hacktricks/network-services-pentesting/pentesting-printers/accounting-bypass.md
2023-06-03 13:10:46 +00:00

79 lines
9.7 KiB
Markdown

# **Introduction**
L'impression sans autorisation peut 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 à la plupart des attaques contre les imprimantes réseau.
Il existe deux approches majeures en ce qui concerne la comptabilité des travaux d'impression : soit **laisser l'imprimante le 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](https://en.wikipedia.org/wiki/CUPS) ou [LPRng](https://en.wikipedia.org/wiki/LPRng) - pour gérer la comptabilité et est assez courante dans les entreprises et les institutions. Le serveur d'impression peut parler LPD, IPP ou d'autres protocoles d'impression et transfère les travaux à l'imprimante réelle. **Il est important de noter que l'accès réseau direct à 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 ce qui suit, 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 |
# Contournement de l'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](https://en.wikipedia.org/wiki/Kerberos\_\(protocol\)), des travaux d'impression signés PGP ou une authentification HTTP [basique](https://en.wikipedia.org/wiki/Basic\_access\_authentication)/[digest](https://en.wikipedia.org/wiki/Digest\_access\_authentication). Si **configurés correctement** et si l'attaquant ne peut pas accéder directement à l'imprimante, elle ne pourra **pas usurper l'identité d'autres utilisateurs**. Cependant, ces fonctionnalités de sécurité sont **optionnelles et rarement appliquées** dans les serveurs d'impression du monde réel. 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** - ce qui peut être défini sur des valeurs arbitraires par le côté client. Les raisons de cela sont une considération simple de coûts et avantages dans la plupart des institutions : Kerberos nécessite une configuration spéciale sur chaque client et l'authentification **HTTP** oblige les utilisateurs à entrer un **mot de passe** chaque fois qu'ils veulent imprimer quelque chose, tandis que les coûts de quelques impressions non comptabilisées sont supportables.
Vous pouvez **vérifier l'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 facile. Les auteurs de **LPRng** _supposent que l'imprimante dispose d'un mécanisme de compteur de pages non volatil fiable et insensible aux cycles de mise sous tension/hors tension_. Ces **compteurs de pages matériels** sont pris en charge par la plupart des imprimantes et **lus** par LPRng **en utilisant PJL après** chaque **travail d'impression**. **HP** a même documenté une fonctionnalité pour **écrire** dans la variable de **compteur de pages** en mettant l'imprimante en mode service. De cette façon, le **compteur de pages** de l'_HP LaserJet 1200, HP LaserJet 4200N_ et _HP LaserJet 4250N_ **peut être manipulé** dans un travail d'impression. À la fin du document à imprimer et séparé par l'[UEL](./#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](factory-defaults.md) **réinitialise également le compteur de pages à zéro sur certains** des appareils testés.\
La diminution du compteur de pages peut également être utilisée pour **vendre une imprimante à un prix supérieur** car elle peut être comparée à 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 économique bien connu consistant à vendre de l'encre surévaluée pour des dispositifs jet d'encre bon marché et à bloquer les kits de recharge tiers en refusant d'imprimer après un certain nombre de pages - pour gérer de telles pratiques non éthiques, il est tout à fait légitime de réinitialiser le compteur de pages.
Sur les anciennes imprimantes laser HP, la commande `pagecount` de [PRET](https://github.com/RUB-NDS/PRET) peut être utilisée pour définir facilement des 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 langages de description de pages majeurs. Pour PostScript, une façon facile de contourner la comptabilité est de vérifier si le paramètre système PageCount existe - ce qui renverra faux lorsqu'il est interprété dans CUPS/Ghostscript - avant d'imprimer réellement le document comme indiqué ci-dessous.
```
currentsystemparams (PageCount) known {
<@\textit{[...] code which is only executed on a printer device [...]}@>
} if
```
De cette manière, le logiciel de comptabilité utilisé par CUPS rend un document différent de celui de l'imprimante. **CUPS ne tient compte que d'une seule page** - qui semble être un **minimum codé en dur** - alors que le **vrai** travail d'impression peut contenir **des centaines de pages**. Notez que l'utilisation de la file d'attente/option IPP "brute" est obligatoire, sinon CUPS analyse le code avec un filtre PostScript-to-PostScript (ps2write de Ghostscript) avant qu'il n'atteigne le compteur de pages.
**Comment tester cette attaque ?**
**Enveloppez** un **document PostScript multi-pages arbitraire** dans le **code ci-dessus** et imprimez-le. Ensuite, allez sur [`http://printserver:631/jobs?which_jobs=all`](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 brute. 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
```
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
- 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) !
- Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
- Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
- **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) **groupe Discord** 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)**.
</details>