# Ataque ao Tcache Bin {% hint style="success" %} Aprenda e pratique Hacking na AWS:[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ Aprenda e pratique Hacking no GCP: [**Treinamento HackTricks GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Apoie o HackTricks * Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)! * **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Compartilhe truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
{% endhint %} ## Informações Básicas Para mais informações sobre o que é um Tcache bin, consulte esta página: {% content-ref url="bins-and-memory-allocations.md" %} [bins-and-memory-allocations.md](bins-and-memory-allocations.md) {% endcontent-ref %} Em primeiro lugar, observe que o Tcache foi introduzido na versão 2.26 do Glibc. O **ataque ao Tcache** (também conhecido como **Tcache poisoning**) proposto na [**página guyinatuxido**](https://guyinatuxedo.github.io/29-tcache/tcache\_explanation/index.html) é muito semelhante ao ataque ao fast bin, onde o objetivo é sobrescrever o ponteiro para o próximo chunk no bin dentro de um chunk liberado para um endereço arbitrário, para mais tarde ser possível **alocar esse endereço específico e potencialmente sobrescrever ponteiros**. No entanto, atualmente, se você executar o código mencionado, receberá o erro: **`malloc(): unaligned tcache chunk detected`**. Portanto, é necessário escrever um endereço alinhado no novo ponteiro (ou executar o binário várias vezes para que o endereço escrito esteja realmente alinhado). ### Ataque aos índices do Tcache Normalmente, é possível encontrar no início do heap um chunk contendo a **quantidade de chunks por índice** dentro do tcache e o endereço do **chunk de cabeça de cada índice do tcache**. Se, por algum motivo, for possível modificar essas informações, seria possível **fazer o chunk de cabeça de algum índice apontar para um endereço desejado** (como `__malloc_hook`) para então alocar um chunk do tamanho do índice e sobrescrever o conteúdo de `__malloc_hook` neste caso. ## Exemplos * CTF [https://guyinatuxedo.github.io/29-tcache/dcquals19\_babyheap/index.html](https://guyinatuxedo.github.io/29-tcache/dcquals19\_babyheap/index.html) * **Vazamento de informações do Libc**: É possível preencher os tcaches, adicionar um chunk na lista não ordenada, esvaziar o tcache e **realocar o chunk da lista não ordenada** sobrescrevendo apenas os primeiros 8B, deixando o **segundo endereço para o libc do chunk intacto para que possamos lê-lo**. * **Ataque ao Tcache**: O binário é vulnerável a um estouro de heap de 1B. Isso será abusado para alterar o **cabeçalho de tamanho** de um chunk alocado, tornando-o maior. Em seguida, este chunk será **liberado**, adicionando-o ao tcache de chunks do tamanho falso. Em seguida, alocaremos um chunk com o tamanho falsificado, e o chunk anterior será **retornado sabendo que este chunk era realmente menor** e isso nos dá a oportunidade de **sobrescrever o próximo chunk na memória**.\ Vamos abusar disso para **sobrescrever o ponteiro FD do próximo chunk** para apontar para **`malloc_hook`**, então é possível alocar 2 ponteiros: primeiro o ponteiro legítimo que acabamos de modificar e, em seguida, a segunda alocação retornará um chunk em **`malloc_hook`** que pode ser abusado para escrever um **one gadget**. * CTF [https://guyinatuxedo.github.io/29-tcache/plaid19\_cpp/index.html](https://guyinatuxedo.github.io/29-tcache/plaid19\_cpp/index.html) * **Vazamento de informações do Libc**: Há um uso após free e um double free. Neste writeup, o autor vazou um endereço do libc lendo o endereço de um chunk colocado em um bin pequeno (como vazando-o do bin não ordenado, mas do pequeno). * **Ataque ao Tcache**: Um Tcache é realizado via um **double free**. O mesmo chunk é liberado duas vezes, então dentro do Tcache o chunk apontará para si mesmo. Em seguida, ele é alocado, seu ponteiro FD é modificado para apontar para o **free hook** e então é alocado novamente para que o próximo chunk na lista vá para o free hook. Em seguida, isso também é alocado e é possível escrever o endereço do `system` aqui, então quando um malloc contendo `"/bin/sh"` é liberado, obtemos um shell. * CTF [https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps0/index.html](https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps0/index.html) * A principal vulnerabilidade aqui é a capacidade de `liberar` qualquer endereço no heap indicando seu deslocamento * **Ataque aos índices do Tcache**: É possível alocar e liberar um chunk de um tamanho que, quando armazenado dentro do chunk do tcache (o chunk com as informações dos bins do tcache), gerará um **endereço com o valor 0x100**. Isso ocorre porque o tcache armazena a quantidade de chunks em cada bin em bytes diferentes, portanto um chunk em um índice específico gera o valor 0x100. * Em seguida, esse valor parece que há um chunk de tamanho 0x100. Permitindo abusar disso ao `liberar` este endereço. Isso irá **adicionar esse endereço ao índice de chunks de tamanho 0x100 no tcache**. * Em seguida, **alocando** um chunk de tamanho **0x100**, o endereço anterior será retornado como um chunk, permitindo sobrescrever outros índices do tcache.\ Por exemplo, colocar o endereço do gancho malloc em um deles e alocar um chunk do tamanho desse índice concederá um chunk no gancho calloc, o que permite escrever um one gadget para obter um shell. * CTF [https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps1/index.html](https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps1/index.html) * Mesma vulnerabilidade que antes com uma restrição extra * **Ataque aos índices do Tcache**: Ataque semelhante ao anterior, mas usando menos etapas ao **liberar o chunk que contém as informações do tcache** para que seu endereço seja adicionado ao índice do tcache de seu tamanho, permitindo alocar esse tamanho e obter as informações do chunk do tcache como um chunk, o que permite adicionar o gancho free como o endereço de um índice, alocá-lo e escrever um one gadget nele. * [**Math Door. HTB Cyber Apocalypse CTF 2023**](https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/math-door/) * **Write After Free** para adicionar um número ao ponteiro `fd`. * Muito **heap feng-shui** é necessário neste desafio. O writeup mostra como **controlar a cabeça da lista livre do Tcache** é bastante útil. * **Vazamento do Glibc** através do `stdout` (FSOP). * **Tcache poisoning** para obter um primitivo de escrita arbitrário. {% hint style="success" %} Aprenda e pratique Hacking na AWS:[**Treinamento HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ Aprenda e pratique Hacking no GCP: [**Treinamento HackTricks GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Apoie o HackTricks * 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 os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) no github.