House of Force
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Esta técnica foi corrigida (aqui) e produz este erro: malloc(): corrupted top size
Você pode tentar o código daqui para testá-lo se quiser.
O objetivo deste ataque é ser capaz de alocar um chunk em um endereço específico.
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.
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:
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.
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.
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 é 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
.
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.
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)