Ret2lib
Last updated
Last updated
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
A essência do Ret2Libc é redirecionar o fluxo de execução de um programa vulnerável para uma função dentro de uma biblioteca compartilhada (por exemplo, system, execve, strcpy) em vez de executar shellcode fornecido pelo atacante na pilha. O atacante cria um payload que modifica o endereço de retorno na pilha para apontar para a função da biblioteca desejada, enquanto também organiza para que quaisquer argumentos necessários sejam configurados corretamente de acordo com a convenção de chamada.
Obtenha o endereço da função a ser chamada (por exemplo, system) e o comando a ser chamado (por exemplo, /bin/sh)
Gere uma cadeia ROP para passar o primeiro argumento apontando para a string do comando e o fluxo de execução para a função
Supondo que a libc
utilizada seja a da máquina atual, você pode encontrar onde ela será carregada na memória com:
Se você quiser verificar se o ASLR está mudando o endereço da libc, você pode fazer:
Sabendo a libc utilizada, também é possível encontrar o offset para a função system
com:
Sabendo a libc utilizada, também é possível encontrar o deslocamento para a string /bin/sh
com:
Sabendo a libc utilizada, também é possível usar Peda ou GEF para obter o endereço da função system, da função exit e da string /bin/sh
:
Se o processo estiver criando filhos toda vez que você interage com ele (servidor de rede), tente ler esse arquivo (provavelmente você precisará ser root).
Aqui você pode encontrar exatamente onde a libc está carregada dentro do processo e onde será carregada para cada filho do processo.
Neste caso, está carregada em 0xb75dc000 (Este será o endereço base da libc)
Pode ser possível que você não saiba qual libc o binário está carregando (porque pode estar localizado em um servidor onde você não tem acesso). Nesse caso, você poderia abusar da vulnerabilidade para vazar alguns endereços e descobrir qual biblioteca libc está sendo usada:
Leaking libc address with ROPE você pode encontrar um template do pwntools para isso em:
Leaking libc - templateVerifique a página https://libc.blukat.me/ e use um casal de endereços de funções dentro da libc para descobrir a versão utilizada.
Esses ataques de força bruta são úteis apenas para sistemas de 32 bits.
Se o exploit for local, você pode tentar forçar o endereço base da libc (útil para sistemas de 32 bits):
Se você estiver atacando um servidor remoto, pode tentar forçar a descoberta do endereço da função usleep
da libc
, passando como argumento 10 (por exemplo). Se em algum momento o servidor levar 10s a mais para responder, você encontrou o endereço dessa função.
Execute um shell apenas pulando para um endereço específico na libc:
One GadgetNeste exemplo, a força bruta do ASLR está integrada no código e o binário vulnerável está localizado em um servidor remoto:
Verifique o exemplo em:
ROP - Return Oriented ProgramingNo caso do ARM64, a instrução ret salta para onde o registrador x30 está apontando e não para onde o registrador da pilha está apontando. Portanto, é um pouco mais complicado.
Além disso, no ARM64, uma instrução faz o que a instrução faz (não é possível saltar no meio das instruções e transformá-las em novas).
Verifique o exemplo em:
Ret2lib + Printf leak - arm64Isso permite vazar informações do processo chamando printf
/puts
com alguns dados específicos colocados como argumento. Por exemplo, colocar o endereço de puts
no GOT em uma execução de puts
irá vazar o endereço de puts
na memória.
Isso basicamente significa abusar de um Ret2lib para transformá-lo em uma vulnerabilidade de strings de formato printf
usando o ret2lib
para chamar printf com os valores para explorá-lo (parece inútil, mas é possível):
Ret2lib, dado um leak para o endereço de uma função na libc, usando um gadget
64 bits, ASLR habilitado, mas sem PIE, o primeiro passo é preencher um overflow até o byte 0x00 do canário para então chamar puts e vazá-lo. Com o canário, um gadget ROP é criado para chamar puts para vazar o endereço de puts do GOT e um gadget ROP para chamar system('/bin/sh')
64 bits, ASLR habilitado, sem canário, overflow de pilha na função principal de uma função filha. Gadget ROP para chamar puts para vazar o endereço de puts do GOT e então chamar um gadget.
64 bits, sem pie, sem canário, sem relro, nx. Usa a função write para vazar o endereço de write (libc) e chama um gadget.
Usa uma string de formato para vazar o canário da pilha e um buffer overflow para chamar system (está no GOT) com o endereço de /bin/sh
.
32 bits, sem relro, sem canário, nx, pie. Abusa de um indexação ruim para vazar endereços da libc e heap da pilha. Abusa do buffer overflow para fazer um ret2lib chamando system('/bin/sh')
(o endereço da heap é necessário para contornar uma verificação).
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)