.. | ||
tools | ||
elf-tricks.md | ||
README.md |
Metodología Básica de Explotación de Binarios
{% hint style="success" %}
Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)
Apoya a HackTricks
- ¡Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
Información Básica sobre ELF
Antes de comenzar a explotar cualquier cosa, es interesante entender parte de la estructura de un binario ELF:
{% content-ref url="elf-tricks.md" %} elf-tricks.md {% endcontent-ref %}
Herramientas de Explotación
{% content-ref url="tools/" %} herramientas {% endcontent-ref %}
Metodología de Desbordamiento de Pila
Con tantas técnicas, es bueno tener un esquema de cuándo cada técnica será útil. Ten en cuenta que las mismas protecciones afectarán a diferentes técnicas. Puedes encontrar formas de evadir las protecciones en cada sección de protección, pero no en esta metodología.
Controlando el Flujo
Hay diferentes formas en las que podrías terminar controlando el flujo de un programa:
- Desbordamientos de Pila sobrescribiendo el puntero de retorno de la pila o el EBP -> ESP -> EIP.
- Podrías necesitar abusar de un Desbordamiento de Enteros para causar el desbordamiento.
- O a través de Escrituras Arbitrarias + Escribir Qué Dónde a la Ejecución
- Cadenas de Formato: Abusar de
printf
para escribir contenido arbitrario en direcciones arbitrarias. - Indexación de Arreglos: Abusar de una indexación mal diseñada para poder controlar algunos arreglos y obtener una escritura arbitraria.
- Podrías necesitar abusar de un Desbordamiento de Enteros para causar el desbordamiento.
- bof a WWW a través de ROP: Abusar de un desbordamiento de búfer para construir un ROP y poder obtener un WWW.
Puedes encontrar las técnicas de Escribir Qué Dónde a la Ejecución en:
{% content-ref url="../arbitrary-write-2-exec/" %} arbitrary-write-2-exec {% endcontent-ref %}
Bucles Eternos
Algo a tener en cuenta es que usualmente solo una explotación de una vulnerabilidad podría no ser suficiente para ejecutar un exploit exitoso, especialmente si se necesitan evadir algunas protecciones. Por lo tanto, es interesante discutir algunas opciones para hacer que una sola vulnerabilidad sea explotable varias veces en la misma ejecución del binario:
- Escribir en una cadena ROP la dirección de la función
main
o la dirección donde está ocurriendo la vulnerabilidad. - Controlando una cadena ROP adecuada podrías ser capaz de realizar todas las acciones en esa cadena.
- Escribir en la dirección de
exit
en GOT (o cualquier otra función utilizada por el binario antes de finalizar) la dirección para volver a la vulnerabilidad. - Como se explica en .fini_array, almacenar 2 funciones aquí, una para llamar nuevamente a la vulnerabilidad y otra para llamar a
__libc_csu_fini
que llamará nuevamente a la función de.fini_array
.
Objetivos de Explotación
Objetivo: Llamar a una función Existente
- ret2win: Hay una función en el código que necesitas llamar (quizás con algunos parámetros específicos) para obtener la bandera.
- En un bof regular sin PIE y canary, solo necesitas escribir la dirección en la dirección de retorno almacenada en la pila.
- En un bof con PIE, necesitarás evadirlo.
- En un bof con canary, necesitarás evadirlo.
- Si necesitas establecer varios parámetros para llamar correctamente a la función ret2win puedes usar:
- Una cadena ROP si hay suficientes gadgets para preparar todos los parámetros.
- SROP (en caso de que puedas llamar a esta llamada al sistema) para controlar muchos registros.
- Gadgets de ret2csu y ret2vdso para controlar varios registros.
- A través de un Escribir Qué Dónde podrías abusar de otras vulnerabilidades (no bof) para llamar a la función
win
. - Redirección de Punteros: En caso de que la pila contenga punteros a una función que va a ser llamada o a una cadena que va a ser utilizada por una función interesante (system o printf), es posible sobrescribir esa dirección.
- ASLR o PIE podrían afectar las direcciones.
- Variables no inicializadas: Nunca se sabe.
Objetivo: RCE
A través de shellcode, si nx está deshabilitado o mezclando shellcode con ROP:
- (Stack) Shellcode: Esto es útil para almacenar un shellcode en la pila antes o después de sobrescribir el puntero de retorno y luego saltar a él para ejecutarlo:
- En cualquier caso, si hay un canary, en un bof regular necesitarás evadirlo (filtrarlo).
- Sin ASLR y nx es posible saltar a la dirección de la pila ya que nunca cambiará.
- Con ASLR necesitarás técnicas como ret2esp/ret2reg para saltar a ella.
- Con nx, necesitarás usar algún ROP para llamar a
memprotect
y hacer que alguna página searwx
, para luego almacenar el shellcode allí (llamando a read por ejemplo) y luego saltar allí. - Esto mezclará shellcode con una cadena ROP.
A través de syscalls
- Ret2syscall: Útil para llamar a
execve
y ejecutar comandos arbitrarios. Necesitas encontrar los gadgets para llamar al syscall específico con los parámetros. - Si se activa ASLR o PIE, necesitarás vencerlos para poder usar los gadgets ROP del binario o las bibliotecas.
- SROP puede ser útil para preparar el ret2execve.
- Gadgets de ret2csu y ret2vdso para controlar varios registros.
A través de libc
- Ret2lib: Útil para llamar a una función de una biblioteca (generalmente de
libc
) comosystem
con algunos argumentos preparados (por ejemplo,'/bin/sh'
). Necesitas que el binario cargue la biblioteca con la función que deseas llamar (generalmente libc). - Si está compilado estáticamente y no hay PIE, la dirección de
system
y/bin/sh
no cambiarán, por lo que es posible usarlos estáticamente. - Sin ASLR y conociendo la versión de libc cargada, la dirección de
system
y/bin/sh
no cambiarán, por lo que es posible usarlos estáticamente. - Con ASLR pero sin PIE, conociendo la libc y con el binario utilizando la función
system
es posibleret
a la dirección de system en el GOT con la dirección de'/bin/sh'
en el parámetro (tendrás que descubrirlo). - Con ASLR pero sin PIE, conociendo la libc y sin que el binario utilice el
system
: - Usa
ret2dlresolve
para resolver la dirección desystem
y llamarla. - Evade ASLR y calcula la dirección de
system
y'/bin/sh'
en memoria. - Con ASLR y PIE y sin conocer la libc: Necesitas:
- Evadir PIE.
- Encontrar la versión de
libc
utilizada (filtrar un par de direcciones de funciones). - Verificar los escenarios anteriores con ASLR para continuar.
A través de EBP/RBP
- Pivoteo de pila / EBP2Ret / EBP Chaining: Controla el ESP para controlar RET a través del EBP almacenado en la pila.
- Útil para desbordamientos de pila off-by-one.
- Útil como una forma alternativa de controlar EIP mientras se abusa de EIP para construir la carga útil en memoria y luego saltar a ella a través de EBP.
Misceláneo
- Redirección de punteros: En caso de que la pila contenga punteros a una función que va a ser llamada o a una cadena que va a ser utilizada por una función interesante (system o printf), es posible sobrescribir esa dirección.
- ASLR o PIE podrían afectar las direcciones.
- Variables no inicializadas: Nunca se sabe.