.. | ||
bf-forked-stack-canaries.md | ||
print-stack-canary.md | ||
README.md |
Canarios de Pila
Aprende hacking en AWS desde cero hasta experto con htARTE (Experto en Equipos Rojos de AWS de HackTricks)!
Otras formas de apoyar a HackTricks:
-
Si deseas ver tu empresa anunciada en HackTricks o descargar HackTricks en PDF ¡Consulta los PLANES DE SUSCRIPCIÓN!
-
Descubre La Familia PEASS, nuestra colección exclusiva de NFTs
-
Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
-
Comparte tus trucos de hacking enviando PRs a los repositorios de HackTricks y HackTricks Cloud.
StackGuard y StackShield
StackGuard inserta un valor especial conocido como un canario antes del EIP (Puntero de Instrucción Extendido), específicamente 0x000aff0d
(que representa nulo, nueva línea, EOF, retorno de carro) para protegerse contra desbordamientos de búfer. Sin embargo, funciones como recv()
, memcpy()
, read()
y bcopy()
siguen siendo vulnerables, y no protege el EBP (Puntero Base).
StackShield adopta un enfoque más sofisticado que StackGuard al mantener una Pila de Retorno Global, que almacena todas las direcciones de retorno (EIPs). Esta configuración garantiza que cualquier desbordamiento no cause daño, ya que permite comparar las direcciones de retorno almacenadas con las reales para detectar ocurrencias de desbordamiento. Además, StackShield puede verificar la dirección de retorno con un valor límite para detectar si el EIP apunta fuera del espacio de datos esperado. Sin embargo, esta protección puede ser eludida mediante técnicas como Return-to-libc, ROP (Programación Orientada a Retorno) o ret2ret, lo que indica que StackShield tampoco protege las variables locales.
Protector de Stack Smash (ProPolice) -fstack-protector
:
Este mecanismo coloca un canario antes del EBP, y reorganiza las variables locales para posicionar los búferes en direcciones de memoria más altas, evitando que sobrescriban otras variables. También copia de forma segura los argumentos pasados en la pila por encima de las variables locales y utiliza estas copias como argumentos. Sin embargo, no protege los arreglos con menos de 8 elementos o los búferes dentro de una estructura de usuario.
El canario es un número aleatorio derivado de /dev/urandom
o un valor predeterminado de 0xff0a0000
. Se almacena en TLS (Almacenamiento Local de Hilos), lo que permite que los espacios de memoria compartidos entre hilos tengan variables globales o estáticas específicas del hilo. Estas variables se copian inicialmente del proceso padre, y los procesos hijos pueden modificar sus datos sin afectar al padre o a los hermanos. Sin embargo, si se utiliza un fork()
sin crear un nuevo canario, todos los procesos (padre e hijos) comparten el mismo canario, volviéndolo vulnerable. En la arquitectura i386, el canario se almacena en gs:0x14
, y en x86_64, en fs:0x28
.
Esta protección local identifica funciones con búferes vulnerables a ataques e inyecta código al inicio de estas funciones para colocar el canario, y al final para verificar su integridad.
Cuando un servidor web utiliza fork()
, habilita un ataque de fuerza bruta para adivinar el byte del canario uno por uno. Sin embargo, al usar execve()
después de fork()
, se sobrescribe el espacio de memoria, anulando el ataque. vfork()
permite que el proceso hijo se ejecute sin duplicación hasta que intenta escribir, momento en el que se crea una duplicación, ofreciendo un enfoque diferente para la creación de procesos y el manejo de memoria.
Longitudes
En binarios x64
, la cookie del canario es un qword de 0x8
bytes. Los primeros siete bytes son aleatorios y el último byte es un byte nulo.
En binarios x86
, la cookie del canario es un dword de 0x4
bytes. Los primeros tres bytes son aleatorios y el último byte es un byte nulo.
{% hint style="danger" %} El byte menos significativo de ambos canarios es un byte nulo porque será el primero en la pila proveniente de direcciones más bajas y, por lo tanto, las funciones que leen cadenas se detendrán antes de leerlo. {% endhint %}
Bypasses
Filtrar el canario y luego sobrescribirlo (por ejemplo, desbordamiento de búfer) con su propio valor.
- Si los canarios se bifurcan en procesos secundarios, podría ser posible forzarlo byte a byte:
{% content-ref url="bf-forked-stack-canaries.md" %} bf-forked-stack-canaries.md {% endcontent-ref %}
- Si hay alguna fuga interesante o vulnerabilidad de lectura arbitraria en el binario, podría ser posible filtrarlo:
{% content-ref url="print-stack-canary.md" %} print-stack-canary.md {% endcontent-ref %}
- Sobrescribir punteros almacenados en la pila
La pila vulnerable a un desbordamiento de pila podría contener direcciones a cadenas o funciones que pueden ser sobrescritas para explotar la vulnerabilidad sin necesidad de alcanzar el canario de la pila. Verifica:
{% content-ref url="../../stack-overflow/pointer-redirecting.md" %} pointer-redirecting.md {% endcontent-ref %}
- Modificar tanto el canario maestro como el del hilo
Un desbordamiento de búfer en una función enhebrada protegida con canario puede usarse para modificar el canario maestro del hilo. Como resultado, la mitigación es inútil porque la verificación se realiza con dos canarios que son iguales (aunque modificados).
Este ataque se realiza en el documento: http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads
- Modificar la entrada GOT de
__stack_chk_fail
Si el binario tiene RELRO parcial, entonces puedes usar una escritura arbitraria para modificar la entrada GOT de __stack_chk_fail
para que sea una función ficticia que no bloquee el programa si se modifica el canario.
Este ataque se realiza en el documento: https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/
Referencias
- https://guyinatuxedo.github.io/7.1-mitigation_canary/index.html
- http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads
- https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/
Aprende hacking en AWS desde cero hasta experto con htARTE (Experto en Equipos Rojos de AWS de HackTricks)!
Otras formas de apoyar a HackTricks:
- Si deseas ver tu empresa anunciada en HackTricks o descargar HackTricks en PDF ¡Consulta los PLANES DE SUSCRIPCIÓN!
- Obtén la merchandising oficial de PEASS & HackTricks
- Descubre La Familia PEASS, nuestra colección exclusiva de NFTs
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte tus trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de Github.