hacktricks/binary-exploitation/basic-binary-exploitation-methodology
2024-04-07 03:54:34 +00:00
..
tools Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/REA 2024-04-07 03:54:34 +00:00
elf-tricks.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/REA 2024-04-07 03:54:34 +00:00
README.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/REA 2024-04-07 03:54:34 +00:00

Méthodologie de base pour l'exploitation binaire

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert en équipe rouge AWS de HackTricks)!

Autres façons de soutenir HackTricks :

Informations de base sur ELF

Avant de commencer à exploiter quoi que ce soit, il est intéressant de comprendre une partie de la structure d'un binaire ELF :

{% content-ref url="elf-tricks.md" %} elf-tricks.md {% endcontent-ref %}

Outils d'exploitation

{% content-ref url="tools/" %} tools {% endcontent-ref %}

Méthodologie du débordement de pile

Avec autant de techniques, il est bon d'avoir un schéma pour savoir quand chaque technique sera utile. Notez que les mêmes protections affecteront différentes techniques. Vous pouvez trouver des moyens de contourner les protections dans chaque section de protection mais pas dans cette méthodologie.

Contrôler le flux

Il existe différentes façons de contrôler le flux d'un programme :

  • Débordements de pile en écrasant le pointeur de retour de la pile ou l'EBP -> ESP -> EIP.
  • Pourrait nécessiter d'abuser des Débordements d'entiers pour provoquer le débordement
  • Ou via Écritures arbitraires + Écrire quoi où à l'exécution
  • Chaines de format: Abuser de printf pour écrire un contenu arbitraire à des adresses arbitraires.
  • Indexation de tableaux : Abuser d'une indexation mal conçue pour pouvoir contrôler certains tableaux et obtenir une écriture arbitraire.
  • Pourrait nécessiter d'abuser des Débordements d'entiers pour provoquer le débordement
  • bof vers WWW via ROP : Abuser d'un débordement de tampon pour construire un ROP et pouvoir obtenir un WWW.

Vous pouvez trouver les techniques Écrire quoi où à l'exécution dans :

{% content-ref url="../arbitrary-write-2-exec/" %} arbitrary-write-2-exec {% endcontent-ref %}

Boucles éternelles

Il est important de noter que généralement une seule exploitation d'une vulnérabilité pourrait ne pas suffire pour exécuter avec succès une exploitation, en particulier certaines protections doivent être contournées. Par conséquent, il est intéressant de discuter de certaines options pour rendre une seule vulnérabilité exploitable plusieurs fois dans la même exécution du binaire :

  • Écrire dans une chaîne ROP l'adresse de la fonction main ou à l'adresse où la vulnérabilité se produit.
  • En contrôlant une chaîne ROP appropriée, vous pourriez être capable d'effectuer toutes les actions dans cette chaîne
  • Écrire dans l'adresse exit dans GOT (ou toute autre fonction utilisée par le binaire avant la fin) l'adresse pour revenir à la vulnérabilité
  • Comme expliqué dans .fini_array, stockez 2 fonctions ici, une pour appeler à nouveau la vulnérabilité et une autre pour appeler __libc_csu_fini qui appellera à nouveau la fonction de .fini_array.

Objectifs d'exploitation

Objectif : Appeler une fonction existante

  • ret2win : Il y a une fonction dans le code que vous devez appeler (peut-être avec certains paramètres spécifiques) pour obtenir le drapeau.
  • Dans un bof régulier sans PIE et canary, vous avez juste besoin d'écrire l'adresse dans l'adresse de retour stockée dans la pile.
  • Dans un bof avec PIE, vous devrez le contourner
  • Dans un bof avec canary, vous devrez le contourner
  • Si vous devez définir plusieurs paramètres pour appeler correctement la fonction ret2win, vous pouvez utiliser :
  • Une chaîne ROP s'il y a suffisamment de gadgets pour préparer tous les paramètres
  • SROP (au cas où vous pourriez appeler cet appel système) pour contrôler de nombreux registres
  • Gadgets de ret2csu pour contrôler plusieurs registres
  • Via un Écrire quoi où vous pourriez abuser d'autres vulnérabilités (pas de bof) pour appeler la fonction win.
  • Redirection de pointeurs : Si la pile contient des pointeurs vers une fonction qui va être appelée ou vers une chaîne qui va être utilisée par une fonction intéressante (system ou printf), il est possible de remplacer cette adresse.
  • ASLR ou PIE pourraient affecter les adresses.
  • Variables non initialisées : On ne sait jamais.

Objectif : RCE

Via shellcode, si nx est désactivé ou en mélangeant shellcode avec ROP :

  • (Stack) Shellcode : Cela est utile pour stocker un shellcode dans la pile avant ou après avoir écrasé le pointeur de retour et ensuite sauter dessus pour l'exécuter :
  • Dans tous les cas, s'il y a un canary, dans un bof régulier vous devrez le contourner (leak)
  • Sans ASLR et nx il est possible de sauter à l'adresse de la pile car elle ne changera jamais
  • Avec ASLR vous aurez besoin de techniques telles que ret2esp/ret2reg pour y sauter
  • Avec nx, vous devrez utiliser un certain ROP pour appeler memprotect et rendre certaines pages rwx, afin de stocker ensuite le shellcode là-dedans (en appelant read par exemple) et ensuite sauter là-bas.
  • Cela mélangera le shellcode avec une chaîne ROP.

Via syscalls

  • Ret2syscall: Utile pour appeler execve afin d'exécuter des commandes arbitraires. Vous devez être capable de trouver les gadgets pour appeler le syscall spécifique avec les paramètres.
  • Si ASLR ou PIE sont activés, vous devrez les contourner pour utiliser les gadgets ROP du binaire ou des bibliothèques.
  • SROP peut être utile pour préparer le ret2execve

Via libc

  • Ret2lib: Utile pour appeler une fonction d'une bibliothèque (généralement de libc) comme system avec certains arguments préparés (par exemple '/bin/sh'). Vous avez besoin que le binaire charge la bibliothèque avec la fonction que vous souhaitez appeler (généralement libc).
  • Si compilé statiquement et sans PIE, l'adresse de system et /bin/sh ne vont pas changer, il est donc possible de les utiliser statiquement.
  • Sans ASLR et en connaissant la version de libc chargée, l'adresse de system et /bin/sh ne vont pas changer, il est donc possible de les utiliser statiquement.
  • Avec ASLR mais sans PIE, en connaissant la libc et en utilisant la fonction system du binaire, il est possible de ret à l'adresse de system dans le GOT avec l'adresse de '/bin/sh' en paramètre (vous devrez résoudre cela).
  • Avec ASLR mais sans PIE, en connaissant la libc et sans que le binaire utilise le system :
  • Utilisez ret2dlresolve pour résoudre l'adresse de system et l'appeler
  • Contournez ASLR et calculez l'adresse de system et '/bin/sh' en mémoire.
  • Avec ASLR et PIE et sans connaître la libc: Vous devez:
  • Contourner PIE
  • Trouver la version de libc utilisée (fuite de quelques adresses de fonctions)
  • Vérifiez les scénarios précédents avec ASLR pour continuer.

Via EBP/RBP

  • Stack Pivoting / EBP2Ret / EBP Chaining: Contrôlez l'ESP pour contrôler RET à travers l'EBP stocké dans la pile.
  • Utile pour les débordements de pile d'un octet
  • Utile comme moyen alternatif de contrôler EIP tout en abusant d'EIP pour construire la charge utile en mémoire puis y sauter via EBP

Misc

  • Redirection des pointeurs: Dans le cas où la pile contient des pointeurs vers une fonction qui va être appelée ou vers une chaîne qui va être utilisée par une fonction intéressante (system ou printf), il est possible de remplacer cette adresse.
  • ASLR ou PIE peuvent affecter les adresses.
  • Variables non initialisées: On ne sait jamais
Apprenez le piratage AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Autres façons de soutenir HackTricks: