[03월 | 악성코드 분석 보고서] 한국 기업을 겨냥한 Vidar 인포스틸러, APT28 연계 정황
샌즈랩 위협 분석팀은 매월 악성코드를 선정하여 보고서를 작성합니다.
샌즈랩 위협 분석팀은 매월 악성코드를 선정하여 보고서를 작성합니다.
전문 분석을 통해 파악한 악성코드의 특징과 위협 동향, 연관 정보 등을 공유해 안전한 사이버 환경을 만들어 가고자 합니다.
악성코드에 대한 더 상세한 정보는 사이버 위협 인텔리전스 서비스 <CTX>에서 확인하실 수 있습니다.
1. 개요
본 보고서는 개인정보 및 금융 정보를 탈취하는 악성코드 Vidar 인포스틸러에 대한 상세 분석 내용을 다룬다.
Vidar는 2018년경 처음 등장한 이후 지속적으로 기능을 고도화하며 발전해 왔으며, 현재는 MaaS(Malware as a Service) 형태로 다크웹에서 유통되는 정보 탈취형 악성코드다. 초기에는 Arkei 트로이 목마의 파생으로 알려졌으나, 이후 웹 브라우저 저장 정보, 암호화폐 지갑, FTP 클라이언트, 클라우드 플랫폼 자격 증명 등 다양한 민감 데이터를 수집하고 유출하는 데 최적화된 구조로 발전하였다. 최근에는 Steam, Discord와 같은 플랫폼의 인증 토큰까지 정교하게 탈취하며 공격 범위를 확장하고 있다.
Vidar는 정상 웹 서비스인 Telegram 채널, Steam 프로필 등을 C2 중계지로 활용하는 구조를 통해, 실시간으로 C2 주소를 동적으로 확보할 수 있도록 설계되어 있다. 이를 통해 공격자는 악성코드를 재배포하지 않고도 C2 인프라를 손쉽게 교체할 수 있으며, 보안 솔루션의 차단을 효과적으로 우회한다. 본 보고서에서 분석한 샘플 역시 이러한 방식을 따르며, 한글 파일명과 문서 아이콘을 이용해 한국 사용자를 대상으로 유포되었다. 실행 시에는 EV(Extended Validation) 코드 서명이 포함된 정상 실행파일처럼 위장되어 사용자의 의심을 피하도록 설계되었고, 이후 프로세스 할로잉(Process Hollowing) 기법을 통해 악성 페이로드를 자식 프로세스에 은닉함으로써 탐지와 분석을 더욱 어렵게 만든다.
특히 분석에 사용된 샘플은 러시아 연계 APT 그룹인 APT28이 악성 이메일 발송과 탈취된 라우터를 통해 유출 데이터를 회수하는 데 사용했던 도메인과 동일한 인프라를 공유하고 있어, 단순한 MaaS 기반 사용을 넘어 APT 수준의 정교한 위협일 가능성도 제기된다. 이에 따라 본 보고서는 Vidar 인포스틸러의 전반적인 구조와 공격 방식, 탐지 회피 기법, 그리고 APT28과의 연관성을 중심으로 악성코드를 분석하고, 이를 바탕으로 향후 유사 위협에 대한 대응 전략 마련에 기여하는 것을 목표로 한다.
2. 악성코드 정보
분석에 사용된 악성코드는 "파손사진 주문서(파손상태가 많이 안좋습니다 확인부탁드립니다).exe", "저작권 관련 이미지 아이콘 UI 사용 내역.exe"와 같은 파일명으로 유포되었으며, 한글 프로그램 아이콘으로 위장해 사용자가 문서 파일로 착각하고 실행하도록 유도되었다. 특히 본 악성코드는 한국의 온라인 판매자를 대상으로, 상품이 파손되어 처리를 요청한다는 내용의 이메일에 첨부되어 발송되었으며, 이를 통해 사용자로 하여금 악성 파일을 실행하게끔 유도하였다.
![[그림 1] 악성 파일 아이콘](/api/media/file/SE-625c998a-8357-4540-8db4-bd140732b528.png)
[그림 1] 악성파일 아이콘
해당 악성코드는 Go 언어로 작성되었으며, 실행 시 사용자에게 눈에 띄는 이상 행위 없이 내부적으로 Setup.exe가 실행되도록 구성되어 있다. Go 언어는 Windows, Linux, macOS 등 다양한 운영체제에 대한 크로스 컴파일을 지원하며, 기존 C 기반 악성코드에 비해 상대적으로 분석 사례가 적고 분석 도구의 호환성도 낮은 편이기 때문에, 탐지 및 정적 분석이 더 어렵다는 특징이 있다. 이는 공격자가 악성코드를 더 은밀하게 유포하고 운영할 수 있는 환경을 제공한다.
Setup.exe는 “NEW VECTOR LTD” 명의의 유효한 EV 코드 서명을 포함하고 있어, 보안 솔루션의 탐지를 우회하고 사용자의 신뢰를 유도하기 위한 수단으로 활용된다. 해당 서명은 정식 인증기관인 DigiCert에서 발급한 정상적인 인증서 체인을 포함하고 있으며, 서명 시점은 2025년 2월 11일로 기록되어 있다. 그러나 현재 이 인증서는 더 이상 유효하지 않으며, 인증 기관(SSL.com)에 의해 해지된 상태로 확인되었다.
![[그림 2] 디지털 서명을 검증할 수 없는 인증서 정보](/api/media/file/SE-e713ca1c-0a42-4f03-8c76-a54156f6a276.png)
[그림 2] 디지털 서명을 검증할 수 없는 인증서 정보
악성코드 실행 이후에는 표면적으로 이상 징후 없이 동작하지만, 백그라운드에서는 브라우저 저장 정보, 암호화폐 지갑, 시스템 정보 등 다양한 민감 정보를 수집한 뒤 외부 C2 서버로 전송한다. 이 과정에서 프로세스 할로잉 기법을 사용해 자식 프로세스에 악성 페이로드를 은닉함으로써 분석을 어렵게 만들고, 악성 행위를 지속적으로 수행할 수 있도록 설계되어 있다.
3. 악성코드 동작 순서도
해당 악성코드는 문서 형태로 위장된 실행 파일을 통해 초기 감염을 유도한다. 피해자가 위장된 악성 파일을 실행하면, 악성코드는 동일한 자식 프로세스를 생성한 뒤, 내부에서 압축 해제된 악성 페이로드를 해당 프로세스에 프로세스 할로잉 방식으로 삽입한다. 이를 통해 탐지를 회피하고 악성 행위를 은폐한 상태로 지속할 수 있도록 설계되어 있다.
페이로드가 삽입된 프로세스는 이후 공격자의 명령을 수신하기 위한 초기 설정을 수행한다. 악성코드는 Telegram 및 Steam Community와 같은 정상 플랫폼을 중계지로 활용하여 실질적인 C2 서버 주소를 확보한다. 내부에 하드코딩된 Telegram 및 Steam 프로필 링크에 접속한 뒤, HTML 내용을 파싱 하여 “ir7am”이라는 키워드를 기준으로 실제 C2 주소를 추출한다. 이 방식을 통해 공격자는 악성코드를 다시 배포하지 않고도 C2 주소를 수시로 변경할 수 있다.
C2 주소 확보 후, 악성코드는 감염된 시스템에서 수집한 다양한 정보를 외부로 전송한다. 수집 대상에는 브라우저 저장 정보, 암호화폐 지갑, 시스템 정보, 클라우드 자격 증명 등이 포함된다. 수집된 정보는 비동기 전송 루틴을 통해 최종적으로 추출된 실제 C2 서버로 전송된다.
![[그림 3] 악성코드 동작 순서도](/api/media/file/SE-2812e0e8-beda-4314-885a-033e25a6c0f6.png)
[그림 3] 악성코드 동작 순서도
4. 악성코드 분석
4.1. 악성 페이로드 메모리 로드 및 실행
유포된 악성코드를 실행하면, 내부 페이로드가 압축 해제 과정을 거쳐 메모리에 로드된다. 이후 실행 파일과 동일한 이름의 자식 프로세스를 생성한 뒤, 해당 프로세스에 프로세스 할로잉 기법을 적용해 악성 페이로드를 주입한다. 이러한 방식은 악성 행위를 은닉하고 보안 탐지를 우회할 수 있다.
![[그림 5] 추출한 악성 페이로드 파일 헥스 덤프](/api/media/file/SE-04322b40-f3ab-4bec-835a-105681feed51.png)
[그림 5] 추출한 악성 페이로드 파일 헥스 덤프
4.2. C2 서버 주소 획득 및 연결
악성코드는 공격자의 명령을 수신하기 위해 정상적인 플랫폼(Steam Community 및 Telegram 채널)을 중계 서버로 활용하여 실제 C2 서버 주소를 동적으로 확보하는 구조로 설계되어 있다. 이 구조는 다음과 같은 절차를 따른다.
첫째, 악성코드는 내부에 미리 하드코딩된 Telegram과 Steam Community URL을 배열 형태로 구성한다.
배열의 각 항목은 Telegram 채널 또는 Steam Community 프로필 링크, 키워드, 그리고 User-Agent 문자열로 구성되어 있다.
배열은 다음과 같다.
- Telegram/Steam Community: https://t.me/l793oy, https://steamcommunity.com/profiles/76561199829660832
- 키워드: ir7am
- User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Chrome/131.0.0.0 Safari/537.36 OPR/116.0.0.0
![[그림 6] 하드코딩된 URL 쌍](/api/media/file/SE-dc19d603-ef71-443d-bf39-75eb0654cb80.png)
[그림 6] 하드코딩된 URL 쌍
둘째, 구성된 URL 목록을 순차적으로 탐색하면서 각각의 URL에 HTTP 요청을 전송하고 응답 내용을 분석한다.
이 과정에서 응답받은 HTML 내용 중 키워드(“ir7am”)와 함께 존재하는 실제 C2 서버 주소를 파싱 하여 추출한다. 분석 결과 Telegram 페이지에서는 https://b.b.goldenloafuae.com이, Steam Community 페이지에서는 https://116.202.4.223이 실제 C2 주소로 확인되었다.
![[그림 7] Telegram과 Steam 프로필에 적힌 실제 C2 주소](/api/media/file/SE-5a510acd-52df-48f7-8156-a6b504f21904.png)
[그림 7] Telegram과 Steam 프로필에 적힌 실제 C2 주소
이러한 정상 플랫폼을 중계 서버로 활용하는 방식은 보안 솔루션의 탐지를 우회하고, 공격자가 플랫폼의 내용을 수정하는 것만으로도 악성코드를 재배포하지 않고 새로운 C2 서버로 변경할 수 있는 유연성을 제공한다.
4.3. 피해 시스템 정보 수집
악성코드는 감염된 시스템에서 다양한 형태의 민감 정보를 폭넓게 수집한다.
주요 수집 항목은 프로그램 버전, GUID, HWID, 실행 경로 및 작업 디렉터리, Windows 설치 정보, 설치된 백신 소프트웨어, 컴퓨터 이름, 사용자 이름, 화면 해상도, 키보드 언어, 시스템 시간 및 시간대 등의 시스템 정보와 프로세서 종류, 코어 수, 쓰레드 수, 메모리 용량 등의 하드웨어 정보가 포함된다. 또한 실행 중인 프로세스 목록과 레지스트리(HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER)에 등록된 설치 프로그램 정보까지 수집하여, 공격자가 시스템의 전체 구성과 사용 환경을 상세히 파악할 수 있도록 한다. 이렇게 수집된 정보는 information.txt라는 이름으로 메모리에 저장된 뒤, 압축 및 암호화 과정을 거쳐 C2 서버로 전송된다.
![[그림 8] 실제 C2로 전송된 시스템 정보 복호화 결과](/api/media/file/SE-317c480e-4245-41fe-96dc-08564e525dd5.png)
[그림 8] 실제 C2로 전송된 시스템 정보 복호화 결과
4.4. 브라우저 저장 정보 탈취
악성코드는 브라우저의 프로파일 디렉터리를 탐색하여 사용자 데이터를 탈취한다.
주요 수집 대상 파일은 쿠키(Cookies), 웹 데이터(Web Data), 방문 기록(History) 등이며, 이 파일들은 일반적으로 %LOCALAPPDATA%, %APPDATA%와 같은 환경 변수와 사용자 경로 정보를 활용해 위치를 특정한다.
먼저 악성코드는 FindFirstFileA() 및 FindNextFileA() API를 통해 프로파일 디렉토리 내에서 수집 대상 파일의 존재 여부를 탐색한다. 발견된 파일은 메모리에 로드된 후, _cookies.db, _webdata.db, _history.db 등의 이름으로 압축 및 암호화 과정을 거쳐 C2 서버로 전송된다. 탈취된 쿠키 및 세션 정보를 통해 공격자는 추가적인 인증 과정 없이 피해자의 온라인 계정에 직접 접근할 수 있어 사생활 침해와 금전적 피해로 이어질 가능성이 높다.
![[그림 9] 실제 C2로 전송된 브라우저 데이터](/api/media/file/SE-df5e3ea2-6971-428a-99f0-3f0ed6310ab8.png)
[그림 9] 실제 C2로 전송된 브라우저 데이터
4.5. 파일 전송 클라이언트 인증 정보 탈취
4.5.1. FileZilla FTP 인증 정보 탈취
악성코드는 사용자의 로컬 시스템에서 FileZilla 프로그램의 접속 기록이 저장된 recentservers.xml 파일을 찾아 FTP 로그인 정보를 추출하고 이를 외부로 전송한다.
악성코드는 먼저 환경 변수 %APPDATA% 경로의 \AppData\Roaming\FileZilla\recentservers.xml 파일을 메모리로 로드한다. 이후 strtok_s() 함수와 <Host>, <Port>, <User>, <Pass encoding="base64"> 등의 태그를 기반으로 XML 내부 문자열을 파싱 하여 FTP 서버 주소, 포트, 계정명, 비밀번호를 추출한다.
특히 비밀번호는 FileZilla 설정 파일 내에서 base64로 인코딩된 상태로 저장되므로, 악성코드는 이를 평문으로 복원하기 위해 내장된 base64 디코딩 루틴을 사용한다. 이렇게 추출된 자격 증명 정보는 “Soft: FileZilla”라는 구문을 포함한 포맷으로 정리되며, 최종적으로 passwords.txt라는 이름으로 압축 및 암호화 과정을 거쳐 외부 C2 서버로 전송된다.
![[그림 10] FileZilla 자격 증명 유출 데이터 포맷팅 코드](/api/media/file/SE-9b074721-b6c9-4112-809d-5ec47ec35025.png)
[그림 10] FileZilla 자격 증명 유출 데이터 포맷팅 코드
FileZilla는 널리 사용되는 FTP 클라이언트 프로그램으로, 공격자가 이러한 인증 정보를 확보할 경우 피해자가 관리하거나 접근 가능한 FTP 서버에 무단으로 접속할 수 있게 된다. 이는 공격자가 웹 서버를 장악하거나 백도어 설치, 웹사이트 변조 등의 2차 피해로 이어질 수 있는 위험성이 존재한다.
4.5.2. WinSCP 세션 인증 정보 탈취
악성코드는 Windows 레지스트리를 통해 WinSCP 프로그램에 저장된 로그인 정보를 수집하고, 이를 외부로 유출하는 기능을 수행한다. WinSCP는 사용자의 세션 설정 정보를 HKEY_CURRENT_USER\Software\Martin Prikryl\WinSCP 2\Sessions 레지스트리 경로에 저장하는데, 악성코드는 이 경로를 열람하여 사용자별로 저장된 FTP/SFTP 서버 접속 정보를 탐색한다.
초기에는 WinSCP가 마스터 비밀번호를 사용하는지를 확인하고, 설정되어 있지 않은 경우에만 세션 정보 수집을 진행한다. 이후 존재하는 세션 키를 열거하고, 각 세션에 대해 다음과 같은 정보를 추출한다
- HostName: 접속할 서버 주소
- PortNumber: 포트 번호 (없을 경우 기본 포트 22 사용)
- UserName: 로그인 계정
- Password: 저장된 비밀번호
이렇게 추출된 자격 증명 정보는 “Soft: WinSCP”라는 구문을 포함한 포맷으로 정리되며, 최종적으로 passwords.txt라는 이름으로 압축 및 암호화 과정을 거쳐 외부 C2 서버로 전송된다.
![[그림 11] WinSCP 자격 증명 유출 데이터 포맷팅 코드](/api/media/file/SE-81b2a606-30c2-4f24-981d-2f3eae66810f.png)
[그림 11] WinSCP 자격 증명 유출 데이터 포맷팅 코드
4.6. Monero 암호화폐 지갑 파일 탈취
해당 악성코드는 감염된 시스템에서 Monero 암호화폐 지갑 정보를 수집하고 외부로 유출하는 기능을 수행한다.
이를 위해 먼저 Windows 레지스트리 경로인 HKEY_CURRENT_USER\SOFTWARE\monero-project\monero-core를 열람한 뒤, wallet_
path 값을 조회하여 사용자가 사용하는 Monero 지갑 파일의 경로를 식별한다. 해당 경로에는 일반적으로 .keys 확장자를 가진 지갑 키 파일이 저장되며, 이 파일에는 Monero 지갑의 개인 키와 같은 민감한 정보가 포함되어 있다. 악성코드는 해당 경로를 기반으로 .keys 파일의 전체 경로를 구성한 뒤, 파일을 복사하여 압축 및 암호화한 후 C2 서버로 전송한다.
![[그림 12] Monero .keys 파일 경로 탐색 코드](/api/media/file/SE-b435e814-2aef-43b1-b495-e6641956b85f.png)
4.7. Steam 계정 및 설정 정보 탈취
4.7.1. Steam JWT 토큰 탈취
악성코드는 피해자의 Steam 인증 정보를 탈취하기 위해 JWT(JSON Web Token)를 메모리에서 탐색하여 수집하고 이를 외부로 유출하는 기능을 수행한다. 이 기능은 먼저 실행 중인 steam.exe 프로세스의 PID(Process ID)를 확인한 후, 해당 프로세스의 가상 메모리 공간을 순차적으로 스캔한다. 탐색 대상은 JWT의 일반적인 헤더 형식을 Basee64로 인코딩한 문자열 “eyAidHlwIjogIkpXVCIs”이며, 이를 다시 디코딩 하면 { "typ": "JWT", 이 된다. 실제 코드에서는 이 문자열에 해당하는 바이트 시퀀스 65 79 41 69 64 48 6C 77 49 6A 6F 67 49 6B 70 58 56 43 49 73를 기준으로 메모리 내 존재 여부를 확인하고, 탐지된 위치 주변의 메모리 블록을 읽어온다. 이후 해당 블록에 “N0ZWFt”가 존재하는지를 확인하며, 조건에 부합할 경우 해당 데이터를 유효한 JWT 토큰으로 간주한다. 추출된 토큰은 압축 및 암호화 과정을 거쳐 C2 서버로 전송된다.
![[그림 13] 프로세스 내 JWT 헤더 탐색 코드](/api/media/file/SE-8f64fce0-0f54-4273-b5bb-46422a00df65.png)
[그림 13] 프로세스 내 JWT 헤더 탐색 코드
Steam은 EdDSA(Edwards-curve Digital Signature Algorithm) 서명을 사용하는 JWT를 인증 및 세션 유지에 활용한다. 이 토큰은 사용자의 로그인 상태를 식별하고 인증된 세션을 유지하는 핵심 수단으로, 탈취된 JWT 토큰을 이용하면 별도의 로그인 절차 없이 해당 사용자의 계정으로 위장하여 접근이 가능하다. 따라서 공격자가 이 토큰을 확보할 경우, 피해자의 Steam 계정에 무단으로 접속하거나 계정 탈취, 아이템 도용 등 2차 피해를 일으킬 수 있다.
4.7.2. Steam 설정 파일 탈취
악성코드는 피해자 시스템에서 Steam 클라이언트와 관련된 주요 설정 파일을 탐색 및 탈취하여 공격자의 외부 C2 서버로 전송하는 기능을 수행한다. Windows 레지스트리의 HKEY_CURRENT_USER\Software\Valve\Steam 경로에서 "SteamPath" 값을 조회하여 Steam 설치 경로를 파악한 뒤, 해당 경로를 기반으로 설정 파일들이 존재하는 config 디렉터리를 찾아낸다.
![[그림 14] 탐색할 Steam 설정 파일 경로 설정 코드](/api/media/file/SE-dec3002c-5946-47af-949e-0da3d640a030.png)
[그림 14] 탐색할 Steam 설정 파일 경로 설정 코드
이후 해당 디렉터리에서 config.vdf, DialogConfig.vdf, DialogConfigOverlay*.vdf, libraryfolders.vdf, loginusers.vdf 등 민감한 정보를 담고 있는 설정 파일들을 이름 패턴에 따라 탐색한다. 탐지된 파일은 메모리에 로드된 뒤, 압축 및 암호화 과정을 거쳐 C2 서버로 전송된다.
탈취된 파일 중 특히 loginusers.vdf는 Steam 계정의 자동 로그인 정보가 포함되어 있어, 공격자는 이를 통해 피해자의 Steam 계정에 직접 접근할 수 있으며, libraryfolders.vdf 및 config.vdf 파일을 통해 사용자가 설치한 게임 목록 및 환경 설정과 같은 상세한 정보도 함께 파악할 수 있다.
4.8. Discord 인증 토큰 탈취
악성코드는 피해자의 Discord 클라이언트 로컬 저장소에서 인증 토큰을 수집하고, 이를 외부 서버로 유출하는 기능을 수행한다.
특히 Discord의 LevelDB와 Local State 파일을 동시에 활용하여 AES로 암호화된 인증 토큰을 복호화 한 뒤 전송하는 구조를 따른다. 먼저 악성코드는 %APPDATA% 경로를 확보한 뒤, \discord\Local Storage\leveldb\CURRENT 파일이 존재하는지를 확인하여 Discord 클라이언트가 설치되어 있는지를 판단한다. 해당 경로가 유효할 경우, leveldb 디렉터리 내부에 존재하는 .ldb, .log 파일들을 수집 대상으로 설정한다.
![[그림 15] Discord LevleDB 디렉토리의 CURRENT 경로 설정 코드](/api/media/file/SE-aa166dd3-89d3-45d8-a322-16b9db7c04de.png)
[그림 15] Discord LevleDB 디렉토리의 CURRENT 경로 설정 코드
그 후 %APPDATA%\discord\Local State 파일에 접근하여, 이 파일 내 저장된 AES-GCM 암호화 키를 추출한다. 추출된 키는 앞서 복사한 leveldb 파일에 포함된 인증 토큰 복호화에 사용된다. 복호화 과정에서는 토큰을 저장할 때 사용하는 고정 식별자인 "dQw4w9WgXcQ" 문자열을 기준으로 Discord 토큰 문자열을 식별하고, Base64 디코딩 및 AES 복호화를 통해 평문 토큰을 추출한다. 토큰은 token*.txt 형식으로 메모리상에 구성되며, 이후 압축 및 암호화 과정을 거쳐 C2 서버로 전송된다.
![[그림 16] Discord Token 식별 코드](/api/media/file/16-1.png)
[그림 16] Discord Token 식별 코드
4.9. 클라우드 자격 증명 정보 탈취
악성코드는 피해자 시스템 내에서 클라우드 서비스에 대한 자격 증명 파일을 탐색하고 이를 C2 서버로 유출하는 기능을 수행한다.
주요 대상은 Microsoft Azure 및 Amazon Web Services(AWS)와 같은 클라우드 플랫폼이며, 여기에 더해 Windows 환경에서 인증 정보를 저장하는 Microsoft IdentityService 디렉토리도 수집 대상에 포함된다. 이들은 모두 로컬 시스템에 표준 디렉토리 형태로 자격 증명 정보(예: 액세스 키, 설정 파일, 토큰 등)를 저장하고 있어, 공격자는 해당 경로를 중심으로 자격 정보를 탐색하고 유출을 시도한다.
악성코드는 다음의 세 가지 디렉토리를 중점적으로 탐색한다.
- Azure CLI 인증 디렉토리: %USERPROFILE%\.azure\
Azure CLI를 통해 로그인한 사용자 인증 정보 및 관련 파일이 저장되는 위치로, 내부 파일을 재귀적으로 탐색하여 수집한 뒤 C2 서버로 전송한다.
- AWS CLI 인증 디렉토리: %USERPROFILE%\.aws\
AWS CLI의 설정 파일(credentials, config)이 위치하며, 사용자 접근 키(Access Key ID), 비밀 접근 키(Secret Access Key) 등 민감 정보가 포함된 파일을 탐색하여 동일한 방식으로 외부로 유출한다.
- Microsoft IdentityService 디렉토리: %LOCALAPPDATA%\.IdentityService\
Microsoft 계정과 Azure AD 연동 인증 토큰, 캐시 등의 정보가 저장된 디렉토리로, 이 역시 재귀적으로 탐색하여 중요한 자격 증명 정보를 수집한 후 외부로 유출한다.
![[그림 17] 탐색할 디렉토리 코드](/api/media/file/17-1.png)
[그림 17] 탐색할 디렉토리 코드
탐색된 파일들은 압축 및 암호화 과정을 거쳐 C2 서버로 전송된다.
이렇게 확보된 클라우드 인증 정보는 공격자가 피해자의 클라우드 자원에 무단 접근하거나, 이를 발판으로 한 추가 공격에 활용될 수 있다.
4.10. 사용자 화면 캡처 및 탈취
악성코드는 피해자 시스템의 전체 화면을 캡처한 후 이를 JPEG 형식의 이미지로 변환하여 외부 C2 서버로 전송하는 기능을 수행한다.
이 과정은 GDI+(Graphics Device Interface+) 라이브러리를 활용해 이루어지며, 우선 악성코드는 InitializeGDIPlus()를 통해 GDI+ 환경을 초기화한 뒤 JPEG 형식의 이미지 인코더를 탐색 및 설정한다.
화면 캡처 과정에서는 GetDesktopWindow()와 GetWindowRect()를 호출하여 현재 시스템의 전체 화면 크기를 확인한다. 이어서 GetDC(), CreateCompatibleDC(), CreateCompatibleBitmap() 함수를 차례로 호출하여 화면 캡처를 위한 메모리 DC(Device Context)와 비트맵 객체를 생성한 뒤, 실제 화면 내용을 BitBlt() 함수를 사용하여 메모리 DC에 복사하는 방식으로 스크린샷을 획득한다.
![[그림 18] 사용자 화면 캡처 코드](/api/media/file/18-1.png)
[그림 18] 사용자 화면 캡처 코드
캡처된 화면 이미지는 JPEG 포맷으로 저장하기 위해 메모리 스트림을 생성한 후, 지정된 이미지 인코더를 이용해 해당 스트림에 저장된다. 이후 준비된 JPEG 이미지는 screenshot.jpg라는 이름으로 C2 서버로 전송된다.
4.11. 원격 악성 페이로드 다운로드 및 실행
악성코드는 원격 서버에서 악성 페이로드를 다운로드한 뒤, 이를 피해자의 시스템에서 실행한다. 저장 위치는 C:\ProgramData\ 디렉토리를 사용하며, 파일 확장자는 C2 서버와 통신하여 전달받는 스택 값을 기준으로 결정된다. 해당 값이 0일 경우 확장자는 .exe가 되고, 1일 경우에는 .dll로 지정된다.
![[그림 19] 파일 확장자 설정 코드](/api/media/file/19-1.png)
[그림 19] 파일 확장자 설정 코드
이후, 악성코드는 C2 서버로부터 전달받은 URL을 복호화 하여 원격 페이로드를 다운로드한 뒤, 구성된 경로에 파일을 저장한다. 다운로드가 완료된 파일은 즉시 ShellExecuteExW() API를 통해 실행된다. 파일이 .exe 형식일 경우 직접 실행하며, .dll 형식일 경우에는 rundll32.exe를 사용하여 특정 export 함수를 간접적으로 호출하는 방식으로 실행된다. 이러한 방식은 보안 솔루션의 프로세스 기반 탐지를 우회할 수 있다.
![[그림 20] rundll32.exe 지정 코드](/api/media/file/20-1.png)
[그림 20] rundll32.exe 지정 코드
이 기능은 공격자가 시스템 내에서 악성 행위를 확장하거나 필요에 따라 추가 악성 페이로드를 원격으로 다운로드하고 실행할 수 있는 유연성을 제공한다. 따라서 피해자의 시스템은 지속적으로 추가적인 보안 위협에 노출될 수 있으며, 이와 같은 탐지 회피 기법으로 인해 보안 솔루션의 정확한 탐지 및 대응이 더욱 어려워질 수 있다.
4.12. 악성 행위 흔적 삭제
악성코드는 악성 행위를 마친 후 시스템 내 흔적을 제거하기 위해 cmd.exe를 호출하여 삭제 명령을 실행한다.
ShellExecuteExA() API를 통해 실행되는 명령어는 /c timeout /t 11로 11초간 대기한 뒤 삭제를 수행하는 구조이며, 조건 분기에 따라 다음 두 가지 방식으로 구성된다. 하나는 rd /s /q "C:\ProgramData\Data\" & exit 명령을 사용하여 폴더 전체를 삭제하는 방식이고, 다른 하나는 여기에 del /f /q * 명령을 추가하여 폴더 내 파일을 먼저 강제 삭제한 뒤 디렉터리를 제거한다.
삭제 대상 경로는 C:\ProgramData\Data\로 고정되어 있으며, 해당 폴더는 악성 행위를 수행할 때 이용한 폴더이다.
이처럼 실행 종료 전 단계에서 명확한 디렉터리 제거 루틴을 구성함으로써, 공격자는 디스크 상의 흔적을 최소화하고 분석을 방해할 수 있도록 설계한 것으로 보인다. 특히 일정 시간 지연 후 삭제가 이루어지기 때문에, 현재 실행 중인 악성 프로세스가 완전히 종료된 이후 파일 삭제가 가능하다는 점에서, 정교하게 설계된 악성코드인 것을 확인할 수 있다.
ShellExecuteExA({ cbSize: sizeof(SHELLEXECUTEINFOA), fMask: ..., hwnd: NULL, lpVerb: "open", lpFile: "C:\\Windows\\system32\\cmd.exe", lpParameters: "/c timeout /t 11\" & rd /s /q \"C:\\ProgramData\\Data\\\" & exit", nShow: 0x3c, ... }); | ShellExecuteExA({ cbSize: sizeof(SHELLEXECUTEINFOA), fMask: ..., hwnd: NULL, lpVerb: "open", lpFile: "C:\\Windows\\system32\\cmd.exe", lpParameters: "/c timeout /t 11\" & rd /s /q \"C:\\ProgramData\\\" & del /f /q\" & exit", nShow: 0x3c, ... }); |
|---|
[표 1] 흔적 삭제 쉘 명령어
5. 수집/유출 정보
구분 | 세부 정보 | 대상 프로그램 |
|---|---|---|
Chromium 기반 브라우저 | - 쿠키 - 웹 데이터 - 방문 기록 | Google Chrome, Google Chrome Canary, Chromium, Vivaldi, EpicPrivacyBrowser, CocCoc 등 |
시스템 정보 | - 프로그램 버전 정보 - 시스템 로컬 시간, 시간대 - MachineGuid - GUID - HWID - 실행 경로 - 운영 체제 제품명 - 호스트명 - 계정명 - 해상도 - 키보드 목록 - CPU - 소켓 수 - 코어 수 - RAM - GPU - 프로세스 목록 - 설치 프로그램 목록 | Windows |
파일 전송 클라이언트 | - Host - Port - User - Password | FileZilla, WinSCP |
로컬 파일 기반 지갑 | - .keys 파일 | Monero |
커뮤니케이션 플랫폼 | - JWT 토큰 - 설정 파일(config.vdf, DialogConfig. vdf 등) | Steam |
- LevelDB 파일, Local State 파일 | Discord | |
- 세션 키 - 캐시 데이터 - 사용자 대화 정보 | Telegram | |
클라우드 자격 증명 | - %USERPROFILE%\.azure\ - %USERPROFILE%\.aws\ - %LOCALAPPDATA%\.IdentityService\ | Microsoft Azure, Amazon Web Services |
스크린샷 | - 전체 화면 |
[표 2] 수집/유출 정보
6. 결론
분석된 악성코드는 Vidar 인포스틸러 계열로, 한글 문서 아이콘과 한국어로 된 파일명을 활용해 한국 사용자를 표적으로 유포되었다.
특히, “상품 파손 확인 요청”이라는 내용의 이메일에 첨부되어 국내 온라인 판매자를 노리고 유포되었으며, 유효한 EV 코드 서명을 포함해 정상 실행파일로 위장함으로써 사용자의 실행을 유도하고 보안 솔루션의 탐지를 회피하도록 설계되었다. 실행 이후에는 동일한 이름의 자식 프로세스를 생성하고, 프로세스 할로잉 기법을 활용해 악성 페이로드를 메모리에 은닉하여 백그라운드에서 악성 행위를 수행한다.
악성코드는 C2 서버와의 통신을 위해 Telegram과 Steam Community 같은 정상 플랫폼을 중계 서버로 활용하여, 하드코딩된 링크의 HTML을 파싱 해 특정 키워드 기반으로 실시간 C2 주소를 추출한다. 이를 통해 공격자는 악성코드를 재배포하지 않고도 C2를 유연하게 교체할 수 있으며, 보안 탐지 및 차단을 효과적으로 우회할 수 있다.
수집 대상 정보는 브라우저 저장 정보, FTP 클라이언트 설정, Steam 및 Discord 계정 정보, 암호화폐 지갑, 클라우드 자격 증명 등 광범위하며, 특히 Steam의 JWT 토큰과 Discord의 AES-GCM 암호화 토큰을 메모리에서 직접 복호화 해 추출하는 고도화된 기법이 적용되었다. 추가로 사용자 화면을 캡처하여 이미지 형태로 유출하는 스파이웨어 기능, 원격 페이로드 다운로드 및 실행, 그리고 마지막 단계에서 파일과 디렉토리를 자동 삭제하는 은닉 기능도 구현되어 있다.
이번에 분석된 악성코드는 b.b.goldenloafuae.com 도메인을 C2 인프라로 사용하였으며, 해당 도메인은 아랍에미리트(UAE)의 실제 제과 브랜드 “Golden Loaf”의 서버로, 실제 서버가 탈취되었거나 도메인 정보가 탈취된 것으로 판단된다. 더욱이 goldenloafuae.com은 과거 러시아 연계 APT 그룹인 APT28이 악성 이메일 발송 및 탈취 라우터를 통한 유출 데이터 회수 인프라로 활용한 전력이 있어, 본 악성코드 역시 APT28의 활동과 연관되었을 가능성을 시사한다. 이처럼 실존 기업의 도메인을 탈취해 사용하는 방식은 공격자가 악성 트래픽을 정상적인 트래픽처럼 위장할 수 있게 하며, 탐지 솔루션을 우회하는 데 활용된다.
![[그림 21] APT28 그룹이 사용한 도메인 goldenloafuae.com](/api/media/file/21-1.png)
[그림 21] APT28 그룹이 사용한 도메인 goldenloafuae.com
Vidar 인포스틸러는 MaaS 형태로 유통되어 다양한 공격자들이 동일한 페이로드를 공유하면서 C2 정보만을 변경해 사용하는 구조적 특성을 가진다. 하지만 이번 사례처럼 APT 그룹의 공격 인프라가 재사용된 정황은, 단순한 도구의 활용을 넘어 특정 국가와 산업 군을 겨냥한 정교한 공격일 가능성을 뒷받침한다. 특히 최근에는 실제 피해자가 활동하는 온라인 커뮤니티를 중심으로 ‘물품 파손 확인 요청’ 메일에 대한 주의가 확산되고 있으며, 이를 통해 본 공격이 국내 온라인 판매자를 중심으로 현실적인 피해를 초래하고 있음을 보여준다. 이에 따라 유사한 위협이 반복될 가능성이 높으며, 국내 기업과 사용자를 보호하기 위한 지속적인 위협 인텔리전스 공유와 다계층 방어 체계 강화가 요구된다.


