Phantom Stealer Unmasked: Shellcode, Steganography, and Credential Theft

Security Splunk Threat Research Team , Teoderick Contreras

Key takeaways

  1. Phantom Stealer uses stealth techniques to steal passwords, browser data, cryptocurrency wallet information, and other sensitive files while avoiding detection.

  2. Phantom Stealer can hide its activity, maintain access to infected devices, and collect sensitive data from browsers, wallets, files, and the clipboard.

  3. Security teams can detect Phantom Stealer earlier by monitoring behaviors like suspicious PowerShell activity, process injection, unusual browser access, and credential theft.

Phantom Stealer is a credential-harvesting malware written in .NET, designed to quietly collect a wide range of sensitive data from infected machines including browser credentials, saved passwords, session cookies, cryptocurrency wallet files, and detailed system fingerprints.

Since its appearance, Phantom Stealer has been observed in multiple campaigns targeting users across different countries, frequently distributed through phishing lures, cracked software, and malicious links spread via platforms like Discord and Telegram. Its modular design and relatively low barrier to entry have made it an attractive option for both novice and experienced threat actors, contributing to its growing adoption and making it a persistent and evolving threat in the infostealer landscape.

In this blog, the Splunk Threat Research Team (STRT) takes a closer look at how Phantom Stealer operates the initial infection chain and the tricks the loader uses to stay hidden and avoid detection, to the inner workings of the stealer itself and how it quietly collects and sends out sensitive data. We also walk defenders through practical ways to spot and investigate this threat using Splunk detections and behavioral analytics.

Loader Analysis:

Steganography: T1027.003

STRT observed that Phantom Stealer leverages multiple loader variants to deliver its payload. One notable variant is a .NET-based loader that conceals the actual malware payload within .NET resource manifest metadata, a technique that abuses the way .NET assemblies store embedded resources to hide malicious content from casual inspection. This is not a new trick; STRT has observed the same approach used by other well-known malware families, including Quasar RAT and Lokibot, suggesting that this method remains an effective and reused technique among threat actors looking to evade static analysis and slow down reverse engineering efforts.

Figure 01 shows the screenshot of the tool we developed to extract the next stager hidden on those 2 image files including the final payload.

Figure 01: Phantom Stealer Steganography Loader Extraction

The extracted executable, embedded within a .PNG entry in the .NET resource manifest, contains an encrypted blob of data. Once decrypted, this blob reveals the final stage payload in this case, Phantom Stealer itself.

Figure 02: Extracted Phantom Stealer Payload

PowerShell: T1059.001

Another interesting loader delivered through a phishing campaign in email that is associated with Phantom Stealer is an obfuscated PowerShell script designed to decode, decrypt, and inject shellcode into a remote process, in this case explorer.exe. The script uses Add-Type to dynamically compile C# code at runtime, defining P/Invoke wrappers for a set of Windows API calls, all deliberately renamed with randomized strings to hinder detection and analysis.

The injection follows the classic OpenProcess →VirtualAllocEx → WriteProcessMemory → VirtualProtectEx → CreateRemoteThread pattern, where the script first opens a handle to a target process, allocates executable memory within it, writes the decrypted shellcode into that memory region, adjusts the memory protection, and finally spawns a remote thread to execute the payload all from within a PowerShell session.

Figure 03: PowerShell Shellcode Loader

Disable or Modify Tools: T1685

The shellcode decrypted and injected into explorer.exe serves as the final-stage loader responsible for unpacking and executing the Phantom Stealer payload on the compromised host. After gaining execution within the trusted process, the shellcode decompresses the embedded stealer payload and transfers execution to it.

In addition to payload staging, the shellcode incorporates multiple defense-evasion capabilities. It disables security telemetry by patching commonly monitored APIs associated with Antimalware Scan Interface (AMSI) and Event Tracing for Windows (ETW). This includes modifying functions such as AmsiScanBuffer and AmsiScanString to prevent security products from scanning malicious content in memory, as well as patching EtwEventWrite to suppress ETW-generated telemetry that could otherwise expose malicious activity to security monitoring and EDR solutions.

Figure 04: API Patching to Suppress Log Generation

Phantom Stealer Analysis:

In the sections below, STRT walks through the tactics and techniques observed across the Phantom Stealer infection chain.

Virtualization/Sandbox Evasion: T1497

Phantom Stealer includes a dedicated class built specifically for anti-analysis purposes. This class implements several methods that collectively fingerprint the running environment by checking a range of system artifacts including IP address, username, hostname, GUID, running process names, installed services, and GPU information.

By cross-referencing these artifacts against known indicators of virtualized or sandboxed environments, the malware attempts to determine whether it is being executed on a real victim machine or inside an analysis environment and will alter or halt its behavior accordingly.

Description
Example Applications
Username
"05h00Gi0", "05KvAUQKPQ", "21zLucUnfI85", "3u2v9m8", "43By4", "4tgiizsLimS", "5sIBK", "5Y3y73", "grepete", "64F2tKIqO5", "6O4KyHhJXBiR", "7DBgdxu", "7wjlGX7PjlW4", "8LnfAai9QdJR", "8Nl0ColNQ5bq", "8VizSM", "9yjCPsEYIMH", "Abby", "acox", "Amy",
"andrea", "AppOnFlySupport", "barbarray", "benjah", "Bruno", "BUiA1hkm", "BvJChRPnsxn", "BXw7q", "cather", "cM0uEGN4do", "cMkNdS6", "DdQrgc", "DefaultAccount", "doroth", "dOuyo8RV71", "DVrzi", "dxd8DJ7c", "e60UW", "ecVtZ5wE", "EGG0p", "equZE3J", "fNBDSlDTXY", "Frank", "fred", "G2DbYLDgzz8Y", "george", "GexwjQdjXG", "GGw8NR", "GJAm1NxXVm", "GjBsjb",
"gL50ksOp", "gu17B", "Guest", "h7dk1xPr", "h86LHD", "HAPUBWS", "Harry Johnson", "hbyLdJtcKyN1", "HEUeRzl", "hmarc", "ICQja5iT", "IVwoKUF", "IZZuXj", "j6SHA37KA", "j7pNjWM", "JAW4Dz0", "JcOtj17dZx", "jeremdiaz", "John", "John Doe", "jude", "Julia", "katorres", "kEecfMwgj", "kevans", "kFu0lQwgX5P", "KUv3bT4", "l3cnbB8Ar5b8", "Lisa", "lK3zMR", "lmVwjj9b", "Louise", "lubi53aN14cU", "Lucas", "Marci", "mike", "Mr.None", "noK4zG7ZhOf", "nZAp7UBVaS1", "o6jdigq", "o8yTi52T", "Of20XqH4VL", "OgJb6GqgK0O", "OZFUCOD6", "patex", "PateX", "Paul Jones", "pf5vj", "PgfV1X", "PqONjHVwexsS", "pWOuqdTDQ", "PxmdUOpVyx", "QfofoG", "QmIS5df7u", "QORxJKNk", "qZo9A", "rB5BnfuR2", "RDhJ0CNFevzX", "rexburns", "RGzcBUyrznReg",
"Rt1r7", "ryjIJKIrOMs", "S7Wjuf", "sal.rosenburg", "server", "SqgFOf3G", "Steve", "test", "tHiF2T", "tim", "timcoo", "TVM", "txWas1m2t", "tylerfl", "uHUQIuwoEFU", "UiQcX", "umehunt", "umyUJ", "Uox1tzaMO", "User01", "UspG1y1C", "vzY4jmH0Jw02", "w0fjuOVmCcP5A", "WDAGUtilityAccount", "XMiMmcKziitD", "xPLyvzr8sgC", "xUnUy", "ykj0egq7fze", "ymONofg", "YmtRdbA", "zOEsT"
PC Name
"00900BC83802", "00900BC83803", "0CC47AC83803", "18C9ACDF-7C00-4", "3CECEFC83806", "6C4E733F-C2D9-4", "ABIGAI", "ACEPC", "AIDANPC", "ALENMOOS-PC", "ALIONE", "APPONFLY-VPS", "ARCHIBALDPC", "azure", "B30F0242-1C6A-4", "BAROSINO-PC", "BECKER-PC", "BEE7370C-8C0C-4", "C81F66C83805", "CATWRIGHT", "CHSHAW", "COFFEE-SHOP", "COMPNAME_4047", "COMPNAME_4416", "COMPNAME_4803", "CRYPTODEV222222", "d1bnJkfVlH", "DAPERE", "DOMIC-DESKTOP", "EA8C2E2A-D017-4", "EFA0FDEC-8FA7-4", "EIEEIFYE", "ESPNHOOL", "FERREIRA-W10", "floppy", "GANGISTAN", "GBQHURCC", "GRAFPC", "GRXNNIIE", "gYyZc9HZCYhRLNg", "JBYQTQBO", "JERRY-TRUJILLO", "JOHN-PC", "JUANYARO", "JUDES-DOJO", "JULIA-PC", "KEVINF", "LANTECH-LLC", "LISA-PC", "LOUISE-PC", "LUCAS-PC", "MARIEGRAY", "MARWAL", "MATTHEW", "MIKE-PC", "NETTYPC", "NPLBBLMK", "ORELEEPC", "ORXGKKZC", "Paul Jones", "PC-DANIELE", "PROPERTY-LTD", "Q9IATRKPRH", "QarZhrdBpj", "RALPHS-PC", "RYANWH", "SCOX", "SERVER-PC", "SERVER1", "Steve", "SYKGUIDE-WS17", "T00917", "test42", "TIQIYLA9TW5M", "TMKNGOMU", "TVM-PC", "Ub9w1K94X31iqkf", "VIDYHI", "VNNVRXUM", "VONRAHEL", "WILEYPC", "WIN-5E07COS9ALR", "WINDOWS-EEL53SN", "WINZDS-1BHRVPQU", "WINZDS-22URJIBV", "WINZDS-3FF2I9SN", "WINZDS-5J75DTHH", "WINZDS-6TUIHN7R", "WINZDS-8MAEI8E4", "WINZDS-9IO75SVG", "WINZDS-AM76HPK2", "WINZDS-B03L9CEO", "WINZDS-BMSMD8ME", "WINZDS-BUAOKGG1", "WINZDS-K7VIK4FC", "WINZDS-MILOBM35", "WINZDS-PU0URPVI", "WINZDS-QNGKGN59", "WINZDS-RST0E8VU", "WINZDS-U95191IG", "WINZDS-VQH86L5D", "WISIMS", "WORK", "BENREED", "WS-CARROT", "XC64ZB", "XGNSVODU", "YCLEXTAL", "ZDS_EDR_14", "ZDS_EDR_9", "ZELJAVA", "ZFKGDPGJ"
GPU Name
"29__HERE", "2G6C7Z61", "2RO_8UVU", "2SN538K4", "5KBK41_L", "5LXPA8ES", "5PECN6L1", "5RPFT3HZ", "6BOS4O7U", "6BZP2Y2_", "6F44ADR7", "6MPA93", "7229H9G9", "74ZZCY7A", "7TB9G6P7", "84KD1KSK", "8NYGK3FL", "8Y3BSXKG", "9SF72FG7", "9Z77DN4T", "_G31E46N", "_PHLNYGR", "_T9W5LHO", "AFRBR6TC", "B69OHLB2", "BDMD4C14", "CSUZOOXW", "CWTM14GS", "D6XUO1XB", "DE92L2UN", "DFXWTBCX", "ET1BXXAK", "F1K792VR", "FENYSTD", "H1_SDVLF", "H_EDEUEK", "HASZN_3F", "HKWURZU9", "HP8WD3MX", "HV61HV5F", "K9SC88UK", "KBBFOHZN", "KEZ744W", "KOD68ZH1", "KW5PTYKC", "L19KFFGO", "LD8LLLOD", "M5RGU9RY", "MDF5Z6ZO", "MKVW6M6X", "MTSUP2DX", "MYNP2R7E", "O25VL9P2", "O597EOTS", "OEFUG1_W", "OOUT3ENP", "OYVM_U6G", "P9T_AU3X", "PC1ESCG3", "PE86ZT", "R69XK_H3", "S6DZU3GA", "THUVF23F9", "TTXRONXD", "UKBEHH_S", "Virtual Desktop Monitor", "VirtualBox Graphics Adapter", "VirtualBox Graphics Adapter (WDDM)", "VM64TTFX", "VMware SVGA 3D", "VO5V631D", "W1TO6L3T", "W29FK1O1", "W2RTB1KRM", "WKMZ6LN2", "X4R9RZ5L", "X5ZW15TV", "XMX85CAL", "YANBV9OY", "YNVLCUKZ", "YVK4794D", "Z2P35N", "Z2P8CT__", "ZN_TF2UZ", "ZP62XCAP", "ZSHE4HM", "Стандартный VGA графический адаптер"
Process Name
"VmRemoteGuest.exe", "Sysmon64.exe"
Service Name
"vmicheartbeat", "vmickvpexchange", "vmicrdv", "vmicshutdown", "vmictimesync", "vmicvss", "Sysmon64"
Machine GUID
"081ab395-5e85-4634-acdb-2dbd4f59a7d0", "089e621c-1422-4856-a8b1-3f1db208ce9e", "10797f1d-9613-4832-b1a3-c22fe365b89d", "15947802-cb9c-478f-af5c-33b1abbd1bfe", "1a85c660-1f98-42ca-b1cb-199f63e1d807", "2b5365f1-eebb-4135-b6e1-413aab299fcb", "4508afd3-5f05-491e-b49f-b44024967766", "453b8045-4cab-4c86-866a-4118a8ac4db6", "5c5926b0-d06a-4688-ade2-325cbb39b4fc", "6a94764b-5e0f-42cf-8947-df4b99cb5cf1", "6c25c4bf-bff0-421d-a4d1-6a31f02e4b7d", "6c5fe7fc-a9c6-46cd-baea-529d2dedc1df", "75ef93ec-1f67-4dbc-b494-f3e460792a4a", "801de7cf-3111-46e2-946b-65e7431dc386", "8459ba60-28e8-4648-9573-ee9fd08ce1c2", "9083fa32-68f2-4dff-a60e-e076f7aeabd3", "988e7c53-d2c0-4b7a-9de6-96944bce64e0", "9ad7283a-ef74-4969-a766-87a104f57d43", "a2014fb5-2ce1-436c-a05d-1c2c44fb3288", "a3d27cfa-1e7a-4ff8-8004-2be13417b6b1", "a47c70d8-7adc-4ad7-994f-644a8c84c176", "a8844a86-4277-45a7-809c-0c8132e08711", "bcac81ca-b4a1-429f-a8be-d684f4c00d27", "c1f1411f-c84a-4d1b-a6f7-b31c8bdd22d2", "c784477d-3fc3-4206-9876-55a4df3943da", "cbbb49d6-b7ff-44ca-aba5-8a5e250d4d42", "cdbd2082-8cfa-481b-ad9b-fc08276e590d", "fb31a63b-dc7c-49d2-8f59-4a30a2594045", "fd34ce94-8855-4c43-824b-81cc27d97788", "fec973c0-c782-43a8-854c-f9f48d935e0d"
IP Address
"10.200.169.204", "104.198.155.173", "104.200.151.35", "109.145.173.169", "109.226.37.172", "109.74.154.90", "109.74.154.91", "109.74.154.92", "140.228.21.36", "149.88.111.79", "154.61.71.50", "154.61.71.51", "172.105.89.202", "174.7.32.199", "176.63.4.179", "178.239.165.70", "181.214.153.11", "185.220.101.107", "185.44.176.125", "185.44.176.135", "185.44.176.143", "185.44.176.70", "185.44.176.85", "185.44.177.132", "185.44.177.133", "185.44.177.138", "185.44.177.193", "185.44.177.254", "185.44.177.55", "188.105.165.80", "188.105.71.44", "188.105.91.116", "188.105.91.143", "188.105.91.173", "191.101.209.39", "191.96.150.218", "192.211.110.74", "192.40.57.234", "192.87.28.103", "193.128.114.45", "193.225.193.201", "193.226.177.40", "194.110.13.70", "194.154.78.144", "194.154.78.152", "194.154.78.160", "194.154.78.169", "194.154.78.179", "194.154.78.210", "194.154.78.227", "194.154.78.230", "194.154.78.235", "194.154.78.77", "194.154.78.91", "194.186.142.178", "194.186.142.180", "194.186.142.183", "194.186.142.195", "194.186.142.204", "194.186.142.214", "194.186.142.236", "194.186.142.246", "195.181.175.103", "195.181.175.105", "195.228.105.39", "195.239.51.3", "195.239.51.42", "195.239.51.46", "195.239.51.59", "195.239.51.65", "195.239.51.73", "195.239.51.80", "195.239.51.89", "195.68.142.20", "195.68.142.3", "195.74.76.222", "2.94.86.134", "20.114.22.115", "20.99.160.173", "204.101.161.31", "204.101.161.32", "207.102.138.83", "207.102.138.93", "208.78.41.115", "209.127.189.74", "212.119.227.136", "212.119.227.151", "212.119.227.167", "212.119.227.179", "212.119.227.184", "212.41.6.23", "213.33.142.50", "213.33.190.109", "213.33.190.118", "213.33.190.171", "213.33.190.22", "213.33.190.227", "213.33.190.242", "213.33.190.35", "213.33.190.42", "213.33.190.46", "213.33.190.69", "213.33.190.74", "23.128.248.46", "34.105.0.27", "34.105.183.68", "34.105.72.241", "34.138.255.104", "34.138.96.23", "34.141.146.114", "34.141.245.25", "34.142.74.220", "34.145.195.58", "34.145.89.174", "34.17.49.70", "34.17.55.59", "34.253.248.228", "34.73.60.153", "34.83.46.130", "34.85.243.241", "34.85.253.170", "35.186.33.204", "35.192.93.107", "35.197.127.11", "35.199.6.13", "35.229.69.227", "35.237.47.12", "38.154.242.210", "45.8.148.171", "5.45.98.162", "52.250.30.131", "64.124.12.162", "67.218.111.202", "78.139.8.50", "79.104.209.109", "79.104.209.168", "79.104.209.172", "79.104.209.221", "79.104.209.231", "79.104.209.24", "79.104.209.249", "79.104.209.33", "79.104.209.36", "79.104.209.66", "80.211.0.97", "81.181.60.60", "84.147.54.113", "84.147.54.61", "84.147.56.249", "84.147.60.41", "84.147.60.52", "84.147.61.28", "84.147.62.12", "84.147.63.171", "84.147.63.236", "84.57.183.108", "84.57.200.69", "87.166.48.65", "87.166.50.1", "87.166.50.213", "87.166.51.209", "88.132.225.100", "88.132.226.203", "88.132.227.238", "88.132.231.71", "88.153.199.169", "88.64.35.141", "88.64.36.101", "88.66.107.75", "88.66.111.235", "88.66.8.175", "88.67.131.90", "88.67.134.91", "88.86.117.130", "89.208.29.106", "89.208.29.108", "89.208.29.140", "89.208.29.149", "89.208.29.63", "89.208.29.64", "89.208.29.95", "89.208.29.96", "89.208.29.97", "89.208.29.98", "92.211.109.160", "92.211.192.144", "92.211.52.62", "92.211.55.199", "93.216.75.209", "95.25.204.90", "95.25.71.112", "95.25.71.12", "95.25.71.5", "95.25.71.64", "95.25.71.65", "95.25.71.70", "95.25.71.80", "95.25.71.86", "95.25.71.87", "95.25.71.89", "95.25.71.92", "95.25.81.24", "None"

Phantom Stealer also creates a chrome process with the –no-sandbox and --user-data-dir command-line argument that are frequently leveraged by malware and adversaries to run Chrome in an isolated environment for stealth operations, credential harvesting, phishing delivery, or evasion of user session artifacts.

Figure 05: No Sandbox Chrome Process Command line

Delay Execution: T1678

Phantom Stealer implements a simple timing-based anti-analysis technique designed to identify emulated or accelerated execution environments. The routine records the current system time, invokes a 10-millisecond delay via Task.Delay(10).Wait(), and then measures the elapsed time. If the delay completes in an unrealistically short interval, the malware assumes that sleep-skipping or timer acceleration is being performed by an emulator or sandbox and flags the environment as suspicious. Although the implementation uses an unusually small threshold and is unlikely to trigger on legitimate systems, it can still detect analysis platforms that bypass delay functions entirely to accelerate malware execution and behavioral analysis.

Figure 06: Delay Execution

Browser Extensions: T1176.001

This trojan stealer targets cryptocurrency wallets by locating and copying browser extension data directories associated with wallet applications. These directories may contain databases, configuration files, local storage, IndexedDB data, session artifacts, and other wallet-related information. By collecting the entire extension folder, the malware can exfiltrate the data for later analysis and extraction of sensitive wallet information, including authentication artifacts, wallet metadata, and potentially encrypted wallet vaults.

Figure 07: Targeted Wallet Browser Extensions

Credentials from Web Browsers: T1555.003

Similar to other trojan stealers, this malware harvests credentials and other sensitive information from targeted web browsers by parsing browser databases and configuration files. The collected data may include usernames, passwords, browsing profiles, cookies, and stored payment card information. After extraction, the stolen information is written to text files in the %TEMP%/<random_gen_dir_name> directory using predefined file naming and formatting conventions before being packaged for exfiltration.

Steal Information
Phantom Collected Data Filename Format
Chromium Username, profiles and password
"Chromium_passwords_", <host_name> "_", “<yyyy-MM-dd_HH.mm.ss>”, ".txt"
Chromium Browser cookies
"Chromium_cookies_", <host_name> "_", “<yyyy-MM-dd_HH.mm.ss>”, ".txt"
Chromium Credit Card Info
"Chromium_credit_cards_", <host_name> "_", “<yyyy-MM-dd_HH.mm.ss>”, ".txt"
Gecko Username, profiles and password
"Gecko_passwords_", <host_name> "_", “<yyyy-MM-dd_HH.mm.ss>”, ".txt"
Gecko Browser cookies
"Gecko_cookies_", <host_name> "_", “<yyyy-MM-dd_HH.mm.ss>”, ".txt"
Gecko Credit Card Info
"Gecko_credit_cards_", <host_name> "_", “<yyyy-MM-dd_HH.mm.ss>”, ".txt"

Figure 08: Targeted Browser Application

Clipboard Data: T1115

Phantom Stealer also monitors and captures clipboard contents to collect potentially sensitive information that users may copy and paste on the compromised host, such as credentials, cryptocurrency wallet addresses, authentication tokens, and other confidential data. The captured clipboard data is written to a file within %TEMP%\<random_generated_directory>\ using the filename format <hostname>_{yyyyMMdd_HHmmss}.txt.

Figure 09: Collect Clipboard Data

The collected clipboard data is further processed by Phantom Stealer to identify patterns associated with cryptocurrency wallet addresses. When a matching wallet address is detected, the malware replaces the original clipboard content with an attacker-controlled wallet address embedded within the malware. This replacement address is stored in the code in an obfuscated form using Base64 encoding and AES-CBC encryption. By modifying wallet addresses copied by the victim, the malware attempts to redirect cryptocurrency transactions to wallets controlled by the threat actor.

Figure 10: Threat Actor Decrypted Wallet Address

Below is an example of CyberChef recipe to Base64 decode and AES decrypt one of the phantom stealers variant encrypted strings.

[

{ "op": "From Base64",

"args": ["A-Za-z0-9+/=", true, false] },

{ "op": "AES Decrypt",

"args": [{ "option": "Hex", "string": "47 5F 6E 68 E3 0D 29 67 66 CC 73 0B 6C 88 26 53 A5 EB 9A 04 03 18 12 FF 04 26 D0 81 F1 FC 86 BD" }, { "option": "Hex", "string": "54 F5 71 2A 1B 63 04 A9 BC E6 04 68 44 34 BC 81" }, 16, "CBC", "Raw", "Raw", { "option": "Hex", "string": "" }, { "option": "Hex", "string": "" }, "Off"] }

]

Data from Local System: T1005

In addition to browser-based data extraction, Phantom Stealer also targets desktop cryptocurrency wallet applications to collect wallet-related credentials, files, and artifacts. The following is a list of the targeted desktop wallet applications.

Zcash
Armory
Bytecoin
Jaxx
Exodus
Ethereum
Electrum
ElectrumLTC
AtomicWallet
Guarda
WalletWasabi
ElectronCash
Sparrow
IOCoin
PPCoin
BBQCoin
Mincoin
DevCoin
YACoin
Franko
FreiCoin
Coinomi
Binance
Coinbase
TronLink
MetaMask
TrustWallet

Phantom Stealer also performs file theft by identifying specific file types and extensions on the compromised host, including sensitive documents, databases, and proprietary project files. These files are archived and exfiltrated to a command-and-control (C2) server.

Figure 11: Phantom Stealer Targeted File Type

This file enumeration method was also used to locate FileZilla configuration files to extract stored credentials associated with the application.

Figure 12: FileZilla Credential Extraction

Query Registry: T1012

Phantom Stealer also queries the Windows Registry to extract wallet-related information by searching for known cryptocurrency wallet identifiers. The targeted registry entries are listed below:

"Litecoin", "Dash", "Bitcoin", "Monero", "Dogecoin", "DashCore", "Qtum", "Electrum_config", "ElectrumLTC_config", "WalletWasabi_config",

"ElectronCash_config", "Sparrow_config", "AtomicDEX", "Binance_wallet_config"

This malware also leverages the Windows Registry to extract saved WinSCP credentials, including usernames and passwords, by parsing known WinSCP registry locations.

Figure 13: WinSCP Registry Data

This trojan stealer queries known Microsoft Outlook profile registry keys to extract stored email account configurations and profile data. This information may be abused for follow-on phishing, credential harvesting, or targeted social engineering attacks against the victim or associated contacts.

Figure 14: Outlook Profiles Registry Keys

Screen Capture: T1113

This malware family also captures desktop screenshots to gather additional information from the compromised host, saving them in “%TEMP%\<random_generated_directory>\” with filenames formatted as <hostname>_<yyyyMMdd_HHmmss>.png.

Figure 15: Phantom Stealer Screen Capture

Input Capture: Keylogging: T1056.001

As a common feature of trojan stealers, this malware includes keylogging functionality to capture sensitive information by recording user keystrokes during input. Figure 16 shows the callback function used to intercept all keystrokes on the compromised host. The captured data is saved in the %TEMP% Phantom Stealer working directory using the filename format <hostname>_<yyyyMMdd_HHmmss>.txt

Figure 16: Phantom Stealer Keylogging Callback Functions

Registry Run Keys / Startup Folder: T1547.001

To achieve persistence on the compromised host, Phantom Stealer either creates a registry Run key or drops a copy of itself into the Startup folder, ensuring its malicious payload is automatically executed upon system reboot.

Figure 17: Phantom Stealer Persistence

Process Injection: T1055

This malware is also capable of injecting malicious code or loading additional plugins retrieved from its command-and-control (C2) server as part of its post-infection setup on the compromised host.

Figure 18: Phantom Stealer Process Injection

Wi-Fi Discovery: T1016.002

Figure 19 shows the command that changes the console code page to UTF-8 (chcp 65001) and uses “netsh wlan show profile to enumerate saved Wi-Fi profiles, typically as a precursor to extracting stored wireless credentials (e.g., SSIDs and passwords) from the compromised host.

Figure 19: Phantom Stealer WIFI Credential Discovery

Network Service Discovery: T1046

To enumerate nearby Wi-Fi networks along with their BSSID information (access point MAC addresses, signal details, and channel data), Phantom Stealer run the “bssid” netsh.exe mode shown in Figure 20.

Figure 20: Phantom Stealer WIFI Enumeration

Browser Information Discovery: T1217

Phantom Stealer performs fuzzy matching to identify installed Chromium-based browsers by comparing known browser installation paths against directories of browsers detected on the system. In addition to filesystem-based discovery, it leverages Windows Registry entries under SOFTWARE\Clients\StartMenuInternet and SOFTWARE\WOW6432Node\Clients\StartMenuInternet to enumerate registered browsers.

It then normalizes both expected and actual browser paths and applies a Levenstein-based similarity algorithm to compute a distance score based on character-level differences. The results are ranked by similarity, and the top three closest matches are retained for each known Chromium browser entry.

Figure 21: Phantom Stealer Browser Installed Enumeration

Detections:

Windows Chromium Browser with Custom User Data Directory

The following analytic detects instances where the Chromium-based browser (e.g., Google Chrome, Microsoft Edge) is launched with the --user-data-dir command-line argument.

title
Windows Chromium Browser with Custom User Data Directory
label
Windows Chromium Browser with Custom User Data Directory
type
Splunk SPL
snippet

| tstats `security_content_summariesonly` min(_time) as firstTime max(_time)

as lastTime from datamodel=Endpoint.Processes where

Processes.process_name IN ("Chrome.exe","Brave.exe", "Opera.exe", "Vivaldi.exe", "msedge.exe")

Processes.process = "*--user-data-dir*"

Processes.process IN ("*--disable-gpu*", "*--disable-3d-apis*")

by Processes.action Processes.dest Processes.original_file_name Processes.parent_process

Processes.parent_process_exec Processes.parent_process_guid Processes.parent_process_id

Processes.parent_process_name Processes.parent_process_path Processes.process Processes.process_exec

Processes.process_guid Processes.process_hash Processes.process_id Processes.process_integrity_level

Processes.process_name Processes.process_path Processes.user Processes.user_id Processes.vendor_product

| `drop_dm_object_name(Processes)`

| `security_content_ctime(firstTime)`

| `security_content_ctime(lastTime)`

| `windows_chromium_browser_with_custom_user_data_directory_filter`

showcopybutton
true

Figure 22: Windows Chromium Browser with Custom User Data Directory Detection

PowerShell PInvoke Process Injection API Chain

The following analytic detects PowerShell Script Block Logging (Event ID 4104) evidence of a complete P/Invoke process-injection API chain at either the compile phase or the execution phase.

title
PowerShell PInvoke Process Injection API Chain
label
PowerShell PInvoke Process Injection API Chain
type
Splunk SPL
snippet

`powershell`

EventCode=4104

ScriptBlockText="*add-type*"

ScriptBlockText="*DllImport*"

ScriptBlockText IN (

"*extern IntPtr*",

"*extern bool*",

"*extern uint*",

"*extern int*"

)

| where

(

match(ScriptBlockText, "(?i)[v][i][r][t][u][a][l][a][l][l][o][c]")

AND match(ScriptBlockText, "(?i)[v][i][r][t][u][a][l][p][r][o][t][e][c][t]")

AND match(ScriptBlockText, "(?i)[c][r][e][a][t][e][t][h][r][e][a][d]")

)

OR

(

match(ScriptBlockText, "(?i)[o][p][e][n][p][r][o][c][e][s][s]")

AND match(ScriptBlockText, "(?i)[v][i][r][t][u][a][l][a][l][l][o][c]")

AND match(ScriptBlockText, "(?i)[w][r][i][t][e][p][r][o][c][e][s][s][m][e][m][o][r][y]")

AND (

match(ScriptBlockText, "(?i)[c][r][e][a][t][e][r][e][m][o][t][e][t][h][r][e][a][d]")

OR

match(ScriptBlockText, "(?i)[q][u][e][u][e][u][s][e][r][a][p][c]")

)

)

OR

(

match(ScriptBlockText, "(?i)[o][p][e][n][t][h][r][e][a][d]")

AND match(ScriptBlockText, "(?i)[s][u][s][p][e][n][d][t][h][r][e][a][d]")

AND match(ScriptBlockText, "(?i)[g][e][t][t][h][r][e][a][d][c][o][n][t][e][x][t]")

AND match(ScriptBlockText, "(?i)[w][r][i][t][e][p][r][o][c][e][s][s][m][e][m][o][r][y]")

AND match(ScriptBlockText, "(?i)[s][e][t][t][h][r][e][a][d][c][o][n][t][e][x][t]")

AND match(ScriptBlockText, "(?i)[r][e][s][u][m][e][t][h][r][e][a][d]")

)

OR

(

match(ScriptBlockText, "(?i)[c][r][e][a][t][e][p][r][o][c][e][s][s]")

AND match(ScriptBlockText, "(?i)[v][i][r][t][u][a][l][a][l][l][o][c]")

AND match(ScriptBlockText, "(?i)[w][r][i][t][e][p][r][o][c][e][s][s][m][e][m][o][r][y]")

AND match(ScriptBlockText, "(?i)[s][e][t][t][h][r][e][a][d][c][o][n][t][e][x][t]")

AND ScriptBlockText = "*ResumeThread*"

)

OR

(

match(ScriptBlockText, "(?i)[n][t][c][r][e][a][t][e][s][e][c][t][i][o][n]")

AND match(ScriptBlockText, "(?i)[n][t][m][a][p][v][i][e][w][o][f][s][e][c][t][i][o][n]")

AND match(ScriptBlockText, "(?i)[c][r][e][a][t][e][r][e][m][o][t][e][t][h][r][e][a][d]")

)

| fillnull

| stats count min(_time) as firstTime

max(_time) as lastTime

by dest signature signature_id user_id vendor_product EventID

Guid Opcode Name Path ProcessID ScriptBlockId ScriptBlockText

| `security_content_ctime(firstTime)`

| `security_content_ctime(lastTime)`

| `powershell_pinvoke_process_injection_api_chain_filter`

showcopybutton
true

Figure 23: PowerShell P/Invoke Process Injection API Chain Detection

Windows Credentials from Password Stores Chrome LocalState Access

The following analytic detects non-Chrome processes accessing the Chrome "Local State" file, which contains critical settings and information.

title
Windows Credentials from Password Stores Chrome LocalState Access
label
Windows Credentials from Password Stores Chrome LocalState Access
type
Splunk SPL
snippet

`wineventlog_security`

EventCode=4663

object_file_path="*\\AppData\\Local\\Google\\Chrome\\User Data\\Local State"

NOT (process_name IN ("*\\chrome.exe","*:\\Windows\\explorer.exe", "*\\platform_experience_helper.exe*", "*Edge\\Application\\msedge.exe*"))

| stats count min(_time) as firstTime max(_time) as lastTime by object_file_name object_file_path process_name process_path process_id EventCode dest

| `security_content_ctime(firstTime)`

| `security_content_ctime(lastTime)`

| `windows_credentials_from_password_stores_chrome_localstate_access_filter`'

showcopybutton
true

Figure 24: Windows Credentials from Password Stores Chrome Local State Access Detection

Windows Process Injection Remote Thread

The following analytic detects suspicious remote thread execution in processes such as Taskmgr.exe, calc.exe, and notepad.exe, which may indicate process injection.

title
Windows Process Injection Remote Thread
label
Windows Process Injection Remote Thread
type
Splunk SPL
snippet

`sysmon`

EventCode=8

TargetImage IN (

"*\\calc.exe",

"*\\CalculatorApp.exe",

"*\\cmd.exe",

"*\\dxdiag.exe",

"*\\explorer.exe",

"*\\mobsync.exe",

"*\\msra.exe",

"*\\notepad.exe",

"*\\OneDriveSetup.exe",

"*\\ping.exe",

"*\\powershell.exe",

"*\\rdpclip.exe",

"*\\Taskmgr.exe",

"*\\wermgr.exe",

"*\\win32calc.exe",

"*\\xwizard.exe"

)

| stats count min(_time) as firstTime

max(_time) as lastTime

by EventID Guid NewThreadId ProcessID SecurityID SourceImage

SourceProcessGuid SourceProcessId StartAddress StartFunction

StartModule TargetImage TargetProcessGuid TargetProcessId UserID

dest parent_process_exec parent_process_guid parent_process_id

parent_process_name parent_process_path process_exec process_guid

process_id process_name process_path signature signature_id

user_id vendor_product

| `security_content_ctime(firstTime)`

| `security_content_ctime(lastTime)`

| `windows_process_injection_remote_thread_filter`

showcopybutton
true

Figure 25: Windows Process Injection Remote Thread Detection

Windows WinSCP Configuration Security Access

This analytic detects unauthorized access to the WinSCP security configuration folder by processes other than WinSCP itself. WinSCP stores sensitive SSH and FTP session credentials, including passwords and private key references, under the user profile path Martin Prikryl\WinSCP 2\Configuration\Security.

title
Windows WinSCP Configuration Security Access
label
Windows WinSCP Configuration Security Access
type
Splunk SPL
snippet

`wineventlog_security` EventCode=4663 object_file_path="*\\Martin Prikryl\\WinSCP 2\\Configuration\\Security*" AND NOT (process_name IN ("winscp.exe"))

| stats count min(_time) as firstTime max(_time) as lastTime by object_file_name object_file_path process_name process_path process_id EventCode dest

| `security_content_ctime(firstTime)`

| `security_content_ctime(lastTime)`

showcopybutton
true

Figure 26: Windows WinSCP Configuration Security Access Detection

Overall, the Phantom Stealer analytic story consists of 32 Splunk detections.

IOC:

Sha256
Description
b588caa5365451a6c60fd73fec5b73f13ac41bcc2a3a3bed7244df5917a62f32
Phantom Stealer Loader
382233c398cbc35dcee845ee17046815f37588a382a8106bfb9b0252ea803961
Phantom Stealer Batch Loader
790945e17a51691483455a11af2efcbe15f2b473b65b151f50287623d1468516
01f1e5369aa0332abb681df7c37818e197ec0a5b5d7b81836b3369a2b1780950
10cfcad907275497dab92af0d687674cec3a0333f80dd16d8d22254794bb2d60
2d5003d9318ae85eb22de99d19705a3cd7bf8e5c3349df979dfb3bdfa080908e
528a46842744366b57edfc6fe2810ca7df43900db75126cd1c78f32957143364
e3ceeb24bdca8842d426e87fa61cf185d68fd7783e1a2b97d4106832ca266724
f82a4d30132b5a57cbfd81c7ab0a53d0cf0dda402c2731732a0097aceb4b0b76
Phantom Stealer
b588caa5365451a6c60fd73fec5b73f13ac41bcc2a3a3bed7244df5917a62f32
Phantom Stealer PowerShell Loader
be119a21bedc3a79bf4dea8bcf5adf18304997a01ea23e276b9c31be37b789ab
Phantom Stealer JavaScript Loader

Learn More

This blog aims to help security analysts, blue teamers, and Splunk users identify Phantom Stealer activity by providing insights into the tactics, techniques, and procedures (TTPs) employed by threat actors. You can implement the detections in this blog using the Enterprise Security Content Updates app or the Splunk Security Essentials app. To view the Splunk Threat Research Team's complete security content repository, visit research.splunk.com.

Feedback

Any feedback or requests? Feel free to put in an issue on GitHub and we’ll follow up. Alternatively, join us on the Slack channel #security-research. Follow these instructions If you need an invitation to our Splunk user groups on Slack.

Contributors

We would like to thank Teoderick Contreras for authoring this post and the entire Splunk Threat Research Team for their contributions: Bhavin Patel, Rod Soto, Patrick Bareiss, Raven Tait, AJ King, Nasreddine Bencherchali and Lou Stella.

Related Articles

Partner Spotlight: NCU-ISAO Members Gain Actionable Intelligence with TruSTAR
Security
4 Minute Read

Partner Spotlight: NCU-ISAO Members Gain Actionable Intelligence with TruSTAR

We recently spoke with Brian Hinze, NCU-ISAO Vice President, Member Services and Operations, to learn more about why NCU-ISAO chose TruSTAR for intelligence management, and how member organizations are using TruSTAR for information sharing and collaboration.
Cloud Federated Credential Abuse & Cobalt Strike: Threat Research February 2021
Security
4 Minute Read

Cloud Federated Credential Abuse & Cobalt Strike: Threat Research February 2021

Learn about the latest emerging threats, such as Cloud Federated Credential Abuse and Cobalt Strike, where bad actors are abusing credential privileges in cloud environments to gain unauthorized access.
Securing the Unseen
Security
4 Minute Read

Securing the Unseen

Learn how Splunk Asset and Risk Intelligence unifies IT/OT visibility, enhances threat detection, and ensures compliance.