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

75 lines
8.4 KiB
Markdown

# Débordement de tas
{% hint style="success" %}
Apprenez et pratiquez le piratage AWS :<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Formation HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Apprenez et pratiquez le piratage GCP : <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Formation HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Soutenez HackTricks</summary>
* Consultez les [**plans d'abonnement**](https://github.com/sponsors/carlospolop)!
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-nous** sur **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Partagez des astuces de piratage en soumettant des PR aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) dépôts GitHub.
</details>
{% endhint %}
## Informations de base
Un débordement de tas est similaire à un [**débordement de pile**](../stack-overflow/) 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**](../stack-overflow/#finding-stack-overflows-offsets).
{% 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**](https://azeria-labs.com/grooming-the-ios-kernel-heap/). 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**](https://guyinatuxedo.github.io/27-edit\_free\_chunk/heap\_consolidation\_explanation/index.html), 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**](https://guyinatuxedo.github.io/24-heap\_overflow/protostar\_heap0/index.html) 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**](https://guyinatuxedo.github.io/24-heap\_overflow/protostar\_heap1/index.html), il est possible de voir comment en abusant d'un dépassement de tampon, il est possible d'**écraser dans un fragment proche une adresse** où **des 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/](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 :
```bash
python3 -c 'print("/"*0x400+"/bin/ls\x00")' > hax.txt
```
### Autres exemples
* [**Auth-or-out. Hack The Box**](https://7rocky.github.io/en/ctf/htb-challenges/pwn/auth-or-out/)
* 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 :<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Formation HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Apprenez et pratiquez le piratage GCP : <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Formation HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Soutenez HackTricks</summary>
* Consultez les [**plans d'abonnement**](https://github.com/sponsors/carlospolop)!
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-nous** sur **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Partagez des astuces de piratage en soumettant des PR aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) dépôts GitHub.
</details>
{% endhint %}