
국내 정부기관 담당자를 대상으로 상품 파손 클레임을 사칭한 스피어피싱 메일이 확인되었습니다.
해당 메일은 악성코드를 직접 첨부하는 대신 외부 파일 공유 서비스 링크를 통해 압축 파일을 내려받도록 유도하며, 내부에는 정상 서명된 Microsoft Excel 실행 파일과 악성 DLL파일이 함께 존재합니다. 감염이 완료되면 브라우저 자격 증명과 암호화폐 지갑 정보가 공격자 서버로 전송됩니다.
이번 피싱 메일은 온라인 거래 과정에서 흔히 발생하는 상품 파손 분쟁을 소재로 삼았습니다.
공격자는 주문한 제품에서 심각한 손상이 발견되었다고 주장하면서, 개봉 과정과 파손 부위를 촬영한 자료를 준비했으니 확인해 달라고 요청합니다. 파일 용량이 크다는 이유를 들어 첨부 대신 외부 링크를 안내한 점이 특징이며, 이는 메일 게이트웨이의 첨부파일 검사를 우회하려는 구성으로 판단됩니다.
링크에 접속하면 파일 공유 서비스(pixeldrain)에 업로드된 압축 파일이 내려받아집니다.
압축을 해제하면 문서로 위장한 실행 파일이 나타나고, 이를 실행하는 순간 다단계에 걸친 감염 절차가 시작됩니다. 각 단계는 서로 다른 방식으로 암호화되어 있으며, 최종적으로 정보탈취 악성코드가 실행되는 구조입니다.
전체 흐름은 [피싱 메일 수신 → 외부 링크 접속 → 압축 파일 다운로드 → 실행 → DLL 사이드로딩 → 파이썬 기반 은닉 설치 → 셸코드 실행 → 정보탈취 악성코드 구동 → 공격자 C2 접속] 순서로 전개됩니다.
1단계 - 스피어피싱 메일 수신
메일은 한국어 업무 메일 형식을 갖추고 있으며, 발신자명에 한국식 이름을 사용해 국내 거래처로 보이도록 위장했습니다. 본문에는 파손 상태를 증명할 영상과 사진을 제공하겠다는 내용과 함께 다운로드 링크가 삽입되어 있습니다.

또한 본문 하단에는 1×1 크기의 추적 픽셀이 삽입되어 있습니다. 추적 픽셀은 발송자가 수신자가 메일을 열었는지, 언제 열었는지를 확인하는 용도로 삽입되는 이미지이며 화면에는 사실상 보이지 않지만, 수신자가 메일을 열어 이미지를 불러오는 순간 해당 이미지가 저장된 서버에 접속 기록이 남게됩니다.
주목할 부분은 이미지 주소의 구성입니다. 주소에는 캠페인을 구분하는 식별자와 수신자를 구분하는 식별자가 각각 포함되어 있어, 서버는 접속 기록만으로 어느 캠페인의 어느 수신자가 메일을 열었는지 구분할 수 있습니다.

동일한 캠페인 식별자는 메일 헤더에서도 확인됩니다. 대량 발송 도구는 수신 측의 스팸 신고를 발송자에게 되돌려 주기 위해 캠페인과 발송 목록을 구분하는 값을 Feedback-ID 헤더에 기록하는데, 여기에 본문 이미지 주소와 동일한 값이 남아 있습니다.

수신자마다 고유 식별자를 부여하고 열람 여부를 집계하는 구조는 개별 작성된 메일에서는 나타나지 않습니다. 이번 메일이 발송 관리 도구를 통해 배포되었으며, 동일한 내용이 다수의 수신자에게 전달되었을 가능성을 시사하는 부분입니다. 아울러 공격자는 어느 수신자가 메일을 열었는지 파악할 수 있으므로, 반응을 보인 대상을 추려 후속 공격을 시도하는 것도 가능합니다.
2단계 - DLL 사이드로딩(Side-Loading)
사용자가 메일 본문 내 링크를 클릭하게 되면 Full_Unboxing_Process_Inspection_Record_9862_2026.zip 압축파일이 다운로드 되며, 압축해제 시 EXE 실행 파일과 DLL 파일이 나타납니다.

Full_Unboxing_Process_Inspection_Record_9862_2026.pdf.exe 파일은 이중 확장자를 사용하여 PDF 파일로 위장하였으며, 실제로는 정상 Excel 실행 파일입니다. 공격자는 악성코드를 직접 만들어 넣는 대신, 신뢰할 수 있는 프로그램을 악용하여 탐지 회피를 노렸습니다.

AppVIsvSubsystems64.dll 파일은 Excel이 실행될 때 자동으로 불러오는 구성 요소와 동일한 이름을 가진 악성 DLL 파일 입니다. Full_Unboxing_Process_Inspection_Record_9862_2026.pdf.exe 파일이 실행되면 Excel은 DLL사이드로딩 기법을 통해 같은 폴더에 있는 이 DLL 파일을 정상 구성 요소로 오인해 메모리에 올리고, 그 순간부터 악성 코드가 정상 프로그램의 권한으로 동작하게 됩니다.
💡 참고하세요
DLL 사이드로딩(DLL Side-Loading)이란?
Windows의 DLL 검색 순서(DLL Search Order)를 악용하는 공격 기법으로 프로그램 실행 시 필요한 DLL을 찾기 위해 여러 경로를 검색하는데, 정상 프로그램과 동일한 경로내 악성 DLL 파일을 위치시켜 악성 DLL 파일이 먼저 로드되도록 조작하는 방식입니다.
3단계 - 악성 DLL의 은닉 동작
메모리에 적재된 DLL 파일은 세 개의 스레드를 생성해 각기 다른 역할을 수행합니다.
첫 번째 스레드는 미끼 문서를 화면에 띄웁니다.
DLL 내부 리소스에 저장된 PDF 파일을 %TEMP% 경로에 doc_<PID>.pdf 이름으로 저장하여 웹 브라우저로 여는 방식으로, 사용자가 정상 문서를 열었다고 인식하게 만드는 역할을 합니다.

두 번째 스레드는 화면에 나타나는 대화상자를 감시합니다.
악성 DLL파일은 정상 DLL 파일이 제공해야 할 기능을 갖추고 있지 않으므로, Excel은 초기화 과정에서 오류 대화상자를 표시하게 됩니다. 공격자는 이 스레드를 통해 창이 뜨는 즉시 확인 버튼을 눌러 닫도록 처리했습니다.
같은 목적으로 DLL 파일은 실행 직후 Excel의 IAT(Import Address Table)를 조작합니다. 대화상자를 띄우는 함수 세 개의 주소를 아무 동작도 하지 않는 함수로 교체해, 오류 창 자체가 생성되지 않도록 차단하는 방식입니다.
💡 참고하세요
IAT 패칭이란?
IAT(Import Address Table)는 프로그램이 사용할 외부 함수의 실제 주소를 기록해 두는 표입니다. 프로그램은 함수를 직접 호출하지 않고 항상 이 표를 거쳐 호출하므로, 표의 내용을 바꾸면 프로그램 코드를 수정하지 않고도 동작을 바꿀 수 있습니다. 공격자는 이 점을 이용해 대화상자 함수의 주소를 빈 함수로 교체했습니다. 이때 빈 함수가 "사용자가 확인 버튼을 눌렀다"는 값을 되돌려 주기 때문에, Excel은 오류 처리가 정상적으로 끝났다고 판단하고 실행을 계속합니다. 프로그램을 손상시키지 않으면서 화면에서 흔적만 지우는 기법입니다.
세 번째 스레드가 실제 감염을 진행합니다.
이 스레드는 분석 환경을 확인하는 코드를 반복 실행해 시간을 지연시킨 뒤, 디버거로부터 자신을 숨기는 처리를 수행합니다. 감염 PC의 정상 ntdll.dll 을 읽어 메모리 영역을 덮어쓰는데, 이는 보안 제품이 감시를 위해 삽입해 둔 코드를 제거하기 위한 동작입니다.
준비가 끝나면 DLL 파일 뒤쪽에 덧붙여진 약 20MB 크기의 데이터를 꺼내 복호화합니다. 이 데이터는 압축 파일이며, DLL은 이를 %TEMP% 폴더에 Drv<PID^TickCount>.zip 이름으로 저장한 뒤 PowerShell을 숨김 상태로 실행해 압축을 해제합니다. DLL 파일 크기가 20MB를 넘는 이유도 여기에 있습니다.
4단계 - 파이썬 실행 환경 설치와 지속성 확보
압축 해제된 파일은 대부분 Python 3.11 포터블 배포판으로 공격자는 감염 대상 PC에 파이썬 실행 환경을 통째로 설치한 뒤, 그 위에서 악성 스크립트를 구동하는 방식을 택했습니다. 실행 주체가 정상 파이썬 인터프리터이므로 프로세스 목록만으로는 악성 여부를 판단하기 어렵게 만들었습니다.

압축을 해제한 폴더의 최상위에는 설치를 담당하는 run.py 스크립트가 존재하며, 이 스크립트는 같은 폴더에 있는 macOS 하위 폴더를 %LOCALAPPDATA%\Drivers\macOS\ 경로로 통째로 복사한 뒤, 복사된 위치의 파이썬 인터프리터로 해당 폴더내 동일한 이름의 run.py 스크립트를 실행합니다.
실행 시 CREATE_NO_WINDOW 옵션을 지정하기 때문에 콘솔 창이 화면에 나타나지 않으며, 임시 폴더에서 시작된 실행 흐름은 이 시점에 사용자 프로파일 경로로 옮겨가며, 이후 동작은 모두 복사된 경로에서 이루어집니다.

| 경로 | 파일 | 역할 |
| %LOCALAPPDATA%\Drivers\ | run.vbs | 스크립트 실행 런처 |
| %LOCALAPPDATA%\Drivers\macOS\ | python.exe | Python 3.11 인터프리터(32비트 |
| %LOCALAPPDATA%\Drivers\macOS\ | run.py | 셸코드 로더 |
| %LOCALAPPDATA%\Drivers\macOS\ | trumads_enc.bin | 암호화된 셸코드 |
[표 1] 설치되는 주요 파일
설치 경로에 사용된 Drivers와 macOS라는 폴더명은 실제 기능과 무관하며, 사용자나 관리자가 목록을 확인하더라도 시스템 구성 요소로 오인하도록 붙인 이름으로 추정됩니다.
복사된 경로에서 실행되는 run.py(%LOCALAPPDATA%\Drivers\macOS\) 스크립트는 압축을 푼 폴더의 설치용 run.py 스크립트와 파일명이 같지만 역할이 다릅니다. 이 스크립트는 동일 경로내 암호화된 셸코드 파일(trumads_enc.bin)을 복호화한 뒤 실행 권한이 부여된 메모리 영역에 올려 구동합니다. 이 과정에서 별도의 실행 파일이 디스크에 생성되지 않으므로 파일 기반 검사만으로는 탐지가 어렵습니다.

동시에 Drivers_EveryMinute라는 이름의 예약 작업이 등록됩니다. 이 작업은 1분 간격으로 런처를 실행하므로, 사용자가 악성 프로세스를 강제 종료하더라도 1분 이내에 다시 구동됩니다. 파일 하나를 삭제하는 것만으로는 감염이 해소되지 않는 구조입니다.


5단계 - 셸코드 실행과 프로세스 인젝션
복호화된 셸코드는 특정 메모리 주소에 의존하지 않고 동작하도록 작성되어 있으며, 사용할 함수의 주소를 실행 시점에 직접 찾아냅니다. 코드 안에 함수 이름이 남지 않기 때문에 정적 분석으로 기능을 파악하기 어렵습니다. 내장된 설정값 역시 공격자가 직접 설계한 스트림 암호로 보호되어 있습니다.
셸코드는 .NET 실행 환경을 프로세스 내부에 구성한 뒤 explorer.exe에 코드를 삽입합니다. 이후 동작이 정상 시스템 프로세스 내부에서 이루어지고 실행할 코드도 디스크에 기록되지 않으므로, 프로세스 목록과 파일 검사 양쪽에서 탐지를 피할 수 있습니다.
6단계 - .NET 로더를 통한 최종 페이로드 적재
셸코드 설정 영역에 포함된 .NET 로더는 자신의 리소스에 저장된 압축 데이터를 복호화하고 압축을 해제해 최종 악성코드를 메모리에 올립니다.
복호화에 사용되는 키는 .NET 실행 파일의 문자열 저장 영역에 숨겨져 있어, 일반적인 분석 도구의 기본 화면에서는 확인되지 않습니다. 앞선 단계까지 포함하면 최초 DLL부터 최종 악성코드에 이르기까지 서로 다른 방식의 암호화가 다섯 차례 중첩되어 적용된 구조입니다. 한 단계를 복호화해도 그 결과물이 다시 암호화된 상태이므로, 자동화된 분석 도구가 전체 구조를 한 번에 파악하기 어렵습니다.
7단계 - 정보탈취 악성코드 실행
최종 단계에서 실행되는 악성코드는 감염 시스템의 자격 증명과 자산 정보를 수집해 공격자 서버로 전송하는 정보탈취형 악성코드입니다. C2 접속 정보는 압축과 직렬화를 거쳐 저장되어 있으며, 통신 시 상호 인증서 검증을 적용해 임의의 분석 도구가 통신 내용을 확인하기 어렵도록 구성되었습니다.
수집 대상은 브라우저 자격 증명과 암호화폐 자산에 집중되어 있습니다.
| 구분 | 대상 | 수집 정보 |
|
브라우저
|
Chromium 계열 34종(Chrome, Edge, Brave, Vivaldi 등) | 저장된 비밀번호, 쿠키, 자동완성, 신용카드 정보 |
| 지갑 확장 프로그램 | 48종(MetaMask, Phantom, Trust Wallet, Coinbase Wallet 등) | 지갑 데이터, 인증 정보 |
| 데스크톱 지갑·앱 | 12종(Exodus, Electrum, Atomic Wallet, Ledger Live, Telegram 등) | 지갑 파일, 키 저장소 |
| 시스템 정보 | WMI 조회 | 프로세서·디스크 식별자, OS 버전, 설치된 백신 제품, 웹캠 유무 |
[표 2] 주요 탈취 대상
수집 기능 외에도 다음과 같은 동작이 확인되었습니다.
활성 창 제목과 유휴 시간을 함께 확인한다는 점은, 사용자가 자리를 비운 시점을 골라 활동하도록 설계되었음을 시사합니다.
이번 공격에서 악성코드는 단계마다 서로 다른 회피 기법을 적용하고 있습니다.
| 기법 | 내용 |
| DLL 사이드로딩 | 정상 서명된 Microsoft Excel이 악성 DLL을 적재 |
| 이중 확장자 | .pdf.exe 형식으로 문서 파일처럼 표시 |
| IAT 패칭 | 대화상자 함수를 빈 함수로 교체해 오류 창 차단 |
| ntdll 언후킹 | 디스크의 정상 ntdll.dll로 메모리를 덮어써 보안 제품의 감시 코드를 제거 |
| 안티 디버깅 | 디버거 탐지 및 스레드 은폐 처리 |
| 안티 분석 | 의미 없는 연산을 반복해 분석 도구의 흐름 추적을 방해 |
| 정상 도구 악용 | Python 포터블 배포판과 PowerShell을 실행 수단으로 사용 |
| 메모리 실행 | 최종 페이로드를 디스크에 기록하지 않고 메모리에서 직접 적재 |
| 다중 암호화 | 서로 다른 방식의 암호화를 5단계로 중첩 적용 |
| 문자열 분할 | 민감한 함수 이름을 조각내어 저장해 문자열 검사 회피 |
[표 3] 탐지 회피 기법
메일 헤더에 기록된 발신 IP (103.82.22.82) 는 베트남에 할당된 주소이며, 발신 국가 정보 역시 베트남으로 표기되어 있습니다.
파이썬 로더 스크립트에는 베트남어로 작성된 주석이 남아 있고, 악성 DLL의 컴파일 시각은 피싱 메일 발송일과 같은 날짜입니다.

또한 확인된 C2 도메인(trum.1368[.]lol)은 베트남어 표현을 포함한 이름을 사용하고 있으며, 연결되는 IP(51.79.209.228)는 해외 호스팅 사업자에 할당된 대역입니다. 이러한 정황을 종합하면 베트남을 기반으로 활동하는 공격자의 소행일 가능성이 높습니다.
이번 공격은 악성코드를 직접 만들어 넣는 대신 신뢰받는 정상 구성 요소를 조합해 감염 체인을 구성한 사례입니다.
서명이 유효한 실행 파일, 정상 파일 공유 서비스, 공식 배포된 파이썬 인터프리터가 모두 공격 수단으로 사용되었습니다. 개별 요소만 보아서는 악성으로 판단할 근거가 없다는 점이 이번 사례의 핵심입니다. 피해 예방을 위해 다음 사항을 준수하시기 바랍니다.
IoC
| Indicator | Type | Description | Detection Name |
|---|---|---|---|
| D144AA1E7FD64A25E7EA97DFDCDBA658 | MD5 | AppVIsvSubsystems64.dll | Trojan.Dropper.Agent |
| 2CD2F749E3D62CE3F90805461D5F9478 | MD5 | root\run.py | Trojan.Python.Loader |
| 2021D8C6181C54A96FE9D16469E7983B | MD5 | macOS\run.p | Trojan.ShellCodeLoader.A |
| 2F7FC67A9567BBE87594935393240C6C | MD5 | run.vbs | Trojan.Script.Agent |
| 9D6C2666BF26A9F71C53EF766DB2E885 | MD5 | trumads_enc.bin | Trojan.BIN.Encoded |
| trum.1368.lol | DOMAIN | C2 | |
| 51.79.209.228 | IP | C2 | |
| okok | Mutex create |
| 세무 위반 통지 사칭 피싱 메일을 통한 원격제어 악성코드 유포 주의 (0) | 2026.07.13 |
|---|---|
| Chai.js 플러그인으로 위장한 북한발 npm 악성 패키지 'chai-as-init' 분석 (0) | 2026.06.16 |
| Solana SDK로 위장한 npm 패키지, Telegram Bot API 기반 RAT 유포 (0) | 2026.06.11 |
| 개인정보 유출 의심 문의로 위장한 Kimsuky 스피어피싱 사례 분석 (0) | 2026.06.09 |
| 디지털 서명 검증을 우회하는 MS Word 변조 악성코드 주의 (CVE-2013-3900) (0) | 2026.06.01 |
댓글 영역