Fast Bin Attack
Last updated
Last updated
Aprenda e pratique Hacking na AWS: HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking no GCP: HackTricks Training GCP Red Team Expert (GRTE)
Para mais informações sobre o que é um fast bin, consulte esta página:
Bins & Memory AllocationsComo o fast bin é uma lista encadeada simples, há muito menos proteções do que em outros bins e apenas modificar um endereço em um chunk fast bin liberado é suficiente para poder alocar posteriormente um chunk em qualquer endereço de memória.
Em resumo:
Você pode encontrar um exemplo completo em um código muito bem explicado em https://guyinatuxedo.github.io/28-fastbin_attack/explanation_fastbinAttack/index.html:
Se for possível sobrescrever o valor da variável global global_max_fast
com um número grande, isso permite gerar pedaços de fast bin de tamanhos maiores, potencialmente permitindo realizar ataques de fast bin em cenários onde anteriormente não era possível. Essa situação é útil no contexto do ataque large bin e ataque unsorted bin.
É possível alocar pedaços, liberá-los, ler seus conteúdos e preenchê-los (com uma vulnerabilidade de overflow).
Consolidar pedaço para vazamento de informações: A técnica consiste basicamente em abusar do overflow para criar um prev_size
falso para que um pedaço anterior seja colocado dentro de um maior, de modo que ao alocar o maior contendo outro pedaço, seja possível imprimir seus dados e vazar um endereço para o libc (main_arena+88
).
Sobrescrever o hook do malloc: Para isso, e abusando da situação de sobreposição anterior, foi possível ter 2 pedaços apontando para a mesma memória. Portanto, liberando ambos (liberando outro pedaço no meio para evitar proteções), foi possível ter o mesmo pedaço no fast bin 2 vezes. Em seguida, foi possível alocá-lo novamente, sobrescrever o endereço para o próximo pedaço para apontar um pouco antes de __malloc_hook
(para que aponte para um inteiro que o malloc pensa ser um tamanho livre - outra forma de bypass), alocá-lo novamente e então alocar outro pedaço que receberá um endereço para os hooks do malloc.
Finalmente, um one gadget foi escrito lá.
Há um overflow de heap e uso após liberação e liberação dupla porque quando um pedaço é liberado é possível reutilizar e liberar novamente os ponteiros.
Vazamento de informações do libc: Basta liberar alguns pedaços e eles receberão um ponteiro para uma parte da localização da main arena. Como é possível reutilizar ponteiros liberados, basta ler este endereço.
Ataque de fast bin: Todos os ponteiros para as alocações são armazenados dentro de um array, então podemos liberar alguns pedaços de fast bin e no último sobrescrever o endereço para apontar um pouco antes deste array de ponteiros. Em seguida, alocar alguns pedaços com o mesmo tamanho e obteremos primeiro o legítimo e depois o falso contendo o array de ponteiros. Agora podemos sobrescrever esses ponteiros de alocação para fazer o endereço GOT de free
apontar para system
e então escrever "/bin/sh"
no pedaço 1 para então chamar free(chunk1)
que em vez disso executará system("/bin/sh")
.
Outro exemplo de abuso de um overflow de um byte para consolidar pedaços no unsorted bin e obter um vazamento de informações do libc e em seguida realizar um ataque de fast bin para sobrescrever o hook do malloc com um endereço de one gadget
Após um vazamento de informações abusando do unsorted bin com um UAF para vazar um endereço do libc e um endereço do PIE, o exploit deste CTF usou um ataque de fast bin para alocar um pedaço em um local onde os ponteiros para pedaços controlados estavam localizados, então foi possível sobrescrever certos ponteiros para escrever um one gadget no GOT
Você pode encontrar um ataque de Fast Bin abusado através de um ataque unsorted bin:
Note que é comum antes de realizar ataques de fast bin abusar das listas de liberação para vazar endereços do libc/heap (quando necessário).
Só podemos alocar pedaços de tamanho maior que 0x100
.
Sobrescrever global_max_fast
usando um ataque Unsorted Bin (funciona 1/16 vezes devido ao ASLR, porque precisamos modificar 12 bits, mas devemos modificar 16 bits).
Ataque de Fast Bin para modificar um array global de pedaços. Isso fornece um primitivo de leitura/escrita arbitrária, o que permite modificar o GOT e fazer com que alguma função aponte para system
.
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)