Mars Stealer: Oski refactoring

Analysis of a new malware called Mars Stealer, which is a further development of Oski Stealer.

It has been noticed that Oski support stopped answering its customers and deleted its telegram account and bot around July 2, 2020. This disappearance has raised eyebrows, as major projects like KPOT Stealer and Predator The Thief don’t usually just go away.

Recently, I came across a sample of Mars Stealer, which appears to be an upgraded version of Oski Stealer. Since Mars Stealer is gaining popularity, I have decided to write a technical analysis about this stealer. Enjoy reading!

Mars Stealer written in ASM/C with using WinApi, weight is 95 kb. Uses special techniques to hide WinApi calls, encrypts strings, collects information in the memory, supports secured SSL-connection with C&C, doesn’t use CRT, STD.

Browsers (supports Chrome V80):

  • Internet Explorer, Microsoft Edge (Chromium Version), Kometa, Amigo, Torch, Orbitium, Comodo Dragon, Nichrome, Maxxthon5, Maxxthon6, Sputnik Browser, Epic Privacy Browser, Vivaldi, CocCoc, Uran Browser, QIP Surf, Cent Browser, Elements Browser, TorBro Browser, CryptoTab Browser, Brave, Opera Stable, Opera GX, Opera Neon, Firefox, SlimBrowser, PaleMoon, Waterfox, CyberFox, BlackHawk, IceCat, K-Meleon, Thunderbird.

Crypto extensions:

  • TronLink, MetaMask, Binance Chain Wallet, Yoroi, Nifty Wallet, Math Wallet, Coinbase Wallet, Guarda, EQUAL Wallet, Jaox Liberty, BitAppWllet, iWallet, Wombat, MEW CX, Guild Wallet, Saturn Wallet, Ronin Wallet, Neoline, Clover Wallet, Liquality Wallet, Terra Station, Keplr, Sollet, Auro Wallet, Polymesh Wallet, ICONex, Nabox Wallet, KHC, Temple, TezBox Cyano Wallet, Byone, OneKey, Leaf Wallet, DAppPlay, BitClip, Steem Keychain, Nash Extension, Hycon Lite Client, ZilPay, Coin98 Wallet.

2FA plugins:

  • Authenticator, Authy, EOS Authenticator, GAuth Authenticator, Trezor Password Manager.

Crypto wallets:

  • Bitcoin Core and all derivatives (Dogecoin, Zcash, DashCore, LiteCoin, etc), Ethereum, Electrum, Electrum LTC, Exodus, Electron Cash, MultiDoge, JAXX, Atomic, Binance, Coinomi.

Computer information:

  • IP and country
  • Working path to EXE file
  • Local time and time zone
  • Language system
  • Language keyboard layout
  • Notebook or desktop
  • Processor model
  • Computer name
  • User name
  • Domain computer name
  • Machine ID
  • GUID
  • Installed software and their versions

Additional functional:

  • Files grabber
  • Loader

/posts/mars-stealer/forum.png

Most strings are encrypted using combinations of RC4 and Base64. The decryption key of RC4 is stored in the decrypt_key variable that was declared in the Run-Time Dynamic Linking function. In this case, the decryption key is 86223203794583053453.

/posts/mars-stealer/decrypt_string.png

The first called function from WinMain declares decryption key for encrypted strings and unencrypted strings, which contain names of WinApi functions for Run-Time Dynamic Linking.

/posts/mars-stealer/strings_start.png

Mars gets a module handle of kernel32.dll by parsing InLoadOrderModuleList which usually contains kernel32 library as its 3rd element (0x18 address). After obtaining the base address of kernel32.dll, it parses the PE file and loops over the exported functions of the DLL to get the address of the LoadLibaryA() and GetProcAddress() functions.

After procedures with kernel32 functions, LoadLibraryA() loads advapi32.dll library and gets the address of the GetUserNameA() for anti-emulation check. The same thing program does with crypt32.dll and gets the address of CryptStringToBinaryA() for strings decryption.

/posts/mars-stealer/linking_start.png

Malware initializes a double word (4 bytes) and calls the GetTickCount() function that returns the number of milliseconds that have elapsed since the system has started. Then calls the Sleep() to suspend the execution of the current thread until 15000 milliseconds (15 seconds). GetTickCount() again gets the time and malware uses the first result to subtract then checks if a gotten number is greater than 10000 milliseconds (10 seconds). If the function returns true, it means that the Sleep() hasn’t been skipped by the debugger and malware continues execution flow.

/posts/mars-stealer/anti_debug.png

Anti-emulation is used to avoid running in the Windows Defender emulator. Malware compares the current computer name with HAL9TH and the username with JohnDoe. If the computer name and username have coincided, the malware finishes execution.

/posts/mars-stealer/anti_emulation.png

This feature is used to avoid infection of machines from the Commonwealth of Independent States (CIS) by using GetUserDefaultLangID() that returns the language identifier of the region format setting for the current user. If the user language ID matches one from the list, the stealer finishes execution.

/posts/mars-stealer/cis_check.png

Language ID Language-tag Country
0x43F kk-KZ Kazakhstan
0x443 us-Latb-US Uzbekistan
0x82C az-Cyrl-AZ Azerbaijan
0x43Fu kk-KZ Kazakhstan
0x419u ru-RU Russia
0x423u ru-BY Belarus

If all checks have passed, the malware creates a mutex object using CreateMutexA() to avoid repeat launch. Mutex name is the same as a strings decryption key, but they are stored in different variables. Then calls GetLastError() which gets the last error, and if the error code is equal to 183 (ERROR_ALREADY_EXIST) it means that mutex already exists therefore malware finishes execution.

/posts/mars-stealer/create_mutex.png

The compilation_date variable contains 28/08/2021 00:00:00. The month on this date has increased by 1 unit, so malware can’t run after a month of compilation. Accordingly, this sample was compiled not on 28/08/2021, but on 28/07/2021.

Mars uses GetSystemTime() to put current system time to a struct, then calls sscanf() to parse the compilation date. SystemTimeToFileTime() is used to convert the current date and compilation date from system time to file time format.

If the current file time is bigger than the compile time, the malware calls `ExitProcess()` to finish the process.

/posts/mars-stealer/expiration_check.png

When stealing Gecko browsers credentials, the malware makes 6 requests using WinINet libary to download dependencies from the public folder and saves them in the ProgramData folder, but sqlite3.dll is downloading before chrome stealing starts. At the end of execution, malware deletes mentioned DLLs and finishes execution.

/posts/mars-stealer/external_dlls.png

DLL name Download url Save path Description
sqlite3.dll http://cookreceipts.fun/public/sqlite3.dll C:\ProgramData\sqlite3.dll Libary for chromium data
freebl3.dll http://cookreceipts.fun/public/freebl3.dll C:\ProgramData\freebl3.dll Library for the NSS (Gecko-based)
mozglue.dll http://cookreceipts.fun/public/mozglue.dll C:\ProgramData\mozglue.dll Mozilla Browser Library
msvcp140.dll http://cookreceipts.fun/public/msvcp140.dll C:\ProgramData\msvcp140.dll Visual C++ Runtime 2015
nss3.dll http://cookreceipts.fun/public/nss3.dll C:\ProgramData\nss3.dll Network System Services Library (Gecko-based)
softokn3.dll http://cookreceipts.fun/public/softokn3.dll C:\ProgramData\softokn3.dll Mozilla Browser Library
vcruntime140.dll http://cookreceipts.fun/public/vcruntime140.dll C:\ProgramData\vcruntime140.dll Visual C++ Runtime 2015

Mars steals credentials from Chromium and Gecko browsers by static paths, therefore it supports only the most popular.

/posts/mars-stealer/browsers.png

Browser name Browser folder
Chrome %localappdata%\Google\Chrome\User Data
Chromium %localappdata%\Chromium\User Data
Microsoft Edge %localappdata%\Microsoft\Edge\User Data
Kometa %localappdata%\Kometa\User Data
Amigo %localappdata%\Amigo\User Data
Torch %localappdata%\Torch\User Data
Orbitum %localappdata%\Orbitum\User Data
Comodo %localappdata%\Comodo\Dragon\User Data
Nichrome %localappdata%\Nichrome\User Data
Maxthon5 %localappdata%\Maxthon5\Users
Sputnik %localappdata%\Sputnik\User Data
Epic Privacy Browser %localappdata%\Epic Privacy Browser\User Data
Vivaldi %localappdata%\Vivaldi\User Data
CocCoc %localappdata%\CocCoc\Browser\User Data
Uran %localappdata%\uCozMedia\Uran\User Data
QIP Surf %localappdata%\QIP Surf\User Data
Cent Browser %localappdata%\CentBrowser\User Data
Elements Browser %localappdata%\Elements Browser\User Data
TorBro %localappdata%\TorBro\Profile
CryptoTab Browser %localappdata%\CryptoTab Browser\User Data
Brave %localappdata%\BraveSoftware\Brave-Browser\User Data
Opera %appdata%\Opera Software\Opera Stable\
Opera GX %appdata%\Opera Software\Opera GX Stable\
Opera Neon %appdata%\Opera Software\Opera Neon\User Data
Firefox %appdata%\Mozilla\Firefox\Profiles\
SlimBrowser %appdata%\FlashPeak\SlimBrowser\Profiles
Pale Moon %appdata%\Moonchild Productions\Pale Moon\Profiles\
Waterfox %appdata%\Waterfox\Profiles\
Cyberfox %appdata%\8pecxstudios\Cyberfox\Profiles\
BlackHawk %appdata%\NETGATE Technologies\BlackHawk\Profiles\
IceCat %appdata%\Mozilla\icecat\Profiles\
K-Meleon %appdata%\K-Meleon\
Thunderbird %appdata%\Thunderbird\Profiles\

This malware also targets 2FA and crypto extensions, but only in Chromium-based browsers (opera is an exception).

/posts/mars-stealer/extensions.png

Type Extension name Extension id
Crypto TronLink ibnejdfjmmkpcnlpebklmnkoeoihofec
Crypto MetaMask nkbihfbeogaeaoehlefnkodbefgpgknn
Crypto Binance Chain Wallet fhbohimaelbohpjbbldcngcnapndodjp
Crypto Yoroi ffnbelfdoeiohenkjibnmadjiehjhajb
Crypto Nifty Wallet jbdaocneiiinmjbjlgalhcelgbejmnid
Crypto Math Wallet afbcbjpbpfadlkmhmclhkeeodmamcflc
Crypto Coinbase Wallet hnfanknocfeofbddgcijnmhnfnkdnaad
Crypto Guarda hpglfhgfnhbgpjdenjgmdgoeiappafln
Crypto EQUAL Wallet blnieiiffboillknjnepogjhkgnoapac
Crypto Jaxx Liberty cjelfplplebdjjenllpjcblmjkfcffne
Crypto BitApp Wallet fihkakfobkmkjojpchpfgcmhfjnmnfpi
Crypto iWallet kncchdigobghenbbaddojjnnaogfppfj
Crypto Wombat amkmjjmmflddogmhpjloimipbofnfjih
Crypto MEW CX nlbmnnijcnlegkjjpcfjclmcfggfefdm
Crypto GuildWallet nanjmdknhkinifnkgdcggcfnhdaammmj
Crypto Saturn Wallet nkddgncdjgjfcddamfgcmfnlhccnimig
Crypto Ronin Wallet fnjhmkhhmkbjkkabndcnnogagogbneec
Crypto NeoLine cphhlgmgameodnhkjdmkpanlelnlohao
Crypto Clover Wallet nhnkbkgjikgcigadomkphalanndcapjk
Crypto Liquality Wallet kpfopkelmapcoipemfendmdcghnegimn
Crypto Terra Station aiifbnbfobpmeekipheeijimdpnlpgpp
Crypto Keplr dmkamcknogkgcdfhhbddcghachkejeap
Crypto Sollet fhmfendgdocmcbmfikdcogofphimnkno
Crypto Auro Wallet cnmamaachppnkjgnildpdmkaakejnhae
Crypto Polymesh Wallet jojhfeoedkpkglbfimdfabpdfjaoolaf
Crypto ICONex flpiciilemghbmfalicajoolhkkenfel
Crypto Nabox Wallet nknhiehlklippafakaeklbeglecifhad
Crypto KHC hcflpincpppdclinealmandijcmnkbgn
Crypto Temple ookjlbkiijinhpmnjffcofjonbfbgaoc
Crypto TezBox mnfifefkajgofkcjkemidiaecocnkjeh
Crypto Cyano Wallet dkdedlpgdmmkkfjabffeganieamfklkm
Crypto Byone nlgbhdfgdhgbiamfdfmbikcdghidoadd
Crypto OneKey infeboajgfhgbjpjbeppbkgnabfdkdaf
Crypto LeafWallet cihmoadaighcejopammfbmddcmdekcje
Crypto DAppPlay lodccjjbdhfakaekdiahmedfbieldgik
Crypto BitClip ijmpgkjfkbfhoebgogflfebnmejmfbml
Crypto Steem Keychain lkcjlnjfpbikmcmbachjpdbijejflpcm
Crypto Nash Extension onofpnbbkehpmmoabgpcpmigafmmnjhl
Crypto Hycon Lite Client bcopgchhojmggmffilplmbdicgaihlkp
Crypto ZilPay klnaejjgbibmhlephnhpmaofohgkpgkd
Crypto Coin98 Wallet aeachknmefphepccionboohckonoeemg
2FA Authenticator bhghoamapcdpbohphigoooaddinpkbai
2FA Authy gaedmjdfmmahhbjefcbgaolhhanlaolb
2FA EOS Authenticator oeljdldpnmdbchonielidgobddffflal
2FA GAuth Authenticator ilgcnhelpchnceeipipijaljkblbcobl
2FA Trezor Password Manager imloifkgjagghnncjkhggdhalmcnfklk

The malware targets multiple wallets, which stores sensitive data in files as wallet.dat that contains the address, the private key to access this address, and other data.

/posts/mars-stealer/wallets.png

Wallet name Wallet folder Regex
Ethereum %appdata%\Ethereum\ keystore
Electrum %appdata%\Electrum\wallets\ .
Electrum LTC %appdata%\Electrum-LTC\wallets\ .
Exodus %appdata%\Exodus\ exodus.conf.json, window-state.json, \Exodus\exodus.wallet\, passphrase.json, seed.seco, info.seco
Electron Cash %appdata%\ElectronCash\wallets\ default_wallet
MultiDoge %appdata%\MultiDoge\ multidoge.wallet
Jaxx %appdata%\jaxx\Local Storage\ file__0.localstorage
Atomic %appdata%\atomic\Local Storage\leveldb\ 000003.log, CURRENT, LOCK, LOG, MANIFEST.000001, 0000*
Binance %appdata%\Binance\ app-store.json
Coinomi %localappdata%\Coinomi\Coinomi\wallets\ *.wallet, *.config

Mars has a custom grabber with multiple functions. First, the malware makes a request to C&C and gets config as a response. Grabber config looks like this name|max_size|path|formats|recursively|. Then uses setup_grabber() which use strtok() with lstrcatA() to parse grabber config and calls grabber() which performs grabbing.

/posts/mars-stealer/grabber.png

Malware gets loader config as the response while uploading log. This config looks like this link|load_to|startup_param| (download link, path to a loaded file, start-up parameters).

To download file stealer calls download_file() function. Then uses strtok() with lstrcatA() to parse config parameters and calls ShellExecuteExA() to execute executable.

/posts/mars-stealer/loader.png

Malware gets the way to itself by using GetModuleFileName() and calls ShellExecuteExA() which executes cmd.exe with /c timeout /t 5 & del /f /q \"%s\" & exit parameters. After 5 seconds cmd.exe deletes current executable.

/posts/mars-stealer/self_removal.png

Mars Stealer it’s an improved version of Oski Stealer. Have been added anti-debug check, crypto extensions stealing, but outlook stealing is missing. The code has been refactoring, but some algorithms remained stupid as in Oski Stealer. Here you can read detailed Oski Stealer analysis from CyberArk.

Tweet: Aug 9, 2021

File: 6143734a8c9cae36bfde4f4b67f3c604

C&C: cookreceipts.fun