COMMENTS (0)
댓글은 익명으로 작성되며, 삭제 비밀번호를 설정하면 본인만 삭제할 수 있습니다. 비밀번호를 설정하지 않은 댓글은 누구나 삭제할 수 있습니다.
ACRStealer 인포스틸러 CAPEv2 샌드박스 분석. Google Docs에 C2를 숨기고, 지오펜싱과 VM 탐지로 샌드박스를 무력화하는 과정을 추적한다. 샌드박스 분석의 한계와 실제 동작의 차이를 비교 분석.
댓글은 익명으로 작성되며, 삭제 비밀번호를 설정하면 본인만 삭제할 수 있습니다. 비밀번호를 설정하지 않은 댓글은 누구나 삭제할 수 있습니다.
2025년 1월, 한국에서 크랙 소프트웨어를 다운로드한 사용자들의 PC에서 브라우저 비밀번호와 암호화폐 지갑이 조용히 빠져나가기 시작했다. ASEC(AhnLab)이 추적한 결과, 유포량이 급증한 악성코드는 ACRStealer였다. 2026년 3월 기준, 금융/헬스케어/이커머스 분야에서 12,000개 이상의 기업 계정이 침해된 것으로 보고됐다.
ACRStealer의 가장 독특한 기법은 Dead Drop Resolver다. C2 서버 주소를 악성코드에 직접 넣지 않고, Google Docs나 Steam 프로필 페이지에 Base64로 인코딩하여 숨겨둔다. 악성코드가 실행되면 이 합법적 서비스에 접속해 실제 C2 주소를 꺼내온다. 보안 장비 입장에서는 "Google Docs에 접속하는 정상 트래픽"으로 보인다.
이 글은 CAPEv2 샌드박스에서 ACRStealer를 직접 실행한 결과다. 결론부터 말하면, 악성코드가 샌드박스 환경을 탐지하고 핵심 행위를 실행하지 않았다. 왜 그랬는지, 그리고 실제로는 어떻게 동작하는지를 함께 분석한다.
| 항목 | 값 |
|---|---|
| 파일명 | b098d781dba14c92ab53.exe |
| 파일 타입 | PE32+ DLL (x86-64) |
| 크기 | 4,016,152 bytes |
| SHA-256 | b098d781dba14c92ab53... |
| MD5 | 2332fe2a6fc8aa5ad21c29e55f5470ec |
| 탐지 점수 | 7.0/10 |
| 분석 환경 | Windows 10 x64 |
| 분석 시간 | 378초 |
| 패키지 | DLL (rundll32.exe로 로드) |
packer_unknown_pe_section_name 시그니처가 탐지됐다. PE 섹션 이름이 표준이 아닌 값으로 변경되어 있다. contains_pe_overlay 시그니처도 함께 탐지됐다.
PE 파일 끝에 추가 데이터(오버레이)가 붙어 있다는 뜻이다. 이 오버레이에 암호화된 설정 데이터나 2차 페이로드가 숨어 있을 수 있다.
드롭된 파일은 7z2600.exe 1건(1.3MB)이다. 정상적인 7-Zip 설치 파일로 보이며, DLL 사이드로딩의 미끼로 사용됐을 가능성이 있다.
└─ PID 6380 rundll32.exe
프로세스가 rundll32.exe 하나뿐이다. SalatStealer 분석(#320)에서 관찰된 다단계 프로세스 체인(원본 → 위장 복사 → PowerShell)과 완전히 다르다. 자식 프로세스를 생성하지 않았다.
| IP | 호스트명 | 포트 |
|---|---|---|
142.250.21.94 | c.pki.goog | 80 |
23.35.218.131 | - | 443 |
20.190.141.39 | - | 443 |
4.213.25.242 | - | 443 |
20.190.163.21 | - | 443 |
HTTP 요청은 Google CRL(인증서 폐기 목록) 조회 2건뿐이다. 실제 C2 통신은 관찰되지 않았다.
| 카테고리 | 시그니처 | 의미 |
|---|---|---|
| EDR 우회 | ntdll_memory_unhooking | ntdll.dll 메모리 보호를 PAGE_READWRITE로 변경 |
| EDR 우회 | suspicious_ntdll_disk_load | 디스크에서 깨끗한 ntdll.dll을 다시 로드 |
| 환경 탐지 | hardware_id_profiling | 볼륨 시리얼/하드웨어 ID 조회 |
| 환경 탐지 | language_check_registry | 시스템 언어 레지스트리 확인 (지오펜싱) |
| 안티디버깅 | antidebug_setunhandledexceptionfilter | 예외 핸들러 기반 디버거 탐지 |
| 로드 | dllload_suspicious_directory | 비정상 경로에서 DLL 로드 |
| 패킹 | packer_unknown_pe_section_name | 비표준 PE 섹션명 |
| 패킹 | contains_pe_overlay | PE 오버레이 데이터 존재 |
| 권한 | privilege_elevation_check | 관리자 권한/UAC 상태 확인 |
| 실행 흐름 | registers_vectored_exception_handler | VEH 등록 |
| 네트워크 | network_http | HTTP 요청 수행 |
| 자기 읽기 | reads_self | 자기 바이너리 이미지 읽기 |
12건의 시그니처 중 실제 탈취 행위(브라우저 크리덴셜 접근, 파일 수집, C2 전송)는 하나도 없다. ACRStealer가 핵심 행위를 실행하지 않은 이유는 4가지다.
ACRStealer는 C2 주소를 Google Docs, Steam 프로필, Telegra.ph에 Base64로 숨겨둔다. 악성코드가 실행되면 이 페이지에 접속해 실제 C2 주소를 가져온다. 분석 시점에 해당 페이지가 삭제되었거나, 플랫폼에 의해 차단됐을 가능성이 높다. C2 주소를 모르면 탈취한 데이터를 보낼 곳이 없으므로 행위가 중단된다.
language_check_registry 시그니처가 탐지됐다. ACRStealer는 HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Nls\CustomLocale에서 시스템 언어를 확인한다. CAPEv2 VM이 영어(en-US) 환경으로 설정되어 있어, 한국어 환경을 노리는 변종이라면 실행을 중단했을 수 있다.
이 샘플은 EXE가 아니라 PE32+ DLL이다. CAPEv2가 rundll32.exe로 로드했지만, 올바른 export 함수를 지정하지 못했을 수 있다. DLL 악성코드는 특정 export 함수(예: DllRegisterServer, ServiceMain)를 호출해야 정상 동작하는 경우가 많다. 잘못된 엔트리포인트로 호출하면 초기화 코드만 실행되고 핵심 로직은 건너뛴다.
hardware_id_profiling과 antidebug_setunhandledexceptionfilter가 탐지됐다. 볼륨 시리얼 번호와 하드웨어 ID를 조회하는 것은 VM 환경을 식별하기 위한 전형적인 기법이다. VM으로 판단되면 행위를 최소화하여 분석을 방해한다.
ASEC과 Malwarebytes의 분석 보고서를 기반으로, ACRStealer가 실제 피해 환경에서 수행하는 행위를 정리한다.
크랙 소프트웨어, 키젠, 가짜 무료 도구 다운로드 페이지를 통해 유포된다. SEO 포이즈닝으로 검색 결과 상위에 악성 다운로드 링크를 노출시킨다. 2025년 11월에는 가짜 CAPTCHA 페이지(ClickFix 기법)로도 유포됐다.
이 방식의 장점은 2가지다. 첫째, 악성코드 바이너리를 리버싱해도 C2 주소가 나오지 않는다. 둘째, 네트워크 모니터링에서 Google Docs 접속은 정상 트래픽으로 분류된다.
2025년 1월까지는 AES + 하드코딩 키로 C2 주소를 암호화했다. 이후 ECDH + ChaCha20-Poly1305로 업그레이드하여 트래픽 복호화 난이도를 높였다.
| 카테고리 | 대상 |
|---|---|
| 브라우저 | Chrome, Edge, Firefox, Opera, Brave 크리덴셜/쿠키 |
| 암호화폐 지갑 | MetaMask, Trust Wallet, Binance, Electrum, Exodus |
| 게임 | Steam 계정 |
| 기타 | 이메일, FTP, 클라우드 스토리지, 원격 접속 도구 설정 |
| 파일 | doc, txt, pdf 문서 |
CAPEv2에서도 관찰된 ntdll_memory_unhooking + suspicious_ntdll_disk_load는 ACRStealer의 핵심 우회 기법이다.
C:\Windows\System32\ntdll.dll을 디스크에서 새로 읽어온다.text 섹션을 디스크 원본으로 덮어쓴다SalatStealer(#320)는 ntdll 메모리 보호만 변경했지만, ACRStealer는 디스크에서 원본을 다시 로드하는 더 확실한 방법을 사용한다. 2026년 3월 변종은 여기서 더 나아가 직접 syscall을 호출하여 ntdll 자체를 거치지 않는다.
| 타입 | 값 |
|---|---|
| SHA-256 | b098d781dba14c92ab537385844c437a0e7f4b1b64fce8e6f7e6e67b1ec8a825 |
| MD5 | 2332fe2a6fc8aa5ad21c29e55f5470ec |
| 타입 | 값 | 맥락 |
|---|---|---|
| IP | 23.35.218.131 | Akamai CDN (C2 또는 인프라) |
| IP | 4.213.25.242 | Azure (C2 또는 인프라) |
| IP | 20.190.141.39 | Azure AD 인증 인프라 |
| IP | 20.190.163.21 | Azure AD 인증 인프라 |
Azure AD IP()는 정상 Windows 인증 트래픽일 가능성이 높다. C2 차단 시 오탐 주의.
| 기법 | 설명 | 이 샘플에서의 관찰 |
|---|---|---|
| T1055 | 프로세스 인젝션 | ntdll 메모리 보호 변경 |
| T1027 | 난독화 | PE 패킹 + 오버레이 데이터 |
| T1027.002 | 소프트웨어 패킹 | 비표준 PE 섹션명 |
| T1071 | 애플리케이션 계층 프로토콜 | HTTP/HTTPS 통신 |
| T1082 | 시스템 정보 수집 | 하드웨어 ID, 볼륨 시리얼 조회 |
| T1033 | 시스템 소유자/사용자 검색 | 권한 상태 확인 |
| T1574 | DLL 하이재킹 | 비정상 경로 DLL 로드 |
title: ACRStealer ntdll 디스크 재로드 탐지
status: experimental
description: ntdll.dll을 디스크에서 다시 로드하는 EDR 우회 기법 탐지
date: 2026-04-09
logsource:
category: file_access
product: windows
detection:
selection:
TargetFilename|endswith: '\ntdll.dll'
Image|endswith: '\rundll32.exe'
condition: selection
level: high
title: ACRStealer Dead Drop Resolver 탐지
status: experimental
description: Google Docs/Steam/Telegra.ph를 C2 리졸버로 악용하는 패턴 탐지
date: 2026-04-09
logsource:
category: proxy
detection:
selection_docs:
c-uri|contains:
- 'docs.google.com/document/d/'
- 'steamcommunity.com/profiles/'
- 'telegra.ph/'
filter_useragent:
c-useragent|contains: 'Mozilla'
condition: selection_docs and not filter_useragent
level: medium
ACRStealer는 CAPEv2 샌드박스에서 핵심 행위를 실행하지 않았다. 12건의 시그니처 중 탈취 관련 행위는 0건이다. 그러나 이것이 "안전한 악성코드"를 의미하지는 않는다. ASEC에 따르면 2026년 2월 기준 한국에서 가장 많이 유포되는 인포스틸러다.
샌드박스 분석의 한계:
대응 방안:
AI 활용 안내 이 글은 AI(Claude)의 도움을 받아 작성되었습니다. 본 분석에 사용된 IOC와 행위 데이터는 자체 CAPEv2 샌드박스에서 직접 실행하여 수집한 결과입니다. 실제 동작 분석은 ASEC, Malwarebytes 등의 공개 보고서를 기반으로 합니다. 인용된 통계와 사례는 참고 자료에 명시된 출처에 근거하며, 설명을 위한 일부 표현은 각색되었습니다.
면책 조항 본 글은 보안 인식 제고를 위한 교육 목적으로 작성되었습니다. 언급된 공격 기법을 실제로 시도하는 행위는 「정보통신망법」, 「형법」 등에 따라 처벌받을 수 있으며, 본 블로그는 이에 대한 법적 책임을 지지 않습니다.
KW_PROTECT_0