hacktricks/binary-exploitation/libc-heap/heap-overflow.md

8.4 KiB

Débordement de tas

{% hint style="success" %} Apprenez et pratiquez le piratage AWS :Formation HackTricks AWS Red Team Expert (ARTE)
Apprenez et pratiquez le piratage GCP : Formation HackTricks GCP Red Team Expert (GRTE)

Soutenez HackTricks
{% endhint %}

Informations de base

Un débordement de tas est similaire à un débordement de pile mais dans le tas. Fondamentalement, cela signifie qu'un espace a été réservé dans le tas pour stocker des données et que les données stockées étaient plus grandes que l'espace réservé.

Dans les débordements de pile, nous savons que certains registres comme le pointeur d'instruction ou le cadre de pile vont être restaurés à partir de la pile et il pourrait être possible d'en abuser. En cas de débordement de tas, il n'y a aucune information sensible stockée par défaut dans le fragment de tas qui peut être débordé. Cependant, il pourrait s'agir d'informations sensibles ou de pointeurs, donc la criticité de cette vulnérabilité dépend de quelles données pourraient être écrasées et comment un attaquant pourrait en abuser.

{% hint style="success" %} Pour trouver les décalages de débordement, vous pouvez utiliser les mêmes motifs que dans les débordements de pile. {% endhint %}

Débordements de pile vs débordements de tas

Dans les débordements de pile, l'agencement et les données qui seront présentes dans la pile au moment où la vulnérabilité peut être déclenchée sont assez fiables. Cela est dû au fait que la pile est linéaire, augmentant toujours dans la mémoire en collision, dans des endroits spécifiques de l'exécution du programme, la mémoire de pile stocke généralement un type de données similaire et elle a une structure spécifique avec certains pointeurs à la fin de la partie de pile utilisée par chaque fonction.

Cependant, dans le cas d'un débordement de tas, la mémoire utilisée n'est pas linéaire mais les fragments alloués sont généralement à des positions séparées de la mémoire (pas les uns à côté des autres) en raison des bacs et des zones séparant les allocations par taille et parce que la mémoire précédemment libérée est utilisée avant d'allouer de nouveaux fragments. Il est compliqué de savoir quel objet va entrer en collision avec celui vulnérable à un débordement de tas. Ainsi, lorsqu'un débordement de tas est trouvé, il est nécessaire de trouver un moyen fiable de faire en sorte que l'objet désiré soit le suivant en mémoire à partir de celui qui peut être débordé.

L'une des techniques utilisées pour cela est le démêlage de tas qui est utilisé par exemple dans ce post. Dans le post, il est expliqué comment dans le noyau iOS, lorsqu'une zone manque de mémoire pour stocker des fragments de mémoire, elle l'agrandit d'une page de noyau, et cette page est divisée en fragments des tailles attendues qui seraient utilisées dans l'ordre (jusqu'à la version iOS 9.2, puis ces fragments sont utilisés de manière aléatoire pour compliquer l'exploitation de ces attaques).

Par conséquent, dans le post précédent où un débordement de tas se produit, pour forcer l'objet débordé à entrer en collision avec un ordre victime, plusieurs kallocs sont forcés par plusieurs threads pour essayer de s'assurer que tous les fragments libres sont remplis et qu'une nouvelle page est créée.

Pour forcer ce remplissage avec des objets d'une taille spécifique, l'allocation hors ligne associée à un port mach iOS est un candidat idéal. En ajustant la taille du message, il est possible de spécifier exactement la taille de l'allocation kalloc et lorsque le port mach correspondant est détruit, l'allocation correspondante sera immédiatement libérée à kfree.

Ensuite, certains de ces espaces réservés peuvent être libérés. La liste de libération kalloc.4096 libère les éléments dans un ordre dernier entré, premier sorti, ce qui signifie essentiellement que si certains espaces réservés sont libérés et que l'exploit essaie d'allouer plusieurs objets victimes tout en essayant d'allouer l'objet vulnérable au débordement, il est probable que cet objet sera suivi d'un objet victime.

Exemple libc

Sur cette page, il est possible de trouver une émulation de débordement de tas de base qui montre comment en écrivant le bit prev in use du fragment suivant et la position de la taille prev, il est possible de consolider un fragment utilisé (en le faisant croire qu'il est inutilisé) et ensuite le réallouer en pouvant écraser des données qui sont utilisées dans un autre pointeur également.

Un autre exemple de protostar heap 0 montre un exemple très basique d'un CTF où un débordement de tas peut être exploité pour appeler la fonction gagnante et obtenir le drapeau.

Dans l'exemple protostar heap 1, il est possible de voir comment en abusant d'un dépassement de tampon, il est possible d'écraser dans un fragment proche une adressedes données arbitraires de l'utilisateur vont être écrites.

Exemple ARM64

Sur la page https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/, vous pouvez trouver un exemple de débordement de tas où une commande qui va être exécutée est stockée dans le fragment suivant à partir du fragment débordé. Ainsi, il est possible de modifier la commande exécutée en l'écrasant avec une exploitation facile telle que :

python3 -c 'print("/"*0x400+"/bin/ls\x00")' > hax.txt

Autres exemples

  • Auth-or-out. Hack The Box
  • Nous utilisons une vulnérabilité de débordement d'entier pour obtenir un débordement de tas.
  • Nous corrompons les pointeurs vers une fonction à l'intérieur d'une struct du bloc débordé pour définir une fonction telle que system et obtenir l'exécution de code.

{% hint style="success" %} Apprenez et pratiquez le piratage AWS :Formation HackTricks AWS Red Team Expert (ARTE)
Apprenez et pratiquez le piratage GCP : Formation HackTricks GCP Red Team Expert (GRTE)

Soutenez HackTricks
{% endhint %}