26 KiB
Pentesting Imprimantes
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
-
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 !
-
Découvrez The PEASS Family, notre collection exclusive de NFTs
-
Obtenez le swag officiel PEASS & HackTricks
-
Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez moi sur Twitter 🐦@carlospolopm.
-
Partagez vos astuces de piratage en soumettant des PR au repo hacktricks et au repo 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/. J'ai essayé de résumer ces informations ici, mais vous pouvez toujours aller à la source pour en savoir plus sur le sujet.
Fondamentaux
Une relation schématique concernant l'encapsulation des langages d'imprimante est donnée ci-dessous :\
Protocoles d'impression réseau
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 de Novell ou 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.
En savoir plus sur le port brut 9100 ici.
En savoir plus sur LPD dans Pentesting 515 ici.
En savoir plus sur IPP dans Pentesting 631 ici.
Langages de contrôle d'imprimante
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, XJCL, 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. 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.
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 :
@PJL SET PAPER=A4
@PJL SET COPIES=10
@PJL ENTER LANGUAGE=POSTSCRIPT
À l'intérieur de la page sur le port 9100 'raw port', vous pouvez trouver plus d'informations sur comment énumérer PJL.
PML
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 : 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 :
> @PJL DMINFO ASCIIHEX="000006030302010301"
< "8000000603030201030114106870204c617365724a65742034323530
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 via des travaux d'impression ordinaires, supprimant ainsi les mécanismes de protection tels que les mots de passe définis par l'utilisateur.
UEL
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 :
\x1b%-12345X
@PJL SET PAPER=A4
@PJL ENTER LANGUAGE=PCL
...
[PCL datastream]
...
\x1b%-12345X
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.
Langages de description de page
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 n'acceptent que des flux de données bitmap simples tels que ZJS 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 de Kyocera, SPL, XES, CaPSL, RPCS, ESC/P qui est principalement utilisé dans les imprimantes à matrice de points ou HP-GL et HP-GL/2 qui ont été conçus pour les traceurs. La prise en charge de l'impression directe de PDF et de XPS est également courante sur les imprimantes plus récentes. Les langages de description de page les plus courants sont cependant PostScript et PCL.
PostScript (PS)
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. 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:
%!
(Hello world) print
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 (par exemple, à travers des boucles infinies), la manipulation et la rétention des travaux d'impression ainsi que l'accès au système de fichiers de l'imprimante.
Sortie de la boucle du serveur
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 :
true 0 startjob
ou exitserver (disponible dans toutes les implémentations qui incluent un serveur de tâches):
serverdict begin 0 exitserver
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 !
Redéfinition de l'opérateur
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 :
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, la rétention et la 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.
PCL
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 :
<Esc>Hello world
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.
Attaques diverses
Clé USB ou câble
Les données peuvent être envoyées à une imprimante locale et reçues d'elle par des câbles USB ou parallèles. 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.
Impression en travers de site
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.
Abus du service Spooler dans AD
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.
Élévation de privilèges
Paramètres d'usine
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.
En savoir plus ici.
Contournement de la comptabilité
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.
Scanner et fax
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.
En savoir plus ici.
Accès aux travaux d'impression
Conservation des travaux d'impression
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.
En savoir plus ici.
Manipulation des travaux d'impression
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.
Divulgation d'informations
Accès à la mémoire
Vous pourriez être en mesure de vider la mémoire NVRAM et d'extraire des informations sensibles (comme les mots de passe) à partir de là.
Lisez comment faire ici.
Accès au système de fichiers
Vous pourriez être en mesure d'accéder au système de fichiers en abusant de PJL ou de PostScript.
Lisez comment faire ici.
Divulgation/Brute-Force des informations d'identification
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.
Exécution de code
Débordements de tampon
Plusieurs débordements de tampon ont déjà été trouvés dans l'entrée PJL et dans le démon LPD, et il pourrait y en avoir d'autres.
Lisez ceci pour plus d'informations.
Mises à jour du micrologiciel
Vous pourriez être en mesure de faire mettre à jour le pilote de l'imprimante par un pilote malveillant spécialement conçu par vous.
Lisez ceci pour plus d'informations.
Packages logiciels
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.
Déni de service
Canal de transmission
Occuper toutes les connexions et augmenter le délai d'attente du serveur pourrait entraîner un déni de service.
En savoir plus à ce sujet ici.
Traitement de documents
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.
Dommages physiques
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.
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
-
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 !
-
Découvrez The PEASS Family, notre collection exclusive de NFT
-
Obtenez le swag officiel PEASS & HackTricks
-
Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez moi sur Twitter [🐦](https://github.com/carlospolop/hacktricks/tree/7af18b62b3