콘텐츠로 이동하기
위협 인텔리전스

캘린더에 표시해 두세요: APT41의 혁신적인 전술

2025년 5월 28일
Google Threat Intelligence Group

Google Threat Intelligence

Visibility and context on the threats that matter most.

Learn more

해당 블로그의 원문은 2025년 5월 29일 Google Cloud 블로그(영문)에 게재되었습니다. 


작성자: Patrick Whitsell


Google Threat Intelligence Group(GTIG)의 임무는 수십억 명의 Google 사용자와 수많은 Google 제품 및 서비스를 보호하는 것입니다. 2024년 10월 말, GTIG는 해킹당한 정부 웹사이트에서 여러 정부 기관을 표적으로 삼는 악성 코드를 발견했습니다. 이 해킹된 사이트는 Google 캘린더를 명령 및 제어(C2)에 악용하는 'TOUGHPROGRESS'라는 악성 코드 페이로드를 전달했습니다. C2를 위한 클라우드 서비스 오용은 여러 위협 행위자가 합법적인 활동으로 위장하기 위해 사용하는 기술입니다.

우리는 이 악성 코드가 중국 기반의 위협 행위자인 APT41(HOODOO로도 추적됨)에 의해 사용되고 있다고 높은 신뢰도로 판단하고 있습니다. APT41의 표적은 전 세계에 걸쳐 있으며, 해운 및 물류, 미디어 및 엔터테인먼트, 기술, 자동차 등 다양한 분야의 정부 및 조직을 포함합니다.

개요

이 블로그 게시물에서는 악성 코드 전달 방법, 악성 코드 공격 체인의 기술적 세부 정보, 최근 APT41 활동, 그리고 보안 전문가들이 유사한 공격으로부터 스스로를 방어하는 데 도움이 될 수 있는 침해 지표(IOC)를 분석합니다. 또한 GTIG가 사용자 지정 탐지 시그니처, 공격자가 제어하는 인프라 차단, 그리고 세이프 브라우징에 추가된 보호 기능을 사용하여 이 캠페인을 어떻게 중단시켰는지 자세히 설명합니다.

https://storage.googleapis.com/gweb-cloudblog-publish/images/apt41-innovative-tactics-fig1.max-1800x1800.png

그림 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 캘린더 활용 등 은밀하고 회피적인 기술들을 구현합니다.

  1. PLUSDROP - 다음 단계를 복호화하여 메모리에서 실행하는 DLL

  2. PLUSINJECT - 합법적인 "svchost.exe" 프로세스를 실행하고 프로세스 할로잉을 수행하여 최종 페이로드를 주입

  3. TOUGHPROGRESS - 감염된 Windows 호스트에서 동작을 실행하며, C2를 위해 Google 캘린더를 사용

TOUGHPROGRESS 분석

TOUGHPROGRESS는 샘플의 ".pdata" 영역에 저장된 셸코드를 복호화하기 위해 하드코딩된 16바이트 XOR 키를 사용합니다. 이후 셸코드는 COMPRESSION_FORMAT_LZNT1을 사용하여 메모리 내 DLL을 압축 해제합니다. 이 DLL은 제어 흐름을 모호하게 만들기 위해 여러 난독화 기술을 겹겹이 사용합니다.

  1. 레지스터 기반 간접 호출

  2. 동적 주소 연산

  3. 64비트 레지스터 오버플로

  4. 함수 디스패치 테이블

레지스터 기반 간접 호출은 레지스터에 저장할 주소를 동적으로 계산한 후에 사용됩니다. 이 계산은 의도적으로 64비트 레지스터를 오버플로시키는 두 개 이상의 하드코딩된 값을 포함합니다. 다음은 CreateThread를 호출하는 예시입니다.

https://storage.googleapis.com/gweb-cloudblog-publish/images/apt41-innovative-tactics-fig2.max-800x800.png

그림 2: 동적 주소 연산 및 64비트 오버플로를 이용한 레지스터 기반 간접 호출

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

https://storage.googleapis.com/gweb-cloudblog-publish/images/apt41-innovative-tactics-fig3.max-800x800.png

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

https://storage.googleapis.com/gweb-cloudblog-publish/images/apt41-innovative-tactics-fig4.max-800x800.png

그림 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 키를 생성합니다.

  1. 메시지를 LZNT1으로 압축

  2. 4바이트 XOR 키로 메시지 암호화

  3. 메시지 헤더 끝에 4바이트 키 추가 (총 10바이트)

  4. 10바이트 XOR 키로 헤더 암호화

  5. 암호화된 헤더를 메시지 맨 앞에 추가

  6. 이렇게 결합된 암호화된 헤더와 메시지가 캘린더 이벤트 설명이 됩니다.

https://storage.googleapis.com/gweb-cloudblog-publish/images/apt41-innovative-tactics-fig5.max-1500x1500.png

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

https://storage.googleapis.com/gweb-cloudblog-publish/images/apt41-innovative-tactics-fig6.max-1700x1700.png

그림 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

 

이름

해시 (SHA256 / MD5)

出境海關申報清單.zip

469b534bec827be03c0823e72e7b4da0b84f53199040705da203986ef154406a 876fb1b0275a653c4210aaf01c2698ec

申報物品清單.pdf.lnk

3b88b3efbdc86383ee9738c92026b8931ce1c13cd75cd1cda2fa302791c2c4fb 65da1a9026cf171a5a7779bc5ee45fb1

6.jpg

50124174a4ac0d65bf8b6fd66f538829d1589edc73aa7cf36502e57aa5513360 1ca609e207edb211c8b9566ef35043b6

7.jpg

151257e9dfda476cdafd9983266ad3255104d72a66f9265caa8417a5fe1df5d7 2ec4eeeabb8f6c2970dcbffdcdbd60e3

도메인

  • 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
}
게시 위치