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 활용 시 주의 필요





































