hacktricks/binary-exploitation/libc-heap/house-of-force.md

89 lines
7.9 KiB
Markdown
Raw Normal View History

# House of Force
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% endhint %}
## Informações Básicas
### Código
* Esta técnica foi corrigida ([**aqui**](https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=30a17d8c95fbfb15c52d1115803b63aaa73a285c)) e produz este erro: `malloc(): corrupted top size`
* Você pode tentar o [**código daqui**](https://guyinatuxedo.github.io/41-house\_of\_force/house\_force\_exp/index.html) para testá-lo se quiser.
### Objetivo
* O objetivo deste ataque é ser capaz de alocar um chunk em um endereço específico.
### Requisitos
* Um overflow que permita sobrescrever o tamanho do cabeçalho do top chunk (por exemplo, -1).
* Ser capaz de controlar o tamanho da alocação do heap.
### Ataque
Se um atacante quiser alocar um chunk no endereço P para sobrescrever um valor aqui. Ele começa sobrescrevendo o tamanho do top chunk com `-1` (talvez com um overflow). Isso garante que malloc não usará mmap para nenhuma alocação, pois o Top chunk sempre terá espaço suficiente.
Em seguida, calcule a distância entre o endereço do top chunk e o espaço alvo para alocar. Isso ocorre porque uma malloc com esse tamanho será realizada para mover o top chunk para essa posição. É assim que a diferença/tamanho pode ser facilmente calculada:
```c
// From https://github.com/shellphish/how2heap/blob/master/glibc_2.27/house_of_force.c#L59C2-L67C5
/*
* The evil_size is calulcated as (nb is the number of bytes requested + space for metadata):
* new_top = old_top + nb
* nb = new_top - old_top
* req + 2sizeof(long) = new_top - old_top
* req = new_top - old_top - 2sizeof(long)
* req = target - 2sizeof(long) - old_top - 2sizeof(long)
* req = target - old_top - 4*sizeof(long)
*/
```
Portanto, alocar um tamanho de `target - old_top - 4*sizeof(long)` (os 4 longs são devido aos metadados do chunk superior e do novo chunk quando alocado) moverá o chunk superior para o endereço que queremos sobrescrever.\
Em seguida, faça outro malloc para obter um chunk no endereço alvo.
### Referências e Outros Exemplos
* [https://github.com/shellphish/how2heap/tree/master](https://github.com/shellphish/how2heap/tree/master?tab=readme-ov-file)
* [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/)
* [https://heap-exploitation.dhavalkapil.com/attacks/house\_of\_force](https://heap-exploitation.dhavalkapil.com/attacks/house\_of\_force)
* [https://github.com/shellphish/how2heap/blob/master/glibc\_2.27/house\_of\_force.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.27/house\_of\_force.c)
* [https://guyinatuxedo.github.io/41-house\_of\_force/house\_force\_exp/index.html](https://guyinatuxedo.github.io/41-house\_of\_force/house\_force\_exp/index.html)
* [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/#hitcon-training-lab-11](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/#hitcon-training-lab-11)
* O objetivo deste cenário é um ret2win onde precisamos modificar o endereço de uma função que será chamada pelo endereço da função ret2win.
* O binário tem um overflow que pode ser explorado para modificar o tamanho do chunk superior, que é modificado para -1 ou p64(0xffffffffffffffff).
* Em seguida, é calculado o endereço do lugar onde o ponteiro a ser sobrescrito existe, e a diferença da posição atual do chunk superior até lá é alocada com `malloc`.
* Finalmente, um novo chunk é alocado que conterá este alvo desejado dentro do qual é sobrescrito pela função ret2win.
* [https://shift--crops-hatenablog-com.translate.goog/entry/2016/03/21/171249?\_x\_tr\_sl=es&\_x\_tr\_tl=en&\_x\_tr\_hl=en&\_x\_tr\_pto=wapp](https://shift--crops-hatenablog-com.translate.goog/entry/2016/03/21/171249?\_x\_tr\_sl=es&\_x\_tr\_tl=en&\_x\_tr\_hl=en&\_x\_tr\_pto=wapp)
* No `Input your name:` há uma vulnerabilidade inicial que permite vazar um endereço da heap.
* Então, na funcionalidade `Org:` e `Host:`, é possível preencher os 64B do ponteiro `s` quando solicitado pelo **nome da org**, que na pilha é seguido pelo endereço de v2, que é então seguido pelo **nome do host** indicado. Como então, strcpy vai copiar o conteúdo de s para um chunk de tamanho 64B, é possível **sobrescrever o tamanho do chunk superior** com os dados colocados dentro do **nome do host**.
* Agora que a escrita arbitrária é possível, o GOT de `atoi` foi sobrescrito para o endereço de printf. Assim, foi possível vazar o endereço de `IO_2_1_stderr` _com_ `%24$p`. E com esse vazamento de libc foi possível sobrescrever novamente o GOT de `atoi` com o endereço de `system` e chamá-lo passando como parâmetro `/bin/sh`.
* Um método alternativo [proposto neste outro relatório](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/#2016-bctf-bcloud) é sobrescrever `free` com `puts`, e então adicionar o endereço de `atoi@got`, no ponteiro que será posteriormente liberado para que seja vazado e com esse vazamento sobrescrever novamente `atoi@got` com `system` e chamá-lo com `/bin/sh`.
* [https://guyinatuxedo.github.io/41-house\_of\_force/bkp16\_cookbook/index.html](https://guyinatuxedo.github.io/41-house\_of\_force/bkp16\_cookbook/index.html)
* Há um UAF permitindo reutilizar um chunk que foi liberado sem limpar o ponteiro. Devido a alguns métodos de leitura, é possível vazar um endereço da libc escrevendo um ponteiro para a função free no GOT aqui e então chamando a função de leitura.
* Em seguida, a House of force foi usada (abusando do UAF) para sobrescrever o tamanho do espaço restante com um -1, alocar um chunk grande o suficiente para chegar ao free hook, e então alocar outro chunk que conterá o free hook. Depois, escrever no hook o endereço de `system`, escrever em um chunk `"/bin/sh"` e finalmente liberar o chunk com o conteúdo dessa string.
{% hint style="success" %}
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-nos no** **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
</details>
{% endhint %}