MĂ©thodologie de Base pour l’Exploitation Binaire

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 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 :

ELF Basic Information

Outils d’Exploitation

Exploiting Tools

Méthodologie de Débordement de Pile

Avec tant 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ĂŽle du Flux

Il existe diffĂ©rentes maniĂšres de contrĂŽler le flux d’un programme :

  • DĂ©bordements de Pile en Ă©crasant le pointeur de retour de la pile ou le EBP -> ESP -> EIP.
  • Peut nĂ©cessiter d’abuser d’un DĂ©bordement d’Entier pour provoquer le dĂ©bordement.
  • Ou via Écritures Arbitraires + Écrire Quoi OĂč pour l’ExĂ©cution.
  • ChaĂźnes de Format: Abuser de printf pour Ă©crire du 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.
  • Peut nĂ©cessiter d’abuser d’un DĂ©bordement d’Entier pour provoquer le dĂ©bordement.
  • bof Ă  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Ăč pour l’ExĂ©cution dans :

Write What Where 2 Exec

Boucles Éternelles

Un point Ă  prendre en compte est que gĂ©nĂ©ralement une seule exploitation d’une vulnĂ©rabilitĂ© peut ne pas suffire Ă  exĂ©cuter un exploit rĂ©ussi, surtout 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 en mesure d’effectuer toutes les actions dans cette chaĂźne.
  • Écrire Ă  l’adresse exit dans le GOT (ou toute autre fonction utilisĂ©e par le binaire avant de se terminer) l’adresse pour revenir Ă  la vulnĂ©rabilitĂ©.
  • Comme expliquĂ© dans .fini_array, stocker 2 fonctions ici, une pour rappeler la vulnĂ©rabilitĂ© et une autre pour appeler __libc_csu_fini qui rappellera Ă  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 des paramĂštres spĂ©cifiques) afin d’obtenir le drapeau.
  • Dans un bof rĂ©gulier sans PIE et canary, vous devez simplement Ă©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 ce syscall) pour contrĂŽler beaucoup de registres.
  • Gadgets de ret2csu et ret2vdso pour contrĂŽler plusieurs registres.
  • Via un Écrire Quoi OĂč, vous pourriez abuser d’autres vulnĂ©rabilitĂ©s (pas bof) pour appeler la fonction win.
  • Redirection de 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 d’écraser cette adresse.
  • ASLR ou PIE peuvent affecter les adresses.
  • Variables Non InitialisĂ©es : On ne sait jamais.

Objectif : RCE

Via shellcode, si nx désactivé ou 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 vers lui 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 sauter vers elle.
  • Avec nx, vous devrez utiliser un ROP pour appeler memprotect et rendre une page rwx, afin de pouvoir ensuite stocker 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 pour 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 afin d’utiliser les gadgets ROP du binaire ou des bibliothĂšques.
  • SROP peut ĂȘtre utile pour prĂ©parer le ret2execve.
  • Gadgets de ret2csu et ret2vdso pour contrĂŽler plusieurs registres.

Via libc

  • Ret2lib : Utile pour appeler une fonction d’une bibliothĂšque (gĂ©nĂ©ralement de libc) comme system avec des 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 (libc gĂ©nĂ©ralement).
  • Si compilĂ© statiquement et sans PIE, l’adresse de system et /bin/sh ne changera pas, donc il est possible de les utiliser statiquement.
  • Sans ASLR et en connaissant la version de libc chargĂ©e, l’adresse de system et /bin/sh ne changera pas, donc il est possible de les utiliser statiquement.
  • Avec ASLR mais sans PIE, en connaissant la libc et avec le binaire utilisant la fonction system, il est possible de ret Ă  l’adresse de system dans le GOT avec l’adresse de '/bin/sh' dans le paramĂštre (vous devrez le dĂ©couvrir).
  • Avec ASLR mais sans PIE, en connaissant la libc et sans que le binaire utilise la fonction system :
  • Utilisez ret2dlresolve pour rĂ©soudre l’adresse de system et l’appeler.
  • Contourner ASLR et calculer 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 (leak quelques adresses de fonction).
  • VĂ©rifier les scĂ©narios prĂ©cĂ©dents avec ASLR pour continuer.

Via EBP/RBP

  • Pivotement de Pile / EBP2Ret / ChaĂźnage EBP : ContrĂŽler l’ESP pour contrĂŽler RET via le EBP stockĂ© dans la pile.
  • Utile pour les dĂ©bordements de pile off-by-one.
  • Utile comme une maniĂšre alternative de contrĂŽler EIP tout en abusant d’EIP pour construire la charge utile en mĂ©moire et ensuite sauter vers elle via EBP.

Divers

  • Redirection de 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 d’écraser cette adresse.
  • ASLR ou PIE peuvent affecter les adresses.
  • Variables Non InitialisĂ©es : On ne sait jamais.

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