- Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
- **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
- **Partagez vos astuces de piratage en soumettant des PR au [repo hacktricks](https://github.com/carlospolop/hacktricks) et au [repo hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
Veuillez noter que **la plupart du contenu de toutes les informations relatives au Pentesting Printers** ont été prises **à partir de la recherche énorme et incroyable** que vous pouvez trouver sur [**http://hacking-printers.net/**](http://hacking-printers.net). J'ai essayé de **résumer** ces informations ici, mais vous pouvez toujours **aller à la source pour en savoir plus sur le sujet**.
L'envoi de données à un périphérique d'imprimante peut être effectué par un câble **USB/parallèle** ou sur un **réseau**. Ce wiki se concentre sur l'impression en réseau, mais la plupart des attaques présentées peuvent également être effectuées contre des imprimantes locales. Il existe divers protocoles exotiques pour l'impression en réseau, tels que le [_NCP_](https://en.wikipedia.org/wiki/NetWare_Core_Protocol) de Novell ou [_AppleTalk_](https://en.wikipedia.org/wiki/AppleTalk). Dans le monde Windows, les partages d'imprimantes _SMB/CIFS_ sont devenus assez populaires. De plus, certains périphériques prennent en charge l'impression sur des protocoles génériques tels que les téléchargements de fichiers _FTP_ ou _HTTP_. Cependant, les protocoles d'impression réseau les plus courants pris en charge directement par les imprimantes réseau sont l'_**LPD**_**, \_IPP**_\*\*, et \*\*_**le port brut 9100** \_ impression. Les protocoles d'impression réseau peuvent être attaqués directement, par exemple en exploitant un débordement de tampon dans le démon LPD de l'imprimante. Dans de nombreux scénarios d'attaque, cependant, ils ne servent que de **support/canal** pour **déployer un code de langage d'imprimante malveillant**. Notez qu'une **imprimante réseau prend généralement en charge plusieurs protocoles pour "imprimer"** un document, ce qui élargit la surface d'attaque.
Un langage de contrôle de tâche gère des paramètres tels que les bacs de sortie pour la tâche d'impression en cours. Bien qu'il se situe généralement en tant que couche facultative entre le protocole d'impression et le langage de description de page, les fonctions peuvent se chevaucher. Des exemples de langages de contrôle de tâches spécifiques au fournisseur sont [CPCA](http://www.undocprint.org/formats/printer\_control\_languages/cpca), [XJCL](http://www.undocprint.org/formats/printer\_control\_languages/xjcl), [EJL](http://www.undocprint.org/formats/printer\_control\_languages/ejl) et **PJL** - qui est pris en charge par une variété d'imprimantes et sera discuté ci-dessous. De plus, les **langages de contrôle et de gestion d'imprimante** sont conçus pour **affecter** non seulement une seule tâche d'impression, mais l'ensemble du **dispositif**. Une approche pour définir une norme commune pour cette tâche était [NPAP](http://www.undocprint.org/formats/printer\_control\_languages/npap). Cependant, il ne s'est pas établi et n'est pris en charge que par Lexmark. D'autres fabricants d'imprimantes utilisent plutôt SNMP ou son métalangage **PML** basé sur PJL.
Le langage de tâche d'impression (PJL) a été introduit à l'origine par HP, mais est rapidement devenu une norme de facto pour le contrôle des tâches d'impression. « PJL réside au-dessus des autres langages d'imprimante » et peut être utilisé pour changer des paramètres tels que le bac à papier ou la taille. Il convient toutefois de souligner que **PJL n'est pas limité à la tâche d'impression en cours car certains paramètres peuvent être rendus permanents**. PJL peut également être utilisé pour **changer l'affichage de l'imprimante ou lire/écrire des fichiers sur le périphérique**. Il existe de nombreux dialectes car les fournisseurs ont tendance à ne prendre en charge qu'un sous-ensemble des commandes répertoriées dans la référence PJL et préfèrent ajouter des commandes propriétaires. **PJL est également utilisé pour définir le format de fichier des données d'impression réelles à suivre**. Sans un tel changement de langage explicite, l'imprimante doit identifier le langage de description de page en fonction des nombres magiques. Les commandes PJL typiques pour définir la taille du papier et le nombre de copies avant de passer l'interpréteur en mode PostScript sont présentées ci-dessous :
Le **Printer Management Language** (PML) est un langage propriétaire pour contrôler les **imprimantes HP**. Il **combine** essentiellement les fonctionnalités de **SNMP****avec PJL**. La documentation publiquement disponible n'a pas été publiée, mais des parties de la norme ont été divulguées par le projet [LPRng](https://en.wikipedia.org/wiki/LPRng) : le **Guide de l'utilisateur PJL Passthrough to PML and SNMP** définit PML comme un "protocole de gestion d'imprimante à requête-réponse orienté objet" et donne une introduction aux bases de la syntaxe. PML est intégré dans PJL et **peut être utilisé pour lire et définir des valeurs SNMP sur un périphérique d'impression**. Cela est particulièrement **intéressant** si un **pare-feu bloque** l'accès aux services **SNMP** (161/udp). L'utilisation de PML dans une tâche d'impression récupérant la valeur `hrDeviceDescr` (OID 1.3.6.1.2.1.25.3.2.1.3, description textuelle d'un périphérique) est démontrée ci-dessous :
La partie arrière de la chaîne de caractères renvoyée par l'imprimante, `6870204c617365724a65742034323530`, est l'hexadécimal pour `hp LaserJet 4250`. Comme on peut le voir, il est possible d'**invoquer** (un sous-ensemble de) **commandes SNMP via PJL via PML**. Une utilisation sensible à la sécurité de PML est de [réinitialiser les imprimantes HP aux paramètres d'usine](./#factory-defaults) via des travaux d'impression ordinaires, supprimant ainsi les mécanismes de protection tels que les mots de passe définis par l'utilisateur.
Le langage de sortie universel (UEL) n'est en fait **pas un véritable "langage" de contrôle de tâches, mais une seule commande utilisée pour terminer le flux de données actuel** : le caractère d'échappement (`\x1b`), suivi de `%-12345X`. Il a été initialement introduit avec le PCL de HP et est **pris en charge par la plupart des imprimantes laser modernes**. Une bonne pratique des "pilotes d'imprimante" est d'invoquer l'UEL au début et à la fin de chaque travail d'impression, de sorte que l'interprétation du langage de l'imprimante soit arrêtée/redémarrée et que chaque travail ait son propre environnement distinct, comme indiqué ci-dessous :
Sinon, par exemple, les paramètres PJL tels que la taille des supports papier ou les définitions PostScript définies dans un travail d'impression influenceraient le travail suivant. **UEL peut être pratique pour enchaîner plusieurs travaux en un seul fichier/datastream envoyé à l'imprimante**. Cela peut être utilisé pour tromper les **compteurs de pages matériels** ou pour passer à un autre langage d'impression dans le cadre d'**attaques d'impression entre sites**.
Un **langage de description de page** (PDL) spécifie l'**apparence du document réel**. Il convient toutefois de souligner que certains PDL offrent un contrôle de travail limité, de sorte qu'**une démarcation claire entre la description de page et le langage de contrôle d'imprimante/travail n'est pas toujours possible**. La fonction d'un "pilote d'imprimante" est de **traduire** le **fichier** à **imprimer** en un **PDL** compris par le modèle d'imprimante. Notez que certaines imprimantes jet d'encre bon marché ne prennent en charge aucun langage de description de page de haut niveau. Les imprimantes dites basées sur l'hôte ou [GDI](https://en.wikipedia.org/wiki/Graphics\_Device\_Interface#GDI\_printers) n'acceptent que des flux de données bitmap simples tels que [ZJS](http://www.undocprint.org/formats/page\_description\_languages/zjstream) tandis que le rendu réel est effectué par le pilote d'imprimante. Il existe différents langages de description de page propriétaires tels que [PRESCRIBE](http://www.undocprint.org/formats/page\_description\_languages/prescribe) de Kyocera, [SPL](http://www.undocprint.org/formats/page\_description\_languages/spl), [XES](http://www.undocprint.org/formats/page\_description\_languages/xes), [CaPSL](http://www.undocprint.org/formats/page\_description\_languages/capsl), [RPCS](http://www.undocprint.org/formats/page\_description\_languages/rpcs), [ESC/P](https://en.wikipedia.org/wiki/ESC/P) qui est principalement utilisé dans les imprimantes à matrice de points ou [HP-GL](https://en.wikipedia.org/wiki/HPGL) et [HP-GL/2](https://en.wikipedia.org/wiki/HPGL#HP-GL.2F2) qui ont été conçus pour les traceurs. La prise en charge de l'impression directe de [PDF](https://en.wikipedia.org/wiki/Portable\_Document\_Format) et de [XPS](https://en.wikipedia.org/wiki/Open\_XML\_Paper\_Specification) est également courante sur les imprimantes plus récentes. **Les langages de description de page les plus courants sont cependant PostScript et PCL.**
Le terme "description de page" peut être trompeur, car **PostScript est capable de bien plus que de simplement créer des graphiques vectoriels**. PostScript est un langage de programmation complet de type Turing basé sur une pile, composé de près de 400 opérateurs pour la manipulation arithmétique, de la pile et des graphiques, et de divers types de données tels que des tableaux ou des dictionnaires, et a été créé par Adobe.\
Techniquement parlant, l'accès à un interpréteur PostScript peut déjà être classé comme une **exécution de code** car toute fonction algorithmique peut théoriquement être implémentée en PostScript. Certes, sans accès à la pile réseau ou à des bibliothèques de système d'exploitation supplémentaires, les possibilités sont limitées aux calculs mathématiques arbitraires tels que l'extraction de bitcoins. Cependant, PostScript est capable d'une entrée/sortie de système de fichiers de base pour stocker des fichiers de code, de graphiques ou de polices fréquemment utilisés.\
À l'origine conçue comme une fonctionnalité, les dangers d'une telle fonctionnalité **étaient limités** avant que les imprimantes ne soient interconnectées et que les risques ne soient principalement discutés dans le contexte des interpréteurs PostScript basés sur l'hôte. À cet égard, Encapsulated PostScript (EPS) est également remarquable car il peut être inclus dans d'autres formats de fichier à interpréter sur l'hôte tels que les documents [LaTeX](https://en.wikipedia.org/wiki/LaTeX). Comme **PJL** et **PCL**, **PostScript** prend en charge une **communication bidirectionnelle** entre l'hôte et l'imprimante.\
Un exemple de code PostScript pour afficher "Hello world" sur stdout est donné ci-dessous:
Brother et Kyocera utilisent leurs propres clones de PostScript : **Br-Script** et **KPDL**. Ces versions du langage PostScript ne sont pas compatibles à 100 %, en particulier en ce qui concerne les fonctionnalités de sécurité telles que la sortie de la boucle du serveur. PostScript peut être utilisé pour une variété d'attaques telles que le [déni de service](http://hacking-printers.net/wiki/index.php/Denial\_of\_service) (par exemple, à travers des boucles infinies), la [manipulation](http://hacking-printers.net/wiki/index.php/Print\_job\_manipulation) et la [rétention](http://hacking-printers.net/wiki/index.php/Print\_job\_retention) des travaux d'impression ainsi que l'accès au [système de fichiers](http://hacking-printers.net/wiki/index.php/File\_system\_access) de l'imprimante.
Normalement, chaque travail d'impression est encapsulé dans son propre environnement séparé. Une fonctionnalité intéressante de **PostScript** est qu'un programme **peut contourner l'encapsulation du travail d'impression** et modifier la VM initiale pour les travaux ultérieurs. Pour ce faire, il peut utiliser soit startjob, une fonctionnalité de niveau 2 :
Cette capacité est contrôlée par StartJobPassword qui est par défaut à `0` (comparer la divulgation d'informations d'identification). Étant donné que la boucle du serveur de tâches est généralement responsable du nettoyage de l'état de l'interpréteur entre les tâches, **toutes les modifications apportées en dehors de la boucle du serveur resteront comme faisant partie de l'état permanent de l'interpréteur pour toutes les tâches ultérieures**. En d'autres termes, une tâche d'impression peut accéder et modifier d'autres tâches. Bingo !
Lorsqu'un document **PostScript****appelle** un **opérateur**, la **première version trouvée** sur la pile de dictionnaires est utilisée. Les opérateurs résident généralement dans le dictionnaire systemdict, cependant, en plaçant une nouvelle version dans le dictionnaire userdict, les opérateurs peuvent être pratiquement écrasés car **la version définie par l'utilisateur est la première trouvée sur la pile de dictionnaires**. En utilisant les opérateurs startjob/exitserver, de tels changements peuvent être rendus permanents - du moins jusqu'à ce que l'imprimante soit redémarrée. Un schéma de la pile de dictionnaires PostScript est donné ci-dessous :
[![La pile de dictionnaires PostScript](http://hacking-printers.net/wiki/images/thumb/f/ff/Dictstack.png/300px-Dictstack.png)](http://hacking-printers.net/wiki/index.php/File:Dictstack.png)
L'**impact potentiel de la redéfinition des opérateurs** est limité uniquement par la créativité. Lorsque d'autres documents légitimes sont imprimés et appellent un opérateur redéfini, la version de l'attaquant sera exécutée. Cela peut conduire à diverses attaques telles que le [déni de service](http://hacking-printers.net/wiki/index.php/Document\_processing#Showpage\_redefinition), la [rétention](http://hacking-printers.net/wiki/index.php/Print\_job\_retention) et la [manipulation](http://hacking-printers.net/wiki/index.php/Print\_job\_manipulation) de tâches d'impression. Notez cependant que ce n'est pas nécessairement un bogue de sécurité, mais une fonctionnalité de langage vieille de 32 ans, disponible dans presque toutes les imprimantes PostScript et [RIP](https://en.wikipedia.org/wiki/Raster\_image\_processor).
PCL 3 et PCL 4 ont ajouté la prise en charge de polices et de macros qui peuvent toutes deux être téléchargées de manière permanente sur le périphérique - cependant, uniquement référencées par un identifiant numérique, pas par un nom de fichier, car **l'accès direct au système de fichiers n'est pas prévu**. PCL 1 à 5 se composent de séquences d'échappement suivies d'un ou plusieurs caractères ASCII représentant une commande à interpréter. PCL 6 Enhanced ou « PCL XL » utilise un protocole orienté objet codé en binaire. Un **exemple de document PCL pour imprimer « Bonjour tout le monde » est donné ci-dessous** :
En raison de ses capacités limitées, PCL est difficile à exploiter d'un point de vue de sécurité à moins de découvrir des commandes propriétaires intéressantes dans la version PCL de certains fabricants d'imprimantes. L'outil PRET implémente un système de fichiers virtuel basé sur PCL qui utilise des macros pour enregistrer le contenu des fichiers et les métadonnées dans la mémoire de l'imprimante. Cette astuce montre qu'un périphérique qui ne prend en charge que des langages de description de page minimalistes comme PCL peut être utilisé pour stocker des fichiers arbitraires tels que du matériel enfreignant les droits d'auteur. Bien que transformer une imprimante en service de partage de fichiers ne soit pas une vulnérabilité de sécurité en soi, cela peut être considéré comme une « mauvaise utilisation du service » en fonction de la politique de l'entreprise.
Les données peuvent être envoyées à une imprimante locale et reçues d'elle par des câbles [USB](https://en.wikipedia.org/wiki/USB) ou [parallèles](https://en.wikipedia.org/wiki/IEEE\_1284). Les deux canaux sont pris en charge par PRET pour communiquer avec le périphérique. De plus, les imprimantes et les MFP sont souvent livrés avec des ports USB de type A qui permettent aux utilisateurs d'imprimer directement à partir d'un périphérique USB.\
Bien que les clés USB branchées ne proposent pas de canal bidirectionnel, leur utilisation dans une salle de copie bondée peut sembler moins suspecte. Évidemment, l'exploitation d'imprimantes USB nécessite que l'attaquant ait un accès physique au périphérique. Cependant, cela n'est pas complètement irréaliste pour la plupart des institutions et des entreprises. L'accès physique à l'imprimante peut généralement être considéré comme moins difficile que pour d'autres composants réseau tels que les serveurs ou les postes de travail.
En abusant de la demande web client, un attaquant peut abuser des imprimantes arbitraires à l'intérieur du réseau interne du client connecté à sa page web malveillante.\
[**Apprenez comment cela est possible ici.**](cross-site-printing.md)
Si vous trouvez un service Spool en écoute à l'intérieur du domaine, vous pourriez être en mesure de l'abuser pour obtenir de nouvelles informations d'identification et escalader les privilèges.\
[**Plus d'informations sur la façon de trouver et d'abuser des services Spooler ici.**](../../windows-hardening/active-directory-methodology/printers-spooler-service-abuse.md)
Il existe plusieurs façons possibles de réinitialiser un périphérique aux paramètres d'usine, et il s'agit d'une fonctionnalité critique pour la sécurité car elle écrase les mécanismes de protection tels que les mots de passe définis par l'utilisateur.\
Vous pourriez être en mesure d'usurper l'identité d'utilisateurs existants ou inexistants pour imprimer des pages en utilisant leurs comptes ou manipuler le compteur matériel ou logiciel pour pouvoir imprimer plus de pages.\
[**Apprenez comment le faire ici.**](accounting-bypass.md)
En accédant aux fonctionnalités de scanner ou de fax, vous pourriez être en mesure d'accéder à d'autres fonctionnalités, mais tout cela dépend du fournisseur.\
Les travaux peuvent être conservés en mémoire et être imprimés à nouveau à un moment ultérieur à partir du panneau de commande, ou en utilisant PostScript, vous pouvez même accéder à distance à tous les travaux qui vont être imprimés, les télécharger et les imprimer.\
Vous pouvez ajouter de nouveaux contenus aux pages qui sont imprimées, changer tout le contenu qui va être imprimé ou même remplacer certaines lettres ou certains mots.\
[**Apprenez comment le faire ici.**](print-job-manipulation.md)
Vous pourriez être en mesure de divulguer le mot de passe en abusant des paramètres SNMP ou LDAP ou vous pourriez essayer de forcer PJL ou PostScript.\
[**Lisez comment faire ici.**](credentials-disclosure-brute-force.md)
Les fournisseurs d'imprimantes ont commencé à introduire la possibilité d'installer des logiciels personnalisés sur leurs appareils, mais les informations ne sont pas disponibles publiquement. La fonctionnalité d'écriture de logiciels personnalisés qui s'exécutent sur les imprimantes était destinée et est réservée aux revendeurs et aux entrepreneurs.\
[**En savoir plus à ce sujet ici.**](software-packages.md)
Vous pouvez utiliser PostScript et PJL pour effectuer des boucles infinies, redéfinir des commandes pour éviter toute impression, désactiver toute fonctionnalité d'impression ou même mettre l'imprimante en mode hors ligne.\
[**En savoir plus à ce sujet ici.**](document-processing.md)
On pourrait abuser de PJL ou de PostScript pour écrire dans la NVRAM des centaines de milliers de fois dans le but de casser la puce ou du moins de faire geler les paramètres dans les paramètres par défaut d'usine.\
[**En savoir plus à ce sujet ici.**](physical-damage.md)
- Travaillez-vous dans une entreprise de cybersécurité ? Voulez-vous voir votre entreprise annoncée dans HackTricks ? ou voulez-vous avoir accès à la dernière version de PEASS ou télécharger HackTricks en PDF ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
- **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3