10 KiB
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.
Vous pouvez faire en sorte qu'un utilisateur envoie une requête HTTP POST au port 9100 de plusieurs IP essayant d'atteindre un port d'impression raw ouvert. Si trouvé, l'en-tête HTTP est soit imprimé en texte clair soit ignoré selon les paramètres de l'imprimante. Les données POST cependant peuvent contenir des travaux d'impression arbitraires comme des commandes PostScript ou PJL à être interprétées.
Impression cross-site améliorée
Vous pouvez utiliser des objets JavaScript XMLHttpRequest (XHR) comme défini pour effectuer des requêtes HTTP POST vers des imprimantes internes. Une limitation de l'approche d'impression cross-site discutée jusqu'à présent est que les données ne peuvent être envoyées qu'à l'appareil, non reçues à cause de la politique de même origine. Pour contourner les restrictions de la politique de même origine, vous pouvez faire en sorte que le serveur réponde avec une fausse mais valide réponse HTTP autorisant les requêtes CORS (y compris Access-Control-Allow-Origin=*
). Un aperçu schématique de l'attaque est donné ci-dessous :
Dans une telle variante améliorée de XSP – combinée avec l'usurpation CORS – un attaquant web a un accès complet à la réponse HTTP ce qui lui permet d'extraire des informations arbitraires comme des travaux d'impression capturés de l'appareil d'impression. Un extrait de code JavaScript de preuve de concept est montré ci-dessous :
job = "\x1B%-12345X\r\n"
+ "%!\r\n"
+ "(HTTP/1.0 200 OK\\n) print\r\n"
+ "(Server: PostScript HTTPD\\n) print\r\n"
+ "(Access-Control-Allow-Origin: *\\n) print\r\n"
+ "(Connection: close\\n) print\r\n"
+ "(Content-Length: ) print\r\n"
+ "product dup length dup string cvs print\r\n"
+ "(\\n\\n) print\r\n"
+ "print\r\n"
+ "(\\n) print flush\r\n"
+ "\x1B%-12345X\r\n";
var x = new XMLHttpRequest();
x.open("POST", "http://printer:9100");
x.send(job);
x.onreadystatechange = function() {
if (x.readyState == 4)
alert(x.responseText);
};
Limitations de l'impression cross-site
Notez que PCL en tant que langage de description de page n'est pas applicable pour le spoofing CORS car il ne permet que l'écho d'un seul nombre. PJL ne peut également pas être utilisé car malheureusement il ajoute @PJL ECHO
à toutes les chaînes écho, ce qui rend impossible de simuler un en-tête HTTP valide. Cependant, cela ne signifie pas que les attaques XSP améliorées sont limitées à PostScript : PostScript peut être utilisé pour répondre avec un en-tête HTTP usurpé et le UEL peut ensuite être invoqué pour changer le langage de l'imprimante. De cette manière, un attaquant web peut également obtenir les résultats des commandes PJL. Deux pièges de mise en œuvre existent qui méritent d'être mentionnés : Premièrement, une Content-Length
correcte pour les données à répondre doit être déterminée avec PostScript. Si l'attaquant ne peut pas prédire la taille globale de la réponse et que l'encodage en morceaux n'est pas une option non plus, elle doit définir une valeur très élevée et utiliser du remplissage. Deuxièmement, ajouter le champ d'en-tête Connection: close
est important, sinon les connexions HTTP/1.1 sont maintenues actives jusqu'à ce que le client web ou l'appareil d'impression déclenche un délai d'attente, ce qui signifie que l'imprimante ne sera pas accessible pendant un certain temps.
Si l'appareil d'impression prend en charge l'impression de texte brut, l'en-tête de la requête HTTP du XHR est imprimé sous forme de copie papier – y compris le champ d'en-tête Origin
contenant l'URL qui a invoqué le JavaScript malveillant, rendant ainsi difficile pour un attaquant de rester silencieux. Cela est inévitable, car nous ne prenons pas le contrôle de l'imprimante – et sous certaines circonstances pouvons désactiver la fonctionnalité d'impression – jusqu'à ce que le corps HTTP soit traité et que l'en-tête HTTP ait déjà été interprété comme du texte brut par l'appareil d'impression. Si réduire le bruit est une priorité, l'attaquant peut cependant essayer de désactiver d'abord la fonctionnalité d'impression avec des commandes PJL propriétaires comme proposé dans PJL jobmedia en utilisant d'autres canaux XSP potentiels comme IPP, LPD, FTP ou le serveur web embarqué de l'imprimante. Bien que tous les protocoles aient pu être testés avec succès pour déployer des travaux d'impression en utilisant des variantes de scripting cross-protocole, ils présentent certains inconvénients au-delà de ne pas fournir de retour d'information en utilisant des en-têtes CORS usurpés :
- L'accès cross-protocole aux ports LPD et FTP est bloqué par divers navigateurs web
- Les paramètres pour l'impression directe via le serveur web embarqué sont spécifiques au modèle
- La norme IPP exige que le
Content-type
pour les requêtes HTTP POST soit défini surapplication/ipp
, ce qui ne peut pas être fait avec des objets XHR – cependant, il appartient à l'implémentation de se soucier réellement des types incorrects
Une comparaison des canaux d'impression cross-site est donnée ci-dessous :
Canal | Port | Pas de retour | Impressions non sollicitées | Standardisé | Bloqué par |
---|---|---|---|---|---|
Raw | 9100 | - | ✔ | ✔ | - |
Web | 80 | ✔ | - | - | - |
IPP | 631 | ✔ | - | ✔ | - |
LPD | 515 | ✔ | - | ✔ | FF, Ch, Op |
FTP | 21 | ✔ | - | ✔ | FF, Ch, Op, IE |
Un problème majeur du XSP est de trouver l'adresse correcte ou le nom d'hôte de l'imprimante. Notre approche consiste à abuser de WebRTC qui est implémenté dans la plupart des navigateurs modernes et a la fonctionnalité d'énumérer les adresses IP pour les interfaces réseau locales. Étant donné l'adresse IP locale, des objets XHR sont en outre utilisés pour ouvrir des connexions au port 9100/tcp pour les 253 adresses restantes afin de récupérer le nom du produit de l'imprimante en utilisant PostScript et le spoofing CORS, ce qui ne prend que quelques secondes dans nos tests. Si l'imprimante est sur le même sous-réseau que l'hôte de la victime, son adresse peut être détectée uniquement à l'aide de JavaScript. WebRTC est en développement pour Safari et pris en charge par les versions actuelles de Firefox, Chrome et Microsoft Edge. Internet Explorer n'a pas de support WebRTC, mais VBScript et Java peuvent également être utilisés pour divulguer l'adresse IP locale. Si l'adresse de l'interface locale ne peut pas être récupérée, nous appliquons une approche de force brute intelligente : Nous essayons de nous connecter au port 80 du routeur de la victime à l'aide d'objets XHR. Pour cela, une liste de 115 adresses de routeur par défaut provenant de diverses ressources accessibles sur Internet a été compilée. Si un routeur est accessible, nous scannons le sous-réseau pour les imprimantes comme décrit précédemment.
Preuve de concept
Une implémentation de preuve de concept démontrant que les attaques d'impression cross-site avancées sont pratiques et une menace réelle pour les entreprises et les institutions est disponible sur hacking-printers.net/xsp/
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 swag 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.