Cover Image

Oteria Cyber Cup 2022


Sur ce post, je vais faire 2 writeups de la catĂ©gorie “Applicatif”, 1 et 2, les deux Ă©tant des challenges Buffer Overflow niveau Facile.

Commençons :

Applicatif 1

En nous connectant sur le ssh Ă  l’adresse 192.168.250.2 en tant qu’utilisateur level1, nous avons un binaire ELF appelĂ© “level1”, nous allons le copier vers notre machine en locale pour l’analyser avec GDB, personnellement pour faciliter les analyses, j’ai ajoutĂ© l’extension PEDA de GDB (Python Exploit Development Assistance).

https://github.com/longld/peda

test

En Ă©xecutant le binaire, on obtient un “blocage”, il s’agit d’un input qui demande des informations Ă  l’utilisateur. En essayant un payload classique pour dĂ©tecter un buffer overflow, nous remarquons qu’on obtient un “segmentation fault” qui signifie qu’on Ă  rĂ©ussi Ă  Ă©crire dans une zone mĂ©moire qu’on ne devrait pas accĂ©der normalement. Lançons PEDA et essayons de trouver l’offset pour Ă©craser le registre EIP :

level1-2.PNG

Sur cette image, nous voyons que nous avons rĂ©ussi avec un pattern de 100 caractĂšres, rĂ©Ă©crire le registre EIP qui correspond Ă  l’adresse de l’instruction actuelle. dans EIP nous avons “HAAd” qui correspond Ă  l’offset 64 (j’ai ajoutĂ© un guillemet au dĂ©but de la chaine accidentellement.) en se basant sur notre pattern, ce qui signifie que nous avons besoin d’écrire 64 caractĂšres avant d’écraser le registre EIP. Analysons les adresses des plusieurs fonctions prĂ©sentes dans ce code et vĂ©rifions si l’ASLR est dĂ©sactivĂ©.

level1-3.PNG

Comme nous pouvons le voir, nous avons une fonction “gagne” qui interpelle, par dĂ©duction, on peut essayer d’appeler cette fonction en Ă©crasant EIP avec l’adresse de “gagne” qui est ici de “0x080484ac”.

En relançant plusieurs fois level1, nous remarquons aussi que les adresses de ces fonctions ne changent pas, donc l’ASLR est dĂ©sactivĂ© sur ce binaire.

Exploitation

level1-4.PNG

J’ai dĂ©cidĂ© de crĂ©er un programme en python2 pour exploiter notre binaire.

PrĂ©cĂ©demment nous avons vu que l’offset est de 64 caractĂšres, l’adresse de “gagne” est “0x080484ac”, nous allons crĂ©er une chaine de caractĂšres Ă  partir de ce programme python2.

EIP est écrit de cette maniÚre car nous devons convertir cette adresse en Little Endian, format utilisé par les binaires.

Exécutons notre exploit :

level1-5.PNG

Nous avons exĂ©cutĂ© notre exploit, normalement sur le serveur du CTF, il existe un fichier .passwd, que j’ai crĂ©Ă© localement pour tester comme les conditions du CTF.

Nous avons rĂ©ussi Ă  exploiter le binaire, nous avons le contenu du fichier .passwd “Oteria c’est trop cool”

Applicatif 2

Nous avons Ă©galement un binaire s’appellant “level2” sur le serveur distant, on rĂ©cupĂšre aussi ce fichier avec ssh level2@192.168.250.2 et pass “level2”.

Une fois fait, analysons le binaire en local comme précédemment.

level2-1.PNG

Nous avons exĂ©cutĂ© le binaire, on obtient un message qui nous demande d’utiliser la variable d’environnement OTERIA pour notre exploit.

Mais qu’est ce que c’est ?

Une variable d’environnement est une variable qui contient des informations sur l’environnement de l’utilisateur dans le systĂšme d’exploitation. Ces variables sont gĂ©nĂ©ralement utilisĂ©es par les systĂšmes d’exploitation et les programmes pour fournir des informations sur l’environnement de l’utilisateur, telles que le rĂ©pertoire de travail actuel, le nom d’utilisateur, le chemin d’accĂšs aux programmes, etc.

Par exemple pour afficher nos variables d’environnement sur notre machine Linux, nous pouvons taper la commande :

level2-2.PNG

Ici sont une partie des variables d’environnement dĂ©finies sur mon systĂšme Kali.

Nous essayons un buffer overflow depuis la variable OTERIA que nous allons définir :

level2-fix1.PNG

Ici nous avons gĂ©nĂ©rĂ© une chaine de caractĂšre de 100 caractĂšres avec python2, et nous l’avons stockĂ© dans la variable d’environnement “OTERIA” que nous avons dĂ©fini avec la commande ci dessus.

En exĂ©cutant le binaire “level2” directement et aussi depuis GDB PEDA (avec un autre payload qui m’avait induit en erreur), nous pouvons voir que nous avons affaire encore Ă  un buffer overflow :

Petite parenthĂšse, quand vous voulez gĂ©nĂ©rer des payloads Ă  utiliser dans des variables d’environnement, n’utilisez pas le gĂ©nĂ©rateur de PEDA car cette chaine possĂšde des caractĂšres spĂ©ciaux et ça peut crĂ©er des erreurs pour calculer les offsets.

level2-4.PNG.png

Nous avons obtenu un “Segmentation Fault” car nous avons rĂ©Ă©cris EIP , en regardant la valeur contenue dans ce registre, mais ceci n’est pas la variable Ă  modifier comme nous allons le voir par la suite, de plus nous avons une indication avec la sortie suivante “Try again, you got 0x41654141”

level2-5.PNG

En voulant obtenir des informations sur les fonctions et leurs adresses, nous remarquons qu’il y Ă  la fonction “getenv()” qui rĂ©cupĂšre la variable d’environnement “OTERIA” , “strcpy()” qui permet de copier une donnĂ©e dans un buffer, mais ne fait aucune vĂ©rification sur la taille de la donnĂ©e et de la taille disponible dans le buffer au moment d’écrire. Nous voyons Ă©galement une fonction “execve()” qui permet de lancer des commandes systĂšmes.

level2-6.PNG

Pour ce challenge j’ai aussi dĂ©cidĂ© d’utiliser IDA Freeware, un outil qui permet d’analyser du code assembleur sur des binaires. Ce programme possĂšde une fonctionnalitĂ© qui permet de gĂ©nĂ©rer du pseudocode en fonction de l’assembleur.

Notre analyse Ă©tait juste, et nous voyons que v6 est Ă©gale Ă  0, et si la valeur de v6 est “-889266486” qui donne en hexadĂ©cimale “0xcafedeca”, le programme va exĂ©cuter une commande systĂšme avec /bin/more et /home/level2/.passwd.

Notre but ici est de réécrire la variable v6 pour bypasser la condition if dans ce programme.

Trouvons l’offset de cette variable :

Ma mĂ©thode est un peu Ă  l’arrache mais celle ci Ă  fonctionnĂ© pour moi :

level2-fix2.PNG

En tĂątonnant un peu avec la taille du payload, nous finissons par trouver l’offset correct qui nous permet d’écraser la valeur de “v6”. L’offset est de 64 caractĂšres, au dessus de cette limite, nous pouvons rĂ©Ă©crire la valeur avec “0xcafedeca” encodĂ© en Little Endian.

Précision :

0x42424242 en ASCII donne “BBBB”, ce qui correspond à la fin de notre payload.

Passons à l’action :

level2-7.PNG

Ici, j’ai dĂ©cidĂ© de crĂ©er un programme bash qui va dĂ©finir la variable d’environnement OTERIA comme nous l’avons dĂ©fini prĂ©cĂ©demment.

Nous allons crĂ©er une chaine de caractĂšre de 64 caractĂšres , et nous allons concatĂ©ner au payload notre valeur qui est dans la condition if Ă  savoir “0xcafedeca” (cafĂ© dĂ©ca 😃) , on va Ă©craser la valeur de v6. Convertie en Little Endian cela correspond Ă  “\xca\xde\xfe\xca”

Exploitation

level2-8.PNG

Nous avons réussi à exploiter ce binaire avec succÚs.

PS: Si les instances en CTF sont Ă  partager entre toutes les Ă©quipes, supprimez vos fichiers d’exploit et toutes vos traces pour Ă©viter que les autres Ă©quipes concurrentes puissent valider un flag sans rien faire (Bravo Ă  Saber qui Ă  utilisĂ© mon exploit pour valider ce flag đŸ€Ł).