12 KiB
Metodologia Básica de Exploração Binária
Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras maneiras de apoiar o HackTricks:
- Se você deseja ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF, confira os PLANOS DE ASSINATURA!
- Adquira o swag oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Junte-se ao 💬 grupo Discord ou ao grupo telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe seus truques de hacking enviando PRs para os repositórios HackTricks e HackTricks Cloud.
Informações Básicas sobre ELF
Antes de começar a explorar qualquer coisa, é interessante entender parte da estrutura de um binário ELF:
{% content-ref url="elf-tricks.md" %} elf-tricks.md {% endcontent-ref %}
Ferramentas de Exploração
{% content-ref url="tools/" %} ferramentas {% endcontent-ref %}
Metodologia de Estouro de Pilha
Com tantas técnicas, é bom ter um esquema de quando cada técnica será útil. Note que as mesmas proteções afetarão diferentes técnicas. Você pode encontrar maneiras de contornar as proteções em cada seção de proteção, mas não nesta metodologia.
Controlando o Fluxo
Existem diferentes maneiras de controlar o fluxo de um programa:
- Estouros de Pilha sobrescrevendo o ponteiro de retorno da pilha ou o EBP -> ESP -> EIP.
- Pode ser necessário abusar de um Estouro de Inteiro para causar o estouro
- Ou via Gravação Arbitrária + Escrever O Que Onde para Execução
- Strings de Formato: Abusar do
printf
para escrever conteúdo arbitrário em endereços arbitrários. - Indexação de Arrays: Abusar de uma indexação mal projetada para poder controlar alguns arrays e obter uma gravação arbitrária.
- Pode ser necessário abusar de um Estouro de Inteiro para causar o estouro
- bof para WWW via ROP: Abusar de um estouro de buffer para construir um ROP e ser capaz de obter um WWW.
Você pode encontrar as técnicas de Escrever O Que Onde para Execução em:
{% content-ref url="../arbitrary-write-2-exec/" %} arbitrary-write-2-exec {% endcontent-ref %}
Laços Eternos
Algo a se ter em conta é que geralmente apenas uma exploração de uma vulnerabilidade pode não ser suficiente para executar um exploit com sucesso, especialmente se algumas proteções precisarem ser contornadas. Portanto, é interessante discutir algumas opções para tornar uma única vulnerabilidade explorável várias vezes na mesma execução do binário:
- Escrever em uma cadeia ROP o endereço da função
main
ou para o endereço onde a vulnerabilidade está ocorrendo. - Controlando uma cadeia ROP apropriada, você pode ser capaz de realizar todas as ações nessa cadeia
- Escrever no endereço
exit
em GOT (ou em qualquer outra função usada pelo binário antes de terminar) o endereço para voltar à vulnerabilidade - Como explicado em .fini_array, armazene 2 funções aqui, uma para chamar a vulnerabilidade novamente e outra para chamar**
__libc_csu_fini
** que chamará novamente a função de.fini_array
.
Objetivos de Exploração
Objetivo: Chamar uma Função Existente
- ret2win: Existe uma função no código que você precisa chamar (talvez com alguns parâmetros específicos) para obter a flag.
- Em um bof regular sem PIE e canary, você só precisa escrever o endereço no endereço de retorno armazenado na pilha.
- Em um bof com PIE, você precisará contorná-lo
- Em um bof com canary, você precisará contorná-lo
- Se você precisar definir vários parâmetros para chamar corretamente a função ret2win, você pode usar:
- Uma cadeia ROP se houver gadgets suficientes para preparar todos os parâmetros
- SROP (caso possa chamar essa chamada de sistema) para controlar muitos registradores
- Gadgets de ret2csu e ret2vdso para controlar vários registradores
- Através de um Escrever O Que Onde você poderia abusar de outras vulnerabilidades (não bof) para chamar a função
win
. - Redirecionamento de Ponteiros: Caso a pilha contenha ponteiros para uma função que será chamada ou para uma string que será usada por uma função interessante (system ou printf), é possível sobrescrever esse endereço.
- ASLR ou PIE podem afetar os endereços.
- Variáveis não inicializadas: Você nunca sabe.
Objetivo: RCE
Via shellcode, se nx desativado ou misturando shellcode com ROP:
- (Stack) Shellcode: Isso é útil para armazenar um shellcode na pilha antes ou depois de sobrescrever o ponteiro de retorno e então pular para ele para executá-lo:
- De qualquer forma, se houver um canary, em um bof regular você precisará contorná-lo (vazar)
- Sem ASLR e nx é possível pular para o endereço da pilha, pois ele nunca mudará
- Com ASLR, você precisará de técnicas como ret2esp/ret2reg para pular para ele
- Com nx, você precisará usar algum ROP para chamar
memprotect
e tornar alguma páginarwx
, para então armazenar o shellcode lá (chamando read, por exemplo) e então pular para lá. - Isso misturará shellcode com uma cadeia ROP.
Via syscalls
- Ret2syscall: Útil para chamar
execve
para executar comandos arbitrários. Você precisa ser capaz de encontrar os gadgets para chamar a syscall específica com os parâmetros. - Se o ASLR ou PIE estiverem ativados, você precisará derrotá-los para usar gadgets ROP do binário ou bibliotecas.
- SROP pode ser útil para preparar o ret2execve
- Gadgets de ret2csu e ret2vdso para controlar vários registradores
Via libc
- Ret2lib: Útil para chamar uma função de uma biblioteca (geralmente de
libc
) comosystem
com alguns argumentos preparados (por exemplo,'/bin/sh'
). Você precisa que o binário carregue a biblioteca com a função que deseja chamar (geralmente libc). - Se compilado estaticamente e sem PIE, o endereço de
system
e/bin/sh
não vão mudar, então é possível usá-los estaticamente. - Sem ASLR e conhecendo a versão da libc carregada, o endereço de
system
e/bin/sh
não vão mudar, então é possível usá-los estaticamente. - Com ASLR mas sem PIE, conhecendo a libc e com o binário usando a função
system
é possívelret
para o endereço do system no GOT com o endereço de'/bin/sh'
no parâmetro (você precisará descobrir isso). - Com ASLR mas sem PIE, conhecendo a libc e sem o binário usando o
system
: - Use
ret2dlresolve
para resolver o endereço desystem
e chamá-lo - Burlar ASLR e calcular o endereço de
system
e'/bin/sh'
na memória. - Com ASLR e PIE e sem conhecer a libc: Você precisa:
- Burlar PIE
- Encontrar a versão da libc usada (vazar alguns endereços de funções)
- Verificar os cenários anteriores com ASLR para continuar.
Via EBP/RBP
- Stack Pivoting / EBP2Ret / EBP Chaining: Controle o ESP para controlar o RET através do EBP armazenado na pilha.
- Útil para estouro de pilha off-by-one
- Útil como uma maneira alternativa de controlar o EIP enquanto abusa do EIP para construir a carga na memória e depois pular para ela via EBP
Misc
- Redirecionamento de Ponteiros: Caso a pilha contenha ponteiros para uma função que será chamada ou para uma string que será usada por uma função interessante (system ou printf), é possível sobrescrever esse endereço.
- ASLR ou PIE podem afetar os endereços.
- Variáveis não inicializadas: Você nunca sabe
Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras maneiras de apoiar o HackTricks:
- Se você quiser ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF Confira os PLANOS DE ASSINATURA!
- Adquira o swag oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Junte-se ao 💬 grupo Discord ou ao grupo telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe seus truques de hacking enviando PRs para HackTricks e HackTricks Cloud github repos.