
Printer Exploitation Toolkit - Das Tool, das die Müllcontainer-Durchsuchung überflüssig gemacht hat.
Ist Ihr Drucker sicher? Überprüfen Sie es, bevor es jemand anderes tut...
PRET ist ein neues Werkzeug für Druckersicherheitstests, das im Rahmen einer Masterarbeit an der Ruhr-Universität Bochum entwickelt wurde. Es verbindet sich über Netzwerk oder USB mit einem Gerät und nutzt die Funktionen einer bestimmten Druckersprache aus. Derzeit werden PostScript, PJL und PCL unterstützt, die von den meisten Laserdruckern verwendet werden. Dies ermöglicht coole Dinge wie das Erfassen oder Manipulieren von Druckaufträgen, den Zugriff auf das Dateisystem und den Speicher des Druckers oder sogar die Verursachung physischer Schäden am Gerät. Alle Angriffe sind detailliert im Hacking Printers Wiki dokumentiert.
Die Hauptidee von PRET ist es, die Kommunikation zwischen dem Endbenutzer und dem Drucker zu erleichtern. Nach Eingabe eines UNIX-ähnlichen Befehls übersetzt PRET diesen in PostScript, PJL oder PCL, sendet ihn an den Drucker, wertet das Ergebnis aus und übersetzt es zurück in ein benutzerfreundliches Format. PRET bietet eine ganze Reihe von Befehlen, die für Druckerangriffe und Fuzzing nützlich sind.

PRET benötigt nur einen Python2-Interpreter. Für farbige Ausgabe und SNMP-Unterstützung müssen jedoch Module von Drittanbietern installiert werden:
# pip install colorama pysnmp
Falls in einer Windows-Konsole Unicode-Zeichen nicht korrekt angezeigt werden, installieren Sie das win_unicode_console-Modul:
# pip install win_unicode_console
Für experimentelles, 'treiberloses' Drucken (siehe print-Befehl) müssen ImageMagick und GhostScript installiert werden:
# apt-get install imagemagick ghostscript
usage: pret.py [-h] [-s] [-q] [-d] [-i file] [-o file] target {ps,pjl,pcl}
positional arguments:
target printer device or hostname
{ps,pjl,pcl} printing language to abuse
optional arguments:
-h, --help show this help message and exit
-s, --safe verify if language is supported
-q, --quiet suppress warnings and chit-chat
-d, --debug enter debug mode (show traffic)
-i file, --load file load and run commands from file
-o file, --log file log raw data sent to the target
$ ./pret.py laserjet.lan ps
$ ./pret.py /dev/usb/lp0 pjl
PRET benötigt ein gültiges Ziel und eine Druckersprache als Argumente. Das Ziel kann entweder die IP-Adresse/der Hostname eines Netzwerkdruckers (mit offenem Port 9100/tcp) oder ein Gerät wie /dev/usb/lp0 für einen lokalen USB-Drucker sein. Um schnell alle Netzwerkdrucker in Ihrem Subnetz mittels SNMP-Broadcast zu entdecken, führen Sie PRET einfach ohne Argumente aus:
./pret.py
No target given, discovering local printers
address device uptime status
───────────────────────────────────────────────────────────────────────────────
192.168.1.5 hp LaserJet 4250 10:21:49 Ready
192.168.1.11 HP LaserJet M3027 MFP 13 days Paper jam
192.168.1.27 Lexmark X792 153 days Ready
192.168.1.28 Brother MFC-7860DW 16:31:17 Sleep mode
Die zu missbrauchende Druckersprache muss eine von ps, pjl oder pcl sein. Nicht alle Sprachen werden von jedem Drucker unterstützt, daher möchten Sie möglicherweise die Sprache wechseln, wenn Sie kein Feedback erhalten. Jede Druckersprache ist einem anderen Satz von PRET-Befehlen zugeordnet und hat unterschiedliche Fähigkeiten zur Ausnutzung.
--safe versucht über IPP, HTTP und SNMP zu prüfen, ob die ausgewählte Druckersprache (PS/PJL/PCL) tatsächlich vom Gerät unterstützt wird, bevor eine Verbindung hergestellt wird. Bei nicht vernetzten Druckern (USB, paralleles Kabel) schlägt dieser Test fehl.
--quit unterdrückt die Bestimmung des Druckermodells, die Einführungsnachricht und einige andere Gespräche.
--debug zeigt den tatsächlich an das Gerät gesendeten Datenstrom und das erhaltene Feedback. Beachten Sie, dass Header-Daten und andere Overheads gefiltert werden. Um den gesamten Verkehr zu sehen, verwenden Sie Wireshark. Das Debuggen kann auch innerhalb einer PRET-Sitzung mit dem debug-Befehl ein- und ausgeschaltet werden.
--load Dateiname liest und führt PRET-Befehle aus einer Textdatei aus. Dies ist nützlich für die Automatisierung. Befehlsdateien können später innerhalb einer PRET-Sitzung über den load-Befehl aufgerufen werden.
--log Dateiname schreibt eine Kopie des rohen Datenstroms, der an den Drucker gesendet wird, in eine Datei. Dies kann nützlich sein, um eine bösartige Druckauftragsdatei zu erstellen, die auf einem anderen, nicht direkt erreichbaren Drucker eingesetzt werden kann, zum Beispiel durch Drucken von einem USB-Laufwerk.
Nach der Verbindung zu einem Druckergerät sehen Sie die PRET-Shell und können verschiedene Befehle ausführen:
$ ./pret.py laserjet.lan pjl
________________
_/_______________/|
/___________/___//|| PRET | Printer Exploitation Toolkit v0.25
|=== |----| || by Jens Mueller <[email protected]>
| | ô| ||
|___________| ô| ||
| ||/.´---.|| | || 「 cause your device can be
|-||/_____\||-. | |´ more fun than paper jams 」
|_||=L==H==||_|__|/
(ASCII art by
Jan Foerster)
Connection to laserjet.lan established
Device: hp LaserJet 4250
Welcome to the pret shell. Type help or ? to list commands.
laserjet.lan:/> help
Available commands (type help <topic>):
=======================================
append debug edit free id ls open restart timeout
cat delete env fuzz info mirror printenv selftest touch
cd df exit get load mkdir put set traversal
chvol disable find help lock nvram pwd site unlock
close display format hold loop offline reset status version
laserjet.lan:/> ls ../../
- 834 .profile
d - bin
d - dev
d - etc
d - hp
d - hpmnt
- 1276 init
d - lib
d - pipe
d - tmp
laserjet.lan:/> exit
Eine Liste generischer PRET-Befehle finden Sie unten:
help Listet verfügbare Befehle auf oder zeigt detaillierte Hilfe mit 'help cmd'.
debug Debug-Modus aktivieren. Verwende 'hex' für Hexdump: debug [hex]
load Führe Befehle aus Datei aus: load cmd.txt
loop Führe Befehl für mehrere Argumente aus: loop <Befehl> <Arg1> <Arg2> …
open Verbinde zu entferntem Gerät: open <Ziel>
close Trenne Verbindung zum Gerät.
timeout Setze Verbindungszeitüberschreitung: timeout <Sekunden>
discover Entdecke lokale Druckergeräte über SNMP.
print Drucke Bilddatei oder Rohtext: print <Datei>|"Text"
site Führe benutzerdefinierten Befehl auf Drucker aus: site <Befehl>
exit Beende den Interpreter.
Generische Dateisystemoperationen mit einer PS-/PJL-/PCL-spezifischen Implementierung sind: