캘린더에 표시해 두세요: APT41의 혁신적인 전술
Google Threat Intelligence Group
Google Threat Intelligence Group(GTIG)의 임무는 수십억 명의 Google 사용자와 수많은 Google 제품 및 서비스를 보호하는 것입니다. 2024년 10월 말, GTIG는 해킹당한 정부 웹사이트에서 여러 정부 기관을 표적으로 삼는 악성 코드를 발견했습니다. 이 해킹된 사이트는 Google 캘린더를 명령 및 제어(C2)에 악용하는 'TOUGHPROGRESS'라는 악성 코드 페이로드를 전달했습니다. C2를 위한 클라우드 서비스 오용은 여러 위협 행위자가 합법적인 활동으로 위장하기 위해 사용하는 기술입니다.
우리는 이 악성 코드가 중국 기반의 위협 행위자인 APT41(HOODOO로도 추적됨)에 의해 사용되고 있다고 높은 신뢰도로 판단하고 있습니다. APT41의 표적은 전 세계에 걸쳐 있으며, 해운 및 물류, 미디어 및 엔터테인먼트, 기술, 자동차 등 다양한 분야의 정부 및 조직을 포함합니다.
개요
이 블로그 게시물에서는 악성 코드 전달 방법, 악성 코드 공격 체인의 기술적 세부 정보, 최근 APT41 활동, 그리고 보안 전문가들이 유사한 공격으로부터 스스로를 방어하는 데 도움이 될 수 있는 침해 지표(IOC)를 분석합니다. 또한 GTIG가 사용자 지정 탐지 시그니처, 공격자가 제어하는 인프라 차단, 그리고 세이프 브라우징에 추가된 보호 기능을 사용하여 이 캠페인을 어떻게 중단시켰는지 자세히 설명합니다.


그림 1: TOUGHPROGRESS 캠페인 개요
전달 방법
APT41은 해킹된 정부 웹사이트에 호스팅된 ZIP 압축 파일 링크가 포함된 스피어 피싱 이메일을 발송했습니다. 이 압축 파일에는 PDF로 위장한 LNK 파일과 디렉터리가 들어 있습니다. 이 디렉터리 안에는 일곱 개의 절지동물 JPG 이미지로 보이는 파일들이 있습니다. LNK 파일을 통해 페이로드가 실행되면, 해당 LNK는 삭제되고 대신 미끼용 PDF 파일이 사용자에게 표시됩니다. 이 PDF 파일에는 해당 종들을 수출 시 신고해야 한다는 내용이 담겨 있습니다.
$ unzip -l 出境海關申報清單.zip
Length Date Time Name
--------- ---------- ----- ----
0 2024-10-23 11:00 image/
12633 2024-10-23 10:53 image/1.jpg
10282 2024-10-23 10:54 image/2.jpg
8288 2024-10-23 10:54 image/3.jpg
4174 2024-10-23 10:54 image/4.jpg
181656 2024-10-23 10:54 image/5.jpg
997111 2024-10-23 11:00 image/6.jpg
124928 2024-10-23 11:00 image/7.jpg
88604 2024-10-23 11:03 申報物品清單.pdf.lnk
--------- -------
1427676 9 files
"6.jpg"와 "7.jpg" 파일은 위장된 이미지입니다. 첫 번째 파일은 실제로는 암호화된 페이로드이고, 두 번째 파일인 DLL 파일이 타깃이 LNK를 클릭했을 때 실행되면서 이를 복호화합니다.
멀웨어 감염 체인
이 악성 코드는 세 가지의 서로 다른 모듈을 순차적으로 배포하며, 각 모듈은 고유한 기능을 수행합니다. 또한 각 모듈은 메모리 전용 페이로드, 암호화, 압축, 프로세스 할로잉(process hollowing), 제어 흐름 난독화, C2를 위한 Google 캘린더 활용 등 은밀하고 회피적인 기술들을 구현합니다.
-
PLUSDROP - 다음 단계를 복호화하여 메모리에서 실행하는 DLL
-
PLUSINJECT - 합법적인 "svchost.exe" 프로세스를 실행하고 프로세스 할로잉을 수행하여 최종 페이로드를 주입
-
TOUGHPROGRESS - 감염된 Windows 호스트에서 동작을 실행하며, C2를 위해 Google 캘린더를 사용
TOUGHPROGRESS 분석
TOUGHPROGRESS는 샘플의 ".pdata" 영역에 저장된 셸코드를 복호화하기 위해 하드코딩된 16바이트 XOR 키를 사용합니다. 이후 셸코드는 COMPRESSION_FORMAT_LZNT1을 사용하여 메모리 내 DLL을 압축 해제합니다. 이 DLL은 제어 흐름을 모호하게 만들기 위해 여러 난독화 기술을 겹겹이 사용합니다.
-
레지스터 기반 간접 호출
-
동적 주소 연산
-
64비트 레지스터 오버플로
-
함수 디스패치 테이블
레지스터 기반 간접 호출은 레지스터에 저장할 주소를 동적으로 계산한 후에 사용됩니다. 이 계산은 의도적으로 64비트 레지스터를 오버플로시키는 두 개 이상의 하드코딩된 값을 포함합니다. 다음은 CreateThread를 호출하는 예시입니다.


그림 2: 동적 주소 연산 및 64비트 오버플로를 이용한 레지스터 기반 간접 호출
Python "ctypes"를 사용하면 64비트 레지스터 연산을 시뮬레이션하여 이 작동 방식을 재현할 수 있습니다. 두 값을 더하면 64비트 주소 공간이 오버플로되고, 그 결과는 호출될 함수의 주소가 됩니다.


그림 3: 64-bit 주소 오버플로 시연


그림 4: Dispatch Table의 CreateThread
이러한 난독화 기술은 '제어 흐름 난독화' 전술로 나타납니다. 간접 호출 및 산술 연산으로 인해 디스어셈블러가 제어 흐름 그래프를 정확하게 재구성할 수 없습니다.
캘린더 C2
TOUGHPROGRESS는 공격자가 제어하는 Google 캘린더를 통해 이벤트를 읽고 쓸 수 있는 기능을 갖추고 있습니다. 실행되면, TOUGHPROGRESS는 하드코딩된 날짜인 2023년 5월 30일에 0분짜리 캘린더 이벤트를 생성하며, 이 이벤트 설명에 감염된 호스트에서 수집한 데이터를 암호화하여 기록합니다.
공격자는 악성 코드에 하드코딩된 미리 정해진 날짜인 2023년 7월 30일과 2023년 7월 31일에 캘린더 이벤트에 암호화된 명령을 배치합니다. TOUGHPROGRESS는 이 이벤트들을 캘린더에서 폴링하기 시작합니다. 이벤트가 검색되면, 이벤트 설명이 복호화되고 포함된 명령이 감염된 호스트에서 실행됩니다. 명령 실행 결과는 암호화되어 또 다른 캘린더 이벤트에 다시 기록됩니다.
Mandiant FLARE 팀과의 협력을 통해 GTIG는 TOUGHPROGRESS가 활용하는 C2 암호화 프로토콜을 리버스 엔지니어링했습니다. 이 악성 코드는 하드코딩된 10바이트 XOR 키를 사용하고, 메시지당 4바이트 XOR 키를 생성합니다.
-
메시지를 LZNT1으로 압축
-
4바이트 XOR 키로 메시지 암호화
-
메시지 헤더 끝에 4바이트 키 추가 (총 10바이트)
-
10바이트 XOR 키로 헤더 암호화
-
암호화된 헤더를 메시지 맨 앞에 추가
-
이렇게 결합된 암호화된 헤더와 메시지가 캘린더 이벤트 설명이 됩니다.


그림 5: TOUGHPROGRESS 캘린더 이벤트 설명 암호화 로틴


그림 6: TOUGHPROGRESS가 생성한 캘린더 이벤트 예시
Google, 사용자 및 고객 보호를 위한 공격자 활동 중단
GTIG의 목표는 단순히 위협을 모니터링하는 것을 넘어, 위협에 대응하고 이를 저지하는 것입니다. Google은 제품 전반에 걸쳐 악성 코드 캠페인을 사전에 차단함으로써, 대규모로 사용자 및 고객을 보호하는 것을 목표로 합니다.
APT41과 TOUGHPROGRESS 악성 코드를 무력화하기 위해, 저희는 공격자가 제어하는 캘린더를 식별하고 폐쇄하기 위한 사용자 지정 지문을 개발했습니다. 또한, 공격자가 제어하는 Workspace 프로젝트를 종료하여 이 캠페인에서 APT41이 의존하던 인프라를 효과적으로 해체했습니다. 이외에도 파일 탐지를 업데이트하고 악성 도메인 및 URL을 Google 세이프 브라우징 차단 목록에 추가했습니다.
Mandiant 컨설팅과의 파트너십을 통해 GTIG는 감염된 조직에 통보했습니다. 통보된 조직에는 탐지 및 사고 대응을 돕기 위해 TOUGHPROGRESS 네트워크 트래픽 로그 샘플과 위협 행위자에 대한 정보를 제공했습니다.
지속적인 활동에 대한 보호
GTIG는 수년간 Workspace 앱을 사용하는 APT41의 공격에 대해 적극적으로 모니터링하고 보호해 왔습니다. 이 위협 그룹은 창의적인 악성 코드 캠페인으로 알려져 있으며, 때로는 Workspace 앱을 활용하기도 합니다.
-
Google Cloud의 CISO 사무실은 2023년 4월에 발간된 Threat Horizons 보고서에서 HOODOO가 악성 코드 C2를 위해 Google Sheets 및 Google Drive를 사용한 사례를 상세히 다루었습니다.
-
2024년 10월, Proofpoint는 VOLDEMORT 악성 코드 패밀리가 APT41의 소행이라고 밝히는 보고서를 발표했습니다.
-
2024년 7월 GTIG와 Mandiant가 보고한 DUSTTRAP 악성 코드 패밀리는 C2를 위해 퍼블릭 클라우드 호스팅을 사용했습니다.
각 사례에서 GTIG는 이 캠페인에 APT41이 의존하던 공격자 제어 Workspace 프로젝트 및 인프라를 식별하고 종료했습니다.
무료 웹 호스팅 인프라
적어도 2024년 8월부터, 저희는 APT41이 악성 코드 배포를 위해 무료 웹 호스팅 도구를 사용하는 것을 관찰해 왔습니다. 여기에는 VOLDEMORT, DUSTTRAP, TOUGHPROGRESS 및 기타 페이로드도 포함될 수 있습니다. 이러한 무료 호스팅 사이트 링크는 다양한 지역 및 산업에 속한 수백 개의 타깃에게 전송되었습니다.
APT41은 Cloudflare Worker 서브도메인을 가장 자주 사용했습니다. 하지만 InfinityFree와 TryCloudflare도 사용한 것으로 관찰되었습니다. 여기에 언급된 특정 서브도메인과 URL은 이전 캠페인에서도 관찰되었지만, 현재는 APT41이 더 이상 사용하지 않을 수도 있습니다.
Cloudflare Workers
-
word[.]msapp[.]workers[.]dev
-
cloud[.]msapp[.]workers[.]dev
TryCloudflare
-
term-restore-satisfied-hence[.]trycloudflare[.]com
-
ways-sms-pmc-shareholders[.]trycloudflare[.]com
InfinityFree
-
resource[.]infinityfreeapp[.]com
-
pubs[.]infinityfreeapp[.]com
APT41은 또한 피싱 메시지에서 URL 단축 서비스를 사용한 것으로 관찰되었습니다. 단축된 URL은 무료 호스팅 앱 서브도메인에 호스팅된 악성 코드로 리디렉션됩니다.
-
https[:]//lihi[.]cc/6dekU
-
https[:]//tinyurl[.]com/hycev3y7
-
https[:]//my5353[.]com/nWyTf
-
https[:]//reurl[.]cc/WNr2Xy
이 블로그 게시물에 있는 모든 도메인과 URL은 세이프 브라우징 차단 목록에 추가되었습니다. 이를 통해 사이트 접속 시 경고가 표시되고 사용자가 악성 코드를 다운로드하는 것을 방지할 수 있습니다.
침해 지표
이 블로그 게시물의 IOC는 Google 위협 인텔리전스에서도 컬렉션으로 제공됩니다.
Hashes
도메인
-
word[.]msapp[.]workers[.]dev
-
cloud[.]msapp[.]workers[.]dev
-
term-restore-satisfied-hence[.]trycloudflare[.]com
-
ways-sms-pmc-shareholders[.]trycloudflare[.]com
-
resource[.]infinityfreeapp[.]com
-
pubs[.]infinityfreeapp[.]com
단축 URL
-
https[:]//lihi[.]cc/6dekU
-
https[:]//lihi[.]cc/v3OyQ
-
https[:]//lihi[.]cc/5nlgd
-
https[:]//lihi[.]cc/edcOv
-
https[:]//lihi[.]cc/4z5sh
-
https[:]//tinyurl[.]com/mr42t4yv
-
https[:]//tinyurl[.]com/hycev3y7
-
https[:]//tinyurl[.]com/mpa2c5wj
-
https[:]//tinyurl[.]com/3wnz46pv
-
https[:]//my5353[.]com/ppOH5
-
https[:]//my5353[.]com/nWyTf
-
https[:]//my5353[.]com/fPUcX
-
https[:]//my5353[.]com/ZwEkm
-
https[:]//my5353[.]com/vEWiT
-
https[:]//reurl[.]cc/WNr2Xy
캘린더
-
104075625139-l53k83pb6jbbc2qbreo4i5a0vepen41j.apps.googleusercontent.com
-
https[:]//www[.]googleapis[.]com/calendar/v3/calendars/ff57964096cadc1a8733cf566b41c9528c89d30edec86326c723932c1e79ebf0@group.calendar.google.com/events
YARA Rules
rule G_Backdoor_TOUGHPROGRESS_LNK_1 {
meta:
author = "GTIG"
date_created = "2025-04-29"
date_modified = "2025-04-29"
md5 = "65da1a9026cf171a5a7779bc5ee45fb1"
rev = 1
strings:
$marker = { 4C 00 00 00 }
$str1 = "rundll32.exe" ascii wide
$str2 = ".\\image\\7.jpg,plus" wide
$str3 = "%PDF-1"
$str4 = "PYL="
condition:
$marker at 0 and all of them
}
rule G_Dropper_PLUSDROP_1 {
meta:
author = "GTIG"
date_created = "2025-04-29"
date_modified = "2025-04-29"
md5 = "9492022a939d4c727a5fa462590dc0dd"
rev = 1
strings:
$decrypt_and_launch_payload = { 48 8B ?? 83 ?? 0F 0F B6 ?? ?? ??
30 04 ?? 48 FF ?? 49 3B ?? 72 ?? 80 [1-5] 00 75 ?? B? 5B 55 D2 56 [0-8] E8
[4-32] 33 ?? 33 ?? FF D? [0-4] FF D? }
condition:
uint16(0) == 0x5a4d and all of them
}
추가 YARA Rules
TOUGHPROGRESS의 또 다른 캠페인에서 PLUSDROP을 실행하는 데 사용된 두 번째 드로퍼입니다.
rule G_Dropper_TOUGHPROGRESS_XML_1 {
meta:
author = "GTIG"
description = "XML lure file used to launch a PLUSDROP dll."
md5 = "dccbb41af2fcf78d56ea3de8f3d1a12c"
strings:
$str1 = "System.Convert.FromBase64String"
$str2 = "VirtualAlloc"
$str3 = ".InteropServices.Marshal.Copy"
$str4 = ".DllImport"
$str5 = "kernel32.dll"
$str6 = "powrprof.dll"
$str7 = ".Marshal.GetDelegateForFunctionPointer"
condition:
uint16(0)!= 0x5A4D and all of them and filesize > 500KB and
filesize < 5MB
}
PLUSBED는 다른 TOUGHPROGRESS 캠페인에서 관찰된 추가 단계입니다.
rule G_Dropper_PLUSBED_2 {
meta:
author = "GTIG"
date_created = "2025-04-29"
date_modified = "2025-04-29"
md5 = "39a46d7f1ef9b9a5e40860cd5f646b9d"
rev = 1
strings:
$api1 = { BA 54 B8 B9 1A }
$api2 = { BA 78 1F 20 7F }
$api3 = { BA 62 34 89 5E }
$api4 = { BA 65 62 10 4B }
$api5 = { C7 44 24 34 6E 74 64 6C 66 C7 44 24 38 6C 00 FF D0 }
condition:
uint16(0) != 0x5A4D and all of them
}