서문
2025년 10월, Elastic 보안 연구소는 원격 분석에서 새롭게 관찰된 Windows 백도어를 발견했습니다. 저희가 나노레모트라고 부르는 완전한 기능을 갖춘 백도어는 REF7707에 설명된 멀웨어와 특징을 공유하며, 파이널드래프트 임플란트와 유사합니다.
멀웨어의 주요 기능 중 하나는 Google 드라이브 API를 사용하여 피해자의 엔드포인트와 데이터를 주고받는 것입니다. 이 기능은 결국 탐지하기 어려운 데이터 도용 및 페이로드 스테이징을 위한 채널을 제공하게 됩니다. 이 멀웨어에는 다운로드/업로드 작업 대기, 파일 전송 일시 중지/재개, 파일 전송 취소, 새로 고침 토큰 생성 등의 파일 전송 기능에 사용되는 작업 관리 시스템이 포함되어 있습니다.
이 보고서는 저희가 모니터링하고 있는 위협 행위자들과 그들의 진화하는 역량에 대한 방어자와 조직의 인식을 제고하는 것을 목표로 합니다.
핵심 사항
- Elastic 보안 연구소에서 새로운 Windows 백도어 발견
- 나노레모트는 파이널드래프트 및 REF7707과 연계된 스파이 위협 행위자가 개발한 것으로 보입니다.
- 나노레모트에는 Google 드라이브 API를 사용한 명령 실행, 검색/열거 및 파일 전송 기능이 포함되어 있습니다.
- 이 백도어는 Microsoft Detours 및 libPeConv를 포함한 오픈 소스 프로젝트의 기능을 통합합니다.
- Elastic Defend는 행동 규칙, 머신 러닝 분류기, 메모리 보호 기능을 통해 나노레모트 공격 체인을 차단합니다.
나노레모트 분석
WMLOADER
관찰된 공격 체인은 로더(WMLOADER)와 페이로드(나노레모트)라는 두 가지 주요 구성 요소로 이루어져 있습니다. 이 보고서는 나노레모트에 초점을 맞추고 있지만, 전반적인 감염 흐름에 대한 맥락을 제공하기 위해 로더에 대해 설명합니다.
WMLOADER는 유효하지 않은 디지털 서명을 사용하여 Bitdefender 보안 프로그램(BDReinit.exe)으로 가장합니다.
실행 후 프로그램은 Windows 함수(VirtualAlloc / VirtualProtect)를 대량으로 호출하여 파일 내에 저장된 임베디드 셸코드를 호스팅할 프로세스를 준비합니다. 셸코드는 RVA(0x193041)에 있으며 롤링 XOR 알고리즘을 사용하여 해독됩니다.
이 셸코드는 WMLOADER와 동일한 폴더 경로에서 wmsetup.log 라는 파일을 찾은 다음 16바이트 ASCII 키(3A5AD78097D944AC)와 함께 AES-CBC를 사용하여 복호화하기 시작합니다. 암호 해독 후 셸코드는 인메모리 백도어인 나노레모트를 실행합니다.
이전 셸코드 복호화 루틴을 기반으로 VirusTotal에서 검색할 때 Bitdefender 및 Trend Micro 제품을 대상으로 하는 다른 관련 샘플을 식별할 수 있습니다.
나노레모트
나노레모트는 정찰을 수행하고, 파일과 명령을 실행하고, 피해 환경과 파일을 주고받는 데 사용할 수 있는 모든 기능을 갖춘 백도어입니다. 임플란트는 난독화 없이 C++로 작성된 64비트 Windows 실행 파일입니다.
나노 리모트 구성
저희가 관찰한 나노레모트 샘플은 라우팅이 불가능한 하드코딩된 IP 주소와 통신하도록 사전 설정되어 있었습니다. 구성 설정을 가리키는 상호 참조가 보이지 않기 때문에 빌더에서 프로그램을 생성한 것으로 추정됩니다.
Google 드라이브 API 인증의 경우, 나노레모트는 여러 클라이언트를 사용할 수 있는 파이프 분리 구성을 사용합니다. |*| 구분 기호는 단일 클라이언트가 사용하는 필드를 분할하고 |-| 은 클라이언트를 구분하는 마커로 사용됩니다. 클라이언트 구조당 세 개의 필드가 있습니다:
- 클라이언트 ID
- 클라이언트 비밀
- 토큰 새로 고침
아래는 형식의 예입니다:
Client_ID_1|*|Client_Secret_1|*|Refresh_Token_1|-|Client_ID_2|*|Client_Secret_2|*|Refresh_Token_2
개발자는 NR_GOOGLE_ACCOUNTS 라는 환경 변수를 통해 이 구성을 수락하는 폴백 메커니즘이 있습니다.
인터페이스/로깅
나노레모트는 타임스탬프, 소스 코드 위치, 동작 설명 등 애플리케이션의 실시간 활동을 표시하는 상세한 콘솔을 제공합니다.
나노레모트가 실행된 위치와 동일한 위치에 새 Windows 디렉터리가 생성되며, 폴더의 이름은 Log 입니다.
새로 만든 로그 파일(pe_exe_run.log)이 이 폴더에 콘솔에서 인쇄된 것과 동일한 출력이 포함된 폴더에 드롭됩니다.
설정
메인 워커 루프가 시작되기 전에 나노레모트에 의한 초기 설정 루틴이 있습니다. 이 멀웨어는 CoCreateGuid 을 통해 고유한 GUID를 생성한 다음 Fowler-Noll-Vo(FNV) 함수를 사용하여 GUID를 해시합니다. 이 GUID는 운영자가 각 요청 시 개별 머신을 식별하는 데 사용됩니다.
악성코드 개발자는 처리되지 않은 예외가 발생할 때 실행 중인 프로세스의 Windows 미니 덤프를 생성하는 프로세스 전체 충돌 처리기를 가지고 있으며, 이는 프로그램 충돌을 분류하는 데 사용될 가능성이 높습니다.
예외는 프로세스를 종료하기 전에 덤프를 생성합니다. MiniDumpWithFullMemory 은 더 큰 크기의 덤프를 생성하고 민감한 데이터를 포함할 수 있으므로 합법적인 소프트웨어에서는 덜 일반적인 것으로 간주될 수 있지만 이는 매우 표준적인 관행입니다.
덤프 파일에 동일한 문자열 포맷터를 사용하여 Google에서 빠르게 검색한 결과(%d%02d%02d%02d%02d%02d_sv.dmp) 중국 기반 소프트웨어 개발 웹사이트의 1 결과만 나왔습니다.
네트워크 통신
앞서 언급했듯이 나노레모트의 C2는 하드코딩된 IP 주소로 통신합니다. 이러한 요청은 HTTP를 통해 발생하며, 16바이트 키를 사용하여 Zlib로 압축되고 AES-CBC로 암호화된 POST 요청을 통해 JSON 데이터가 제출됩니다(558bec83ec40535657833d7440001c00). 모든 요청의 URI는 사용자 에이전트(NanoRemote/1.0)와 함께 /api/client 를 사용합니다.
아래는 C2 암호화/압축에 사용되는 CyberChef 레시피입니다:
암호화 전의 각 요청은 다음과 같이 구성된 스키마를 따릅니다:
- 명령 ID: 연결된 명령 핸들러 ID
- 데이터: 데이터: 해당 핸들러에 필요한 키/값 쌍을 포함하는 명령별 객체입니다.
- ID: 감염된 호스트에 할당된 고유 머신 식별자
다음은 데이터 객체 내부의 명령 키를 통해 누가미 실행을 트리거하는 요청의 예입니다:
{
"cmd": 21,
"data": {
"command": "whoami"
},
"id": 15100174208042555000
}
각 응답은 두 개의 추가 필드와 함께 이전 필드를 사용하여 유사한 형식을 따릅니다.
- 출력: 출력: 이전에 요청된 명령 핸들러의 모든 출력을 포함합니다.
- 성공: 성공: 명령의 성공 여부를 결정하는 데 사용되는 부울 플래그입니다.
다음은 이전 누가미 명령의 응답 예시입니다:
{
"cmd": 21,
"data": 0,
"id": 17235741656643013000,
"output": "desktop-2c3iqho\\rem\r\n",
"success": true
}
명령 핸들러
나노레모트의 주요 기능은 22 명령 핸들러를 통해 구동됩니다. 아래는 다양한 핸들러를 디스패치하는 데 사용되는 스위치 문을 보여주는 제어 흐름 그래프(CFG) 다이어그램입니다.
아래는 명령 핸들러 테이블입니다:
| 명령 ID | 설명 |
|---|---|
| #1 | 호스트 기반 정보 수집 |
| #2 | 비콘 시간 초과 수정 |
| #3 | 자동 종료 |
| #4 | 경로별로 폴더 내용 나열 |
| #5 | 경로별로 폴더 내용을 나열하고 작업 디렉터리를 설정합니다. |
| #6 | 스토리지 디스크 세부 정보 가져오기 |
| #7 | 새 디렉터리 만들기 |
| #8 #9 | 디렉토리/파일 삭제 |
| #10 #11 | 해체(캐시 지우기, 정리) |
| #12 | PE 로더 - 디스크에서 PE 실행 |
| #13 | 작업 디렉터리 설정 |
| #14 | 작업 디렉터리 가져오기 |
| #15 | 파일 이동 |
| #16 | Google 드라이브를 통한 다운로드 작업 대기열 |
| #17 | Google 드라이브를 통한 업로드 작업 대기열 |
| #18 | 다운로드/업로드 전송 일시 중지 |
| #19 | 다운로드/업로드 전송 재개 |
| #20 | 파일 전송 취소 |
| #21 | 명령 실행 |
| #22 | PE 로더 - 메모리에서 PE 실행 |
핸들러 #1 - 호스트 기반 정보 수집
이 핸들러는 시스템 및 사용자 세부 정보를 열거하여 피해 환경을 프로파일링합니다:
WSAIoctl와SIO_GET_INTERFACE_LIST를 사용하여 내부 및 외부 IP 주소를 검색합니다.- 다음을 통해 사용자 이름을 가져옵니다.
GetUserNameW - 다음을 통해 호스트 이름을 검색합니다.
GetComputerNameW - 다음을 통해 현재 사용자가 관리자 그룹의 구성원인지 확인합니다.
IsUserAnAdmin - 다음을 사용하여 멀웨어가 사용한 프로세스 경로를 검색합니다.
GetModuleFileNameW WinREVersion및ProductName값 이름을 사용하여 레지스트리에서 운영 체제 정보(제품 빌드)를 검색합니다.- 다음을 통해 실행 중인 프로그램의 프로세스 ID를 가져옵니다.
GetCurrentProcessID
아래는 C2 서버로 전송되는 데이터의 예시입니다:
{
"cmd": 1,
"data": {
"Arch": "x64",
"ExternalIp": "",
"HostName": "DESKTOP-2C3IQHO",
"ID": 8580477787937977000,
"InternalIp": "192.168.1.1",
"OsName": "Windows 10 Enterprise ",
"ProcessID": 304,
"ProcessName": "pe.exe",
"SleepTimeSeconds": 0,
"UID": 0,
"UserName": "REM *"
},
"id": 8580477787937977000
}
핸들러 #2 - 비콘 시간 초과 수정하기
이 핸들러는 나노레모트의 C2 통신을 위한 비콘 타임아웃 간격을 수정하며, 운영자가 제공한 초 수에 따라 멀웨어가 절전 모드로 전환됩니다.
아래는 나노레모트가 키(interval)와 값(5)을 사용하여 비콘 타임아웃을 5 초로 수정하는 요청의 예시입니다.
{
"cmd": 2,
"data": {
"interval": 5
},
"id": 15100174208042555000
}
핸들러 #3 - 자체 종료
이 핸들러는 글로벌 변수를 0 로 설정하여 나노레모트의 해체 및 프로세스 종료를 효과적으로 알리는 역할을 합니다.
핸들러 #4 - 경로별 폴더 콘텐츠 나열
이 핸들러는 운영자가 제공한 파일 경로를 사용하여 폴더 콘텐츠를 나열합니다. 각 항목의 목록에는 다음이 포함됩니다:
- 항목이 디렉토리인지 여부
- 항목이 숨김으로 표시되었는지 여부
- 마지막 수정 날짜
- 파일 이름
- 크기
핸들러 #5 - 폴더 내용 나열 및 작업 디렉터리 설정
이 핸들러는 이전 핸들러(#4)와 동일한 코드를 사용하지만 프로세스의 현재 작업 디렉터리도 제공된 경로로 설정한다는 점만 다릅니다.
핸들러 #6 - 스토리지 디스크 정보 가져오기
이 핸들러는 다음 Windows API 함수를 사용하여 컴퓨터에서 스토리지 디스크 정보를 수집합니다:
- 논리 드라이브 가져오기
- GetDiskFreeSpaceExW
- GetDriveTypeW
- GetVolumeInformationW
다음은 반환된 데이터를 보여주는 JSON 요청의 예입니다:
{
"cmd": 6,
"data": {
"items": [
{
"free": 26342813696,
"name": "C:",
"total": 85405782016,
"type": "Fixed"
}
]
},
"id": 16873875158734957000,
"output": "",
"success": true
}
핸들러 #7 - 새 폴더 디렉터리 만들기
이 명령 핸들러는 제공된 경로를 기반으로 새 디렉터리를 만듭니다.
핸들러 #8, #9 - 파일, 디렉터리 삭제
이 핸들러는 #8과 #9 명령 ID를 모두 지원하며, 제공된 파일 경로에 따라 분기가 동적으로 선택됩니다. 파일 또는 지정된 폴더를 삭제할 수 있는 기능이 있습니다.
핸들러 #10, #11 - 해체/정리
이 두 핸들러는 서로 다른 인수를 사용하여 동일한 티어다운 함수를 호출하여 힙 할당, 내부 C++ 객체 및 멀웨어의 런타임과 관련된 캐시된 데이터를 재귀적으로 해제합니다. 이는 명령 구조를 정리하고 메모리 누수나 불안정성을 방지하는 데 목적이 있습니다.
핸들러 #12 - 사용자 지정 PE 로더 - 디스크에서 PE 실행
이 핸들러에는 디스크에 존재하는 파일에 대한 사용자 지정 PE 로드 기능이 포함되어 있습니다. 이 기능은 기존 Windows 로더를 사용하지 않고 디스크에서 PE 파일을 로드하기 위해 라이브러리 libPeConv의 헬퍼 코드와 함께 표준 Windows API를 활용합니다.
즉, 디스크에서 PE 파일을 읽고, 파일을 메모리에 복사하고, 섹션/헤더를 수동으로 매핑하여 파일을 준비한 후 최종적으로 메모리에서 실행합니다. 이 구현은 사용자 모드 후킹과 기존 가시성을 우회하는 스텔스 및 회피를 위한 고의적인 기술입니다. 한 가지 예로, 이 기법을 통해 파일이 실행되면 이 실행 파일이 프로크몬을 사용하여 실행되었다는 흔적이 남지 않습니다.
아래는 이 핸들러에 대한 다음 입력으로, 키(args) 아래에 로컬 파일 경로가 제공됩니다:
{
"cmd": 12,
"data": {
"args": "C:\\tmp\\mare_test.exe"
},
"id": 15100174208042555000
}
다음 스크린샷은 이 기술을 사용하여 테스트 실행 파일을 성공적으로 실행한 것을 보여줍니다:
이 분석에서 흥미로운 점은 libPeConv 라이브러리를 채택했다는 점인데, 이는 저희 내부에서 다양한 멀웨어 관련 작업에 사용하고 있는 훌륭하고 유용한 프로젝트입니다. 나노레모트 개발자는 이 라이브러리의 여러 함수를 사용하여 메모리에서 PE 파일을 수동으로 로드하고 실행하는 일반적인 작업을 간소화합니다. 아래는 나노레모트 라이브러리에서 사용하는 함수입니다:
-
default_func_resolver: DLL을 동적으로 로드하고 내보낸 함수의 주소를 검색하여 PE 파일에서 함수를 확인합니다.
-
hooking_func_resolver: 로드된 DLL에서 이름으로 함수의 가상 주소를 검색합니다.
-
FillImportThunks: 가져온 각 함수를 메모리의 실제 주소로 확인하여 가져오기 테이블을 채웁니다.
-
ApplyRelocCallback: PE 파일이 기본 베이스와 다른 주소에 로드될 때 베이스 재배치를 적용합니다.
이 핸들러에서 주목할 만한 또 다른 점은 오픈 소스 후킹 라이브러리인 Microsoft Detours를 사용한다는 점입니다. 이 라이브러리는 다음 Windows 함수를 가로채는 데 사용됩니다:
- GetStdHandle
- RtlExitUserThread
- RtlExitUserProcess
- FatalExit
- ExitProcess
이 런타임 후킹 루틴은 종료 관련 함수를 가로채서 제어된 동작을 적용하고 복원력을 향상시킵니다. 예를 들어, 나노레모트는 단일 워커 스레드에서 장애가 발생해도 전체 나노레모트 프로세스가 종료되는 것을 방지합니다.
핸들러 #13 - 작업 디렉터리 설정
이 핸들러는 키(경로)를 사용하여 작업 디렉터리를 특정 디렉터리로 설정합니다. 아래는 요청 예시입니다:
{
"cmd": 13,
"data": {
"path": "C:\\tmp\\Log"
},
"id": 15100174208042555000
}
핸들러 #14 - 작업 디렉터리 가져오기
이 핸들러는 현재 작업 디렉터리를 검색하며, 아래는 이전 핸들러(#13)로 디렉터리를 설정한 후의 응답 예시입니다.
{
"cmd": 14,
"data": 0,
"id": 11010639976590963000,
"output": "[+] pwd output:\r\nC:\\tmp\\Log\r\n",
"success": true
}
핸들러 #15 - 파일 이동
이 핸들러를 사용하면 운영자가 파일 복사 및 삭제 작업을 수행하여 파일을 다른 폴더로 이동하는 두 개의 인수(old_path, new_path)와 함께 MoveFileExW를 사용하여 피해 시스템에서 파일을 이동할 수 있습니다.
핸들러 #16 - 대기열 다운로드 작업
이 핸들러는 제공된 task_id로 다운로드 작업 개체를 생성한 다음 작업을 다운로드 대기열에 대기시킵니다. 이 구현에서는 OAuth 2.0 토큰을 사용하여 Google 드라이브 API에 대한 요청을 인증합니다. 이 기능은 위협 행위자가 피해 컴퓨터로 파일을 다운로드하는 데 사용됩니다. Google 서버와의 암호화된 통신은 이러한 트래픽을 합법적인 트래픽으로 보이게 하여 조직이 정상적인 사용과 구별하거나 검사할 수 없도록 합니다.
메인 워커 스레드 내부에는 대기열 객체를 추적하고 멀웨어가 대기 중인 작업을 처리하는 데 사용되는 전역 변수가 있습니다.
작업은 C2 서버에서 제공하는 다양한 필드를 사용하여 처리됩니다:
- type
- task_id
- file_id
- target_path
- file_size
- md5
다운로드 작업이 처리되면 나노레모트는 파일 ID(1BwdUSIyA3WTUrpAEEDhG0U48U9hYPcy7)를 사용하여 Google 드라이브에 호스팅된 파일의 크기를 검색합니다. 다음으로, 멀웨어는 WinHttpSendRequest를 통해 파일을 다운로드한 다음 WinHttpWriteData를 사용하여 컴퓨터에 파일을 씁니다.
아래는 이 다운로드 과정을 보여주는 콘솔 출력입니다:
이 멀웨어 기능은 위협 그룹이 데이터 유출 및 페이로드 호스팅을 위해 신뢰할 수 있는 클라우드 플랫폼을 계속 악용함에 따라 조직에 고유한 문제를 제기합니다. 컨텍스트가 없는 트래픽은 합법적인 트래픽과 쉽게 섞여 네트워크 가시성에 의존하는 방어자에게 탐지를 어렵게 만들 수 있습니다.
핸들러 #17 - 대기열 업로드 작업
이 핸들러는 이전 핸들러(#16)와 비슷한 방식으로 작동하지만 업로드 대기열 작업을 생성하고 작업을 업로드 대기열에 큐에 대기시킵니다. 이 핸들러는 위협 행위자가 피해 컴퓨터에서 공격자가 제어하는 Google 드라이브 계정으로 파일을 업로드하는 데 사용됩니다.
운영자가 C2 서버를 통해 제공하는 필드는 다음과 같습니다:
typetask_idupload_namesource_pathfile_sizemd5
아래는 Google 드라이브 API(/upload/drive/v3/files)를 통해 테스트 파일을 업로드할 때 악성코드가 생성한 네트워크 트래픽입니다.
아래 그림은 이 업로드 과정 중 콘솔을 보여줍니다.
아래는 Google 드라이브 테스트 계정으로 파일 업로드 기능을 사용한 이전 데모 스크린샷입니다.
아래는 이 핸들러의 응답입니다:
{
"cmd": 17,
"data": {
"file_id": "1qmP4TcGfE2xbjYSlV-AVCRA96f6Kp-V7",
"file_name": "meow.txt",
"file_size": 16,
"md5": "1e28c01387e0f0229a3fb3df931eaf80",
"progress": 100,
"status": "uploaded",
"task_id": "124"
},
"id": 4079875446683087000,
"output": "",
"success": true
}
핸들러 #18 - 다운로드/업로드 전송 일시 중지
이 핸들러를 통해 운영자는 task_id를 전달하여 나노레모트가 관리하는 모든 다운로드 및 업로드 작업을 일시 중지할 수 있습니다.
핸들러 #19 - 다운로드/업로드 전송 재개
이 핸들러를 사용하면 운영자는 task_id를 사용하여 나노레모트가 관리하는 일시 중지된 다운로드 또는 업로드 작업을 다시 시작할 수 있습니다.
핸들러 #20 - 파일 전송 취소
이 핸들러를 통해 운영자는 task_id를 통해 나노레모트가 관리하는 모든 다운로드/업로드 작업을 취소할 수 있습니다.
핸들러 #21 - 명령 실행
공격자가 피해 컴퓨터에서 명령을 실행하기 위해 사용하는 주요 핸들러입니다. 새 프로세스를 생성하고 Windows 파이프를 통해 출력을 반환하는 방식으로 작동합니다. 이는 공격자가 환경을 열거하고, 측면 이동을 수행하고, 추가 페이로드를 실행하기 위해 직접 액세스하는 데 사용하는 대부분의 백도어에서 발견되는 핵심 기능입니다.
아래 그림은 이 핸들러가 호출되었을 때 나노레모트의 프로세스 트리를 보여줍니다. 이 멀웨어는 cmd.exe를 생성하고 지정된 명령(이 경우 누가미.exe)을 실행합니다.
핸들러 #22 - 메모리에서 인코딩된 PE 실행
이 핸들러는 기존 나노레모트 프로세스 내에서 Base64로 인코딩된 PE 파일을 로드하고 실행합니다. 인코딩된 PE 파일은 pe_data 필드를 사용하여 C2 서버에서 제공합니다. 프로그램에 명령줄 인수가 필요한 경우 키(인수)가 사용됩니다.
아래는 테스트 프로그램을 사용한 콘솔 출력을 보여주는 예제입니다:
유사 유사점
코드 유사성 및 동작 관점에서 볼 때 FINALDRAFT와 NANOREMOTE는 중복되는 부분이 있습니다.
많은 기능이 두 임플란트에서 명확한 코드 재사용을 보여줍니다. 예를 들어, 둘 다 CoCreateGuid를 통해 GUID를 생성하고 Fowler-Noll-Vo(FNV) 함수로 해싱한 후 버퍼를 해제하기 전에 동일한 힙 유효성 검사를 수행하는 동일한 순서를 따릅니다.
요청을 주고받는 데 사용되는 HTTP 관련 코드의 상당 부분도 유사성을 암시합니다. 아래는 두 멀웨어 제품군에서 사용하는 HTTP 요청의 설정/구성을 보여주는 제어 흐름 그래프의 예시입니다.
분석하는 동안, WMLOADER가 올해 초에 발표한 FINALDRAFT를 배포하기 위해 PATHLOADER가 사용한 것과 동일한 파일 이름인 wmsetup.log라는 하드 코딩된 파일에서 해당 페이로드를 복호화하는 것을 관찰했습니다.
또 다른 흥미로운 발견은 샘플 (wmsetup.log)을 발견했다는 것입니다. 에서 최근 필리핀에서 2025-10-03에 업로드된 바이러스 토탈(VirusTotal)을 확인했습니다.
파일을 다운로드하여 WMLOADER 옆에 배치한 다음 로더를 실행했습니다. wmsetup.log 파일을 성공적으로 해독하여 FINALDRAFT 임플란트를 발견했습니다.
아래는 동일한 AES 키가 FINALDRAFT와 나노레모트를 성공적으로 해독하는 데 사용된 것을 보여주는 나란히 배치된 그래픽입니다.
저희의 가설은 WMLOADER가 다양한 페이로드와 함께 작동할 수 있는 동일한 빌드/개발 프로세스의 일부이기 때문에 동일한 하드코딩된 키를 사용한다는 것입니다. 이러한 임플란트의 배후에 있는 위협 그룹이 키를 회전시키지 않는 이유는 명확하지 않으며, 편의성이나 테스트 때문일 수 있습니다. 이는 파이널드래프트와 나노레모트가 코드베이스와 개발 환경을 공유한다는 또 다른 강력한 신호로 보입니다.
나노레모트를 통한 MITRE ATT&CK
Elastic은 위협이 엔터프라이즈 네트워크에 대해 사용하는 일반적인 전술, 기술 및 절차를 문서화하기 위해 MITRE ATT& CK 프레임워크를 사용합니다.
전술
전술은 기술 또는 하위 기술의 이유를 나타냅니다. 이는 적의 전술적 목표, 즉 행동을 수행하는 이유입니다.
기술
기술은 공격자가 행동을 수행하여 전술적 목표를 달성하는 방법을 나타냅니다.
- Account Discovery
- 로컬 스토리지 검색
- 웹 서비스를 통한 데이터 유출: 클라우드 저장소로의 데이터 유출
- 마스커레이딩: 잘못된 코드 서명
- 명령 및 스크립팅 인터프리터: Windows 명령 셸
나노 리모트 완화
나노레모트를 실행하는 실험실 환경에서는 Elastic Defend를 사용해 다양한 경보가 트리거되었습니다.
방어자가 확인해야 할 주요 행동 중 하나는 Google 드라이브 API와 같은 합법적인 서비스를 남용하는 행위입니다. 아래는 나노레모트를 사용하여 파일 다운로드 및 업로드를 위해 Google API와 상호 작용할 때 일반적으로 악용되는 웹서비스에 연결 규칙으로 트리거되는 경고의 예시입니다.
C2 서버에서 Base64로 인코딩된 파일을 사용하는 PE 로딩 기법도 Memory Threat Detection Alert: Shellcode Injection 알림을 통해 탐지되었습니다.
탐지/예방
- 하드웨어 중단점을 사용한 회피 가능성
- 잘못된 코드 서명을 통한 회피 가능성
- 서명되지 않은 모듈에서 백업되지 않은 셸코드
- 평판이 낮은 모듈에서 셸코드 실행
- 비정상 스택의 이미지 중공
- 자주 악용되는 웹 서비스에 대한 연결
- 메모리 위협 탐지 알림: 셸코드 인젝션
YARA
Elastic Security는 이 활동을 식별하기 위해 YARA 규칙을 만들었습니다.
rule Windows_Trojan_NanoRemote_7974c813 {
meta:
author = "Elastic Security"
creation_date = "2025-11-17"
last_modified = "2025-11-19"
license = "Elastic License v2"
os = "Windows"
arch = "x86"
threat_name = "Windows.Trojan.NanoRemote"
strings:
$str1 = "/drive/v3/files/%s?alt=media" ascii fullword
$str2 = "08X-%04X-%04x-%02X%02X-%02X%02X%02X%02X%02X%02X" ascii fullword
$str3 = "NanoRemote/" wide
$str4 = "[+] pwd output:" wide
$str5 = "Download task %s failed: write error (wrote %llu/%zu bytes)"
$seq1 = { 48 83 7C 24 28 00 74 ?? 4C 8D 4C 24 20 41 B8 40 00 00 00 BA 00 00 01 00 48 8B 4C 24 28 FF 15 ?? ?? ?? ?? 85 C0 }
$seq2 = { BF 06 00 00 00 89 78 48 8B 0D ?? ?? ?? ?? 89 48 ?? FF D3 89 78 78 8B 0D ?? ?? ?? ?? 89 48 7C FF D3 89 78 18 8B 0D }
condition:
4 of them
}
rule Windows_Trojan_WMLoader_d2c7b963 {
meta:
author = "Elastic Security"
creation_date = "2025-12-03"
last_modified = "2025-12-03"
license = "Elastic License v2"
os = "Windows"
arch = "x86"
threat_name = "Windows.Trojan.WMLoader"
reference_sample = "fff31726d253458f2c29233d37ee4caf43c5252f58df76c0dced71c4014d6902"
strings:
$seq1 = { 8B 44 24 20 FF C0 89 44 24 20 81 7C 24 20 01 30 00 00 }
$seq2 = { 41 B8 20 00 00 00 BA 01 30 00 00 48 8B 4C C4 50 FF 15 }
condition:
all of them
}
관찰
이 연구에서는 다음과 같은 관찰 가능성에 대해 논의했습니다.
| 관측 가능합니다. | 유형 | 이름 | 참조 |
|---|---|---|---|
| fff31726d253458f2c29233d37ee4caf43c5252f58df76c0dced71c4014d6902 | SHA-256 | BDReinit.exe | WMLOADER |
| 999648bd814ea5b1e97918366c6bd0f82b88f5675da1d4133257b9e6f4121475 | SHA-256 | ASDTool.exe | WMLOADER |
| 35593a51ecc14e68181b2de8f82dde8c18f27f16fcebedbbdac78371ff4f8d41 | SHA-256 | mitm_install_tool.exe | WMLOADER |
| b26927ca4342a19e9314cf05ee9d9a4bddf7b848def2db941dd281d692eaa73c | SHA-256 | BDReinit.exe | WMLOADER |
| 57e0e560801687a8691c704f79da0c1dbdd0f7d5cc671a6ce07ec0040205d728 | SHA-256 | 나노레모트 |
