블로그
home
Nation-State Cyber Actors Analysis Report
home
🇨🇳

[IG-25-4031-CLEAR] 중국 APT41그룹 ShadowPad 악성코드 분석(1차) : EXE, DLL 기반 ShadowPad 기능 및 행위 분석

Classification
TLP:CLEAR
Release Date
2025/07/01
Writer
GyeongRyeol Kim
Editor
Bohyeong Son
Mihee Kim
Tags
Malware
ShadowPad
APT41
AntiAnalysis
중국
Backdoor
Plugin
악성코드
2 more properties

1. 개요

○ 최근 중국 사이버 보안 회사 i-SOON에서 유출된 내부 문서에서 ShadowPad가 사용한 C2 인프라가 발견됨에 따라 APT41 그룹과의 연관성이 제기*되어 ShadowPad를 통해 중국발 사이버 공격 메커니즘을 통한 예방을 위해 관련 분석내용 공유
○ ShadowPad는 2015년에 PlugX* 악성코드의 후속으로 등장한 모듈형 백도어 악성코드로, APT41(Winnti) 그룹이 최초로 사용한 후 다양한 중국 기반 공격 그룹에서 사용되어옴
* PlugX: 중국 기반 APT 그룹(ex. Mustang Panda)에서 주로 사용하는 모듈형 백도어 악성코드
○ 본 문서에서 분석한 샘플은 EXE, DLL로 이루어져 정상 EXE 파일 실행 시 같은 폴더에 있는 악성 DLL 파일이 사이드로딩되어 실행 → 쉘코드를 통한 로드 과정 이후 처음 실행되는 Root 모듈에서, 암호화된 상태로 내장된 각종 모듈을 메모리에 복호화 후 사용
[그림 1] exe, dll 구성의 ShadowPad 실행 흐름도

2. 대응방안

○ C:\ProgramData 폴더에 평소에 존재하지 않던 폴더 혹은 파일 생성 여부 확인
○ Run 레지스트리 키 및 서비스 목록 확인하여 의심스러운 항목 제거

3. ShadowPad 정보

3.1. ShadowPad 공격 사례 및 진화 양상

○ ShadowPad는 2017년 넷사랑(NetSarang)의 공급망 공격 사례를 통해 알려졌으며, 중국의 APT41(Winnti) 그룹이 최초로 사용한 것으로 알려짐
현재는 APT41을 비롯한 중국계 공격 그룹(APT17, RedEcho, Aquatic Panda 등)에서 사용
시기
공격 그룹
공격 사례
2024
미확인
유럽·중동 기업 21개 사 이상 랜섬웨어 연계 공격
2023.07 ~ 2023.08
APT41(Winnti)
대만 정부산하 연구소 공격
2020 ~ 2021
RedEcho, RedFoxtrot
인도를 비롯한 중국 서부 인접 아시아 국가 항공우주, 방산, 통신사, 전력망, 정부 기관 등 공격
2019.11
APT41(Winnti)
홍콩 대학 2곳 이상 공격
2018.06 ~ 2018.11
APT41(Winnti)
ASUS Live Update 공격 (Operation ShadowHammer)
2017.08 ~ 2017.09
Axoim(APT17)
CCleaner 공급망 공격
2017.07
APT41(Winnti)
Netsarang 공급망 공격
[표 1] ShadowPad 악성코드가 사용된 공격 사례 일부
○ 사용되는 파일 구성은 크게 두 가지로 확인되며 분석을 방해하기 위한 기법이 고도화되고 있음
○ 본 문서에서 분석한 ShadowPad 샘플은 2020년도에 발견된 샘플로, 두 개의 파일(EXE, DLL)을 드롭하여 실행하는 구조이며 ScatterBee의 일부 난독화 기능이 발견됨
파일 구성
발견 시기
특징
EXE, DLL
2017년~
정상 EXE 실행 시 악성 DLL 사이드로딩 전용 DLL 로더가 ShadowPad 페이로드를 메모리에서 복호화 및 실행
EXE, DLL, DAT
2018년~
DLL이 암호화된 DAT 파일 복호화하여 로딩
[표 2] 파일 구성에 따른 ShadowPad 분류
적용 시기
분석 방해 기법
2017년~
간단한 RC4, XOR 기반 암호화 및 압축
2018년~
문자열 암호화, API 동적 로딩
2020년~
ScatterBee, ShadowShredder 등을 이용한 난독화 고도화
2022년~
ScatterBrain(ScatterBee의 진화형) 사용 안티 분석 및 VM 탐지 기능 고도화
[표 3] 시기에 따른 분석 방해 기법 진화 양상

3.2. 모듈 특징

○ 본 분석에서 사용된 샘플에서 발견된 모듈은 [표 4]와 같으며, 실제 중국 APT 그룹에서 사용하는 ShadowPad는 공격 상황에 따라서 다양한 모듈이 존재
[그림 2] 분석 샘플에서 발견된 내장 플러그인
code ID
Module(Plugin) Name
Information
100
Root
처음 진입점
101
Plugins
다른 모듈 API 제공
102
Config
암호화된 구성 문자열 처리
103
Install
지속성 유지
104
Online
C2 통신
106
ImpUser
토큰 복제하여 특정 사용자 사칭
207
PIPE
명령된 파이프 처리
200
TCP
TCP 통신
202
UDP
UDP 통신
300
Disk
파일 시스템 작업
301
Process
프로세스 작업
302
Servcie(Service 오타 추정)
서비스 작업
303
Register
레지스트리 작업
304
Shell
쉘 명령줄 작업
306
KeyLogger
키로깅
307
Screen
스크린샷
317
RecentFiles
최근 접근한 파일 목록
[표 4] 분석 샘플에서 발견된 내장 플러그인(모듈) 정보
○ Shadowpad 모든 모듈의 시작 함수들은 인자의 값에 따라 동작이 다르며, 값에 따라 [표 5]의 동작을 하는 것으로 확인됨
정적 분석 시 case 102, 103을 통해 모듈 파악 후 분석 진행하면 용이
[그림 3] ShadowPad Root 모듈 시작지점
case
동작
0
모듈 종료
1
모듈 메인 작업
100
스레드 작업 생성 및 설정
101
스레드 작업 해제 및 종료
102
간접 호출 시 사용될 code 번호 설정
103
모듈 이름 출력
104
모듈 메인 작업 포인터 설정
[표 5] ShadowPad 모듈 시작점 스위치 Case별 동작

3.3. 안티 분석 기법 - ScatterBee

○ 이번 샘플에는 2020년도부터 적용된 ScatterBee 패커의 난독화 기능 중 일부 발견됨
○ 디스어셈블러의 해석을 방해하기 위해 서로 반대되는 분기 조건을 사용하는 방식 사용
[그림 4] 디스어셈블 분석 방해를 위한 제어 흐름 난독화 기법
○ API 사용 시 PEB를 이용해서 API 이름을 읽어온 뒤 자체 알고리즘으로 해시 값을 계산해 인자로 받은 값과 일치하는 API를 사용하는 동적 로드 방식
[그림 5] 동적으로 API 주소 확인해 사용하는 알고리즘
○ 모듈에서 사용하는 문자열들은 커스텀된 알고리즘으로 암호화되어 있어 사용 시마다 복호화 함수를 이용해 사용
[그림 6] 이번 샘플에서 확인된 문자열 복호화(decrypt_payload) 알고리즘

4. 악성코드 상세분석

4.1. KzLhmzSy.exe(MD5: e4e40e7da3e5ceaeaed00ad564ca402c) - Installer

○ 최초 확인되는 파일은 sfx 형식인 자체 압축 풀림 파일로, 실행 시 압축 해제 되면서 내장된 스크립트가 동작해 Temp 폴더에 exe, dll 파일 생성 및 exe 파일 실행
[그림 7] 최초 exe 파일 기본 정보
[그림 8] 파일에 포함된 exe, dll 파일 및 실행 스크립트
○ 실행 파일은 정상 파일로 확인되며, 악성 DLL 파일이 DLL SideLoading 기법을 통해 실행
[그림 9] DLL SideLoading을 통해 실행된 DLL 파일 정보
○ 실행파일에서 DLL 파일 로드 시, 실행 파일의 특정 위치를 확인하여 정해진 바이트와 일치할 경우 해당 위치의 바이트를 DLL 파일 내의 특정 함수를 실행하는 명령어로 패치
[그림 10] DllMain 동작(exe 파일 바이트 확인 및 패치)
[그림 11] exe 파일 패치 과정
○ 패치를 통해 실행되는 함수는 임의 할당한 메모리에 DLL 내 암호화된 데이터를 복호화 후 해당 데이터(쉘코드) 실행
[그림 12] 데이터 복호화 함수
[그림 13] 암호화된 데이터(base 주소 + 0x17800)
[그림 14] 복호화된 데이터
○ 복호화된 쉘코드는 Shadowpad 모듈 실행 준비 과정 수행
PEB 구조를 이용해 API 동적 할당하여 사용하며, API를 이용해 필요한 DLL 및 IAT를 설정한 후 임의 할당한 메모리에 Root 모듈을 삽입하여 실행
[그림 15] shellcode 시작점, 헤더 값
[그림 16] shellcode에서 동적 로드하는 API

4.2. Root 모듈 (Code: 100)

○ Shellcode를 통해 처음에 실행되는 모듈로 플러그인 로드 및 설정 과정 수행 후 Install 모듈 실행

4.3. Config 모듈 (Code: 102)

○ Shadowpad의 기본 설정 정보가 담겨있는 모듈로, 다른 모듈에서 필요 시 해당 모듈을 불러와 사용
○ 설정 정보는 암호화되어 있으며 “3.3. 안티 분석 기법”에서 소개한 문자열 복호화 함수를 이용해 복호화하여 사용
이번 샘플에서 확인된 설정 정보는 [표 6]와 같음
No
Offset
Data
Info
1
0x84~0x9B
4/13/2020 11:04:32 AM
파일 수정 시간
2
0x9C~0xA8
WinDefends
서비스명
3
0xA9~0xD6
%ALLUSERSPROFILE%\McAfee\Appdata\fcats.exe
파일 복사 위치
4
0xD7~0xE2
WinDefends
서비스명
5
0xE3~0xEF
WinDefends
서비스명
6
0xF0~0x137
Manages objects in the Network and Dial-Up Connections folders, in which you can view both local area network dns remote connections.
서비스 설명
7
0x138~0x167
SOFTWARE\Microsoft\Windows\CurrentVersion\Run
Run 레지스트리
8
0x168~0x173
CMCUpdate
Run 레지스트리명
9
0x174~0x1A6
%ProgramFiles%\Windows Media Player\wmplayer.exe
Injection 프로세스
10
0x1A7~0x1D6
%ProgramFiles%\Internet Explorer\iexplore.exe
Injection 프로세스 후보
11
0x1D7~0x1F7
%windir%\system32\winlogon.exe
Injection 프로세스 후보
12
0x1F8~0x217
%windir%\system32\svchost.exe
Injection 프로세스 후보
13
0x218~0x233
TCP://103.255.179.186:443
C2 (TCP)
14
0x234~0x24E
TCP://103.255.179.168:80
C2 (TCP)
15
0x24F~0x269
UDP://103.255.179.186:53
C2 (UDP)
16
0x27A~0x287
SOCKS4\r\n\r\n
프록시
17
0x288~0x295
SOCKS4\r\n\r\n
프록시
18
0x296~0x2A3
SOCKS5\r\n\r\n
프록시
19
0x2A4~0x2B1
SOCKS5\r\n\r\n
프록시
[표 6] 샘플에서 확인된 config 설정 정보

4.4. Install 모듈 (Code: 103)

○ Install 모듈은 최초 실행한 hpqhvind.exe -> 이를 복제해서 실행한 fcats.exe -> Shadowpad 모듈을 Injection한 wmplayer.exe를 차례대로 실행하면서 동작
[그림 17] 프로세스 실행 과정
○ 최초 실행하는 hpqhvind.exe는 PID를 이용해 뮤텍스 생성하여 중복 실행 방지
[그림 18] 뮤텍스 생성 과정
○ 현재 파일의 실행경로를 확인해서 의도된 경로가 아닐 경우 exe, dll 파일을 의도된 경로(이번 샘플의 경우 ProgramData\McAfee\Appdata 폴더에 fcats.exe, hpqhvsei.dll 파일)로 복제
파일의 최종 수정 시간은 config에 하드코딩된 특정 시간(2020-04-14 오전 3:06)으로 변조
[그림 19] 파일 복제에 사용된 경로
[그림 20] 파일 복제 현황
○ 정상 서비스인 WinDefend와 유사한 WinDefends라는 명칭을 사용한 서비스 생성
[그림 21] 서비스 등록을 위한 레지스트리 생성
○ 지속성 유지를 위해 서비스 이외에도 Run 레지스트리에 CMCUpdate 라는 이름의 값 생성
[그림 22] HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run에 생성된 레지스트리
○ 지속성 유지를 위한 작업 후 fcats.exe 실행 및 %TEMP% 파일에 있던 원본 파일 삭제
○ fcats.exe는 hpqvind.exe와 동일하게 진행하다가 의도된 경로에서 실행된 것이 확인되면 윈도우에서 제공하는 기본 미디어 플레이어인 wmplayer.exe에 Shadowpad 모듈을 Injection하여 실행한 후 종료
[그림 23] wmplayer.exe에 Injection 하는 과정 일부
○ 최종 실행된 wmplayer.exe에서 이후의 모든 악성 행위들이 수행되며, 뮤텍스 생성 후 online 모듈 실행

4.5. Online 모듈 (Code: 104)

○ 암호화된 C2 주소를 복호화하여 socket 생성한 후 통신 시도
TCP, UDP 방법을 사용하여 연결 시도하며 통신 성공 시 명령을 받아 이후 동작 수행하는 것으로 알려졌지만 C2 연결 불가능하여 이후 통신 과정 확인 불가
[그림 24] TCP, UDP 통신 현황
[그림 25] 통신 불가
[그림 26] Online 모듈의 통신 관련 기능

4.6. KeyLogger 모듈 (Code: 306)

○ 키보드 입력 시 속도가 느려지며 로깅 동작이 수행된 것이 확인되어 해당 모듈 일부 분석
○ 키보드 메시지에 후킹을 거는 방식을 사용해서 로깅을 하며 현재 실행중인 프로세스의 제목, 파일 경로, 입력한 키 등을 ProgramData 하위 폴더를 생성하여 저장하는 것으로 확인됨
[그림 27] 후킹을 통한 키로깅 및 모니터링 진행
[그림 28] 키로깅 시 모니터링한 프로세스 정보 저장 부분
[그림 29] 키로깅 대상 프로세스 문자열
[그림 30] 암호화된 키로깅 파일 생성

5. IoC 정보

No
Type
Data
Info
1
MD5
e4e40e7da3e5ceaeaed00ad564ca402c
KzLhmzSy.exe (installer)
2*
MD5
76a234e9343499c675bf05e6b7c8fb4d
hpqhvind.exe (정상파일)
3
MD5
f977be4ebb0d06c9a19b37d8bbb37178
hpqhvsei.dll (shadowpad)
4
C2
103.255.179[.]186:443
TCP
5
C2
103.255.179[.]186:80
TCP
6
C2
103.255.179[.]186:53
UDP
* 2번 파일의 경우 실행 과정에서 발견되어 기재했으며, 파일 자체는 정상파일이므로 IoC 활용 시 주의 필요

6. 참고자료

IGLOO Corp. 2025. All rights reserved.