House of Orange

Reading time: 7 minutes

tip

Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Apoya a HackTricks

Informaci贸n B谩sica

C贸digo

Objetivo

  • Abusar de la funci贸n malloc_printerr

Requisitos

  • Sobrescribir el tama帽o del chunk superior
  • Fugas de libc y heap

Antecedentes

Algunos antecedentes necesarios de los comentarios de este ejemplo:

La cuesti贸n es que, en versiones anteriores de libc, cuando se llamaba a la funci贸n malloc_printerr, iteraba a trav茅s de una lista de estructuras _IO_FILE almacenadas en _IO_list_all, y realmente ejecutaba un puntero de instrucci贸n en esa estructura.
Este ataque forjar谩 una estructura _IO_FILE falsa que escribiremos en _IO_list_all, y har谩 que malloc_printerr se ejecute.
Luego ejecutar谩 cualquier direcci贸n que hayamos almacenado en la tabla de saltos de las estructuras _IO_FILE, y obtendremos ejecuci贸n de c贸digo.

Ataque

El ataque comienza al lograr obtener el chunk superior dentro del bin no ordenado. Esto se logra llamando a malloc con un tama帽o mayor que el tama帽o actual del chunk superior pero menor que mmp_.mmap_threshold (el valor predeterminado es 128K), lo que de otro modo activar铆a la asignaci贸n mmap. Siempre que se modifique el tama帽o del chunk superior, es importante asegurarse de que el chunk superior + su tama帽o est茅 alineado a p谩gina y que el bit prev_inuse del chunk superior est茅 siempre establecido.

Para obtener el chunk superior dentro del bin no ordenado, asigna un chunk para crear el chunk superior, cambia el tama帽o del chunk superior (con un desbordamiento en el chunk asignado) de modo que chunk superior + tama帽o est茅 alineado a p谩gina con el bit prev_inuse establecido. Luego asigna un chunk m谩s grande que el nuevo tama帽o del chunk superior. Ten en cuenta que free nunca se llama para llevar el chunk superior al bin no ordenado.

El antiguo chunk superior ahora est谩 en el bin no ordenado. Suponiendo que podemos leer datos dentro de 茅l (posiblemente debido a una vulnerabilidad que tambi茅n caus贸 el desbordamiento), es posible filtrar direcciones de libc desde 茅l y obtener la direcci贸n de _IO_list_all.

Se realiza un ataque de bin no ordenado abusando del desbordamiento para escribir topChunk->bk->fwd = _IO_list_all - 0x10. Cuando se asigna un nuevo chunk, el antiguo chunk superior se dividir谩, y un puntero al bin no ordenado se escribir谩 en _IO_list_all.

El siguiente paso implica reducir el tama帽o del antiguo chunk superior para que quepa en un bin peque帽o, espec铆ficamente estableciendo su tama帽o en 0x61. Esto sirve para dos prop贸sitos:

  1. Inserci贸n en Small Bin 4: Cuando malloc escanea el bin no ordenado y ve este chunk, intentar谩 insertarlo en el bin peque帽o 4 debido a su peque帽o tama帽o. Esto hace que el chunk termine en la cabeza de la lista del bin peque帽o 4, que es la ubicaci贸n del puntero FD del chunk de _IO_list_all ya que escribimos una direcci贸n cercana en _IO_list_all a trav茅s del ataque de bin no ordenado.
  2. Activar una Verificaci贸n de Malloc: Esta manipulaci贸n del tama帽o del chunk har谩 que malloc realice verificaciones internas. Cuando verifica el tama帽o del chunk falso hacia adelante, que ser谩 cero, activa un error y llama a malloc_printerr.

La manipulaci贸n del bin peque帽o te permitir谩 controlar el puntero hacia adelante del chunk. La superposici贸n con _IO_list_all se utiliza para forjar una estructura _IO_FILE falsa. La estructura se elabora cuidadosamente para incluir campos clave como _IO_write_base y _IO_write_ptr establecidos en valores que pasan las verificaciones internas en libc. Adem谩s, se crea una tabla de saltos dentro de la estructura falsa, donde un puntero de instrucci贸n se establece en la direcci贸n donde se puede ejecutar c贸digo arbitrario (por ejemplo, la funci贸n system).

Para resumir la parte restante de la t茅cnica:

  • Reducir el Antiguo Chunk Superior: Ajustar el tama帽o del antiguo chunk superior a 0x61 para que quepa en un bin peque帽o.
  • Configurar la Estructura Falsa _IO_FILE: Superponer el antiguo chunk superior con la estructura falsa _IO_FILE y establecer los campos apropiadamente para secuestrar el flujo de ejecuci贸n.

El siguiente paso implica forjar una estructura falsa _IO_FILE que se superponga con el antiguo chunk superior actualmente en el bin no ordenado. Los primeros bytes de esta estructura se elaboran cuidadosamente para incluir un puntero a un comando (por ejemplo, "/bin/sh") que se ejecutar谩.

Los campos clave en la estructura falsa _IO_FILE, como _IO_write_base y _IO_write_ptr, se establecen en valores que pasan las verificaciones internas en libc. Adem谩s, se crea una tabla de saltos dentro de la estructura falsa, donde un puntero de instrucci贸n se establece en la direcci贸n donde se puede ejecutar c贸digo arbitrario. T铆picamente, esta ser铆a la direcci贸n de la funci贸n system u otra funci贸n que pueda ejecutar comandos de shell.

El ataque culmina cuando una llamada a malloc activa la ejecuci贸n del c贸digo a trav茅s de la estructura manipulada _IO_FILE. Esto permite efectivamente la ejecuci贸n de c贸digo arbitrario, lo que t铆picamente resulta en un shell que se genera o en otro payload malicioso que se ejecuta.

Resumen del Ataque:

  1. Configurar el chunk superior: Asignar un chunk y modificar el tama帽o del chunk superior.
  2. Forzar el chunk superior en el bin no ordenado: Asignar un chunk m谩s grande.
  3. Filtrar direcciones de libc: Usar la vulnerabilidad para leer del bin no ordenado.
  4. Realizar el ataque de bin no ordenado: Escribir en _IO_list_all usando un desbordamiento.
  5. Reducir el antiguo chunk superior: Ajustar su tama帽o para que quepa en un bin peque帽o.
  6. Configurar una estructura falsa _IO_FILE: Forjar una estructura de archivo falsa para secuestrar el flujo de control.
  7. Activar la ejecuci贸n de c贸digo: Asignar un chunk para ejecutar el ataque y ejecutar c贸digo arbitrario.

Este enfoque explota mecanismos de gesti贸n de heap, fugas de informaci贸n de libc y desbordamientos de heap para lograr la ejecuci贸n de c贸digo sin llamar directamente a free. Al elaborar cuidadosamente la estructura falsa _IO_FILE y colocarla en la ubicaci贸n correcta, el ataque puede secuestrar el flujo de control durante las operaciones est谩ndar de asignaci贸n de memoria. Esto permite la ejecuci贸n de c贸digo arbitrario, lo que potencialmente resulta en un shell u otras actividades maliciosas.

Referencias

tip

Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Apoya a HackTricks