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
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 :
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Ă©.
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
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 :
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.
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 :
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 :
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.
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â
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.
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 :
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 :
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
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 đ€Ł).