
Uma prova de conceito de um estouro de SEH com injeção arbitrária de DLL.
Uma prova de conceito de um estouro de SEH com injeção arbitrária de DLL
O Kolibrì HTTP Server 2.0 é afetado por um estouro de buffer baseado em pilha. Na época da descoberta, essa vulnerabilidade era explorada simplesmente sobrescrevendo o ponteiro de instrução com uma instrução JMP ESP, onde ESP apontava para o shellcode depositado na pilha. Posteriormente, descobriu-se que a cadeia SEH poderia ser sobrescrita se um payload maior fosse enviado. No entanto, o aplicativo não possui instruções válidas POP - POP - RET para fazer o SE handler apontar para o próximo registro SEH. Isso ocorre porque todos os endereços de memória relacionados começam com um nullbyte.

Este exploit propõe execução de código via estouro de SEH por meio de injeção de DLL. Injetar uma DLL arbitrária no processo do Kolibrì abre uma oportunidade para sobrescrever o SE handler com um endereço sem nullbyte que aponte para uma instrução POP - POP - RET dessa DLL. Claramente, este método só pode ser usado para desenvolver uma prova de conceito, e não pode ser confiável se a exploração for realizada para elevar privilégios do sistema localmente. Isso ocorre porque você precisa ter os mesmos privilégios do processo alvo para injetar uma DLL nele. Fora isso, o exploit funciona!

Quando carreguei este exploit pela primeira vez, ele só suportava shellcodes personalizados muito curtos, com endereços fixos de WinExec e ExitProcess. Isso se devia ao curto espaço de buffer disponível após a sobrescrita do SEH. Agora, acabei de atualizar o código do exploit implantando um shellcode egghunter logo após o SEH e colocando o egg + o shellcode no cabeçalho User-Agent do servidor web. Assim, o fluxo de execução será redirecionado do SEH sobrescrito para o egghunter, que então procurará o shellcode marcado com o egg 'w00t'.
Os créditos por este método vão para FULLSHADE, deste repositório original.
https://github.com/FULLSHADE/POPPOPRET-nullbyte-bypass
Tudo o que fiz foi aplicar a ideia a este CVE específico.