Pré-sélections ECSC 2019 writeups

Les présélections viennent de se terminer, j'ai trouvé le CTF intéressant, malgré ma place de 210ème. J'aime bien partager donc j'ai fais ce poste.

Je viendrais alimenter ce writeup avec le temps.

reverse

ybab 26pts

Le fichier indiqué est un exécutable 64bits. Avec un simple strings on obtient le flag.

strings ybab | grep ECSC{
flag : ECSC{cdcd13c4c81a23a21506fa8efa5edff781e9fe80}

forensic

Not so FAT 43pts

On télécharge un fichier image.dd qui est un secteur de démarrage système.

testdisk image.dd

On sélectionne le disque.

Une partition de type None est identifiée par le programme, on va utiliser ce type.

On va dans les options avancées, pour récupérer des éventuels fichiers.

Le programme trouve une partition en FAT16, allons-y.

Listons les fichiers présents dans cette partition.

On trouve un fichier compressé nommé flag.zip, on le copie sur notre système, dans le dossier courant par exemple.
Il ne reste plus qu'a le décompresser, et lire le fichier contenu.

unzip flag.zip; cat flag.txt
flag : ECSC{eefea8cda693390c7ce0f6da6e388089dd615379}

Petites notes 46pts

On a un fichier pcapng contenant beaucoup de trames d'un réseau, 4903 pour être précis. Un de mes premiers réflexes à été de strings petitesnotes.pcapng | grep ECSC{.

Quelque chose ne tourne pas rond, le flag n'est pas entier, il est bien présent dans le fichier cependant. Après avoir cherché désespérément dans les trames présentes un indice, je décides d'aller voir dans les propriétés de la capture.

Bingo ! Le flag se trouve dans les commentaires

Une autre manière, plus intelligente aurait été de cat petitesnotes.pcapng | grep flag, on aurait pu voir tout de suite qu'il fallait voir dans les commentaires.

flag : ECSC{cShle5dOKYBfjLNzT}

3615 Incident (1) 127pts

Je n'ai pas flag ce challenge durant le CTF, mais après.

web

PHP sandbox 124pts

En se connectant à l'adresse indiquée on obtient cette page :

Avec l'énnoncé et le message assez explicite de la page web, on en déduit qu'il va faloir utiliser des paramètres GET. En essayant plusieurs paramètres différents, j'ai compris que le serveur attendait le paramètre args.

Le serveur veut qu'on affiche le contenu d'un fichier en utilisant le paramètre GET trouvé. On connait déja un fichier présent sur le serveur : index.php.

Une regex est en place, après avoir cherché comment la bypass, je sais qu'elle laisse passer les caractères [A-Za-z0-9_./=|], ce qui ne nous laisse plus trop le choix pour afficher le contenu du fichier.
Je suis resté bloqué là quelques temps avant de me demander ce que faisait le serveur avec le paramètre GET. Mais que se passerait-il si on utilisait une array pour le paramètre ?

Voilà le code source du fichier index.php, on remarque un commentaire à la ligne 3, sûrement du base64. On le décode, et on a le flag.

flag : ECSC{ae822cf59d26401b64f20ee9af8fd4cf31da79ab}

Scully (1) 150pts

Le nom du challenge met dèjà la puce à l'oreille, il va sûrement s'agir d'une injection SQL. Voici le contenu de la page de copnnexion :

Essayons de nous connecter avec des identifiants de base admin:admin.

Nous avons un message d'erreur de connexion. Essayons alors une injection basique : admin' or 1=1;#.

Nous n'avons plus de message d'erreur de connexion, et ne sommes pas authentifiés. Peut-être que la base de données n'est pas une MySQL mais une SQLite ? Essayons plutôt admin' or 1=1;--.

En effet, les bases de données SQLite utilisent -- comme commentaire, alors que MySQL utilise le #. À noter que admin' or 1=1;/* marche très bien aussi.

Pour rentrer un peu plus dans les détails, la requête initiale du serveur doit être sûrement :

SELECT * FROM users WHERE username = '$username' AND password = '$password';
/* $username et $password étants les inputs utilisateur de la page web */

En utilisant des inputs utilisateurs bien choisi, comme admin' or 1=1;--, la requête serveur se trouve alor modifiée :

SELECT * FROM users WHERE username = 'admin' or 1=1;--' AND password = '$password';

Le champ de vérification du mot de passe se trouve alors en commentaire ! Le serveur nous authentifie alors automatiquement en tant qu'admin sans vérification de mot de passe. L'injection la plus courte que j'ai trouvé pour valider le challenge est : 'or 1--.

flag : ECSC{889b71de2017ca8074f49d3f853950e147591b38}