hacktricks/network-services-pentesting/pentesting-printers/cross-site-printing.md

10 KiB
Raw Blame History

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

Autres moyens de soutenir HackTricks :

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 :

Impression cross-site avancée avec usurpation CORS

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 sur application/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 :