hacktricks/network-services-pentesting/pentesting-printers/accounting-bypass.md

10 KiB
Raw Blame History

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

Autres moyens de soutenir HackTricks :

Introduction

Imprimer sans autorisation peut en soi constituer un risque de sécurité ou une violation de la politique de l'entreprise. Dans les environnements où les travaux d'impression sont facturés, un attaquant interne a une motivation pour contourner le système de comptabilité. De plus, être capable d'imprimer est une condition préalable pour la plupart des attaques contre les imprimantes réseau.

Il existe deux approches principales en matière de comptabilité des travaux d'impression : soit laisser l'imprimante gérer directement, soit utiliser un serveur d'impression intermédiaire. La première approche est spécifique au fournisseur, implique généralement une sorte de pilote d'imprimante spécial et n'est pas discutée ici. L'autre approche implique un serveur d'impression séparé généralement une implémentation logicielle comme CUPS ou LPRng pour gérer la comptabilité et est assez courante dans les entreprises et les institutions. Le serveur d'impression peut utiliser LPD, IPP ou d'autres protocoles d'impression et transfère les travaux vers l'imprimante réelle. Il est important de noter que l'accès direct au réseau de l'imprimante doit être restreint, sinon un attaquant peut facilement contourner le serveur d'impression et ses mécanismes de comptabilité. Cela signifie filtrer l'accès aux ports typiques et atypiques (LPD, IPP, brut, HTTP, SMB, FTP, SNMP).

Il existe essentiellement deux approches pour contourner les systèmes de comptabilité des travaux d'impression : soit usurper l'identité d'un autre utilisateur, soit manipuler le compteur de pages imprimées. Dans la suite, les deux options sont discutées pour les installations LPRng (v3.8.B) et CUPS (v2.1.4) qui sont des systèmes d'impression open-source populaires utilisés dans les environnements académiques et d'entreprise. Une comparaison des fonctionnalités de sécurité des deux systèmes est donnée ci-dessous.

Système d'impression Protocole Chiffrement Authentification Compteur de pages
LPRng LPD SSL/TLS Kerberos, PGP matériel
CUPS IPP SSL/TLS Kerberos, HTTP logiciel

Contournements d'authentification

LPRng et CUPS offrent tous deux un chiffrement de canal basé sur SSL et des schémas d'authentification sécurisés tels que Kerberos, PGP signant des travaux d'impression ou une authentification HTTP basic/digest. Si configuré correctement et dans le cas où l'attaquant ne peut pas accéder directement à l'imprimante, il ne sera pas capable d'usurper l'identité d'autres utilisateurs. Cependant, ces fonctionnalités de sécurité sont optionnelles et rarement appliquées dans les serveurs d'impression réels. Au lieu de cela, les noms d'utilisateur donnés en tant que paramètres LPD (LPRng) ou IPP (CUPS) sont enregistrés et comptabilisés qui peuvent être définis à des valeurs arbitraires par le côté client. La raison en est une simple considération coût-bénéfice dans la plupart des institutions : Kerberos nécessite une configuration spéciale sur chaque client et l'authentification HTTP exige des utilisateurs d'entrer un mot de passe chaque fois qu'ils veulent imprimer quelque chose alors que le coût de quelques impressions non comptabilisées est supportable.

Vous pouvez vérifier une authentification appropriée en essayant d'imprimer avec un nom d'utilisateur personnalisé comme ceci :

lp -U nobody test.ps

Manipulation du compteur de pages

Compteurs de pages matériels

Pour une comptabilité correcte, le nombre de pages imprimées doit être déterminé par le système d'impression, ce qui n'est pas une tâche triviale. Les auteurs de LPRng partent du principe que l'imprimante dispose d'une sorte de mécanisme de compteur de pages non-volatile fiable et insensible aux cycles de mise sous/hors tension. De tels compteurs de pages matériels sont pris en charge par la plupart des imprimantes et lus par LPRng à l'aide de PJL après chaque travail d'impression. HP a même documenté une fonctionnalité pour écrire sur la variable du compteur de pages en mettant l'imprimante en mode service. De cette façon, le compteur de pages des HP LaserJet 1200, HP LaserJet 4200N et HP LaserJet 4250N peut être manipulé au sein d'un travail d'impression. À la fin du document à imprimer et séparé par le UEL, le compteur doit simplement être réinitialisé à sa valeur d'origine (par exemple, 2342) :

\x1b%-12345X@PJL JOB
This page was printed for free
\x1b%-12345X@PJL EOJ
\x1b%-12345X@PJL JOB
@PJL SET SERVICEMODE=HPBOISEID
@PJL SET PAGES=2342
\x1b%-12345X@PJL EOJ

Un attaquant pourrait définir un nombre négatif de pages imprimées. Notez que la réinitialisation de l'appareil aux paramètres d'usine réinitialise également le compteur de pages à zéro sur certains des appareils testés.
Réduire le compteur de pages peut également être utilisé pour vendre une imprimante au-dessus de son prix car cela peut être comparé à l'odomètre lors de l'achat d'une voiture d'occasion. Il convient cependant de souligner que la réinitialisation du compteur de pages n'est pas nécessairement à des fins malveillantes : Il s'agit d'un modèle commercial bien connu de vendre de l'encre surévaluée pour des appareils à jet d'encre à faible coût et de bloquer les kits de recharge de tiers en refusant d'imprimer après un certain nombre de pages pour gérer de telles pratiques non éthiques, il est absolument légitime de réinitialiser le compteur de pages.

Sur les anciens laserjets HP, la commande pagecount de PRET peut être utilisée pour facilement définir les compteurs de pages matériels :

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

Welcome to the pret shell. Type help or ? to list commands.
printer:/> pagecount 10
Old pagecounter: 53214
New pagecounter: 10

Compteurs de pages logiciels

CUPS utilise des compteurs de pages logiciels qui ont été implémentés pour tous les principaux langages de description de page. Pour PostScript, une manière simple de contourner la comptabilité est de vérifier si le paramètre système PageCount existe ce qui retournera faux lorsqu'interprété dans CUPS/Ghostscript avant d'imprimer réellement le document comme montré ci-dessous.

currentsystemparams (PageCount) known {
<@\textit{[...] code which is only executed on a printer device [...]}@>
} if

Ainsi, le logiciel de comptabilité utilisé par CUPS rend un document différent de celui de l'imprimante. CUPS ne compte qu'une seule page ce qui semble être un minimum codé en dur tandis que le vrai travail d'impression peut contenir des centaines de pages. Notez que l'utilisation de la file d'attente/option 'raw' IPP est obligatoire, sinon CUPS analyse le code avec un filtre PostScript vers PostScript (ps2write de Ghostscript) avant qu'il n'atteigne le compteur de pages.

Comment tester cette attaque ?

Encapsulez un document PostScript de plusieurs pages arbitraire dans le code ci-dessus et imprimez. Ensuite, allez sur http://printserver:631/jobs?which_jobs=all et vérifiez le compteur de pages de CUPS pour ce travail d'impression. Notez que vous devez établir une file d'attente raw. C'est-à-dire, une file d'attente où le système de filtrage n'est pas impliqué et le travail d'impression va directement à une imprimante. Pour CUPS, cela se fait en définissant le type de contenu sur application/vnd.cups-raw. Si votre système est déjà configuré pour utiliser le serveur d'impression à tester, utilisez simplement :

lp -o raw test.ps
Apprenez le hacking AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Autres moyens de soutenir HackTricks :