위협 인텔리전스

국내 IP에서 유포된 PureCrypter 적용 Formbook 페이로드 분석

국내 IP에서 유포된 PureCrypter 적용 Formbook 페이로드 분석

엔키화이트햇

2025. 8. 29.

요약

  • 피싱 이메일 전송 및 악성코드 유포에 이용된 한국 ip를 식별했다.

  • 공격자는 PureCrypter로 패킹된 Formbook 악성코드를 사용했다.

  • 안티 디버깅, 여러 단계의 코드 인젝션 등 다양한 기법을 사용해 분석 난이도를 높이고 악성 행위를 은닉한다.

  • 공격에 사용된 C&C 서버와 타 Kimsuky 공격 인프라 사이의 유사성이 발견됐다.

1. 개요

2025년 5월경 국내 ip 158.247.250[.]251와 관련있는 다수의 RAR, EXE 파일이 발견되었다. 해당 ip는 과거 DNS 기록에서 네이버 관련 피싱 인프라로 의심되는 도메인이 확인되었으며, VirusTotal에 네이버 로그인 관련 URL 질의 기록이 남아있다.

158.247.250[.]251의 URL 질의 기록

caption - 158.247.250[.]251의 URL 질의 기록

그중에 관련된 이메일 파일, 해당 이메일 첨부 파일인 RAR, EXE 파일은 한국에서 보고되었으며, 이메일을 수신한 이메일 계정 또한 한국 에너지 기업의 도메인이다. ip와 관련된 악성코드들은 한국 외에도 다양한 국가에 서로 다른 파일 이름으로 유포되었다. 유포된 파일은 분석 결과 PureCrypter로 패킹된 Formbook 악성코드로 확인되었다.

2. 악성코드 분석

공격 개요도

caption - 공격 개요도

2.1. 초기 접근

초기 접근 시 outlook 피싱 이메일을 전송하였다. 이메일 수신 도메인은 국내 에너지 기업의 도메인으로 확인되었다. 이메일에는 항공 화물 운송장으로 위장한 EXE 파일이 RAR 압축되어 첨부되어 있으며, 압축 비밀번호는 설정되어 있지 않다.

피해자에게 전달된 피싱 이메일

caption - 피해자에게 전달된 피싱 이메일

이메일 발신자는 noreplychleeportchlee@dhl.com이다. 독일 소재 운송 업체의 도메인을 사칭한 것으로 보이며, 국제 운송 업체의 운송장 형태로 파싱 메일을 전송하는 전략은 과거부터 공격 행위자들이 초기 침투 방법으로 자주 이용해 왔다.

2.2. PureCrypter

이메일 첨부 파일의 압축을 해제하면 .NET 실행 파일이 나타난다. 해당 EXE 파일은 상용 .NET 로더인 PureCrypter의 첫 번째 스테이지로 확인되었다.

상용 .NET 로더인 PureCrypter는 2021년부터 판매되어 수많은 악성코드 유포에 사용되었다. 공격자는 Purecrypter를 사용해 지속성 확보 방식과 인젝션 방법 및 타겟, 보안 알고리즘 우회 기법 등 다양한 공격 설정을 커스텀할 수 있다. 공격자가 설정한 데이터는 Newtonsoft.json 프레임워크를 통해 직렬화 된 후 리소스 영역에 저장하며, 동작 시 이를 역직렬화 한 후 사용한다.

어셈블리 이름은 Utdmecvq.exe이며, 내부에서는 오픈소스인 MonoTorrent 관련 클래스들과 실제 행위를 수행하는 RemoteExecuterApp 클래스가 확인된다. RemoteExecuterApp 클래스에서만 메인 로직이 실행되며, 엔트리 포인트 또한 RemoteExecuterApp 클래스 내부에 존재한다.

Utdmecvq.exe 내부 클래스

caption - Utdmecvq.exe 내부 클래스

악성코드는 가장 먼저 User-Agent를 설정하여 C&C 서버에 다운로드 요청을 보낸다. 이를 통해 악성코드의 C&C 서버에 대한 다운로드 요청을 보편적인 브라우저에서 발생한 요청으로 위장한다.

다운로드 요청을 보내는 URL과 설정되는 User-Agent는 아래와 같다.

  • URL: http://158.247.250[.]251/Gmfbssvfg.vdf

  • User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:122.0) Gecko/20100101 Firefox/122.0

C&C 서버에서 암호화된 파일 다운로드

caption - C&C 서버에서 암호화된 파일 다운로드

다운로드에 성공하면, 다운로드한 파일을 Base64로 인코딩된 AES key와 IV 값으로 복호화 후 메모리에 로드한다. 이후 Ts8mNZe9r3J0nu8Oa0.e4XQsmqqJcMfslpD8o 클래스의 pY8vRcOLI 메소드를 Invoke한다.

  • base64 인코딩된 key : eq78+DV08bw6vTK7GtbEEcXfM/7YWzVL50qlG2HSJkY=

  • base64 인코딩된 IV : LqF17M9RPpHJCRbrkD6msw==

복호화 및 Invoke 로직

caption - 복호화 및 Invoke 로직

다운로드 후 복호화된 파일도 .NET 어셈블리 파일이며, 난독화 도구인 .NET Reactor 로 난독화되어 있다.

caption -복호화된 .NET 파일 정보

어셈블리 정보에서 Newtonsoft.Json 프레임워크 정보를 확인할 수 있고, 이는 악성코드가 PureCrypter를 이용한다는 것을 알 수 있다.

복호화된 .NET 파일 어셈블리 정보

caption - 복호화된 .NET 파일 어셈블리 정보

리소스 데이터 복호화

악성코드는 실행 후 가장 먼저 암호화된 리소스 영역의 데이터를 가져와 복호화 과정을 거친 뒤 해시 테이블 형태로 저장한다. 암호화 방식은 DES, AES, TDES, Rijndael, RC2, 커스텀 블록 암호 중 선택할 수 있다. 분석된 사례의 경우 AES 방식을 사용한다.

  • AES key(16 진수 형태): A872738399912091389AE9720D5E068A0EF3B7D4C42B1FF24EA864F6C85683E9

  • AES IV(16 진수 형태): F96CF8CAFBAF112548F6F122D9270CCA

문자열 테이블 구축 로직

caption - 문자열 테이블 구축 로직

복호화된 데이터는 테이블에는 악성코드 동작에 사용되는 각종 문자열들로, 이후 해시 테이블에 key값으로 접근해 문자열을 가져온다. 리소스 이름 문자열을 추출한 뒤에, Dnspy의 watch 기능을 이용해 AppDomain.CurrentDomain.GetData 메소드를 호출하면 복호화 완료된 Hashtable을 확인할 수 있다.

caption - 복호화된 문자열 테이블

설정 데이터 직렬화

PureCrypter 적용 시 인젝션 방식 및 타겟 프로세스, 보안 기능 우회 여부 등 각종 을 설정할 수 있다. 설정 데이터는 직렬화 및 AES 암호화되어 패킹 된 파일의 리소스 영역에 저장된다. 이후 런타임 중에 리소스 영역의 설정 정보를 동적으로 역직렬화하여 사용한다.

PureCrypter 설정 데이터 역직렬화 로직

caption - PureCrypter 설정 데이터 역직렬화 로직

설정 데이터 구조

데이터 인덱싱은 ProtoMember 기준으로 작성하였고, "페이로드 인젝션을 위한 설정 데이터", "탐지 우회를 위한 설정 데이터", "추가 기능을 위한 설정 데이터"가 존재한다.

1. 페이로드 인젝션에 사용되는 설정 데이터

| ProtoMember | Description | Info |
| --- | --- | --- |
| 1 | 인젝션 페이로드를 내부에 저장된 값을 사용할 , 다운로드할 결정하는 플래그 ( True면 내부 데이터 로드, False이면 외부에서 다운로드 ) | true |
| 2 | 인젝션 페이로드 또는 다운로드 url이 저장된 바이트 배열 | Formbook 페이로드 바이트 배열 |
| 3 | 악성코드 실행 프로세스가 64bit인지를 나타내는 플래그 | false |
| 4 | 페이로드를 인젝션할 방식을 결정하는 Enum ( 0: .NET 어셈블리 로드 Invoke, 1: 프로세스 할로잉, 2: Reflective DLL 인젝션 ) | 1 |
| 5 | 실행 또는 페이로드를 인젝션 타겟 프로세스 이름 문자열 | "Itself" |
| 6 | 인젝션 페이로드 실행 전달되는 명령줄 인자 문자열 | "" |
| 7 | 부모 프로세스로 사용할 프로세스의 이름 문자열 | "explorer" |
| 8 | 사용되지 않는  | null |
| 9 | 프로세스 생성 형태를 결정하는 DWORD  | 1 (보통 크기)

2. 탐지 우회를 위한 설정 데이터

| ProtoMember | Description | Info |
| --- | --- | --- |
| 1 | 악성코드 실행 SleepEx(999) 함수를 차례 수행할 결정하는 변수 | 0x15 |
| 2 | 뮤텍스 설정을 진행할 결정하는 플래그 | false |
| 3 | 뮤텍스 설정 사용되는 문자열 | "Xilnulmx" |
| 4 | 현재 실행중인 프로세스의 파일  %Temp%복사된 파일을 윈도우 디펜더 검사 대상에서 제외할 결정하는 플래그 | false |
| 5 | 시스템 프로세스 정보를 이용한 가상 머신 샌드박스 탐지 로직을 수행할 결정하는 플래그 | false |
| 6 | 프로세스 핸들 복제를 수행할 결정하는 플래그 | false |
| 7 | ip release 또는 renew 명령을 실행할 결정하는 플래그 | false |
| 8 | 추가 파워쉘 스크립트 문자열 | null |
| 9 | 라이브러리 후킹 탐지를 수행할 결정하는 플래그 | false |
| 10 | Amsi 우회를 수행할 결정하는 풀래그 | false |
| 11 | ETW 기반 탐지 우회를 수행할 결정하는 플래그 | false |
| 12 | 사용되지 않는  | false |
| 13 | 자가 삭제를 수행할 결정하는 플래그 | false |
| 16 | 추가 파워쉘 스크립트를 관리자 권한으로 실행할 결정하는 플래그 | false

3. 추가 기능을 위한 설정 데이터

3.1. 지속성 확보 설정 데이터

| ProtoMember | Description | Info |
| --- | --- | --- |
| 1 | 지속성 확보 방식을 결정하는 Enum ( 0: 레지스트리 등록, 1: 시작 프로그램 등록, 2: 작업 등록) | 1 |
| 2 | 자가 복제 경로로 사용되는 문자열 | "%appdata%" |
| 3 | 자가 복제 파일 명으로 사용되는 문자열 | "temp.exe" |
| 4 | 자가 복제 더미 바이트를 추가할 결정하는 플래그 | false

3.2. MessageBox 출력 설정 데이터

| ProtoMember | Description | Info |
| --- | --- | --- |
| 1 | MessageBox 출력 경고 또는 정보 표시를 결정하는 플래그 | false |
| 2 | MessageBox로 출력되는 문자열 | null

3.3. 파일 드롭 및 실행 설정 데이터

| ProtoMember | Description | Info (null) |
| --- | --- | --- |
| 1 | 드롭 실행되는 실행 파일 데이터 바이트 배열 | null |
| 2 | 드롭 실행되는 실행 파일 이름 문자열 | null |
| 3 | 파일 드롭 실행 여부를 결정하는 플래그 | false |
| 4 | 파일 드롭 실행 여부를 결정하는 플래그 | false

3.4. GZIP 압축 설정 데이터

| ProtoMember | Description | Info (null) |
| --- | --- | --- |
| 1 | 추가로 인젝션되는 GZIP 압축된 페이로드 | null

세부 동작

뮤텍스 생성

역직렬화된 구조체 멤버에서 특정 플래그를 검사해 True인 경우 뮤텍스를 생성한다. 분석된 악성코드는 플래그가 False로 설정되어 있다. 뮤텍스 생성 시 15초 동안 뮤텍스 획득을 위해 대기하고, ipconfig 명령어를 실행해 IP를 갱신한다. 뮤텍스 이름은 아래와 같다.

  • Xilnulmx

뮤텍스 설정 로직

caption - 뮤텍스 설정 로직

안티 디버깅

아래 조건들을 확인해 해당되는 경우 프로세스를 종료한다.

  • CheckRemoteDebuggerPresent() 메소드로 디버거가 탐지된 경우

  • 현재 실행중인 프로세스에 SbieDll.dll, cuckoomon.dll 모듈이 포함된 경우

  • 실행 환경 코어 수가 2개 이하인 경우

  • 현재 프로세스의 부모 프로세스 이름에 "cmd" 문자열이 포함된 경우

  • BIOS Version 및 SerialNumber에 "Microsoft", "VMWare", "Virtual" 문자열이 포함된 경우

  • BIOS manufacturer 및 model에 "Microsoft", "VMWare", "Virtual" 문자열이 포함된 경우

  • 모니터 해상도가 낮거나 32bit 운영체제인 경우

  • 사용자 이름이 "john", "anna", "xxxxxxxx"인 경우

IP Release

IP주소 release 여부를 확인해 ipconfig 명령어를 실행해 IP 주소 할당 해제한다.

IP release 명령어 실행 로직

caption - IP release 명령어 실행 로직

Amsi 우회

Amsi 검사에서 사용되는 AmsiScanBuffer 함수의 주소를 획득한 후 메모리 권한을 변경한다. 이후AmsiScanBuffer 함수가 호출될 때 Windows OS 비트 수에 따라 특정 값을 반환하고 즉시 종료되도록 패치한다.

AmsiScanBuffer 패치 로직

caption - AmsiScanBuffer 패치 로직

해당 메소드에서는 AmsiScanBuffer 문자열을 획득하기 위해 문자열에 포함된 "Janroe"를 제거한다.

Janroe 제거 로직

caption - Janroe 제거 로직

가공 전 AmsiScanBuffer 문자열

caption - 가공 전 AmsiScanBuffer 문자열

ETW 기반 탐지 우회

EtwEventWrite 또한 위의 AmsiScanBuffer와 동일한 방식으로 패치한다. AmsiScanBuffer 패치 로직과 달리 특정 문자열을 제거하지 않는다.

EtwEventWrite 패치 로직

caption - EtwEventWrite 패치 로직

안티 라이브러리 후킹

현재 실행중인 프로세스에 로드된 ntdll.dll 또는 kernel32.dll을 %System% 디렉토리의 원본 파일로 덮어쓴다.

안티 라이브러리 후킹을 위한 라이브러리 복원 로직

caption - 안티 라이브러리 후킹을 위한 라이브러리 복원 로직

Windows Defender 검사 제외

현재 실행중인 프로세스의 파일 경로가 "%appdata%\temp.exe"인지 확인한다. 경로가 다르다면 다음 Powershell 스크립트를 base64 인코딩한 뒤 -enc 옵션과 함께 주어 Powershell로 실행한다.

Add-MpPreference -ExclusionPath {filepath};
Add-MpPreference -ExclusionProcess {filepath};
Add-MpPreference -ExclusionPath %appdata%\\temp.exe;
Add-MpPreference -ExclusionProcess %appdata%\\temp.exe;

실행되는 스크립트는 현재 실행중인 파일과 %appdata%\temp.exe 파일을 Windows Defender 검사 제외 프로세스로 추가한다.

Windows Defender 검사 제외 로직

caption - Windows Defender 검사 제외 로직

Powershell 스크립트 실행

구조체에 특정 필드에 저장된 파워쉘 스크립트가 있을 경우, 특정 플래그에 따라 일반 또는 관리자 권한으로 Powershell 프로세스를 실행하여 인자로 전달한다.

추가 Powershell 스크립트 실행 로직

caption - 추가 Powershell 스크립트 실행 로직

파일 생성 및 실행

구조체에 저장된 경로와 이름의 파일이 존재하지 않을 때, 구조체에 저장된 데이터를 뒤집고 Gzip 압축 해제하여 해당 경로에 저장 및 실행한다.

추가 실행파일 드롭 및 실행 로직

caption - 추가 실행파일 드롭 및 실행 로직

MessageBox 출력

현재 실행 중인 프로세스가 "%Appdata%\temp.exe"가 아니거나 %Windows% 하위 경로에 있지 않으면 구조체 내 특정 문자열을 MessageBox로 출력한다. 이때 필드 내 특정 상수가 0이면 경고 아이콘, 아니면 정보 아이콘을 사용해 출력한다.

MessageBox 출력 로직

caption - MessageBox 출력 로직

지속성 확보 및 자가 복제

현재 실행중인 프로세스 실행 파일이 “%AppData%\temp.exe”가 아니거나 “%Windows%” 하위 경로에 존재하지 않으면, “%AppData%\temp.exe”로 자가 복제한다. 이때 “%AppData%” 폴더가 존재하지 않으면 폴더를 생성한다. 자가 복제 경로 및 파일 이름은 공격자가 설정 가능하다.

자가 복제 로직

caption - 자가 복제 로직

이후 구조체에 저장된 값에 따라 다른 동작을 수행한다.

  • 0인 경우 : "%Appdata%\temp.exe" 경로를 "HKCR\Software\Microsoft\Windows\CurrentVersion\Run" 키로 등록해 지속성을 확보한다.

    Software\Microsoft\Windows\CurrentVersion\Run 레지스트리 키 등록 로직

    caption - Software\Microsoft\Windows\CurrentVersion\Run 레지스트리 키 등록 로직

  • 1인 경우 : 시작 프로그램 디렉토리에 "%Appdata%\temp.exe"를 실행하는 temp.vbs 파일을 생성해 시작 프로그램으로 등록한다.

    시작 프로그램 등록 로직

    caption - 시작 프로그램 등록 로직

  • 2인 경우 : "%Appdata%\temp.exe"를 2~4분 사이의 랜덤 주기로 실행하는 작업을 생성한다. 작업 이름으로는 자가 복제 결과 파일의 이름이 그대로 사용된다.

    작업 등록 로직

    caption - 작업 등록 로직

지속성 확보 작업을 완료하면 현재 실행 중인 프로세스 실행 파일을 "%Appdata%\temp.exe" 파일로 복사한다.

프로세스 핸들 복제

악성코드의 프로세스 핸들을 explorer.exe에 복제함으로써 악성코드가 사용 중으로 표시되어 보안 프로그램이나 사용자 등이 파일을 삭제 및 수정하지 못하게 한다.

프로세스 핸들 복제 로직

caption - 프로세스 핸들 복제 로직

페이로드 인젝션

먼저 현재 프로세스가 관리자 권한으로 실행 중인 경우 DebugMode에 진입한 뒤에 동작을 수행한다. 페이로드를 인젝션할 때, 특정 필드 플래그에 따라 내부에 저장된 데이터를 직접 AES 복호화 및 Gzip 압축 해제하거나, Url을 이용해 외부에서 다운로드한다. 이때 사용되는 AES key와 IV는 처음 리소스 복호화 때 사용된 값과 동일하다. 분석된 악성코드는 암호화된 페이로드를 파일 내부에 포함하고 있다.

추가 페이로드 획득 로직

caption - 추가 페이로드 획득 로직

페이로드 인젝션 시 구조체 내 특정 값에 따라 다른 방식을 사용한다.

  • 0인 경우 : 어셈블리 데이터를 메모리에 로드한 뒤 메소드를 호출한다.

    .NET 어셈블리 로드 및 실행 로직

    caption - .NET 어셈블리 로드 및 실행 로직

  • 1인 경우 : 프로세스 할로잉을 통해 코드를 주입 후 실행한다. 이때 전달된 인자에 따라 일반 프로세스 할로잉 또는 부모 프로세스 스푸핑을 거친 할로잉을 수행한다.

    일반 프로세스 할로잉 로직

    caption - 일반 프로세스 할로잉 로직

    부모 프로세스 스푸핑을 진행하는 프로세스 할로잉 로직

    caption - 부모 프로세스 스푸핑을 진행하는 프로세스 할로잉 로직

  • 2인 경우 : 네이티브 쉘코드를 메모리에 할당해 실행한다. 이때 전달된 인자에 따라 현재 프로세스 또는 다른 프로세스에 쉘코드를 로드 후 실행한다.

    현재 프로세스 쉘코드 삽입 로직

    caption - 현재 프로세스 쉘코드 삽입 로직

    원격 프로세스 쉘코드 삽입 로직

    caption - 원격 프로세스 쉘코드 삽입 로직

분석된 악성코드는 explorer.exe가 부모 프로세스가 되도록 위장한 뒤, 자기 자신에 프로세스 할로잉을 수행한다.

압축 페이로드 인젝션

구조체 내부의 특정 데이터를 뒤집고 Gzip 압축 해제한 뒤에 앞선 쉘코드 인젝션 방식을 사용해 특정 프로세스에 인젝션한다.

Gzip 압축된 쉘코드 인젝션 로직

caption - Gzip 압축된 쉘코드 인젝션 로직

자가 삭제 및 프로세스 종료

파워쉘 스크립트를 실행해 악성코드 자가삭제 후 실행 중인 현재 프로세스를 강제로 종료한다. 실행되는 파워쉘 스크립트는 다음과 같다

  • Start-Sleep -Seconds 5; Remove-Item -Path '{filepath}' -Force

자가 삭제 및 프로세스 종료 로직

caption - 자가 삭제 및 프로세스 종료 로직

2.3. Formbook

암호화되어 저장된 최종 페이로드는 PE 파일이며, 분석 결과 Formbook 악성코드로 확인되었다.

PureCrypter로 패킹된 최종 페이로드 정보

caption - PureCrypter로 패킹된 최종 페이로드 정보

분석 결과 악성코드 동작 및 코드 영역 복호화 과정은 아래 글의 Formbook 악성코드와 유사하다.

  • https://www.fortinet.com/blog/threat-research/deep-analysis-formbook-new-variant-delivered-phishing-campaign-part-ii

해당 유형의 Formbook은 저수준 라이브러리를 동적으로 로드 후 사용하여 API 호출 과정을 은닉한다. 이를 위해 ntdll.dll 파일 핸들을 ZwCreateFile로 가져와, 메모리 내에 NtReadFile로 저장 후 NtAllocateVirtualMemory로 ERW 권한을 부여한다. 이후 ntdll.dll API를 호출할 때마다 해당 영역의 코드를 참조한다.

메모리에 별도로 적재된 ntdll.dll

caption - 메모리에 별도로 적재된 ntdll.dll

ntdll.dll API의 주소를 동적으로 가져와 호출하는 명령어에 전달된 레지스터 값과 인자를 분석해 세부 동작을 확인할 수 있다.


악성코드는 전체적으로 복잡한 암호화 로직에 의해 암호화 되어 있으며, 악성코드 실행과 동시에 메인 로직의 복호화 및 점프가 이루어진다. 이렇게 1차 복호화가 완료된 이후에도 악성코드의 주요 함수는 여전히 암호화 되어 있다. 악성코드는 해당 함수들을 사용 직전 복호화 한 뒤에 함수가 종료된 이후 다시 암호화하는 방식으로 동작을 수행한다.

함수 복호화 및 암호화 루틴

caption - 함수 복호화 및 암호화 루틴

또한 악성 행위 수행 전 디버깅 환경을 탐지하는 로직이 존재한다. 디버깅 탐지 과정에서 로드하는 시스템 정보가 악성코드의 행위 수행에도 사용되므로 동적 분석 시 데이터 로드 함수 리턴 지점 까지 정상 진행해야 한다. 안티 디버깅 시 탐지하는 요소는 특정 프로세스 이름, 상위 디렉토리 이름, 윈도우 계정 이름, 커널 정보 클래스 등이다.

환경 정보 저장 및 디버깅 탐지 로직

caption - 환경 정보 저장 및 디버깅 탐지 로직

탐지 로직이 종료되면 Formbook 페이로드를 인젝션 하기 위한 준비를 시작한다. 이 과정에서 32bit 코드에서 64bit 코드로 전환하는 Heaven’s Gate 기법이 사용된다. 저장된 64bit 코드는 실행 시점에 따라 다른 동작을 수행하며, 현재 과정에서는 다른 프로세스에 동일한 64bit 코드를 복사 후 실행하는 역할을 한다.

64bit 코드로 점프하는 명령어

caption - 64bit 코드로 점프하는 명령어

실행되는 64bit 의사 코드

caption - 실행되는 64bit 의사 코드

다른 프로세스에 복사된 64bit 쉘코드는 현재 작동 중인, 즉 복사의 대상이 된 프로세스의 자식 프로세스로 runonce.exe 프로세스를 생성한다. 생성된 runonce.exe 프로세스와 기존 부모 프로세스인 OneDrive.exe 사이에 공유 메모리 섹션을 생성한 후에, 복사된 64bit 쉘코드는 작업을 마무리한다.

64bit 쉘코드가 생성한 자식 프로세스

caption - 64bit 쉘코드가 생성한 자식 프로세스

기존 로더 프로세스는공유 메모리 섹션을 통해 runonce.exe 프로세스에 Formbook 페이로드를 복사한다. 이후 ntdll.dll의 스레드 관련 API를 이용해 RtlUserThreadStart의 rax 레지스터를 조작한 뒤에 스레드를 재개해 runonce.exe 프로세스에서 인젝션한 페이로드가 실행되도록 한다.

Formbook 정보 수집 및 원격 명령 실행 모듈

runonce.exe 프로세스에 인젝션 된 쉘코드는 먼저 전체 코드를 복호화한다. 복호화 이후에는 안티 디버깅 로직을 수행한 뒤, 주요 동작 함수를 호출한다.

정보 수집 모듈의 디버깅 탐지 로직

caption - 정보 수집 모듈의 디버깅 탐지 로직

가장 먼저 먼저 레지스트리 키, advapi32.dll API를 이용해 기본 시스템 및 사용자 정보를 수집한다. 수집 후 병합되는 정보는 아래와 같고, 각 정보는 ":" 문자로 구분된다.

  • Windows 정보

  • 컴퓨터 이름 및 사용자 이름을 base64 인코딩한 값

초기에 수집 되어 메모리에 저장되는 시스템 및 사용자 정보

caption - 초기에 수집 되어 메모리에 저장되는 시스템 및 사용자 정보

수집 정보는 아래 과정을 통해 암호화된다.

  1. RC4 암호화

  2. Base64 인코딩

  3. 접두사 "PKT2:" 붙인 뒤 RC4 암호화

위 과정에서 사용되는 RC4 key는 아래와 같다.

  • 1차 RC4 key hex: 1DC0668A628EA91766A75C87319A23B24939C07B

  • 2차 RC4 key hex: 3A665CF99A9B7A79F4FECB77BBE2BF5FF79687E3

초기 정보 수집 후에는 64bit 코드를 한번 더 호출하여 explorer.exe의 하위 64bit 프로세스 중 하나에 같은 Formbook 통신 모듈 페이로드를 삽입한다. 이때 삽입된 페이로드는 이후 C&C 서버와의 통신에 사용된다.

인젝션 및 rip 조작 이후 다시 32bit 코드로 돌아오면 User Request 대기 중인 통신 모듈 스레드에 PostThreadMessageW로 WM_COMMAND 메세지를 보내 실행을 재개한다. 추가로 인젝션 된 페이로드는 기존 악성코드 엔트리와 다른 지점에서 작동하며 통신 모듈 역할을 수행한다.

인젝션 후에는 정보 수집, 명령 수신 및 실행 로직을 반복한다. 정보 수집 과정에서는 각종 브라우저 및 이메일 정보를 수집한다.

  • Windows 정보

  • 이메일 프로필 ( Outlook, Thunderbird, Foxmail )

  • 브라우저 (Internet Explorer, Firefox, Chrome 등 ) 개인 정보

  • Windows Vault 자격 증명

민감 정보 수집 로직

caption - 민감 정보 수집 로직

Chrome 브라우저의 Login Data의 경우 %Temp%\IE13ci5 파일로 복사된 뒤 sql 쿼리로 데이터를 추출한다.

Login Data 복사 로직

caption - Login Data 복사 로직

수집된 각종 데이터는 64bit 프로세스의 통신 모듈과의 공유 메모리에 저장되고, 통신 모듈이 C&C 서버와의 통신 시 전송된다.

또한 Formbook 악성코드는 C&C 서버에서 데이터를 받아 원격 명령을 수행한다. 통신 모듈이 수신하여 공유 메모리에 저장한 데이터의 선두에 "XLNG" 문자열이 존재할 경우 바로 다음 바이트를 opcode로 사용한다.

패킷 검사 로직

caption - 패킷 검사 로직

명령 식별자는 "1"~"9"로 이루어져 있으며 각각의 동작은 아래와 같다

| Command | Behavior |
| --- | --- |
| "1" | exe,, dll, ps1 확장자를 가진 파일을 다운로드  `%Temp%` 디렉토리에 저장한 실행 |
| "2" | PE 파일 다운로드 헤더 검증  `%Temp%` 디렉토리에 저장한 실행 |
| "3" | 자가 삭제 explorer.exe 재시작 |
| "4" | exe 또는 ps1 파일을 `%Temp%` 디렉토리에 다운로드 실행 |
| "5" | 브라우저 데이터 (쿠키, 로그인 정보, 프로필, 세션) 수집 |
| "6" | WIndows, 운영체제, 사용자 이름 정보 수집 |
| "7" | 시스템 재부팅 |
| "8" | 시스템 종료 |
| "9" | 아무 동작도 하지 않음

Formbook 통신 모듈

64bit 프로세스에 인젝션 된 페이로드는 C&C 서버와 통신을 시작한다. Formbook 악성코드는 실제 C&C 서버 주소 뿐만 아니라 수많은 가짜 더미 C&C 주소를 저장하고 모든 주소에 요청을 보내며 실제 C&C 주소를 식별하기 어렵게 한다.

복호화 후 힙 메모리에 저장된 도메인 정보

caption - 복호화 후 힙 메모리에 저장된 도메인 정보

악성코드는 암호화된 C&C 서버 URL을 동적으로 복호화하여 요청을 보낸다. 유출되는 데이터는 복잡한 커스텀 암호화 후 base64 인코딩 되어 패킷에 포함된다. 수집된 URL은 글의 부록 "Formbook URLs"에 첨부하였다.

통신 모듈은 이외에도 GetClipboardData API로 클립보드 정보를 수집해 공유 메모리에 저장한다. 클립보드 데이터는 runonce.exe에서 동작 중인 정보 수집 모듈이 공유 메모리에 기록한 민감 정보와 함께 C&C 서버로 전송된다.

클립보드 데이터 수집을 위한 함수들

caption - 클립보드 데이터 수집을 위한 함수들


3. 추가 악성코드 및 연관성

3.1. 같은 IP에서 유포되는 악성코드

PureCrypter로 패킹되었으며, 같은 IP(158.247.250[.]251)에서 다운로드한 파일을 복호화해 실행하는 다른 악성코드를 확보했다. 이들은 초기 접근 방법을 알아낼 수 없었지만, 대부분 RAR 압축파일 형태로 전달된 것을 보아 분석된 악성코드와 같은 방식으로 피싱 이메일을 통해 유포된 것으로 보인다.

확보한 악성코드에서 확인한 정보는 아래와 같다.

| 어셈블리 이름 | MD5 | Base64 인코딩된 AES  | Base64 인코딩된 AES IV | User-Agent |
| --- | --- | --- | --- | --- |
| ljwflx.exe | 81bfe3b3204ede1fca418e44aa19b310 | KnJ27qGTjAZZNKQexmBuXSOnnFvFQv/BKoLXk48czKg= | +PNBK7GBbAf397zUxJVbQA== | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 OPR/96.0.4693.80 |
| Kahogdwhj.exe | 52a321e48902b8fbd1e984d9bd15f278 | PDXdRECJmaHFmRrowwO11ODbcK9klmg78nXy4Dd9VuE= | 3Dma78UCdly9DQH6md97kw== | Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:122.0) Gecko/20100101 Firefox/122.0 |
| Endolsydm.exe | 310ebb7ca19ff9b75d4054c340b0c82e | x1ehIEX7Pxv5/8qKPc91WFsl+5PCPtjdaxJZa0J05+c= | eCzZQvqLFuqZ5qiO471g2g== | Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.6099.199 Mobile Safari/537.36 |
| lkdsnivzaem.exe | ca9cb7bb06398670abc6d19186c336cd | auCoaTwzm/qB/9TAvmSm81zuddQ/sJbMELul5a5ti6s= | oH8nCT02nAmvySgN5wye6g== | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 OPR/96.0.4693.80

C&C 서버인 158.247.250.251에서 디렉토리 리스팅을 통해 파일들을 확인할 수 있었으며, 6월 3일까지도 파일이 수정되며 공격이 이루어졌다. 분석 당시 다운로드 할 수 있는 파일은 분석된 파일을 포함해 총 4개이며, 이 중 하나의 파일이 추가로 복호화가 가능했다.

접속된 C&C 서버의 루트 디렉토리

caption - 접속된 C&C 서버의 루트 디렉토리

추가로 확보한 2차 PureCrypter 로더는 분석된 악성코드와 동일하게 .NET Reactor로 난독화되어 있다.

Csxkd.dll 내부 클래스

caption - Csxkd.dll 내부 클래스

같은 방식으로 문자열 해시 테이블과 역직렬화 된 데이터를 확인할 수 있다. 직렬화 된 데이터 및 후속 악성코드 AES 복호화 시 사용되는 key와 IV는 아래와 같다.

  • base64 인코딩된 key : "aOmN7DquQ0DhLOXV9UsPjyqVGWY5RNEE2rx2fcmP/pk="

  • base64 인코딩된 IV : "numBuSJgCDpuy8TlrrBsIg=="

추가 악성코드 또한 최종적으로 분석된 사례와 완벽히 동일한 Formbook 악성코드를 인젝션한다.

6월 둘째 주 이후에는 C&C 서버가 비활성화 되어 파일을 확인할 수 없었다. 마지막으로 6월 마지막 주에는 루트 경로에 b374k 웹쉘인 admin.php 파일이 확인되었다.

업로드된 b374k 웹쉘

caption - 업로드된 b374k 웹쉘

3.2. 추가 C&C 서버

사용된 User-Agent를 기반으로 조사한 결과 비슷한 시기에 제작된 .NET PureCrypter 다운로더들이 확인되었다. 검색된 악성코드들은 분석된 사례와 같이 공격자가 구축한 C&C 서버를 사용하는 방식 뿐만 아니라, 침해된 웹사이트나 공유 드라이브에 파일을 업로드 후 이를 다운로드하는 방식도 사용한다. 또한 RAR 파일은 물론, ISO 이미지, 7z 등 다양한 압축 형태로 배포되었다.

PureCrypter 내부에 설정된 User-Agent 정보만으로 이들이 같은 공격자가 제작한 악성코드임을 단정하기는 어려울 것으로 생각되었다. 이에 분석된 사례와 같은 ssl thumbprint가 나타나는 공격자 구축 C&C 서버에서 유포되며 Formbook 관련 탐지명이 남아 있는 악성코드만을 선별하였다.

  • C&C 서버

161.248.239[.]119
95.214.54[.]164
195.177.94[.]43
147.135.109[.]

모두 PureCrypter로 패킹된 악성코드를 유포했다는 점은 같지만, Formbook 이외에도 SnakeKeylogger 등 다른 종류의 악성코드 또한 유포된 사례도 알려져 있다. 현재는 대부분 접근 불가능한 상태이기 때문에 서버에 저장되어 있던 최종 페이로드를 확인할 수 없다.

3.3. Kimsuky C&C 인프라 연관성

악성코드 유포 서버인 국내 ip 158.247.250[.]251는 북한 배후 공격 그룹 Kimsuky의 공격 인프라와의 공통점이 다수 발견되었다. 엔키화이트햇 위협연구팀은 2025년 상반기 Kimsuky의 Github 악용 공격 사례 분석 이후 관련 위협을 꾸준히 모니터링 해 왔다. 이 과정에서 Formbook 유포 서버와 공통점을 가진 XenoRAT C&C 서버 158.247.240[.]40를 확인하였다.

발견된 공통점은 아래 표와 같다.

| 특징 | `158.247.250[.]251` | `158.247.240[.]40` |
| --- | --- | --- |
| 웹쉘 경로 | /admin.php | /admin.php |
| 웹쉘 종류 | b374k | b374k |
| 주로 매핑된 도메인 | *.store | *.store |
| JARM Fingerprint | 07d19d12d21d21d07c42d43d0000009424803a662b126a748cf4f90707a33c | 07d19d12d21d21d07c42d43d0000009424803a662b126a748cf4f90707a33c

또한, 158.247.250[.]251에 매핑되었던 도메인인 menavcorp[.]store, nidlip.onlinenservicesite[.]store 등은 공격자가 네이버 관련 피싱 공격에 해당 C&C 서버를 이용하려 했음을 알려준다. Kimsuky는 과거부터 한국 사용자를 대상으로 한 네이버 피싱 공격에 {네이버 관련 키워드}[.]store 형식의 도메인을 자주 이용해왔다.

  • https://hunt.io/blog/million-ok-naver-facade-kimsuky-tracking

4. 대응 방안

4.1. 출처가 의심스러운 이메일 첨부파일 다운로드 및 실행 지양

이메일에 포함된 이미지에 한글이 등장하는 것으로 보아 공격자는 공격 타겟을 한국 국적의 개인으로 설정하고 초기 접근에 시도했다는 점을 알 수 있다. 또한 발신 이메일을 DHL 사의 공식 도메인으로 위장하고, 실제 기업들의 자동 발신 이메일 주소에 자주 사용되는 "noreply" 문자열을 사용하며 피해자가 이메일을 의심하지 않도록 설계했다.

이와 같이 의심스러운 이메일을 수신했을 경우 첨부파일 다운로드 및 실행을 지양해야 하며, virustotal 등의 검사 도구를 적극 이용하여 압축 대상 파일을 악성 행위 여부를 확인해야 한다.

한글 이미지가 포함된 피싱 이메일

caption - 한글 이미지가 포함된 피싱 이메일

그러나 이번 사례의 경우 첨부된 압축 파일에 암호가 설정되어 있지 않아 브라우저 등의 파일 검사의 대상이 되며, 압축 해제 시 exe 확장자가 그대로 노출되어 보안 프로그램을 사용하는 사용자는 위험을 알아챌 수 있다.

5. 마치며

본 글에서는 피싱 이메일을 통한 국내 ip에서의 Formbook 악성코드 유포 사례를 분석했다. 최종 악성코드인 Formbook 파일은 PureCrypter를 이용해 로드되며, 감염된 PC 정보 유출 및 원격 명령 수행 등의 동작이 이루어진다.

분석된 사례의 경우 모듈형 다단계 Formbook 악성코드에 더해 PureCrypter까지 적용되어 행위를 은닉하고 분석을 어렵게 했다. 이처럼 보안 및 탐지 기술이 점차 발전함에 따라, 은밀하면서도 성공적인 악성 행위를 수행하기 위한 우회 기술도 계속해서 개발되고 있다.

또한 공격에 사용된 C&C 서버에서 Kimsuky 공격 인프라와 공통점이 발견되었다. 분석된 사례는 최근 Kimsuky 공격 패턴과 전반적으로 차이가 있고, 하나의 IP를 여러 공격자가 이용했을 가능성도 있기에 확신하기 어렵지만, 과거 네이버 피싱 도메인이 매핑된 점, 동일한 유형(b374k)의 웹쉘이 C&C 서버에 존재한 점, JARM Fingerprint 가 일치하는 점 등의 공통점을 근거로 볼 수 있다.

피싱 이메일을 통해 여러 기업이나 기관을 사칭하여 악성코드를 유포하는 사례는 꾸준히 발견되고 있다. 공격자들은 신뢰할 수 있는 대상임을 이용해 사용자의 경각심을 낮추고 감염을 유도하므로, 개인 및 조직 차원에서 더욱 각별한 주의와 철저한 보안 대응이 요구된다.

6. 부록

부록 A. MITRE ATT&CK

| Tactics | Techniques |
| --- | --- |
| Initial Access | T1566.001: Phishing: Spearphishing Attachment |
| Execution | T1059.001: Command and Scripting Interpreter: PowerShell-nT1059.003: Command and Scripting Interpreter: Windows Command Shell-nT1047: Windows Management Instrumentation-nT1204.002: User Execution: Malicious File |
| Persistence | T1547.001: Boot or Logon Autostart Execution: Registry Run Keys / Startup Folder |
| Defense Evasion | T1027.002: Obfuscated Files or Information: Software Packing-nT1027.014: Obfuscated Files or Information: Encrypted/Encoded File-nT1055.002: Process Injection: Portable Executable Injection-nT1055.003: Process Injection: Thread Execution Hijacking-nT1055.012: Process Injection: Process Holowing-nT1134.001: Access Token Manipulation: Token Impersonation/Theft-nT1140: Deobfuscate/Decode Files or Information-nT1497.001: Virtualization/Sandbox Evasion: System Checks-nT1622: Debugger Evasion-nT1070.010: Indicator Removal: Relocate Malware |
| Discovery | T1057: Process Discovery-nT1082: System Information Discovery |
| Collection | T1115: Clipboard Data-nT1005: Data from Local System |
| Command and Control | T1095: Non-Application Layer Protocol-nT1071: Application Layer Protocol: Web Protocols-nT1665: Hide Infrastructure-nT1132.001: DataEncoding: Standard Encoding-nT1573.001: Encrypted Channel: Symmetric Cryptography |
| Exfiltration | T1041: Exfiltration Over C2 Channel

부록 B. IOCs

Hash

  • e78be07019dfaf682c601985ac3ba424

  • 108b5fd1b62489fd5cdb4ebd4a463226

  • 42d24ccfb0a05c5f299181ca3afc7ae3

  • a6c26a0b5df0db6a35b15c24342f27f8

  • 6e5198c3aae9005cc58d011a8c6f0bec

  • 81bfe3b3204ede1fca418e44aa19b310

  • 52a321e48902b8fbd1e984d9bd15f278

  • 310ebb7ca19ff9b75d4054c340b0c82e

  • ca9cb7bb06398670abc6d19186c336cd

C&C

  • 158.247.250[.]251

  • 95.214.54[.]164

  • 161.248.239[.]119

  • 195.177.94[.]43

  • 147.135.109[.]226

  • 158.247.240[.]40

Mutex

  • Xilnulmx

  • Ncppn

User-Agent

  • Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 OPR/96.0.4693.80

  • Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:122.0) Gecko/20100101 Firefox/122.0

  • Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.6099.199 Mobile Safari/537.36

Email

  • noreplychleeportchlee@dhl.com

부록 C. Formbook URLs

  • www.asymptote[.]fund/geqw/

  • www.u90hm[.]top/q3ld/

  • www.eufi[.]xyz/sk5i/

  • www.netbarg[.]com/r6jx/

  • www.ml[.]com/zh1t/

  • www.adoptados[.]pet/rnaj/

  • www.synergysynergyeqhu[.]lol/hjvu/

  • www.businessauth[.]xyz/9nn7/

  • www.realbigteeth[.]net/29f4/

  • www.cleartrek[.]top/e35m/

  • www.dekoratifcamfilmi[.]xyz/gxr6/

  • www.sanlou86[.]vip/4h4w/

  • www.tridentoutdoor[.]net/odp0/

  • www.bmf.gv[.]at/bmvd/

  • www.dgdetailing[.]pro/g9w4/

  • www.ogrex[.]org/w7hs/

  • www.teamx[.]club/egab/

  • www.df96w[.]top/oodw/

  • www.dubrovnik[.]services/8fpw/

  • www.gamevui[.]shop/84g1/

  • www.uwd64[.]top/p1wy/

  • www.iconimax[.]org/geqw/

  • www.parshmen[.]art/ym9z/

  • www.g50tz[.]top/cdm7/

  • www.goldenstreamzxy[.]pro/vvrb/

  • www.070bn[.]shop/panb/

  • www.later[.]info/trou/

  • www.imprint[.]boutique/eqc8/

  • www.honghuo-qq2l2[.]sbs/aa4d/

  • www.fabu2024b01[.]xyz/ow2j/

  • www.aishiteru4[.]click/wirg/

  • www.japp4[.]icu/2q9x/

  • www.agrimater[.]shop/o05o/

  • www.fmtuxu[.]top/hlfg/

  • www.new8838[.]win/7evm/

  • www.slayflu[.]xyz/n871/

  • www.thebriefingpod[.]media/hwu8/

  • www.lawson[.]co[.]jp/n307/

  • www.yourcredential[.]xyz/v4li/

  • www.donaldcoin[.]com/n66l/

  • www.novatek[.]tech/o29b/

  • www.gorillalegends[.]xyz/xgry/

  • www.babyhan64[.]shop/4s99/

  • www.artscriptor[.]info/a2d4/

  • www.cardo[.]work/am6j/

  • www.hirufm[.]lk/whj4/

  • www.h34ry[.]top/ssr8/

  • www.ztg86[.]top/3whz/

  • www.freedom[.]golf/ip3t/

  • www.kl3u2l[.]top/v5n7/

  • www.dagdijital[.]xyz/bhvz/

  • www.resolve[.]fitness/d7x3/

  • www.precisednutrition[.]net/z82q/

  • www.autorolluphub[.]xyz/ulhr/

  • www.mastermohamedfight[.]top/o7rb/

  • www.farcana-drop[.]xyz/2p9m/

  • www.itmoh[.]town/hwcx/

  • www.sticker[.]business/728a/

  • www.arcade[.]plus/lvbq/

엔키화이트햇

엔키화이트햇

ENKI Whitehat
ENKI Whitehat

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

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

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

빈틈없는 보안 설계의 시작, 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.