보안 위협 분석

온라인 문의

PURELOGS InfoStealer

악성코드 분석        2026-03-10

1) 개요

PURELOGS InfoStealer는 최근 사이버 범죄 생태계에서 매우 악명을 떨치고 있는 .NET 기반의 서비스형 악성코드(Malware-as-a-Service, MaaS)이다. 2022년 여러 암시장 포럼에서 처음 판매되기 시작했으며, PureCoder라는 개발자가 개발 및 판매하고 있다. 해당 악성코드 외에도 PureRAT, BlueLoader, PureCrypter와 같은 다른 악성 도구들도 판매하고 있다.
특정 산업군을 가리지 않고, 다양한 산업군을 대상으로 공격을 시도하고 있으며, 백신의 탐지를 피하기 위해 시스템 API를 직접 호출하고 메모리 상에서만 동작하는 치밀함을 보이며, 탈취한 정보를 압축하여 공격자의 C2 서버로 전송한 뒤 흔적을 지우는 방식으로 운영하고 있다. 

<그림 1> PureCoder가 판매중인 PureLogs Stealer 페이지
 

2) 악성 js 파일

해당 악성코드는 제약 회사 청구서로 위장한 메일로 유포되었다. 메일에 첨부된 zip 파일을 열면 js 확장자를 가진 파일이 들어가 있다. 해당 js 파일은 WSH(Windows Script Host) JScript 파일로, Windows 스크립팅 엔진을 통해 실행된다. 해당 파일을 열어보면 아래와 같이 특이한 문자들로 난독화되어 있다. 소스코드 내부의 replace 함수를 통해 불필요한 문자들은 삭제되고, WMI(Windows Management InstrumentationManagement)를 통해 실행된다. 

<그림 2> 난독화된 js 스크립트
 

<그림3 > powershell 명령어
 

powershell 명령어에서 중요한 부분은 아래와 같으며, hxxps[://]archive[.]org/download/optimized_msi_20250904/optimized_MSI[.]png 주소에서 png 파일을 다운받아 DownloadString 함수를 통해 메모리상에 데이터를 저장한다. 

<그림 4> PNG 다운로드 및 메모리에 저장 

 

저장된 png 파일의 앞부분은 이미지 데이터지만 뒷 부분의 ‘BaseStart-’부터는 악성코드 다운로더의 바이너리 데이터가 저장되어 있다. powershell 명령어에서 해당 부분을 읽어온 뒤 복호화하여 파일리스(Fileless)로 실행한다. 이러한 파일리스 실행 방식을 통해 기존 안티바이러스의 탐지를 회피한다. 

※ 파일리스(Fileless) : 시스템의 하드 드라이브에 파일을 생성하지 않고 실행되는 악성 코드 공격 방식을 의미 

<그림 5> png 파일에 숨겨진 다운로더 파일
 

3) Microsoft.Win32.TaskScheduler.dll – 악성코드 다운로더

악성코드 다운로더는 .NET으로 개발되었으며, powershell에 명시된 옵션을 이용하여 VAI 함수를 실행한다. 악성코드 함수 및 변수는 알아볼 수 없는 이름으로 난독화되어 있다. 

<그림 6> powershell을 통해 악성코드 다운로더 함수 실행
 

<그림 7> 악성코드 다운로더 내 VAI 함수
 

powershell에서 전달받은 추가 다운로드 주소를 StrReverse 함수로 뒤집은 뒤 base64로 복호화하여 나온 “hxxp[://]lineclearexpress[.]wuaze[.]com/arquivo_20250908023227[.]txt” 주소에서 데이터를 다운로드한다. 

<그림 8> 추가 악성코드 다운로드
 

다운받은 페이로드는 메모리에 로드하여 실행한다. 이를 위해 로더는 프로세스 할로잉(Process Hollowing) 기법으로 정상 프로세스의 메모리에 페이로드를 인젝션한다. 

※ 프로세스 할로잉(Process Hollowing) : 파일리스(Fileless) 공격 기법 중 하나로, 정상적인 프로세스의 껍데기는 유지한 채 그 내부의 내용은 악성 코드로 바꿔치기하는 수법 

<그림 9> 다운로드한 악성코드를 임의의 파일에 인젝션
 

4) Qgwwal.exe – 암호화된 데이터 복호화 및 압축 해제 프로그램

프로세스 할로잉으로 실행된 페이로드는 최종 페이로드가 아니라 압축 해제 프로그램이다. 해당 프로그램은 파일 리소스에 저장된 최종 페이로드를 메모리 내에서 복호화 및 압축 해제 후 실행을 목적으로 한다.
main 함수에서 Rtrne 함수를 실행하면 아래와 같이 각각의 기능을 순차적으로 실행한다. 

<그림 10> 순차적으로 암호화된 리소스 파일 복호화 및 압축 해제
 

첫 번째 작업 단계는 ConnectMonoConnection 함수에서 DecompressDispatcher를 실행하여 복호화를 진행한다. 

<그림 11> DecompressDispatcher 함수를 실행하여 파일 복호화 진행
 

DecompressDispatcher 함수에서는 암호화 알고리즘을 이용하여 복호화를 진행한다. 복호화시 특징으로 대중적으로 사용되는 AES 알고리즘 대신 3DES 알고리즘을 사용하여 복호화를 진행한다. 3DES는 NIST에서 속도가 느리고 비효율적이라는 이유로 공식적으로 사용을 중단한 구식 암호화 알고리즘이다. 많은 백신에서 AES와 관련된 암호화 상수 및 서명을 탐지하다보니 3DES을 이용하여 백신 탐지를 회피하는 것으로 보인다. 

<그림 12> 3DES 알고리즘을 이용해 리소스 파일 복호화
 

복호화 후에도 PE 파일이 나오는게 아니라 GZip 압축 파일이 나온다. 해당 파일을 EncrytEfficientDecrtyptor 함수를 이용하여 압축을 해제한다. 이러한 복호화 후 압축 해제를 통해 효과적으로 백신의 탐지를 회피한다. 

<그림 13> 복호화한 파일 압축 해제
 

복호화 및 압축 해제로 생성된 파일이 최종 PURELOGS 페이로드로 AssessConnection 함수에서 Assembly.Load 함수를 통해 메모리로 로드된다. 

<그림 14> 최종 페이로드 메모리 로드
 

5) PURELOGS InfoStealer

PURELOGS가 실행되면 C2 정보를 확보하기 위해 Base64로 인코딩된 문자열을 디코딩하고, MD5 해시값을 계산하여 실제 3DES 키를 생성한다. 그 후 생성된 키로 TripleDESCryptoServiceProvider를 초기화한 후 CreateDecryptor().TransformFinalBlock() 함수를 호출하여 데이터를 복호화한다. 

<그림 15> 암호화된 C2 정보 복호화
 

그 후 각종 스틸러 모듈을 이용하여, 웹브라우저에서 사용자 개인정보 탈취, 다양한 애플리케이션 토큰을 이용하여 개인 정보 탈취, 암화화폐 지갑 정보 탈취, 기기정보를 수집한다.
수집하는 웹 브라우저로는 Firefox, Chrome, Edge, Brave, Opera가 있고, 평문 AES-256-GCM 마스터 키를 확보한 후 SQLite 데이터베이스, 로그인 데이터, 쿠키 및 웹 데이터에 접근하여 저장된 자격 증명, 세션 쿠키, 자동 완성 정보, 이용 내역 및 신용 카드 정보를 복호화하고 추출한다. 

<그림 16> 브라우저 정보 수집
 

암호화폐 지갑의 경우도 Bitcoin Core, Electrum, Exodus, Monero 등 30개 이상의 지갑 애플리케이션 목록을 하드코딩하여 수집하며, 특히 크롬브라우저 계열의 확장 프로그램에 설치하는 암화화폐 지갑을 식별하기 위해 타겟 리스트가 하드코딩되어 있고, 일치하는 암화화폐 지갑의 경우 암호화된 시드 구문과 개인키가 포함된 전체 확장 프로그램 데이터 폴더를 ZIP 아카이브로 압축한다. 

<그림 17> 암호화폐 지갑 정보 수집
 

그 외에도 FileZilla, OpenVPN, ProtonVPN, Discord, Telegram 등 다양한 애플리케이션의 계정 및 설정 정보를 수집한다. 

<그림 18> 다양한 애플리케이션에서 개인정보 수집
 

아래는 수집하는 정보들이다.
수집하는 브라우저 정보 

Chrome, ChromeBeta, ChromeSxS, ChromeDev, ChromeUnstable, ChromeCanary, Chrome(x86), ChromeBeta(x86), ChromeSxS(x86), GChromeDev(x86), ChromeUnstable(x86), ChromeCanary(x86), Chromium, Edge, Brave, EpicPrivacy, Amigo, Vivaldi, Kometa, Orbitum, Mail.Ru Atom, ComodoDragon, Torch, Comodo, 360ChromeX, Slimjet, 360, 360 SE6, 360 SE, 360 Secure, Maxthon3, Maxthon5, Maxthon, QQ, K-Meleon, Xpom, Lenovo, Xvast, Go!, Safer Secure, Sputnik, Nichrome, CocCoc, Uran, Chromodo, 7Star, Chedot, Cent, Iridium, Elements, Citrio, Sleipnir5 ChromiumViewer, QIP Surf, Liebao, Coowon, ChromePlus, RafotechMustang, Suhba, TorBro, RockMelt, Bromium, Twinkstar, iTop Private, CCleaner, AcWeb, CoolNovo, Baidu Spark, SRWare Iron, Titan, AVAST, AVG, UC, UR, Blisk, Flock, CryptoTab, Sidekick, Swing, Superbird, SalamWeb, Ghost, Netbox, GarenaPlus, Kinza, Insomniac, ViaSat, NaverWhale, Falkon, Sogou, Opera, Opera GX, OperaNeon, OperaCryptoDeveloper, Yandex, YandexBrowserCanary, YandexBrowserDeveloper, YandexBrowserBeta, YandexBrowserTech, YandexBrowserSxS, Firefox, SeaMonkey, Waterfox, Waterfox Classic, K-Meleon, Thunderbird, IceDragon, Cyberfox, BlackHawk, Pale Moon, Basilisk, BitTube, SlimBrowser, LibreWolf, Mercury

<표 1> 수집하는 브라우저 리스트
 

수집하는 브라우저 확장 프로그램 

SafePal, Pontem Aptos, OKX, xverse.app, Rainbow, Elli-Sui, Opera, Petra Aptos, Hashpack, zkPass TransGate, Blade-Hedera Web3 Digital, Leap Cosmos, Frontier, Coinhub, Klever, Glass-Sui, MultiversX DeFi, Fewcha Move, Fluvi, HAVAH, SubWallet - Polkadot, compass-wallet-for-sei, Rise - Aptos, Morphis, BitPay, Venom, TronLink, BitApp, MetaMask, Exodus, Trust, Braavos Smart, Yoroi, Binance Chain, Jaxx Liberty, iWallet, BitClip, Terra Station, EQUAL, Wombat, Nifty, Math, Guarda, Coin98, TezBox, Cyano, Coinbase, Phantom, MOBOX, XDCPay, Solana, Swash, Finnie, Keplr, Liquality, Rabet, Ronin, ZilPay, XDEFI, Waves Keeper, GreenAddress, Sollet, ICONex, MEW CX, NeoLine, KHC, Byone, OneKey, MetaWallet, Atomic, Electrum, Mycelium, Coinomi, Edge, BRD, Samourai, Bread, KeepKey, Ledger Live, Ledger, Bitbox, Digital Bitbox, RoboForm, MultiPassword, 1Password-fox, Dashlane, DualSafe Password Manager, Trezor Password Manager, Authy, Authenticator, GAuth Authenticator, EOS Authenticator, KeePassXC, Bitwarden, NordPass, Keeper, LastPass, BrowserPass, MYKI, Splikity, CommonKey, SAASPASS, Telos Authenticator, Zoho Vault, Norton Password Manager, Avira Password Manager, Aegis Authenticator, LastPass Authenticator, KeePass, Duo Mobile, OTP Auth, FreeOTP, Zerion, Bybit, Gate, Bitget, SafePal, Rainbow, MetaMask, Braavos Smart, Yoroi, Binance Chain, Terra Station, EQUAL, Wombat, Math, TezBox, Keplr, Ronin, Waves Keeper, LastPass, Keeper Password Manager, bitwarden, RoboForm, Authenticator, 1Password, KeePassXC, Dashlane, MYKI, Exodus Web3, Trust, MetaMask, Guarda, BitKeep, Waves Keeper

<표 2> 수집하는 브라우저 확장 프로그램 리스트
 

수집하는 애플리케이션 

Discord, steam, OpenVPN, ProtonVPN, Pidgin, Signal, Telegram, IDM(Internet Download Manager), Ngrok, OBS, FileZilla, WinSCP 2, FoxMail, MailBird, MailMaster, Outlook

<표 3> 수집하는 애플리케이션 리스트
 

수집하는 암화화폐 지갑 

Qtum, DashCore, Litecoin, Bitcoin, Dogecoin, Coinomi, Armory, Bytecoin, MultiBit, Exodus, Ethereum, Electrum, ElectrumLTC, AtomicWallet, Guarda, WalletWasabi, ElectronCash, Sparrow, IOCoin, PPCoin, BBQCoin, Mincoin, DevCoin, YACoin, Franko, FreiCoin, InfiniteCoin, GoldCoinGLD, Binance, Terracoin, DaedalusMainnet, MyMonero, MyCrypto, Bisq, Bisq_db, Bisq_keys, Zap, Simpleos, Neon, bitmonero, Etherwall

<표 4> 수집하는 암호화폐 리스트
 

6) 결론

PURELOGS Infostealer는 현대 인포스틸러가 지향하는 ‘경량화’, ‘고효율’, ‘은폐성’을 모두 갖춘 위협적인 MaaS(Malware-as-a-Service)이다. 이 악성코드는 PNG 이미지 파일의 헤더 뒤에 악성 페이로드를 숨기는 스테가노그래피(Steganography) 기법을 사용하여 네트워크 보안 장비의 콘텐츠 필터링을 무력화합니다. 일단 실행되게 되면, 동적 어셈블리 로딩과 메모리 내 복호화 로직을 통해 디스크에 흔적을 남기지 않고 실행되는 치밀함을 보인다.
피싱 메일의 PNG 파일로 위장한 다운로드 단계부터, 암호화된 페이로드 복호화 및 압축 해제, 최종 단계에서의 파일리스 형태로 메모리에 로드되어 실행까지 이어지는 다층적 방어막은 기존의 시그니처 기반 백신이 이들을 탐지하기 어렵게 만든다. 또한 단순한 브라우저 자격 증명을 넘어, 암호화폐 지갑(MetaMask, SafePal 등), 통신 보안 도구(VPN, ngrok), 미디어 방송 권한(OBS)까지 노리는 것은 공격자가 감염된 PC를 단순한 정보 탈취 대상이 아닌, 기업 내부망 침투나 대규모 금융 사기를 위한 거점으로 활용하려 함을 의미한다.
향후에도 PNG 파일 외에 다양한 미디어 포맷을 악용한 변종을 지속적으로 배포할 것으로 예상되며, 이에 대응하기 위해 금융권 및 주요 산업군은 EDR 또는 XDR를 도입하여 메모리 상의 행위를 실시간으로 모니터링하고 차단할 수 있는 행위 기반 보안 솔루션 도입이 필요하며, 탈취된 세션 쿠키나 VPN 프로필이 악용될 수 없도록, 모든 접근 요청에 대해 기기 상태와 사용자 인증을 실시간으로 재검증하는 체계가 필요하다. 

7) IoC

SHA256
c3857a086bdac485a5e65fc88828cb0c4c831be7a1f63e2dab32a47f97b36289
c208d8d0493c60f14172acb4549dcb394d2b92d30bcae4880e66df3c3a7100e4
3050a5206d0847d5cfa16e79944ce348db688294e311db4d7b6045ffbe337450
bb723217f9c2932116c9e1313d558a7baddb921886eaa3beca95f7b3c5b848b0
08a5d0d8ec398acc707bb26cb3d8ee2187f8c33a3cbdee641262cfc3aed1e91d
 
 
URL
hxxps[://]archive[.]org/download/optimized_msi_20250904/optimized_MSI[.]png
hxxps[://]ia902909[.]us[.]archive[.]org/16/items/optimized_msi_20250904/optimized_MSI[.]png
hxxp[://]lineclearexpress[.]wuaze[.]com/arquivo_20250908023227[.]txt
 
 
IP
185.27.134.206
45.137.70.55:5888

 

8) YARA Rule

rule Advanced_PureLogs_Combined {
meta:
description = "Detects PureLogs Infostealer (Including Steganography & .NET Loader variants)"
date = "2026-02-25"
severity = "Critical"
 
strings:
$png_header = { 89 50 4E 47 0D 0A 1A 0A }
$net_magic = "BSJB"
$guid_resource = "1b24d7e1-0237"

$obfus_key = "EZNRMERM" ascii wide
$res_mgr = "InternalGetResourceSet" ascii wide

$browser_path = "\\Google\\Chrome\\User Data\\Local State" ascii wide
$firefox_key = "key4.db" ascii wide
$nss_private = "nssPrivate" ascii wide

$wallet_metamask = "nkbihfbeogaeaoehlefnkodbefgpgknn" ascii wide
$wallet_phantom = "bfnaelmomeimhlpmgjnjophhpkkoljpa" ascii wide
$wallet_binance = "fhbohimaelbohpjbbldcngcnapndodjp" ascii wide

$wmi_av = "Select * from AntivirusProduct" ascii wide
$wmi_os = "SELECT * FROM win32_operatingsystem" ascii wide
$regex_token = "dQw4w9WgXcQ:"
 
condition:
($png_header at 0 and $net_magic) or

(
uint16(0) == 0x5A4D and
(
3 of ($obfus_key, $guid_resource, $res_mgr, $nss_private) or
4 of ($wallet_*, $browser_path, $wmi_av, $regex_token)
)
)
}
 
rule Infostealer_PURELOGS_Custom {
meta:
description = "Detects advanced infostealer based on analyzed components (Wallets, Discord, Obfuscation, System APIs)"
severity = "Critical"
 
strings:
$obfus = "EZNRMERM" ascii wide
$gitversion = "nerdbank.gitversion.tasks" ascii wide
$regex_discord = "dQw4w9WgXcQ:[^.*\\['(.*)'\\].*$][^\"]*" ascii wide
$discord_api = "https://discordapp.com/api/v9/users/@me" ascii wide
$wallet_safepal = "lgmpcpglpngdoalbgeoldeajfclnhafa" ascii wide
$wallet_okx = "mcohilncbfahbmgdjkbpemcciiolgcge" ascii wide
$wallet_rainbow = "opfgelmcmbiajamepnmloijbpoleiama" ascii wide
$path_profiles = "profiles.ini" ascii wide
$path_signal = "signal-desktop" ascii wide
$path_pidgin = ".purple\\accounts.xml" ascii wide
$reg_idm = "SOFTWARE\\DownloadManager" ascii wide
$path_ngrok = "ngrok.yml" ascii wide
$path_obs = "obs-studio" ascii wide
$sqlite_cookies = "cookies.sqlite" ascii wide
$nss_private = "nssPrivate" ascii wide
$browser_args = "--no-sandbox --user-data-dir=" ascii wide
 
condition:
uint16(0) == 0x5A4D and uint32(uint32(0x3C)) == 0x00004550 and
(
4 of ($wallet_*, $path_*, $reg_idm, $regex_discord, $obfus, $gitversion) or ($browser_args and $sqlite_cookies and $nss_private)
)
}

9) 참고자료

  • 목록
문의