1. 공격개요
○ 북한 해킹 그룹 Kimsuky가 스피어피싱을 통해 유포한 악성 LNK 파일 3건을 확보해 분석
•
C2의 포트(9992, 7648) 및 파일명, Google Drive 정보에 따라 2가지 유형으로 분류
○ 스피어피싱내 악성LNK를 통한 공격 시나리오(with 클라우드 스토리지)
1.
스피어피싱내 악성LNK파일 : .docx확장자와 아이콘으로 사용자 실행 유도
2.
클라우드 스토리지 이용한 정보 수집 및 정찰 : Dropbox와 Google Drive를 이용해 시스템 정보 탈취 코드 다운로드 및 실행 → 수집된 시스템 정보 업로드
3.
Powershell백도어로 추가 악성코드 실행 : C2에서 명령어를 즉시 혹은 반복 실행기능 있는 Powershell백도어 다운로드 후, Run레지스트리 및 작업 스케줄러 등록으로 지속성 확보 후 추가 악성코드 실행
4.
PebbleDash와 RDP Wrapper로 원격실행 : 최종 악성코드로 PebbleDash* 백도어와 오픈소스 원격 접속 도구 RDP Wrapper를 활용해 피해자 시스템 원격 제어 및 추가 악성 행위 수행
* 기문서 “[IG-25-4006-O] 북한발 PebbleDash 백도어 악성코드 분석 공유”에서 상세분석 확인 가능
[그림 1] 공격 흐름도
2. 대응방안
○ 메일 열람 시 발신자 메일주소, 첨부된 링크 및 파일 등 신중히 확인 필요
○ 악성 실행 파일은 문서로 위장한 경우가 많아 파일 실행 시 아이콘, 확장자, 유형 등 확인 필요
•
확장자 확인을 위해 “폴더 옵션 > 보기 탭 > 알려진 파일 형식의 파일 확장명 숨기기” 체크 해제
3. 스피어피싱을 통한 악성LNK 공격 유형
○ Kimsuky 그룹이 유포했다고 알려진 [표 1]의 악성 LNK 파일 3건을 확보하여 분석
No | MD5 | 파일명 |
1 | 8ac5d4d3a68ca82b190bceb8cf7cb07e | 20250201_388165727.eml.lnk |
2 | 8b541e4da55cb41e3304bda5ea568eb7 | 20250114_27263.docx.lnk |
3 | 5e040663bbe55915a67f696a6aafb81a | 20250206_68013.docx.lnk |
[표 1] 확보한 LNK 파일 정보
○ 분석 과정에서 악성 LNK 파일들은 동일한 실행 과정을 가진 것으로 확인되었으나, [표 2]의 사용하는 C2의 Port와 생성 파일의 차이와 [표 3]의 사용하는 Google Drive 정보의 차이를 근거로 Type A와 Type B로 분류
Type | LNK 파일 | IP(C2) | PORT(C2) | 생성 파일(C2) |
A | 20250201_388165727.eml.lnk
20250114_27263.docx.lnk | 74[.]50[.]94[.]175 | 9992 | t.zip |
B | 20250206_68013.docx.lnk | 74[.]50[.]94[.]175 | 7648 | k.zip |
[표 2] 유형별 사용된 C2 정보
Type | LNK 파일 | folderId
(Google Drive) | client_id
(Google Drive) | client_secret
(Google Drive) |
A | 20250201_388165727.eml.lnk
20250114_27263.docx.lnk | 1m3Z22KdkwaiW8VTeeGbARdCcfCmoBRCy | 71532697854-ef1nlsl4cjn4scm57dsf1685leiunavu.apps.googleusercontent.com | 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 |
B | 20250206_68013.docx.lnk | 1lvY-PLtOkcA8clrQABWUWUMhRkgAsMsa | 159263970130-1gil63rpicrhtbo4he4qvnfiks351oc4.apps.googleusercontent.com | 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 |
[표 3] 유형별 사용된 Google Drive 정보
4. 악성코드 상세분석
4.1. 문서 위장 LNK 파일 - 악성 .ps1 파일 드롭 및 실행
○ 파일명에 .docx와 .eml 문자열을 포함하고 MS Word와 MS Outlook 아이콘을 사용한 악성 LNK 파일로 정상 파일인 것처럼 위장해 사용자가 파일을 실행하도록 유도
[그림 2] 정상 파일로 위장한 LNK 파일
○ 각 파일의 링크 대상과 명령어 인수 확인 결과, 모두 시스템 프로세스 mshta.exe를 사용해 동일한 동작을 하는 악성 자바스크립트를 실행하는 것으로 분석
[그림 3] LNK 파일별 링크 대상 및 명령어 인수
○ 악성 자바스크립트 명령어는 결과적으로 파워셀 명령어를 실행해 [표 4]의 파일들을 생성하는 [표 5]의 동작을 수행하는 것으로 분석
•
“생성 파일 1”의 경우, 악성 행위가 확인되어 본 문서에서 상세분석 제공
•
“생성 파일 2”의 경우, 모든 파일의 내부 데이터가 [그림 6]과 같이 단순 및 동일하고 이번 분석에서 확보된 샘플에서는 악성행위에 활용되지 않는 것으로 확인
No | LNK 파일 | 생성 파일 1 | 생성 파일 2 |
1 | 20250201_388165727.eml.lnk | p.ps1 | b224 |
2 | 20250114_27263.docx.lnk | p.ps1 | a1149 |
3 | 20250206_68013.docx.lnk | d.ps1 | b261 |
[표 4] LNK 파일별 생성 파일 정보
단계 | 행위 |
1 | 파일 크기 정보를 사용해 자기 자신을 검색 |
2 | 파일 끝부분 데이터를 획득하여 %PROGRAMDATA% 폴더에 “생성 파일 1“을 생성 |
3 | %PROGRAMDATA% 폴더에 “생성 파일 2”을 생성 |
4 | “생성 파일 1“를 실행 |
[표 5] 악성 자바스크립트에 의해 실행되는 파워쉘 코드 동작 과정
[그림 4] 악성 자바스크립트에 의해 실행되는 파워쉘 코드
[그림 5] 악성 LNK 파일들의 끝부분에 존재하는 “생성 파일 1” 데이터 일부
[그림 6] “생성 파일 2”의 내부 데이터
4.2. 생성된 .ps1 파일 - 파일 다운로드 및 지속성 확보
○ 각 LNK 파일은 [표 6]과 같이 PS1 파일을 생성 후 실행
LNK 파일 | PS1 파일 | MD5 |
20250201_388165727.eml.lnk | p.ps1 | f792d1864e7e92fe25daa73fe964bdea |
20250114_27263.docx.lnk | p.ps1 | ca9b8df227469c7e6d745cc267db80ba |
20250206_68013.docx.lnk | d.ps1 | 11a100d560ebee05dd8467e5eb790c49 |
[표 6] LNK 파일별 생성 파일 정보
○ 생성된 PS1 파일들은 Base64로 암호화된 데이터와 복호화 코드가 난독화되어 있는 파워셀 스크립트 파일로 확인
[그림 7] 난독화된 파워쉘 코드 일부
[그림 8] 난독화되어 있던 Base64 암호화 데이터 일부
[그림 9] 난독화되어 있던 복호화 코드
○ 각 PS1 파일의 해시 값들은 상이했으나 난독화 해제 및 Base64 복호화를 통해 확인한 결과, 다운로드 C2, 사용 변수명, 생성 파일명 등의 차이만 있을 뿐 [표 7]과 같이 2개의 ZIP 파일, 1개의 PS1 파일 다운로드해 처리하는 동일한 동작을 수행하는 코드
LNK 파일 | PS1 파일 | C2 | 생성 파일 |
20250201_388165727.eml.lnk | p.ps1 | https://www.dropbox.com/scl/fi/icvpzbx4vn6lcthva168z/zzJG.zip?rlkey=kntc36792grkm64xriqputbdq&st=px51yl8u&dl=1 | gs.zip |
74[.]50[.]94[.]175[:]9992 | t.zip | ||
74[.]50[.]94[.]175[:]7032 | tmps3.ps1 | ||
20250114_27263.docx.lnk | p.ps1 | https://www.dropbox.com/scl/fi/lpgj7eek9jczsx2ey83tk/zzG.zip?rlkey=lngmcnnjatzijm02oex219ffy&st=lwe8y29g&dl=1 | gs.zip |
74[.]50[.]94[.]175[:]9992 | t.zip | ||
74[.]50[.]94[.]175[:]7032 | tmps3.ps1 | ||
20250206_68013.docx.lnk | d.ps1 | https://www.dropbox.com/scl/fi/qde76i5ppqjdom9goxy9b/zzJG_2.zip?rlkey=g3mwyqarn84w0g7lnjq6awvgo&st=b9z4ng6j&dl=1 | gs.zip |
74[.]50[.]94[.]175[:]7648 | k.zip | ||
74[.]50[.]94[.]175[:]7032 | tmps2.ps1 |
[표 7] LNK 파일별 다운로드 및 생성 파일 정보
[그림 10] 각 PS1 파일에서 확인한 유사 코드 일부
○ Dropbox에서 다운로드되어 gs.zip으로 생성되는 파일들은 이미 삭제된 상태로 확인되었으나, VirusTotal에서 해당 파일들을 확보하여 분석을 진행
[그림 11] 삭제된 Dropbox 파일
○ 확보한 파일들은 [표 8]과 같이 동일한 파일명을 가진 파일들 압축되어 있고, 모두 [표 9]의 과정을 따라 지속성 확보 및 실행되는 것으로 분석
Dropbox 파일 | 내부 파일 | MD5 |
zzJG.zip | 83972.tmp | e96157d3b82008c5e3142a57584678cb |
G3892.tmp | 99f9419d756729bc97d687f845d77783 | |
zzG.zip | 83972.tmp | 2af6fb5bc3137eb297c6560e267d8193 |
G3892.tmp | 9f1c9fc7aa773e7a86a79180c42887e1 | |
zzJG_2.zip | 83972.tmp | 5fca1117c0e5ee6de3c169eebc903227 |
G3892.tmp | 1e9d94d88fdac3c4a0a47a3a1d07e329 |
[표 8] gs.zip 압축 파일 정보
단계 | 행위 |
1 | Dropbox에서 %PROGRAMDATA% 폴더에 gs.zip 파일 다운로드 |
2 | %PROGRAMDATA% 폴더에 압축 해제 |
3 | CMD 명령어를 사용해 83972.tmp를 2분마다 실행되도록 작업 스케줄러에 등록 |
4 | CMD 명령어를 사용해 83972.tmp를 Run 레지스트리에 등록 |
5 | G3892.tmp 파일 실행 |
[표 9] gs.zip 파일 처리 과정 (모든 PS1 파일에서 동일)
[그림 12] gs.zip 처리 코드 일부 (모든 PS1 파일에서 동일)
○ d.ps1 파일에서 74[.]50[.]94[.]175의 7628번 포트로 다운로드되는 k.zip은 C2가 닫혀있어 VirtusTotal를 통해 파일을 확보하여 [표 10]의 파일들이 포함된 것으로 확인
다운로드 | 내부 파일 | MD5 |
k.zip | N9371.js | ae6ebf3fcde78bb6da37e302a2a579ee |
tt8.tmp | 3126dfaee1fc0c05f62bafcbbc49782d | |
38243.tmp | d916a1648c2de4c4e5f10fdc3f64d40d | |
nD9327.tmp | 245d729238809b580179b70b7347cf65 |
[표 10] k.zip에 포함된 파일 정보
○ p.ps1 파일들에서 74[.]50[.]94[.]175의 9992번 포트로 다운로드되는 t.zip은 직접적인 내부 파일 확인은 어려웠지만, 코드 상에서 t.zip 내부의 M3762.js와 29184.tmp 파일이 사용된 것이 확인되었고 d.ps1과 p.ps1 코드의 유사성으로 보아 k.zip과 내부 파일이 유사했을 것으로 추정
다운로드 | 내부 파일 | 정보 |
t.zip | M3762.js | 코드 상으로 존재가 확인 |
(?) | 확인은 불가하였으나 존재했을 것으로 추정 | |
29184.tmp | 코드 상으로 존재가 확인 | |
(?) | 확인은 불가하였으나 존재했을 것으로 추정 |
[표 11] t.zip에 포함된 파일 정보(추정)
[그림 13] 코드 상으로 확인된 t.zip 내부 파일 일부
○ k.zip과 t.zip은 각 PS1 파일에서 동일한 [표 12]의 과정에 의해 Run 레지스트리와 작업 스케줄러에 등록되어 지속성을 확보하는 것으로 분석
단계 | 행위 |
1 | 74[.]50[.]94[.]175에서 %PRAGRAMDATA% 폴더에 k.zip(t.zip) 파일 다운로드 |
2 | %PROGRAMDATA% 폴더에 압축 해제 후 k.zip(t.zip) 삭제 |
3 | CMD를 사용해 N9371.js(M3762.js)를 Run 레지스트리에 등록 |
4 | CMD를 사용해 38243.tmp(29184.tmp)를 2분마다 실행되도록 스케줄러에 등록 |
[표 12] k.zip과 t.zip 파일의 지속성 확보 과정
[그림 14] k.zip과 t.zip의 동일한 지속성 확보 과정
○ 무한루프를 통해 74[.]50[.]94[.]175의 7032번 포트에서 데이터를 다운로드하여 tmps2.ps1 또는 tmps3.ps1으로 저장한 후 실행하는 원격 파워셀 코드실행 기능이 모든 PS1 파일에서 동일하게 확인
[그림 15] 무한루프를 통해 원격 파워쉘 명령어를 실행 (모든 PS1 파일 동일)
4.3. 83972.tmp(gs.zip) - G3892.tmp 실행
○ 확보된 gs.zip에서 확인 가능한 83972.tmp 파일 3건에 대한 분석을 진행
Dropbox | 내부 파일 | MD5 |
zzJG.zip | 83972.tmp | e96157d3b82008c5e3142a57584678cb |
G3892.tmp | 99f9419d756729bc97d687f845d77783 | |
zzG.zip | 83972.tmp | 2af6fb5bc3137eb297c6560e267d8193 |
G3892.tmp | 9f1c9fc7aa773e7a86a79180c42887e1 | |
zzJG_2.zip | 83972.tmp | 5fca1117c0e5ee6de3c169eebc903227 |
G3892.tmp | 1e9d94d88fdac3c4a0a47a3a1d07e329 |
[표 13] 확보된 gs.zip 압축 파일 정보
○ 83972.tmp들은 모두 반복 횟수의 차이만 있을 뿐 동일한 방식의 난독화가 적용된 문자열과 난독화 해제 코드가 존재하는 악성 자바스크립트 파일로 확인
○ PS1 파일에서 설정된 Run 레지스트리와 작업 스케줄러에 의해서 2분마다 실행
[그림 16] 83972.tmp 파일 내의 난독화된 문자열
[그림 17] 83972.tmp 파일 내의 난독화 해제 코드 일부
○ 모든 83972.tmp 파일의 난독화 해제된 문자열에 gs.zip의 G3892.tmp 파일을 실행하는 동일한 파워셀 코드가 존재하는 것으로 보아, 83972.tmp은 작업 스케줄러 및 Run 레지스트리에 등록되어 G3892.tmp 파일을 실행시키는 로더 역할의 파일로 분석
[그림 18] 문자열 난독화 해제 결과
[그림 19] G3892.tmp를 실행시키는 코드 (모든 83972.tmp에서 동일)
4.4. G3892.tmp(gs.zip) - 시스템 정보 수집 및 전송
○ 확보된 gs.zip에서 확인 가능한 G3892.tmp 파일 3건에 대한 분석을 진행
Dropbox | 내부 파일 | MD5 |
zzJG.zip | 83972.tmp | e96157d3b82008c5e3142a57584678cb |
G3892.tmp | 99f9419d756729bc97d687f845d77783 | |
zzG.zip | 83972.tmp | 2af6fb5bc3137eb297c6560e267d8193 |
G3892.tmp | 9f1c9fc7aa773e7a86a79180c42887e1 | |
zzJG_2.zip | 83972.tmp | 5fca1117c0e5ee6de3c169eebc903227 |
G3892.tmp | 1e9d94d88fdac3c4a0a47a3a1d07e329 |
[표 14] 확보된 gs.zip 압축 파일 정보
○ 모든 G3892.tmp 파일들은 Base64로 암호화된 데이터와 복호화 코드가 난독화된 파워셀 스크립트 파일로 83972.tmp 로더에 의해서 실행
[그림 20] G3892.tmp 내부의 난독화된 문자열
[그림 21] 난독화되어 있던 Base64 암호화 데이터 일부
[그림 22] 난독화되어 있던 확인된 복호화 코드
○ 난독화 해제 및 Base64 복호화를 통해 확인한 결과, 각 파일은 [표 15]의 정보를 사용해 Google Drive의 AccessToken을 발급 받아 로그 파일 업로드 및 추가 파일 다운로드를 수행하는 것으로 분석
•
zzJG.zip와 zzG.zip에서 사용된 토큰 정보는 동일한 것으로 확인
파일명 | 사용 정보 | 데이터 |
G3892.tmp
(zzJG.zip) | client_id | 71532697854-ef1nlsl4cjn4scm57dsf1685leiunavu.apps.googleusercontent.com |
client_secret | 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 | |
G3892.tmp
(zzG.zip) | client_id | 71532697854-ef1nlsl4cjn4scm57dsf1685leiunavu.apps.googleusercontent.com |
client_secret | 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 | |
G3892.tmp
(zzJG_2.zip) | client_id | 159263970130-1gil63rpicrhtbo4he4qvnfiks351oc4.apps.googleusercontent.com |
client_secret | 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 |
[표 15] Google Drive 토큰 발급 시 사용되는 정보
[그림 23] Google Drive 토큰 발급 코드
○ 모든 G3892.tmp 파일은 실행 시작 후 [표 14]의 정보를 사용해 현재 시간이 포함된 로그 파일 ($userObj)_($curTime)_Result_log.txt를 GoogleDrive에 업로드하여 악성코드 실행을 공지
•
zzJG.zip와 zzG.zip이 사용하는 folderId와 objName 정보는 동일한 것으로 확인
파일명 | 사용 정보 | 데이터 |
G3892.tmp
(zzJG.zip) | folderId | 1m3Z22KdkwaiW8VTeeGbARdCcfCmoBRCy |
objName | ttt | |
G3892.tmp
(zzG.zip) | folderId | 1m3Z22KdkwaiW8VTeeGbARdCcfCmoBRCy |
objName | ttt | |
G3892.tmp
(zzJG_2.zip) | folderId | 1lvY-PLtOkcA8clrQABWUWUMhRkgAsMsa |
objName | uuu |
[표 16] Google Drive 로그 업로드 시 사용되는 정보
[그림 24] 로그를 업로드하는 코드 일부 (모든 G3892.tmp 동일)
○ 이후 Google Drive에서 [표 17]의 과정을 따라 특정 파일들을 검색하여 tmps4.ps1으로 다운로드 후 실행한 결과를 ($userObj)_($curTime)_result.txt로 업로드하는 것으로 분석
단계 | 행위 |
1 | Google Drive에서 검색한 파일을 %PROGRAMDATA% 폴더에 tmps4.ps1로 다운로드 |
2 | 다운로드한 파일은 Google Drive에서 삭제 |
3 | tmps4.ps1 실행 후 결과를 현재 시간을 파일명으로 %PROGRAMDATA% 폴더에 저장 |
4 | 실행 결과를 ($userObj)_($curTime)_result.txt 파일로 업로드 |
5 | 업로드 후 로컬에 생성했던 파일은 삭제 |
[표 17] G3892.tmp 동작 과정
[그림 25] 파일 검색 코드
[그림 26] 추가 파일 다운로드 및 실행 코드 일부
[그림 27] 결과 파일 업로드 코드 일부
○ zzJG.zip과 zzG.zip에서 사용했던 Google Drive 폴더는 내부 확인이 가능했으나, 실행 시작 관련 로그 파일만 확인 가능했고 추가적으로 다운로드 및 실행하는 tmp4.ps1과 관련된 파일은 이미 삭제되어 확인이 불가능한 상태
[그림 28] zzJG.zip과 zzG.zip에서 사용하는 폴더 내부
[그림 29] 실행 시작 로그 파일 내용
○ 하지만 kimsuky 그룹이 이전에 사용했던 악성 파워셀 스크립트(MD5: 85cdfd80e45269c30948dc642f4070a5)를 살펴보면 [표 18]의 시스템 정보를 탈취 후 Dropbox를 통해 업로드했던 이력이 존재
탈취 정보 | ||
마지막 부팅 시간 | OS 제품명 | OS 빌드넘버 |
OS 아키텍처 | OS 버전 | OS 설치 날짜 |
설치된 Anti-Virus 리스트 | 프로세스 리스트 | PC 종류 (노트북/데스크탑) |
[표 18] Kimsuky 그룹이 이전에 탈취한 시스템 정보
○ G3892.tmp 파일에 로그 업로드 부분만 존재하고 시스템 정보 탈취 부분이 없는 것으로 보아 Google Drive에서 다운로드된 tmps4.ps1은 시스템 정보를 탈취하는 파워셀 스크립트로 추정
[그림 30] Kimsuky 그룹이 이전에 사용한 파워쉘 스크립트 일부
4.5. N9371.js(k.zip) - tt8.tmp 실행
○ 각 PS1 파일에서 다운로드된 ZIP 파일 중 확보된 k.zip 파일에 대한 분석을 진행
○ “4.3 83972.tmp(gs.zip)”에서 설명한 파일과 동일한 난독화 기법이 적용된 자바스크립트 파일로 d.ps1에서 설정된 Run 레지스트리에 의해서 시스템 시작 시 실행
[그림 31] N9371.js 내부의 난독화된 문자열
○ 난독화 해제를 통해 확인한 문자열에 k.zip의 tt8.tmp 파일을 실행하는 파워셀 코드가 존재하는 것으로 보아, N9371.js 파일은 Run 레지스트리에 등록되어 tt8.tmp 파일을 실행시키는 로더 역할의 파일로 분석
[그림 32] 문자열 난독화 해제 결과
[그림 33] tt8.tmp를 실행하는 파워쉘 코드
4.6. tt8.tmp(k.zip) - 원격 코드 실행(즉시)
○ “4.2 d.ps1”에서 설명한 파일과 동일한 난독화 기법이 적용된 파워셀 스크립트 파일로 N9371.js 로더에 의해서 실행
[그림 34] tt8.tmp 내부에 난독화된 문자열
[그림 35] 난독화되어 있던 Base64 암호화 데이터 및 복호화 코드
○ “4.2 d.ps1”에서 설명한 tmps2.ps1 원격 코드 실행 기능과 유사한 [표 19]의 동작을 수행
단계 | 행위 |
1 | “Vndu677”이라는 이름의 뮤텍스 생성을 통해 중복 실행 체크 |
2 | 이미 실행 중이라면 종료 |
3 | 실행 중이 아니라면 뮤텍스를 생성 |
4 | 74[.]50[.]94[.]175[:]7032에서 데이터를 읽어 %PROGRAMDATA% 폴더에 tmps2.ps1로 저장 |
5 | tmps2.ps1 실행 후 삭제 |
[표 19] tt8.tmp의 tmps2.ps1 실행 과정
[그림 36] Mutex 체크 코드
[그림 37] 원격 코드 실행
4.7. 38243.tmp(k.zip) - nD9327.tmp 실행
○ “4.3 83972.tmp(gs.zip)”에서 설명한 파일과 동일한 난독화 기법이 적용된 자바스크립트 파일로 d.ps1에서 설정된 작업 스케줄러에 의해서 2분마다 실행
[그림 38] 38243.tmp 내부에 난독화된 문자열
○ 난독화 해제를 통해 확인한 문자열에 k.zip의 nD9327.tmp 파일을 실행하는 파워셀 코드가 존재하는 것으로 보아, 38243.tmp 파일은 작업 스케줄러에 등록되어 nD9327.tmp 파일을 실행시키는 로더 역할의 파일로 분석
[그림 39] 자바스크립트 문자열 난독화 해제 결과
[그림 40] nD9327.tmp를 실행하는 파워쉘 코드
4.8. nD9327.tmp(k.zip) - 원격 코드 실행(반복)
○ “4.2 d.ps1”에서 설명한 파일과 동일한 난독화 기법이 적용된 파워셀 스크립트 파일로 38243.tmp 로더에 의해서 실행
[그림 41] nD9327.tmp 내부에 난독화된 문자열
[그림 42] 난독화 해제를 통해 확인된 Base64 암호화 데이터와 복호화 코드
○ Base64 복호화를 통해 확인한 결과, 74[.]50[.]94[.]175[:]7031에서 데이터를 읽어 qos.ps1 파일을 생성해 실행하는 원격 코드 실행 기능으로 분석
•
무한루프를 통해 즉시 원격 코드를 실행할 수 있는 tt8.tmp 파일과는 달리 작업 스케줄러에 등록된 nD9327.tmp 로더에 의해 주기적으로 실행된다는 차이점이 존재
[그림 43] 원격 코드 실행
4.9. 최종 악성 코드 - PebbleDash, RDP Wrapper
○ Kimsuky 그룹은 스피어피싱으로 LNK 파일을 유포하여 파워셀을 통한 원격 코드 실행으로 PebbleDash 백도어 악성코드와 Github에 공개된 오픈소스 원격 접속 도구 RDP Wrapper을 사용해 피해자의 시스템을 원격으로 제어하는 것으로 알려짐
[그림 44] 오픈소스 원격 접속 도구 RDP Wrapper
○ 분석 과정에서 Kimsuky 그룹이 사용했다고 알려진 PebbleDash 백도어 관련 IoC 정보인 [표 20]을 확인하여 본 문서에 IoC 정보를 추가
- 확인 과정에서 3번, 4번 샘플은 기문서 “[IG-25-4006-O] 북한발 PebbleDash 백도어 악성코드 분석 공유”에서 분석한 샘플과 동일한 코드가 존재하는 유사 샘플로 확인
No | MD5 | 악성코드 종류 |
1 | 15dc6a28b875b4706bcc0db4a026aeb0 | PebbleDash |
2 | 7349683077ce4fcac77580848182ead9 | PebbleDash |
3 | 31345cc286bfb2b3edcee6c960f11c3f | PebbleDash |
4 | a573b15586e4313832f269b162a04514 | PebbleDash |
5 | 2c98bfc9f76352c82dc57edd98dce9a8 | PebbleDash |
[표 20] PebbleDash 관련 IoC 정보
[그림 45] 기문서[IG-25-4006-O]에서 분석된 샘플과 동일한 코드
○ PebbleDash 백도어는 [표 21]의 기능을 하는 것으로 알려졌으며 상세분석은 기문서 “[IG-25-4006-O] 북한발 PebbleDash 백도어 악성코드 분석 공유” 참고
No | 기능 | No | 기능 |
1 | 드라이브 정보 탈취 | 7 | 파일 업로드(탈취) |
2 | 프로세스 정보 탈취 | 8 | 파일 다운로드 |
3 | 시스템 정보 탈취 | 9 | 파일 속성 변경 |
4 | 파일 정보 탈취 | 10 | 파일 삭제 |
5 | 파일 및 디렉토리 정보 탈취 | 11 | 프로세스 실행 |
6 | 커맨드라인 명령 수행 및 결과 탈취 | 12 | 프로세스 종료 |
[표 21] PebbleDash의 주요 기능
5. IoC 정보
NO | Type | Data | Info |
1 | MD5 | 8ac5d4d3a68ca82b190bceb8cf7cb07e | 20250201_388165727.eml.lnk |
2 | MD5 | 8b541e4da55cb41e3304bda5ea568eb7 | 20250114_27263.docx.lnk |
3 | MD5 | 5e040663bbe55915a67f696a6aafb81a | 20250206_68013.docx.lnk |
4 | MD5 | f792d1864e7e92fe25daa73fe964bdea | p.ps1 (...388165727.eml.lnk) |
5 | MD5 | ca9b8df227469c7e6d745cc267db80ba | p.ps1 (...27263.docx.lnk) |
6 | MD5 | 11a100d560ebee05dd8467e5eb790c49 | d.ps1 (...68013.docx.lnk) |
7 | MD5 | 0d6f3ce0c314e611f4e933dd6c17f2e3 | zzJG.zip |
8 | MD5 | 42f2dbc68c6a4844474c695bf8000420 | zzG.zip |
9 | MD5 | c0375790762356a5652719b97a7b5602 | zzJG_2.zip |
10 | MD5 | e96157d3b82008c5e3142a57584678cb | 83972.tmp (zzJG.zip) |
11 | MD5 | 99f9419d756729bc97d687f845d77783 | G3892.tmp (zzJG.zip) |
12 | MD5 | 2af6fb5bc3137eb297c6560e267d8193 | 83972.tmp (zzG.zip) |
13 | MD5 | 9f1c9fc7aa773e7a86a79180c42887e1 | G3892.tmp (zzG.zip) |
14 | MD5 | 5fca1117c0e5ee6de3c169eebc903227 | 83972.tmp (zzJG_2.zip) |
15 | MD5 | 1e9d94d88fdac3c4a0a47a3a1d07e329 | G3892.tmp (zzJG_2.zip) |
16 | MD5 | ae6ebf3fcde78bb6da37e302a2a579ee | N9371.js |
17 | MD5 | 3126dfaee1fc0c05f62bafcbbc49782d | tt8.tmp |
18 | MD5 | d916a1648c2de4c4e5f10fdc3f64d40d | 38243.tmp |
19 | MD5 | 245d729238809b580179b70b7347cf65 | nD9327.tmp |
20 | MD5 | 15dc6a28b875b4706bcc0db4a026aeb0 | (PebbleDash) |
21 | MD5 | 7349683077ce4fcac77580848182ead9 | (PebbleDash) |
22 | MD5 | 31345cc286bfb2b3edcee6c960f11c3f | (PebbleDash) |
23 | MD5 | a573b15586e4313832f269b162a04514 | (PebbleDash) |
24 | MD5 | 2c98bfc9f76352c82dc57edd98dce9a8 | (PebbleDash) |
25 | C2 | https://www.dropbox.com/scl/fi/icvpzbx4vn6lcthva168z/zzJG.zip?rlkey=kntc36792grkm64xriqputbdq&st=px51yl8u&dl=1 | zzJG.zip 다운로드 |
26 | C2 | https://www.dropbox.com/scl/fi/lpgj7eek9jczsx2ey83tk/zzG.zip?rlkey=lngmcnnjatzijm02oex219ffy&st=lwe8y29g&dl=1 | zzG.zip 다운로드 |
27 | C2 | https://www.dropbox.com/scl/fi/qde76i5ppqjdom9goxy9b/zzJG_2.zip?rlkey=g3mwyqarn84w0g7lnjq6awvgo&st=b9z4ng6j&dl=1 | zzJG_2.zip 다운로드 |
28 | C2 | 74[.]50[.]94[.]175[:]9992 | t.zip 다운로드 |
29 | C2 | 74[.]50[.]94[.]175[:]7628 | k.zip 다운로드 |
30 | C2 | 74[.]50[.]94[.]175[:]7032 | tmps2.ps1(tmps3.ps1) 다운로드 |
31 | C2 | 74[.]50[.]94[.]175[:]7031 | qos.ps1 다운로드 |




.png&blockId=1f5f216a-760c-8036-a2bd-e975bf650787)
_%EC%95%85%EC%84%B1_%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90_%EC%9D%98%ED%95%B4_%EC%8B%A4%ED%96%89%EB%90%98%EB%8A%94_%ED%8C%8C%EC%9B%8C%EC%85%80_%EC%BD%94.png&blockId=1f5f216a-760c-80f4-95b7-c25a8f6cdcb2)
.png&blockId=1f5f216a-760c-80f6-bf97-ed23378b2206)
.png&blockId=1f5f216a-760c-80bd-abf1-d1c4ec0559d5)
_%EB%82%9C%EB%8F%85%ED%99%94%EB%90%9C_%ED%8C%8C%EC%9B%8C%EC%85%80_%EC%BD%94%EB%93%9C_%EC%9D%BC%EB%B6%80.png&blockId=1f5f216a-760c-80eb-9eba-cb2797486f78)
_%EB%82%9C%EB%8F%85%ED%99%94%EB%90%98%EC%96%B4_%EC%9E%88%EB%8D%98_Base64_%EC%95%94%ED%98%B8%ED%99%94_%EB%8D%B0%EC%9D%B4%ED%84%B0_%EC%9D%BC%EB%B6%80.png&blockId=1f5f216a-760c-80bb-870d-c29bdf4d5299)
_%EB%82%9C%EB%8F%85%ED%99%94%EB%90%98%EC%96%B4_%EC%9E%88%EB%8D%98_%EB%B3%B5%ED%98%B8%ED%99%94_%EC%BD%94%EB%93%9C.png&blockId=1f5f216a-760c-8049-b799-e9aa4f3757b5)
.png&blockId=1f5f216a-760c-80c0-a511-e043b6b1a2a1)
.png&blockId=1f5f216a-760c-807e-89ee-e39e75a80780)
_gs.zip_%EC%B2%98%EB%A6%AC_%EC%BD%94%EB%93%9C_%EC%9D%BC%EB%B6%80.png&blockId=1f5f216a-760c-80a5-8951-e0fb8ba1068d)
.png&blockId=1f5f216a-760c-8003-9fd6-e98f97627444)
.png&blockId=1f5f216a-760c-80cb-93ba-fa4fd480ee56)
.png&blockId=1f5f216a-760c-805a-8065-d76ce19e85d3)
_83972.tmp_%ED%8C%8C%EC%9D%BC_%EB%82%B4%EC%9D%98_%EB%82%9C%EB%8F%85%ED%99%94%EB%90%9C_%EB%AC%B8%EC%9E%90%EC%97%B4.png&blockId=1f5f216a-760c-803e-88ae-c7f97163724e)
_83972.tmp_%ED%8C%8C%EC%9D%BC_%EB%82%B4%EC%9D%98_%EB%82%9C%EB%8F%85%ED%99%94_%ED%95%B4%EC%A0%9C_%EC%BD%94%EB%93%9C_%EC%9D%BC%EB%B6%80.png&blockId=1f5f216a-760c-806f-866f-f3f7da9fc4ff)
_%EB%AC%B8%EC%9E%90%EC%97%B4_%EB%82%9C%EB%8F%85%ED%99%94_%ED%95%B4%EC%A0%9C_%EA%B2%B0%EA%B3%BC.png&blockId=1f5f216a-760c-8099-b940-df78563eed30)
.png&blockId=1f5f216a-760c-80a0-91b5-ea8b55af8293)
_G3892.tmp_%EB%82%B4%EB%B6%80%EC%9D%98_%EB%82%9C%EB%8F%85%ED%99%94%EB%90%9C_%EB%AC%B8%EC%9E%90%EC%97%B4.png&blockId=1f5f216a-760c-80b2-8288-e05c71eb8583)
_%EB%82%9C%EB%8F%85%ED%99%94%EB%90%98%EC%96%B4_%EC%9E%88%EB%8D%98_Base64_%EC%95%94%ED%98%B8%ED%99%94_%EB%8D%B0%EC%9D%B4%ED%84%B0_%EC%9D%BC%EB%B6%80.png&blockId=1f5f216a-760c-8020-9c5c-f354db51034c)
_%EB%82%9C%EB%8F%85%ED%99%94%EB%90%98%EC%96%B4_%EC%9E%88%EB%8D%98_%ED%99%95%EC%9D%B8%EB%90%9C_%EB%B3%B5%ED%98%B8%ED%99%94_%EC%BD%94%EB%93%9C.png&blockId=1f5f216a-760c-8057-bf23-cf8de521b597)
_GoogleDrive_%ED%86%A0%ED%81%B0_%EB%B0%9C%EA%B8%89_%EC%BD%94%EB%93%9C.png&blockId=1f5f216a-760c-80be-8dd1-ff91bc508599)
_%EB%A1%9C%EA%B7%B8_%EC%97%85%EB%A1%9C%EB%93%9C%ED%95%98%EB%8A%94_%EC%BD%94%EB%93%9C_%EC%9D%BC%EB%B6%80.png&blockId=1f5f216a-760c-80bf-a458-d04264aa5420)
_%ED%8C%8C%EC%9D%BC_%EA%B2%80%EC%83%89_%EC%BD%94%EB%93%9C.png&blockId=1f5f216a-760c-8088-a3be-e04bd9037451)
_%EC%B6%94%EA%B0%80_%ED%8C%8C%EC%9D%BC_%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C_%EB%B0%8F_%EC%8B%A4%ED%96%89_%EC%BD%94%EB%93%9C_%EC%9D%BC%EB%B6%80_.png&blockId=1f5f216a-760c-8022-a9d2-e42ba5a95699)
_%EA%B2%B0%EA%B3%BC_%ED%8C%8C%EC%9D%BC_%EC%97%85%EB%A1%9C%EB%93%9C_%EC%BD%94%EB%93%9C_%EC%9D%BC%EB%B6%80.png&blockId=1f5f216a-760c-8089-8513-ed7d3d0f4332)
_GoogleDrive_%ED%8F%B4%EB%8D%94_%EB%82%B4%EB%B6%80.png&blockId=1f5f216a-760c-8055-9f1a-f555a4864a90)
_%EC%8B%A4%ED%96%89_%EC%8B%9C%EC%9E%91_%EB%A1%9C%EA%B7%B8_%ED%8C%8C%EC%9D%BC_%EB%82%B4%EC%9A%A9.png&blockId=1f5f216a-760c-8099-a815-f1669805900b)
_Kimsuky_%EA%B7%B8%EB%A3%B9%EC%9D%B4_%EC%9D%B4%EC%A0%84%EC%97%90_%EC%82%AC%EC%9A%A9%ED%95%9C_%ED%8C%8C%EC%9B%8C%EC%85%80_%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8_%EC%9D%BC%EB%B6%80.png&blockId=1f5f216a-760c-8052-a9ae-e593f21cdbf0)
_N9371.js_%EB%82%B4%EB%B6%80%EC%9D%98_%EB%82%9C%EB%8F%85%ED%99%94%EB%90%9C_%EB%AC%B8%EC%9E%90%EC%97%B4.png&blockId=1f5f216a-760c-80ca-a1f7-fef9f43fb4a7)

_tt8.tmp%EB%A5%BC_%EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94_%ED%8C%8C%EC%9B%8C%EC%85%80_%EC%BD%94%EB%93%9C.png&blockId=1f5f216a-760c-80e6-888b-f88a69c4abb6)
_tt8.tmp_%EB%82%B4%EB%B6%80%EC%97%90_%EB%82%9C%EB%8F%85%ED%99%94%EB%90%9C_%EB%AC%B8%EC%9E%90%EC%97%B4.png&blockId=1f5f216a-760c-8067-aa13-e24150afd8b7)
_%EB%82%9C%EB%8F%85%ED%99%94%EB%90%98%EC%96%B4_%EC%9E%88%EB%8D%98_Base64_%EC%95%94%ED%98%B8%ED%99%94_%EB%8D%B0%EC%9D%B4%ED%84%B0_%EB%B0%8F_%EB%B3%B5%ED%98%B8%ED%99%94_%EC%BD%94%EB%93%9C.png&blockId=1f5f216a-760c-8020-83c5-fc37ee706a31)
_Mutex_%EC%B2%B4%ED%81%AC_%EC%BD%94%EB%93%9C.png&blockId=1f5f216a-760c-8086-9c5a-d515f586cab7)
_%EC%9B%90%EA%B2%A9_%EC%BD%94%EB%93%9C_%EC%8B%A4%ED%96%89.png&blockId=1f5f216a-760c-80ed-8d85-d81da1a748cc)
_38243.tmp_%EB%82%B4%EB%B6%80%EC%97%90_%EB%82%9C%EB%8F%85%ED%99%94%EB%90%9C_%EB%AC%B8%EC%9E%90%EC%97%B4.png&blockId=1f5f216a-760c-8040-81ac-f22e2825b8c0)
_%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8_%EB%AC%B8%EC%9E%90%EC%97%B4_%EB%82%9C%EB%8F%85%ED%99%94_%ED%95%B4%EC%A0%9C_%EA%B2%B0%EA%B3%BC.png&blockId=1f5f216a-760c-8032-a639-c94d62622ab9)
_nD9327.tmp%EB%A5%BC_%EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94_%ED%8C%8C%EC%9B%8C%EC%85%80_%EC%BD%94%EB%93%9C.png&blockId=1f5f216a-760c-80d8-b390-ee18a9d798da)
_nD9327.tmp_%EB%82%B4%EB%B6%80%EC%97%90_%EB%82%9C%EB%8F%85%ED%99%94%EB%90%9C_%EB%AC%B8%EC%9E%90%EC%97%B4.png&blockId=1f5f216a-760c-8036-ad2a-eaef4341e1e8)
_%EB%82%9C%EB%8F%85%ED%99%94_%ED%95%B4%EC%A0%9C%EB%A5%BC_%ED%86%B5%ED%95%B4_%ED%99%95%EC%9D%B8%EB%90%9C_Base64_%EC%95%94%ED%98%B8%ED%99%94_%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%99%80_%EB%B3%B5%ED%98%B8%ED%99%94_%EC%BD%94%EB%93%9C.png&blockId=1f5f216a-760c-800f-995a-d54d243720b2)
_%EC%9B%90%EA%B2%A9_%EC%BD%94%EB%93%9C_%EC%8B%A4%ED%96%89.png&blockId=1f5f216a-760c-809e-88ed-de41b17ba924)

.png&blockId=1f5f216a-760c-803a-8fb1-d12a1c9e20e1)

