
Una prueba de concepto de un desbordamiento SEH con inyección de dll arbitraria
Una prueba de concepto de un desbordamiento SEH con inyección de DLL arbitraria
Kolibrì HTTP Server 2.0 está afectado por un desbordamiento de búfer basado en pila. En el momento del descubrimiento, esta vulnerabilidad se explotaba simplemente sobrescribiendo el puntero de instrucción con una instrucción JMP ESP, donde ESP apuntaba al shellcode depositado en la pila. Posteriormente, se descubrió que la cadena SEH podía sobrescribirse si se enviaba un payload más grande. Sin embargo, la aplicación no tiene instrucciones POP - POP - RET válidas para que el manejador SE apunte al siguiente registro SEH. Esto se debe a que todas las direcciones de memoria relacionadas comienzan con un byte nulo.

Este exploit propone la ejecución de código mediante un desbordamiento SEH a través de la inyección de DLL. Inyectar una DLL arbitraria en el proceso de Kolibrì abre la oportunidad de sobrescribir el manejador SE con una dirección libre de bytes nulos que apunte a una instrucción POP - POP - RET de esa DLL. Claramente, este método solo puede usarse para desarrollar una prueba de concepto y no se puede confiar en él si la explotación se realiza para elevar privilegios del sistema localmente. Esto se debe a que necesitas tener los mismos privilegios del proceso objetivo si deseas inyectar una DLL en él. Aparte de eso, ¡el exploit funciona!

Cuando subí este exploit por primera vez, solo soportaba shellcode personalizados muy cortos con direcciones hardcodeadas de WinExec y ExitProcess. Esto se debía al espacio de búfer reducido después de sobrescribir el SEH. Ahora acabo de actualizar el código del exploit implementando un shellcode egghunter justo después del SEH y colocando el huevo + el shellcode en la cabecera User-Agent del servidor web. Así, el flujo de ejecución se redirigirá desde el SEH sobrescrito al egghunter, que luego buscará el shellcode marcado con el huevo 'w00t'.
El crédito por este método es para FULLSHADE de este repositorio original.
https://github.com/FULLSHADE/POPPOPRET-nullbyte-bypass
Todo lo que he hecho es aplicar la idea a este CVE específico.