hacktricks/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections/aslr.md

6.5 KiB

ASLR

Aprende hacking en AWS desde cero hasta experto con htARTE (Experto en Equipos Rojos de AWS de HackTricks)!

Otras formas de apoyar a HackTricks:

Información Básica

La Randomización del Diseño del Espacio de Direcciones (ASLR, por sus siglas en inglés) es una técnica de seguridad utilizada en sistemas operativos para aleatorizar las direcciones de memoria utilizadas por los procesos del sistema y de las aplicaciones. Al hacerlo, se vuelve significativamente más difícil para un atacante predecir la ubicación de procesos y datos específicos, como la pila, el montón y las bibliotecas, mitigando así ciertos tipos de exploits, especialmente los desbordamientos de búfer.

Verificar el Estado de ASLR

Para verificar el estado de ASLR en un sistema Linux, puedes leer el valor del archivo /proc/sys/kernel/randomize_va_space. El valor almacenado en este archivo determina el tipo de ASLR que se está aplicando:

  • 0: Sin aleatorización. Todo es estático.
  • 1: Aleatorización conservadora. Las bibliotecas compartidas, la pila, mmap(), la página VDSO se aleatorizan.
  • 2: Aleatorización completa. Además de los elementos aleatorizados por la aleatorización conservadora, la memoria gestionada a través de brk() se aleatoriza.

Puedes verificar el estado de ASLR con el siguiente comando:

bashCopy codecat /proc/sys/kernel/randomize_va_space

Desactivando ASLR

Para desactivar ASLR, establece el valor de /proc/sys/kernel/randomize_va_space en 0. Desactivar ASLR generalmente no se recomienda fuera de escenarios de prueba o depuración. Así es como puedes desactivarlo:

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

También puedes desactivar ASLR para una ejecución con:

setarch `arch` -R ./bin args
setarch `uname -m` -R ./bin args

Activando ASLR

Para habilitar ASLR, puedes escribir un valor de 2 en el archivo /proc/sys/kernel/randomize_va_space. Normalmente se requieren privilegios de root. La activación de la aleatorización completa se puede hacer con el siguiente comando:

echo 2 | sudo tee /proc/sys/kernel/randomize_va_space

Persistencia a través de reinicios

Los cambios realizados con los comandos echo son temporales y se restablecerán al reiniciar. Para hacer que el cambio sea persistente, necesitas editar el archivo /etc/sysctl.conf y agregar o modificar la siguiente línea:

kernel.randomize_va_space=2 # Enable ASLR
# or
kernel.randomize_va_space=0 # Disable ASLR

Después de editar /etc/sysctl.conf, aplica los cambios con:

sudo sysctl -p

Esto asegurará que la configuración de tu ASLR se mantenga después de reinicios.

Burlando ASLR de 32 bits

Fuerza bruta de 32 bits

PaX divide el espacio de direcciones del proceso en 3 grupos:

  • Código y datos (inicializados y no inicializados): .text, .data y .bss —> 16 bits de entropía en la variable delta_exec. Esta variable se inicializa aleatoriamente con cada proceso y se suma a las direcciones iniciales.
  • Memoria asignada por mmap() y bibliotecas compartidas —> 16 bits, llamado delta_mmap.
  • La pila —> 24 bits, referido como delta_stack. Sin embargo, efectivamente utiliza 11 bits (desde el décimo hasta el vigésimo byte inclusive), alineados a 16 bytes —> Esto resulta en 524,288 posibles direcciones reales de pila.

Los datos anteriores son para sistemas de 32 bits y la entropía final reducida hace posible eludir ASLR intentando la ejecución una y otra vez hasta que el exploit se complete con éxito.

Ideas de fuerza bruta:

  • Si el exploit es local, puedes intentar forzar la dirección base de libc (útil para sistemas de 32 bits):
for off in range(0xb7000000, 0xb8000000, 0x1000):
  • Si estás atacando un servidor remoto, podrías intentar hacer fuerza bruta en la dirección de la función usleep de libc, pasando como argumento 10 (por ejemplo). Si en algún momento el servidor tarda 10 segundos adicionales en responder, encontraste la dirección de esta función.

{% hint style="success" %} En sistemas de 64 bits, la entropía es mucho mayor y esto no es posible. {% endhint %}

Ret2ret

Intenta evadir ASLR abusando de direcciones dentro de la pila:

{% content-ref url="../stack-overflow/ret2ret.md" %} ret2ret.md {% endcontent-ref %}

Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks: