
Printer Exploitation Toolkit - L'outil qui a rendu la fouille des poubelles obsolète.
Votre imprimante est-elle sécurisée ? Vérifiez avant que quelqu'un d'autre ne le fasse...
PRET est un nouvel outil de test de sécurité des imprimantes développé dans le cadre d'un Mémoire de Master à l'Université de la Ruhr à Bochum. Il se connecte à un périphérique via le réseau ou USB et exploite les fonctionnalités d'un langage d'imprimante donné. Actuellement, PostScript, PJL et PCL sont pris en charge, langages parlés par la plupart des imprimantes laser. Cela permet des choses sympas comme la capture ou la manipulation de travaux d'impression, l'accès au système de fichiers et à la mémoire de l'imprimante, voire même des dommages physiques à l'appareil. Toutes les attaques sont documentées en détail dans le Wiki Hacking Printers.
L'idée principale de PRET est de faciliter la communication entre l'utilisateur final et l'imprimante. Ainsi, après avoir saisi une commande de type UNIX, PRET la traduit en PostScript, PJL ou PCL, l'envoie à l'imprimante, évalue le résultat et le retraduit dans un format convivial pour l'utilisateur. PRET propose tout un ensemble de commandes utiles pour les attaques d'imprimantes et le fuzzing.

PRET nécessite uniquement un interpréteur Python2. Cependant, pour la sortie colorée et le support SNMP, des modules tiers doivent être installés :
# pip install colorama pysnmp
Si vous utilisez une console Windows et que les caractères Unicode ne s'affichent pas correctement, installez le module win_unicode_console :
# pip install win_unicode_console
Pour l'impression expérimentale « sans pilote » (voir la commande print), ImageMagick et GhostScript doivent être installés :
# 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 nécessite une cible valide et un langage d'imprimante comme arguments. La cible peut être soit l'adresse IP/le nom d'hôte d'une imprimante réseau (avec le port 9100/tcp ouvert) soit un périphérique comme /dev/usb/lp0 pour une imprimante USB locale. Pour découvrir rapidement toutes les imprimantes réseau de votre sous-réseau en utilisant la diffusion SNMP, exécutez simplement PRET sans arguments :
./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
Le langage d'imprimante à abuser doit être l'un des suivants : ps, pjl ou pcl. Tous les langages ne sont pas supportés par chaque imprimante, donc vous pouvez changer de langage si vous ne recevez aucun retour. Chaque langage d'imprimante est associé à un ensemble différent de commandes PRET et possède différentes capacités à exploiter.
--safe essaie de vérifier via IPP, HTTP et SNMP si le langage d'impression sélectionné (PS/PJL/PCL) est réellement supporté par l'appareil avant de se connecter. Sur les imprimantes non réseau (USB, câble parallèle), ce test échouera.
--quit supprime la détermination du modèle d'imprimante, le message d'introduction et quelques autres bavardages.
--debug affiche le flux de données réellement envoyé à l'appareil et les retours reçus. Notez que les en-têtes et autres surcharges sont filtrés. Pour voir tout le trafic, utilisez Wireshark. Le débogage peut également être activé/désactivé dans une session PRET à l'aide de la commande debug.
--load filename lit et exécute les commandes PRET à partir d'un fichier texte. Ceci est utile pour l'automatisation. Les fichiers de commandes peuvent également être invoqués ultérieurement dans une session PRET via la commande load.
--log filename écrit une copie du flux de données brutes envoyé à l'imprimante dans un fichier. Cela peut être utile pour construire un fichier de travail d'impression malveillant qui peut être déployé sur une autre imprimante non directement accessible, par exemple en l'imprimant depuis une clé USB.
Après vous être connecté à un périphérique d'imprimante, vous verrez le shell PRET et pourrez exécuter diverses commandes :
$ ./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
Une liste des commandes PRET génériques est donnée ci-dessous :
help Lister les commandes disponibles ou obtenir de l'aide détaillée avec 'help cmd'.
debug Entrer en mode débogage. Utiliser 'hex' pour hexdump : debug [hex]
load Exécuter les commandes depuis un fichier : load cmd.txt
loop Exécuter une commande pour plusieurs arguments : loop <cmd> <arg1> <arg2> …
open Se connecter à un périphérique distant : open <cible>
close Se déconnecter du périphérique.
timeout Définir le délai d'attente de connexion : timeout <secondes>
discover Découvrir les périphériques d'imprimante locaux via SNMP.
print Imprimer un fichier image ou du texte brut : print <fichier>|"texte"
site Exécuter une commande personnalisée sur l'imprimante : site <commande>
exit Quitter l'interpréteur.
Les opérations génériques sur le système de fichiers avec une implémentation spécifique PS/PJL/PCL sont :
┌───────────┬─────┬─────┬─────┬────────────────────────────────────────┐
│ Commande │ PS │ PJL │ PCL │ Description │
├───────────┼─────┼─────┼─────┼────────────────────────────────────────┤
│ ls │ ✓ │ ✓ │ ✓ │ Lister le contenu d'un répertoire distant. │
│ get │ ✓ │ ✓ │ ✓ │ Recevoir un fichier : get <fichier> │
│ put │ ✓ │ ✓ │ ✓ │ Envoyer un fichier : put <fichier local> │
│ append │ ✓ │ ✓ │ │ Ajouter à un fichier : append <fichier> <chaîne> │
│ delete │ ✓ │ ✓ │ ✓ │ Supprimer un fichier distant : delete <fichier> │
│ rename │ ✓ │ │ │ Renommer un fichier distant : rename <ancien> <nouveau> │
│ find │ ✓ │ ✓ │ │ Lister récursivement le contenu d'un répertoire. │
│ mirror │ ✓ │ ✓ │ │ Miroiter le système de fichiers distant vers un répertoire local. │
│ cat │ ✓ │ ✓ │ ✓ │ Afficher un fichier distant sur stdout. │
│ edit │ ✓ │ ✓ │ ✓ │ Éditer des fichiers distants avec vim. │
│ touch │ ✓ │ ✓ │ │ Mettre à jour les horodatages des fichiers : touch <fichier> │
│ mkdir │ ✓ │ ✓ │ │ Créer un répertoire distant : mkdir <chemin> │
├───────────┼─────┼─────┼─────┼────────────────────────────────────────┤
│ cd │ ✓ │ ✓ │ │ Changer de répertoire de travail distant. │
│ pwd │ ✓ │ ✓ │ │ Afficher le répertoire de travail sur l'appareil. │
│ chvol │ ✓ │ ✓ │ │ Changer de volume distant : chvol <volume> │
│ traversal │ ✓ │ ✓ │ │ Définir le chemin de traversée : traversal <chemin> │
├───────────┼─────┼─────┼─────┼────────────────────────────────────────┤
│ format │ ✓ │ ✓ │ │ Initialiser le système de fichiers de l'imprimante. │
│ fuzz │ ✓ │ ✓ │ │ Fuzzing du système de fichiers : fuzz <catégorie> │
├─ ─ ─ ─ ─ ─┴─ ─ ─┴─ ─ ─┴─ ─ ─┴─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─┤
│ chemin - Explorer la structure du système de fichiers avec des stratégies de traversée de chemin. │
│ écriture - D'abord mettre/ajouter un fichier, puis vérifier son existence. │
│ aveugle - Tests en lecture seule pour les fichiers existants comme /etc/passwd. │
├───────────┬─────┬─────┬─────┬────────────────────────────────────────┤
│ df │ ✓ │ ✓ │ │ Afficher les informations de volume. │
│ free │ ✓ │ ✓ │ ✓ │ Afficher la mémoire disponible. │
└───────────┴─────┴─────┴─────┴────────────────────────────────────────┘
id Afficher les informations du périphérique.
version Afficher la version de l'interpréteur PostScript.
devices Afficher les périphériques d'E/S disponibles.
uptime Afficher la durée de fonctionnement du système (peut être aléatoire).
date Afficher la date et l'heure système de l'imprimante.
pagecount Afficher le compteur de pages de l'imprimante.
lock Définir le mot de passe des paramètres startjob et système.
unlock Supprimer le mot de passe des paramètres startjob et système.
restart Redémarrer l'interpréteur PostScript.
reset Réinitialiser les paramètres PostScript aux valeurs d'usine.
disable Désactiver la fonctionnalité d'impression.
destroy Causer des dommages physiques à la NVRAM de l'imprimante.
hang Exécuter une boucle infinie PostScript.
overlay Mettre un fichier eps en superposition sur toutes les copies papier : overlay <fichier.eps>
cross Mettre un graffiti d'imprimante sur toutes les copies papier : cross <police> <texte>
replace Remplacer une chaîne dans les documents à imprimer : replace <ancien> <nouveau>
capture Capturer les travaux supplémentaires à imprimer sur ce périphérique.
hold Activer la rétention des travaux.
set Définir une clé à une valeur dans le dictionnaire le plus haut : set <clé=valeur>
known Lister les opérateurs PostScript pris en charge : known <opérateur>
search Rechercher dans tous les dictionnaires par clé : search <clé>
dicts Retourner une liste des dictionnaires et de leurs permissions.
resource Lister ou vider une ressource PostScript : resource <catégorie> [dump]
dump Vider un dictionnaire : dump <dict>
Dictionnaires : - systemdict - statusdict - userdict
- globaldict - serverdict - errordict
- internaldict - currentsystemparams
- currentuserparams - currentpagedevice
config Modifier les paramètres de l'imprimante : config <paramètre>
duplex - Définir l'impression recto-verso.
copies # - Définir le nombre de copies.
economode - Définir le mode économique.
negative - Définir l'impression négative.
mirror - Définir l'inversion miroir.
Toutes les commandes ne sont pas supportées par toutes les imprimantes. Notamment les appareils Brother et Kyocera utilisent leurs propres clones PostScript – Br-Script et KPDL – au lieu de licencier l'« Adobe PostScript » original. Ces variantes du langage PostScript peuvent ne pas être 100 % compatibles, surtout en ce qui concerne les fonctionnalités sensibles à la sécurité comme la capture de travaux d'impression. L'accès au système de fichiers est supporté par la plupart des imprimantes, mais généralement limité à un certain répertoire cloisonné.
id Afficher les informations du périphérique.
status Activer les messages d'état.
version Afficher la version du firmware ou le numéro de série (depuis 'info config').
pagecount Manipuler le compteur de pages de l'imprimante : pagecount <nombre>
printenv Afficher une variable d'environnement de l'imprimante : printenv <VAR>
env Afficher les variables d'environnement (alias pour 'info variables').
set Définir une variable d'environnement de l'imprimante : set <VAR=VALEUR>
display Définir le message d'affichage de l'imprimante : display <message>
offline Mettre l'imprimante hors ligne et afficher un message : offline <message>
restart Redémarrer l'imprimante.
reset Réinitialiser aux valeurs d'usine.
selftest Effectuer divers auto-tests de l'imprimante.
disable Désactiver la fonctionnalité d'impression.
destroy Causer des dommages physiques à la NVRAM de l'imprimante.
flood Inonder l'entrée utilisateur, peut révéler des débordements de tampon.
lock Verrouiller les paramètres du panneau de contrôle et l'accès en écriture au disque.
unlock Déverrouiller les paramètres du panneau de contrôle et l'accès en écriture au disque.
hold Activer la rétention des travaux.
nvram Opérations NVRAM : nvram <opération>
nvram dump [all] - Vider (toute) la NVRAM dans un fichier local.
nvram read addr - Lire un seul octet à une adresse.
nvram write addr value - Écrire un seul octet à une adresse.
info Afficher des informations : info <catégorie>
info config - Fournit des informations de configuration.
info filesys - Retourne les informations du système de fichiers PJL.
info id - Fournit le numéro de modèle de l'imprimante.
info memory - Identifie la quantité de mémoire disponible.
info pagecount - Retourne le nombre de pages imprimées.
info status - Fournit le statut actuel de l'imprimante.
info ustatus - Liste les variables de statut non sollicitées.
info variables - Liste les variables d'environnement de l'imprimante.
Certaines commandes sont supportées exclusivement par les imprimantes HP, car d'autres fabricants n'ont implémenté qu'un sous-ensemble du standard PJL. C'est particulièrement vrai pour les commandes basées sur PML comme restart ou reset. L'activation de la rétention à long terme des travaux via la commande hold semble n'être possible que pour certains appareils Epson. L'accès à la NVRAM via la commande nvram est une fonctionnalité propriétaire des imprimantes Brother. Un accès limité au système de fichiers est supporté par divers appareils HP, OKI, Konica, Xerox, Epson et Ricoh.
selftest Effectuer un auto-test de l'imprimante.
info Afficher des informations : info <catégorie>
info fonts - Afficher les polices installées.
info macros - Afficher les macros installées.
info patterns - Afficher les motifs définis par l'utilisateur.
info symbols - Afficher les jeux de symboles.
info extended - Afficher les polices étendues.
PCL est un langage de description de page très limité sans accès au système de fichiers. Les commandes get/put/ls utilisent donc un système de fichiers virtuel basé sur des macros PCL, implémenté principalement pour la valeur de piratage. Cette preuve de concept montre que même un appareil qui ne supporte que des langages minimalistes comme PCL peut être utilisé pour stocker des fichiers arbitraires comme du matériel portant atteinte aux droits d'auteur. Bien qu'un tel service de partage de fichiers ne soit pas une vulnérabilité de sécurité en soi, il pourrait être considéré comme un « détournement de service » selon la politique de l'entreprise.
pret.py - Programme principal exécutablecapabilities.py - Routines pour vérifier le support du langage d'imprimantediscovery.py - Routines pour lister les imprimantes via diffusion SNMPprinter.py - Code générique pour décrire un périphérique d'impressionpostscript.py - Code spécifique PS (hérite de la classe printer)pjl.py - Code spécifique PJL (hérite de la classe printer)pcl.py - Code spécifique PCL (hérite de la classe printer)helper.py - Fonctions d'aide pour la sortie, la journalisation, les sockets, etc.codebook.py - Table statique des codes d'état/erreur PJLfuzzer.py - Constantes pour le fuzzing du système de fichiersmibs/* - MIBs SNMP spécifiques à l'imprimantedb/* - Base de données des modèles supportésÉtant donné les fonctionnalités et les diverses extensions propriétaires dans les langages d'impression comme PostScript et PJL, mener un pentest sur des imprimantes n'est pas un travail trivial. PRET peut aider à assister et à vérifier les problèmes connus dans le langage. Une fois que vous avez joué avec l'outil, vous voudrez peut-être effectuer une analyse de sécurité systématique des imprimantes. Un bon point de départ est le Aide-mémoire pour les tests de sécurité des imprimantes.
Bon hacking !
lpd/* - Scripts pour le fuzzing LPD