Einführung
Drucker stellen in der Welt des Internets der Dinge (IoT) einen interessanten Fall dar, da sie im Vergleich zu den meisten IoT-Geräten sehr leistungsfähige Hardware sind, von den meisten Administratoren jedoch nicht als "echter" Computer angesehen werden. Im Laufe der Jahre haben viele Sicherheitsforscher Schwachstellen in Druckern untersucht und darüber berichtet. Die überwiegende Mehrheit dieser Forschungen konzentrierte sich jedoch darauf, wie man den Drucker selbst hacken kann, um z. B. das Display des Druckers zu ändern oder die gedruckten Dokumente zu stehlen. In diesem Fall untersuchen wir, wie die besondere Rolle, die Drucker in den meisten Netzwerken spielen, genutzt werden kann, um Endbenutzergeräte zu infizieren und die Reichweite des Angriffs im Netzwerk zu vergrößern.
Hintergrund
Um dieses Problem zu verstehen, müssen wir ein wenig über das Microsoft Web Point-and-Print Protocol (MS-WPRN) wissen und warum es so funktioniert, wie es funktioniert.
Die meisten Unternehmen versuchen, das Prinzip der geringsten Privilegien auf die Geräte in ihren Netzwerken anzuwenden. Das funktioniert bei Laptops und Desktops recht gut, da sich die verwendete Hardware nicht so oft ändert. Bei Druckern verhält es sich jedoch ein wenig anders. Sie benötigen zwar immer noch Treiber, aber Drucker müssen praktisch jeden Benutzer unterstützen, der eine Verbindung zu ihnen herstellen möchte. Wenn sich Endbenutzer durch ein Gebäude bewegen, wollen sie natürlich den Drucker verwenden, der ihnen am nächsten ist. Mobile Benutzer erwarten, dass sie problemlos einen Drucker anschließen und verwenden können, wenn sie ins Büro kommen. Hinzu kommt, dass die meisten Unternehmen nicht auf einen einzigen Drucker standardisiert sind, sondern oft mehrere Modelle und Hersteller in einem einzigen Netzwerk einsetzen.
Anstatt also die Systemadministratoren zu veranlassen, alle möglichen Druckertreiber an alle Workstations im Netzwerk zu verteilen, bestand die Lösung darin, eine Möglichkeit zu entwickeln, den Treiber direkt vor der Verwendung des Druckers an ein Benutzergerät zu liefern. Und genau hier kam Point-and-Print ins Spiel. Bei diesem Ansatz wird ein gemeinsamer Treiber auf dem Drucker oder Druckserver gespeichert, und nur die Benutzer dieses Druckers erhalten den von ihnen benötigten Treiber. Auf den ersten Blick ist dies eine praktische und einfache Lösung für die Treiberbereitstellung. Der Benutzer erhält Zugang zu dem von ihm benötigten Druckertreiber, ohne dass ein Administrator erforderlich ist - eine schöne Win-Win-Situation.
Das Thema
Das Problem ist, dass eine Ausnahme erforderlich war, damit dieses System aus der Sicht des Endbenutzers gut funktioniert. Normalerweise werden Benutzerkontensteuerungen eingesetzt, um einen Benutzer vor der Installation eines neuen Treibers zu warnen oder zu verhindern. Um das Drucken zu erleichtern, wurde eine Ausnahme geschaffen, um diese Kontrolle zu umgehen. Letztendlich haben wir also einen Mechanismus, der es ermöglicht, ausführbare Dateien von einem freigegebenen Laufwerk herunterzuladen und sie als System auf einer Workstation auszuführen, ohne dass der Benutzer eine Warnung erhält. Aus der Sicht eines Angreifers ist das fast zu schön, um wahr zu sein, und natürlich mussten wir es ausprobieren.
Die Ausbeutung
In unserem Fall verwenden wir einen echten Drucker. Da die meisten Drucker mit zahlreichen Funktionen ausgestattet sind, war es nicht allzu schwer, einen Fehler zu finden, der den Zugriff auf das zugrunde liegende System ermöglicht. In diesem Fall konnten wir ein Firmware-Update entpacken, um einige Anmeldeinformationen zu sammeln und das Dateisystem zu verstehen. Eine binwalk-Magic-Datei wird im Abschnitt Tools am Ende dieser Seite bereitgestellt, und nach einigem Suchen fanden wir die Datei, die mit diesen Treibern zusammenhängt. Sie müssen sich auf einem gemeinsam genutzten Treiber "print$" in smb befinden und beinhalten typischerweise mehrere Varianten für verschiedene Architekturen (z.B. x86, x64, ppc, alpha). Suchen Sie nach Verzeichnissen mit den Namen: W32X86, x64, IA64, color, usw.
Wir haben einfach die x86-dll-Datei aus dem Drucker genommen, was direkt oder über rpcclient[5] geschehen kann, und sie mit "the-backdoor-factory"[1] gepatcht.
Dadurch erhielten wir eine DLL-Datei mit einer eingeschleusten Nutzlast zurück.
Es gibt mehrere Möglichkeiten, die DLL wieder in das ursprüngliche Verzeichnis zu verschieben. Normalerweise können Sie in die print$-Freigabe zurückschreiben, wenn Sie über Domänenadministrator-Zugangsdaten verfügen. Alternativ dazu können Sie mit lokalem Root-Zugriff auf den Drucker die vorhandene Datei mit der soeben erstellten zurückgeschriebenen Datei überschreiben. Es ist immer noch erstaunlich, dass die Hersteller die standardmäßigen versteckten Anmeldeinformationen auf dem Rechner belassen. Wenn es nicht in Ihrem Cracking-Wörterbuch steht, ist es immer gut, root:myroot für den Fall der Fälle hinzuzufügen.
In unserem Beispiel haben wir eine Mischung aus Windows XP 32bit, Windows 7 32bit, Windows 7 64 bit, Windows 2008 R2 AD 64, Ubuntu CUPS, Windows 2008 R2 64 Druckserver und einen unbenannten Drucker verwendet. Damit Windows 7 gut mit Point-and-Print funktioniert, musste es auf der Active Directory-Seite konfiguriert und als Richtlinie übertragen werden. Mehr dazu im Abschnitt Internet Printing Protocol weiter unten.
Nach dem normalen Hinzufügen eines Druckers mit automatischer Erkennung und der Auswahl unseres Druckers (mit der hinterlegten DLL) durchläuft das Windows-System den normalen Treibererfassungs- und Installationsprozess.
Diese Stufe ermöglicht die Installation eines Druckertreibers ohne Benutzerwarnung, uac oder sogar ohne Überprüfung der binären Signatur, und das alles mit Systemrechten.
Auf der msfconsole-Seite ergab sich daraus folgendes Bild:
Andere mögliche Vektoren
Angesichts der Art dieses Problems gibt es viele Möglichkeiten, wie die Remotecodeausführung genutzt werden kann. Im obigen Beispiel haben wir ein Reverse Engineering für einen Desktop-Drucker durchgeführt. Die gleiche Funktion zum Laden von Treibern könnte jedoch auch mit einem anderen Software-Stack erreicht und in anderen Szenarien verwendet werden. Einige davon sind unter anderem:
- Angriffe auf Wasserlöcher
- Backdooring eines vorhandenen Druckers oder Druckerservers.
- Microsoft Druckserver: Treiberpfad: c:\windows\system32\spool\drivers\*\3\...
- Linux Cups Server: Prüfen Sie, ob der Freigabetreiber print$ in der Konfiguration vorhanden ist.
- Mehrere Anbieter unterstützen Point-and-Printon auf dem Drucker selbst.
- Drucker mit zurückgesetzten Treibern neu flashen.
- Erstellen Sie einen gefälschten Druckserver und senden Sie ihn mit automatischer Erkennung.
- Privilegieneskalation
- Verwenden Sie den add printer als einen Mechanismus zur Erhöhung der Privilegien, um Zugang zum System zu erhalten.
- Mitm-Angriff auf den Drucker und Einspeisung des manipulierten Treibers anstelle des echten Treibers.
- Mit IPP und Webpnp zu mehr Globalität.
Ferninfizierung über das Internet-Druckprotokoll und Web PointNPrint
Bisher haben wir uns auf ein internes Netzwerk beschränkt, in dem ein Gerät entweder eingefügt oder infiziert wurde und dazu verwendet wurde, weitere Geräte zu infizieren, die mit ihm verbunden waren. Das Microsoft Internet Printing Protocol (IPP) und Web PointNprint ermöglichen es uns, dieses Problem über das Intranet hinaus auf das Internet auszuweiten. Microsoft IPP ermöglicht den gleichen Mechanismus, um Treiber vom Drucker zu laden. Dies kann mit folgendem Codestück vom MS-Druckserver geschehen.
Diese URL enthält eine Datei, die ein ".webpnp" oder webpointNprint ist.
Schauen wir uns den Inhalt dieser schönen 10 MB großen Binärdatei an.
Hier befinden sich die Dateien, die geladen werden sollen. Die Dateien, die wir aus dem vorherigen Angriff gepatcht haben, liefen genauso gut, egal ob sie über smb, Point-and-Print oder unter webpnp übertragen wurden.
Grundlegende Ursache des Problems
Die Verfolgung des Problems führt uns zu einer ntprint.dll-Bibliothek, insbesondere zur Funktion "PSetupDownloadAndInstallLegacyDriver". Dies ist die Funktion, die für die Überprüfung der Richtlinie und die Durchführung der Installation mit erhöhten Rechten verantwortlich ist.
Es gibt zwar triftige Gründe, die Installation von Treibern ohne Administratorrechte zuzulassen, aber eine Warnung sollte wahrscheinlich immer aktiviert sein und die Binärsignatur sollte wahrscheinlich immer überprüft werden, um die Angriffsfläche zu verringern.
Abhilfemaßnahmen
Vectra und Microsoft haben bei der Untersuchung dieses Problems zusammengearbeitet, und Microsoft hat eine Korrektur für CVE-2016-3238 (MS16-087) undCVE-2016-3239 als Teil des Security Bulletin MS16-087 bereitgestellt, das hier verfügbar ist.
Das Verhalten von Point-and-Print kann mit GPO bis zu einer Granularität definiert werden, die dem Administrator die Kontrolle über das Risiko geben sollte. Es ist zwar möglich, Point-and-Print zu deaktivieren oder eine Warnung hinzuzufügen und UAC anzufordern, aber das bringt uns nur zum ersten Problem zurück, nämlich der Frage, wie die Treiber verwaltet werden können, damit der Benutzer den Treiber installieren kann, ohne jedes Mal die IT-Abteilung kontaktieren zu müssen.
Microsoft stellt die erforderliche Dokumentation unter [3],[4] zur Verfügung, und die Entwicklung von enhancedPoint-and-Print(v4) versucht, einige dieser Probleme zu beheben. Die Umstellung auf einen Drucker, der die neueste Version des Protokolls und eine neuere Version von Windows unterstützt, könnte einen Teil der Angriffsfläche minimieren. Wir haben die Sicherheitsmerkmale von v4 / Enhanced Point-and-Print nicht weiter als bis zu ihrer Spezifikation geprüft, aber die Abwärtskompatibilität könnte diese Bemühungen überflüssig machen.
Überprüfung Ihrer Netzwerke
Host-Registrierung für die Aktivierung vonPoint-and-Print
Scannen Ihres Netzwerks nach Point n Print-Treibern