
Printer Exploitation Toolkit - Lo strumento che ha reso obsoleto il frugare nei cassonetti.
La tua stampante è sicura? Controlla prima che lo faccia qualcun altro...
PRET è un nuovo strumento per il test di sicurezza delle stampanti sviluppato nell'ambito di una tesi magistrale presso la Ruhr University Bochum. Si connette a un dispositivo tramite rete o USB e sfrutta le funzionalità di un dato linguaggio di stampa. Attualmente sono supportati PostScript, PJL e PCL che sono utilizzati dalla maggior parte delle stampanti laser. Ciò consente operazioni interessanti come catturare o manipolare lavori di stampa, accedere al file system e alla memoria della stampante o addirittura causare danni fisici al dispositivo. Tutti gli attacchi sono documentati in dettaglio nel Wiki Hacking Printers.
L'idea principale di PRET è facilitare la comunicazione tra l'utente finale e la stampante. Quindi, dopo aver inserito un comando simile a UNIX, PRET lo traduce in PostScript, PJL o PCL, lo invia alla stampante, valuta il risultato e lo ritraduce in un formato user-friendly. PRET offre una vasta gamma di comandi utili per attacchi alle stampanti e fuzzing.

PRET richiede solo un interprete Python2. Tuttavia, per output colorato e supporto SNMP, è necessario installare moduli di terze parti:
# pip install colorama pysnmp
Se si esegue su console Windows e i caratteri Unicode non vengono visualizzati correttamente, installare il modulo win_unicode_console:
# pip install win_unicode_console
Per la stampa sperimentale 'senza driver' (vedi comando print), è necessario installare ImageMagick e GhostScript:
# 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 richiede un target valido e un linguaggio di stampa come argomenti. Il target può essere l'indirizzo IP/hostname di una stampante di rete (con porta 9100/tcp aperta) o un dispositivo come /dev/usb/lp0 per una stampante USB locale. Per scoprire rapidamente tutte le stampanti di rete nella tua sottorete utilizzando il broadcast SNMP, esegui semplicemente PRET senza argomenti:
./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
Il linguaggio di stampa da sfruttare deve essere uno tra ps, pjl o pcl. Non tutti i linguaggi sono supportati da ogni stampante, quindi potresti voler cambiare lingua se non ricevi alcun feedback. Ogni linguaggio di stampa è associato a un diverso insieme di comandi PRET e ha diverse capacità di sfruttamento.
--safe tenta di verificare tramite IPP, HTTP e SNMP se il linguaggio di stampa selezionato (PS/PJL/PCL) è effettivamente supportato dal dispositivo prima di connettersi. Su stampanti non collegate in rete (USB, cavo parallelo) questo test fallirà.
--quit sopprime la determinazione del modello di stampante, il messaggio introduttivo e altre chiacchiere.
--debug mostra il flusso di dati effettivamente inviato al dispositivo e il feedback ricevuto. Nota che i dati di intestazione e altri overhead sono filtrati. Per vedere tutto il traffico, usa wireshark. Il debug può anche essere attivato/disattivato all'interno di una sessione PRET usando il comando debug
--load filename legge ed esegue comandi PRET da un file di testo. Utile per l'automazione. I file di comando possono anche essere invocati in seguito all'interno di una sessione PRET tramite il comando load.
--log filename scrive una copia del flusso di dati grezzi inviato alla stampante in un file. Può essere utile per creare un file di lavoro di stampa malevolo da distribuire su un'altra stampante non direttamente raggiungibile, ad esempio stampandolo da un'unità USB.
Dopo aver effettuato la connessione a un dispositivo di stampa, vedrai la shell PRET e potrai eseguire vari comandi:
$ ./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
Di seguito è riportato un elenco di comandi PRET generici:
help List available commands or get detailed help with 'help cmd'.
debug Enter debug mode. Use 'hex' for hexdump: debug [hex]
load Run commands from file: load cmd.txt
loop Run command for multiple arguments: loop <cmd> <arg1> <arg2> …
open Connect to remote device: open <target>
close Disconnect from device.
timeout Set connection timeout: timeout <seconds>
discover Discover local printer devices via SNMP.
print Print image file or raw text: print <file>|"text"
site Execute custom command on printer: site <command>
exit Exit the interpreter.
Le operazioni generiche sul file system con implementazione specifica PS/PJL/PCL sono:
┌───────────┬─────┬─────┬─────┬────────────────────────────────────────┐
│ Comando │ PS │ PJL │ PCL │ Descrizione │
├───────────┼─────┼─────┼─────┼────────────────────────────────────────┤
│ ls │ ✓ │ ✓ │ ✓ │ Elenca il contenuto della directory remota. │
│ get │ ✓ │ ✓ │ ✓ │ Ricevi file: get <file> │
│ put │ ✓ │ ✓ │ ✓ │ Invia file: put <file locale> │
│ append │ ✓ │ ✓ │ │ Aggiungi al file: append <file> <str> │
│ delete │ ✓ │ ✓ │ ✓ │ Elimina file remoto: delete <file> │
│ rename │ ✓ │ │ │ Rinomina file remoto: rename <vecchio> <nuovo> │
│ find │ ✓ │ ✓ │ │ Elenca ricorsivamente il contenuto della directory. │
│ mirror │ ✓ │ ✓ │ │ Rispecchia il filesystem remoto in una directory locale. │
│ cat │ ✓ │ ✓ │ ✓ │ Invia file remoto in stdout. │
│ edit │ ✓ │ ✓ │ ✓ │ Modifica file remoti con vim. │
│ touch │ ✓ │ ✓ │ │ Aggiorna timestamp file: touch <file> │
│ mkdir │ ✓ │ ✓ │ │ Crea directory remota: mkdir <percorso> │
├───────────┼─────┼─────┼─────┼────────────────────────────────────────┤
│ cd │ ✓ │ ✓ │ │ Cambia directory di lavoro remota. │
│ pwd │ ✓ │ ✓ │ │ Mostra la directory di lavoro sul dispositivo. │
│ chvol │ ✓ │ ✓ │ │ Cambia volume remoto: chvol <volume> │
│ traversal │ ✓ │ ✓ │ │ Imposta path traversal: traversal <percorso> │
├───────────┼─────┼─────┼─────┼────────────────────────────────────────┤
│ format │ ✓ │ ✓ │ │ Inizializza il filesystem della stampante. │
│ fuzz │ ✓ │ ✓ │ │ Fuzzing del filesystem: fuzz <categoria> │
├─ ─ ─ ─ ─ ─┴─ ─ ─┴─ ─ ─┴─ ─ ─┴─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─┤
│ path - Esplora la struttura del filesystem con strategie di path traversal. │
│ write - Prima metti/aggiungi file, poi verifica la sua esistenza. │
│ blind - Test di sola lettura per file esistenti come /etc/passwd. │
├───────────┬─────┬─────┬─────┬────────────────────────────────────────┤
│ df │ ✓ │ ✓ │ │ Mostra informazioni sul volume. │
│ free │ ✓ │ ✓ │ ✓ │ Mostra memoria disponibile. │
└───────────┴─────┴─────┴─────┴────────────────────────────────────────┘
id Mostra informazioni sul dispositivo.
version Mostra la versione dell'interprete PostScript.
devices Mostra i dispositivi I/O disponibili.
uptime Mostra il tempo di attività del sistema (potrebbe essere casuale).
date Mostra la data e l'ora del sistema della stampante.
pagecount Mostra il contatore pagine della stampante.
lock Imposta la password dei parametri startjob e di sistema.
unlock Rimuovi la password dei parametri startjob e di sistema.
restart Riavvia l'interprete PostScript.
reset Ripristina le impostazioni PostScript ai valori di fabbrica.
disable Disabilita la funzionalità di stampa.
destroy Causa danni fisici alla NVRAM della stampante.
hang Esegui un ciclo infinito PostScript.
overlay Metti file eps di overlay su tutte le copie cartacee: overlay <file.eps>
cross Metti graffiti della stampante su tutte le copie: cross <font> <testo>
replace Sostituisci stringa nei documenti da stampare: replace <vecchio> <nuovo>
capture Cattura i prossimi lavori da stampare su questo dispositivo.
hold Abilita la conservazione dei lavori.
set Imposta chiave a valore nel dizionario superiore: set <chiave=valore>
known Elenca operatori PostScript supportati: known <operatore>
search Cerca in tutti i dizionari per chiave: search <chiave>
dicts Restituisce un elenco di dizionari e i loro permessi.
resource Elenca o scarica risorsa PostScript: resource <categoria> [dump]
dump Scarica dizionario: dump <dict>
Dizionari: - systemdict - statusdict - userdict
- globaldict - serverdict - errordict
- internaldict - currentsystemparams
- currentuserparams - currentpagedevice
config Cambia impostazioni stampante: config <impostazione>
duplex - Imposta stampa fronte/retro.
copies # - Imposta numero di copie.
economode - Imposta modalità economica.
negative - Imposta stampa negativa.
mirror - Imposta inversione speculare.
Non tutti i comandi sono supportati da ogni stampante. Soprattutto i dispositivi Brother e Kyocera utilizzano i propri cloni PostScript – Br-Script e KPDL – invece di licenziare l'originale 'Adobe PostScript'. Tali varianti del linguaggio PostScript potrebbero non essere compatibili al 100%, specialmente per quanto riguarda le funzionalità sensibili alla sicurezza come la cattura dei lavori di stampa. L'accesso al filesystem è supportato dalla maggior parte delle stampanti, ma di solito limitato a una determinata directory in sandbox.
id Mostra informazioni sul dispositivo.
status Abilita messaggi di stato.
version Mostra versione firmware o numero di serie (da 'info config').
pagecount Manipola il contatore pagine della stampante: pagecount <numero>
printenv Mostra variabile d'ambiente della stampante: printenv <VAR>
env Mostra variabili d'ambiente (alias per 'info variables').
set Imposta variabile d'ambiente della stampante: set <VAR=VALORE>
display Imposta messaggio sul display della stampante: display <messaggio>
offline Porta la stampante offline e mostra messaggio: offline <messaggio>
restart Riavvia stampante.
reset Ripristina ai valori di fabbrica.
selftest Esegue vari autotest della stampante.
disable Disabilita funzionalità di stampa.
destroy Causa danni fisici alla NVRAM della stampante.
flood Inonda l'input utente, potrebbe rivelare buffer overflow.
lock Blocca impostazioni pannello di controllo e accesso in scrittura al disco.
unlock Sblocca impostazioni pannello di controllo e accesso in scrittura al disco.
hold Abilita conservazione lavori.
nvram Operazioni NVRAM: nvram <operazione>
nvram dump [all] - Scarica (tutta) la NVRAM su file locale.
nvram read addr - Legge un singolo byte dall'indirizzo.
nvram write addr value - Scrive un singolo byte all'indirizzo.
info Mostra informazioni: info <categoria>
info config - Fornisce informazioni di configurazione.
info filesys - Restituisce informazioni sul filesystem PJL.
info id - Fornisce il numero del modello della stampante.
info memory - Identifica la quantità di memoria disponibile.
info pagecount - Restituisce il numero di pagine stampate.
info status - Fornisce lo stato corrente della stampante.
info ustatus - Elenca le variabili di stato non richieste.
info variables - Elenca le variabili d'ambiente della stampante.
Alcuni comandi sono supportati esclusivamente dalle stampanti HP, perché altri produttori hanno implementato solo un sottoinsieme dello standard PJL. Ciò è particolarmente vero per i comandi basati su PML come restart o reset. L'abilitazione della conservazione a lungo termine dei lavori tramite il comando hold sembra possibile solo per alcuni dispositivi Epson. L'accesso alla NVRAM tramite il comando nvram è una caratteristica proprietaria delle stampanti Brother. L'accesso limitato al filesystem è supportato da vari dispositivi HP, OKI, Konica, Xerox, Epson e Ricoh.
selftest Esegue l'autotest della stampante.
info Mostra informazioni: info <categoria>
info fonts - Mostra i font installati.
info macros - Mostra le macro installate.
info patterns - Mostra i pattern definiti dall'utente.
info symbols - Mostra i set di simboli.
info extended - Mostra i font estesi.
PCL è un linguaggio di descrizione della pagina molto limitato senza accesso al filesystem. I comandi get/put/ls utilizzano quindi un filesystem virtuale basato su macro PCL, implementato principalmente per il valore di hacking. Questa prova di concetto mostra che anche un dispositivo che supporta solo linguaggi minimalisti come PCL può essere utilizzato per memorizzare file arbitrari come materiale che viola il copyright. Sebbene tale servizio di condivisione file non sia di per sé una vulnerabilità di sicurezza, potrebbe costituire un 'abuso del servizio' a seconda delle politiche aziendali.
pret.py - Programma principale eseguibilecapabilities.py - Routine per verificare il supporto del linguaggio di stampadiscovery.py - Routine per elencare le stampanti usando broadcast SNMPprinter.py - Codice generico per descrivere un dispositivo di stampapostscript.py - Codice specifico PS (eredita dalla classe printer)pjl.py - Codice specifico PJL (eredita dalla classe printer)pcl.py - Codice specifico PCL (eredita dalla classe printer)helper.py - Funzioni di supporto per output, logging, socket, ecc.codebook.py - Tabella statica dei codici di stato/errore PJLfuzzer.py - Costanti per il fuzzing del filesystemmibs/* - MIB SNMP specifici della stampantedb/* - database dei modelli supportatiDate le funzionalità e le varie estensioni proprietarie nei linguaggi di stampa come PostScript e PJL, condurre un pentest sulle stampanti non è un compito banale. PRET può aiutare ad assistere e verificare i problemi noti nel linguaggio. Una volta che hai giocato con lo strumento, potresti voler eseguire un'analisi sistematica della sicurezza della stampante. Un buon punto di partenza è il Printer Security Testing Cheat Sheet.
Happy Hacking!
lpd/* - Script per il fuzzing LPD