.. | ||
accounting-bypass.md | ||
buffer-overflows.md | ||
credentials-disclosure-brute-force.md | ||
cross-site-printing.md | ||
document-processing.md | ||
factory-defaults.md | ||
file-system-access.md | ||
firmware-updates.md | ||
memory-access.md | ||
physical-damage.md | ||
print-job-manipulation.md | ||
print-job-retention.md | ||
README.md | ||
scanner-and-fax.md | ||
software-packages.md | ||
transmission-channel.md |
Pentesting Imprimantes
Apprenez le piratage AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!
Autres moyens de soutenir HackTricks :
- Si vous souhaitez voir votre entreprise annoncée dans HackTricks ou télécharger HackTricks en PDF, consultez les PLANS D'ABONNEMENT !
- Obtenez le merchandising officiel PEASS & HackTricks
- Découvrez La Famille PEASS, notre collection d'NFTs exclusifs
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez moi sur Twitter 🐦 @carlospolopm.
- Partagez vos astuces de piratage en soumettant des PR aux dépôts github HackTricks et HackTricks Cloud.
Veuillez noter que la plupart du contenu de toutes les informations liées au _Pentesting des Imprimantes_** ** a été prise depuis la vaste et incroyable recherche 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 apprendre davantage sur le sujet.
Fondamentaux
Une relation schématique concernant l'encapsulation des langages d'imprimantes est donnée ci-dessous :\
Protocoles d'impression réseau
Envoyer des données à un périphérique d'impression peut se faire par câble USB/parallèle ou via un réseau. Ce wiki se concentre sur l'impression réseau, mais la plupart des attaques présentées peuvent également être réalisées contre des imprimantes locales. Il existe divers protocoles exotiques pour l'impression en réseau comme le NCP de Novell ou AppleTalk. Dans le monde Windows, les partages d'imprimantes SMB/CIFS sont devenus assez populaires. De plus, certains appareils prennent en charge l'impression via des protocoles génériques tels que les téléchargements de fichiers FTP ou HTTP. Les protocoles d'impression les plus courants pris en charge directement par les imprimantes réseau sont cependant LPD, IPP et l'impression sur port brut 9100. Les protocoles d'impression réseau peuvent être attaqués directement, par exemple en exploitant un dépassement de tampon dans le démon LPD de l'imprimante. Cependant, dans de nombreux scénarios d'attaque, ils ne servent que de canal/support pour déployer du code malveillant de langage d'imprimante. 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'Imprimantes
Un langage de contrôle de travaux gère des paramètres comme les bacs de sortie pour le travail d'impression en cours. Bien qu'il se situe généralement comme une couche optionnelle 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 travaux spécifiques aux fournisseurs 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'imprimantes sont conçus pour affecter non seulement un seul travail d'impression mais l'appareil dans son ensemble. Une approche pour définir une norme commune pour cette tâche était NPAP. Cependant, il ne s'est pas imposé et est uniquement pris en charge par Lexmark. D'autres fabricants d'imprimantes utilisent plutôt SNMP ou son métalangage basé sur PJL PML.
PJL
Le Printer Job Language (PJL) a été initialement introduit par HP mais est rapidement devenu un standard de facto pour le contrôle des travaux d'impression. ‘PJL se situe au-dessus des autres langages d'imprimantes’ et peut être utilisé pour changer des paramètres comme le bac à papier ou la taille. Il faut cependant souligner que PJL n'est pas limité au travail 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 l'appareil. 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 les leurs propriétaires. PJL est en outre 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 de nombres magiques. Des commandes PJL typiques pour définir la taille du papier et le nombre de copies avant de passer en mode interpréteur PostScript sont montré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. Aucune documentation publique n'a été diffusée, cependant, des parties de la norme ont été divulguées par le projet LPRng : le PJL Passthrough to PML and SNMP User’s Guide définit le PML comme 'un protocole de gestion d'imprimante orienté objet de type requête-réponse' et fournit une introduction aux bases de la syntaxe. Le PML est intégré au sein du PJL et peut être utilisé pour lire et définir les 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 du PML dans un travail d'impression pour récupérer la valeur hrDeviceDescr
(OID 1.3.6.1.2.1.25.3.2.1.3, description textuelle d'un dispositif) est démontrée ci-dessous :
> @PJL DMINFO ASCIIHEX="000006030302010301"
< "8000000603030201030114106870204c617365724a65742034323530
UEL
Le langage de sortie universel (UEL) n'est en réalité pas un véritable langage de contrôle de travaux mais une commande unique 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' consiste à 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 dispose de son propre environnement séparé, comme illustré ci-dessous :
\x1b%-12345X
@PJL SET PAPER=A4
@PJL ENTER LANGUAGE=PCL
...
[PCL datastream]
...
\x1b%-12345X
Sinon, par exemple, les paramètres PJL comme la taille du papier ou les définitions PostScript définies dans une tâche d'impression influenceraient la tâche suivante. UEL peut être pratique pour enchaîner plusieurs tâches en un seul fichier/flot de données envoyé à l'imprimante. Cela peut être utilisé pour tromper les compteurs de pages matériels ou pour changer le langage d'impression dans des attaques de cross-site printing avancées.
Langages de Description de Page
Un langage de description de page (PDL) spécifie l'apparence du document réel. Il faut cependant noter que certains PDL offrent un contrôle limité des tâches, donc une démarcation claire entre la description de page et le langage de contrôle de l'imprimante/de la tâche n'est pas toujours possible. La fonction d'un « pilote d'imprimante » est de traduire le fichier à imprimer en un PDL qui est compris par le modèle d'imprimante. Notez que certaines imprimantes à jet d'encre à bas coût ne prennent pas en charge de 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 comme ZJS tandis que le rendu réel est effectué par le pilote d'imprimante. Il existe divers langages de description de page propriétaires comme PRESCRIBE de Kyocera, SPL, XES, CaPSL, RPCS, ESC/P qui est principalement utilisé dans les imprimantes matricielles ou HP-GL et HP-GL/2 qui ont été conçus pour les traceurs. La prise en charge directe de l'impression PDF et XPS est également courante sur les imprimantes plus récentes. Cependant, les langages de description de page ‘standard’ les plus courants sont 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 basé sur une pile, Turing-complet, composé de près de 400 opérateurs pour les arithmétiques, la manipulation de pile et de graphiques et divers types de données tels que les tableaux ou les dictionnaires et a été créé par Adobe.
Techniquement parlant, l'accès à un interpréteur PostScript peut déjà être classé comme exécution de code car toute fonction algorithmique peut théoriquement être mise en œuvre en PostScript. Certes, sans accès à la pile réseau ou aux bibliothèques supplémentaires du système d'exploitation, les possibilités se limitent à des calculs mathématiques arbitraires comme le minage de bitcoins. Cependant, PostScript est capable d'entrées/sorties de base sur le système de fichiers pour stocker du code, des graphiques ou des fichiers de polices fréquemment utilisés.
À l'origine conçues comme une fonctionnalité, les dangers d'une telle fonctionnalité étaient limités avant que les imprimantes ne soient interconnectées et les risques étaient principalement discutés dans le contexte des interpréteurs PostScript basés sur l'hôte. À cet égard, l'Encapsulated PostScript (EPS) est également notable car il peut être inclus dans d'autres formats de fichiers pour être interprété sur l'hôte, comme les documents LaTeX. Comme PJL et PCL, PostScript prend en charge la communication bidirectionnelle entre l'hôte et l'imprimante.
Un exemple de code PostScript pour écho Hello world à stdout est donné ci-dessous :
%!
(Hello world) print
Brother et Kyocera utilisent leurs propres clones de PostScript : Br-Script et KPDL. Ces variantes du langage PostScript ne sont pas 100 % compatibles, 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 denial of service (par exemple, à travers des boucles infinies), la manipulation et la rétention de 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 caractéristique intéressante de PostScript est qu'un programme peut contourner l'encapsulation du travail d'impression et modifier la VM initiale pour les travaux subséquents. 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 le StartJobPassword qui par défaut est 0
(comparer à la divulgation de credentials). Puisque 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, tous les changements effectués en dehors de la boucle du serveur resteront comme partie de l'état permanent de l'interpréteur pour toutes les tâches subséquentes. En d'autres termes, une tâche d'impression peut accéder et modifier d'autres tâches. Bingo !
Redéfinition d'opérateur
Lorsqu'un document PostScript appelle un opérateur, la première version trouvée dans la pile de dictionnaires est utilisée. Les opérateurs résident habituellement dans le dictionnaire systemdict, cependant en plaçant une nouvelle version dans le dictionnaire userdict, les opérateurs peuvent être pratiquement réécrits car la version définie par l'utilisateur est la première trouvée dans la pile de dictionnaires. En utilisant les opérateurs startjob/exitserver, de tels changements peuvent être rendus permanents – au 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 seulement limité 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 denial of service, la rétention et la manipulation de tâches d'impression. Notez cependant que cela n'est pas nécessairement un bug 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é le support pour les polices et les macros qui peuvent toutes deux être téléchargées de manière permanente sur l'appareil – cependant seulement référencées par un identifiant numérique, et non par un nom de fichier, car l'accès direct au système de fichiers n'est pas prévu. PCL 1 à 5 consistent en des séquences d'échappement suivies par un ou plusieurs caractères ASCII représentant une commande à interpréter. PCL 6 Enhanced ou ‘PCL XL’ utilise un protocole orienté objet et encodé en binaire. Un exemple de document PCL pour imprimer ‘Hello world’ est donné ci-dessous :
<Esc>Hello world
En raison de ses capacités limitées, le PCL est difficile à exploiter d'un point de vue 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 sauvegarder le contenu et les métadonnées des fichiers dans la mémoire de l'imprimante. Ce hack montre que même un appareil qui ne prend en charge que des langages de description de page minimalistes comme le PCL peut être utilisé pour stocker des fichiers arbitraires comme du matériel violant le droit d'auteur. Bien que transformer une imprimante en service de partage de fichiers ne soit pas en soi une vulnérabilité de sécurité, cela peut être considéré comme un « mauvais usage du service » en fonction de la politique de l'entreprise.
Attaques diverses
Clé USB ou câble
Les données peuvent être envoyées et reçues d'une imprimante locale par des câbles USB ou parallèles. Les deux canaux sont pris en charge par PRET pour communiquer avec l'appareil. De plus, les imprimantes et les MFP sont souvent équipés de 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 des imprimantes USB nécessite que l'attaquant ait un accès physique à l'appareil. Cependant, cela n'est pas complètement irréaliste pour la plupart des institutions et entreprises. Obtenir un accès physique à l'imprimante peut généralement être considéré comme moins difficile que pour d'autres composants réseau comme les serveurs ou les postes de travail.
Impression inter-sites
En abusant de requêtes web client, un attaquant peut abuser d'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 à l'écoute à l'intérieur du domaine, vous pourriez être capable d'abuser de celui-ci pour obtenir de nouvelles informations d'identification et escalader les privilèges.
Plus d'informations sur comment trouver et abuser des services Spooler ici.
Élévation de privilèges
Réglages d'usine
Il existe plusieurs façons possibles de réinitialiser un appareil aux réglages d'usine, et c'est une fonctionnalité critique pour la sécurité car elle écrase les mécanismes de protection comme les mots de passe définis par l'utilisateur.
En savoir plus ici.
Contournement de comptabilité
Vous pourriez être capable 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 faire ici.
Scanner et Fax
En accédant aux fonctionnalités de Scanner ou de Fax, vous pourriez être capable d'accéder à d'autres fonctionnalités, mais tout cela dépend du fournisseur.
En savoir plus ici.
Accès aux travaux d'impression
Rétention des travaux d'impression
Les travaux peuvent être retenus en mémoire et être imprimés à nouveau à un moment ultérieur depuis le panneau de contrôle, 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 un nouveau contenu aux pages qui sont imprimées, changer tout le contenu qui va être imprimé ou même remplacer juste certaines lettres ou mots.
Apprenez comment faire ici.
Divulgation d'informations
Accès à la mémoire
Vous pourriez être capable de dumper la mémoire NVRAM et d'extraire des informations sensibles (comme des mots de passe) de là.
Lisez comment faire cela ici.
Accès au système de fichiers
Vous pourriez être capable d'accéder au système de fichiers en abusant de PJL ou de PostScript.
Lisez comment faire cela ici.
Divulgation de données d'identification/Force brute
Vous pourriez être capable de divulguer le mot de passe utilisé en abusant de SNMP ou des paramètres LDAP ou vous pourriez essayer de forcer brutalement PJL ou PostScript.
Lisez comment faire cela ici.
Exécution de code
Débordements de tampon
Plusieurs débordements de tampon ont déjà été trouvés dans les entrées PJL et dans le démon LPD, et il pourrait y en avoir d'autres.
Lisez ceci pour plus d'informations.
Mises à jour du firmware
Vous pourriez être capable de faire mettre à jour le pilote de l'imprimante par un malveillant spécialement conçu par vous.
Lisez ceci pour plus d'informations.
Paquets logiciels
Les fabricants d'imprimantes ont commencé à introduire la possibilité d'installer des logiciels personnalisés sur leurs appareils mais les informations ne sont pas publiquement disponibles. La fonctionnalité d'écrire des logiciels personnalisés qui fonctionnent sur les imprimantes était prévue et est réservée aux revendeurs et aux sous-traitants.
Lisez 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 conduire à un DoS.
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 au moins faire en sorte que les paramètres soient gelés dans ceux par défaut de l'usine.
En savoir plus à ce sujet ici.
Apprenez le hacking AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!
Autres moyens de soutenir HackTricks :
- Si vous souhaitez voir votre entreprise annoncée dans HackTricks ou télécharger HackTricks en PDF, consultez les PLANS D'ABONNEMENT!
- Obtenez le merchandising officiel PEASS & HackTricks
- Découvrez La famille PEASS, notre collection d'NFTs exclusifs
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez moi sur Twitter 🐦 @carlospolopm.
- Partagez vos astuces de hacking en soumettant des PR aux dépôts github HackTricks et HackTricks Cloud.