Taller introductorio a la explotación de software GNU/Linux. Se explicarán diversos tipos de vulnerabilidades (corrupciones de memoria, fugas de información, condiciones de carrera, etc...) siguiendo metodologías actuales del desarrollo de exploits donde se sortearán las protecciones del sistema operativo.
Abel Valero - VM + VFS = The Wooden Horse [rooted2018]RootedCON
Se mostrara como analizar malware altamente ofuscado con tecnicas avanzadas como es la implementacion de una maquina virtual para evitar mostrar el codigo real.
El objetivo es descifrar todos y cada uno de los componentes de este malware obteniendo el codigo original antes de pasar por su VM.
Para ello se ha creado distintas herramientas que facilitan esta tarea, veremos como fueron implementandose.
Por ultimo analizaremos el payload final y las tecnicas que utiliza para realizar sus implantes en distintos procesos del sistema, como es el uso de un sistema de archivos virtual (VFS), utilizado para ocultar los distintos componentes.
Eduardo Blázquez - Técnicas de Ingeniería Inversa I & II [rooted2018]RootedCON
Esta charla tratará de enseñar todos los conocimientos básicos para poder llevar a cabo el análisis de un programa dentro de un debugger. Para esto, se enseñará la arquitectura y el lenguaje ensamblador usados en el intel x86 de 32 bits, para después realizar un reversing de un binario para la resolución de un crackme. La teoría, así como las técnicas mostradas en esta charla, servirán a todos los oyentes como bases necesarias en el mundo del análisis de malware, así como en el mundo del exploiting. Es por tanto recomendable a todos los oyentes que quieran seguir el ejemplo que se verá, traer un ordenador portatil con windows (puede usarse una máquina virtual) ya sea de 64 o 32 bits, con el debugger OllyDBG o el debugger x64debugger instalados.
Carlos Brendel - Sobreviviendo al exterior con tu IPS [rooted2018]RootedCON
¿Qué hacer cuando se publica una nueva vulnerabilidad en un servicio que utilizamos? Veremos una vulnerabilidad reciente, analizaremos el método de explotación y aprenderemos a proteger nuestro servidor vulnerable.
Pablo González - Jugando a lo Super Mario entre túneles y máquinas [rooted2018]RootedCON
En esta ponencia se explicarán de forma técnica y práctica el cómo realizar saltos entre máquinas con técnicas como la tunelización SSH, Port-Forwarding, Pivoting o PortProxy. En la ponencia se explicarán las diferentes técnicas y se detallará ejemplo de cada caso y uso en escenarios reales de pentesting. Se utilizarán ejemplos manuales y después uso de herramientas, intentando focalizar en ejemplos que sean sencillos de asimilar por los asistentes. Acabaremos montando un entorno similar a un escenario real y veremos como podemos llegar a diferentes máquinas con estas diferentes técnicas dentro de la fase de post-explotación. Jugaremos como Super Mario entre tuberías y llegaremos a rincones inexplorados desde nuestro punto de inicio.
Juan Antonio Calles & Patricia Rada - Biohacking: Almacenando información en ...RootedCON
A lo largo de la ponencia, se presentará el estado del arte sobre el almacenamiento de información en el material genético, con foco principal en la posibilidad que brinda el ADN de las bacterias tras los recientes descubrimientos de técnicas como CRISPR. Asimismo se darán a conocer las ventajas y desventajas que hasta la fecha ofrece este modelo y sus posibles áreas de mejora, con especial interés en el campo de la esteganografía.
Abel Valero - VM + VFS = The Wooden Horse [rooted2018]RootedCON
Se mostrara como analizar malware altamente ofuscado con tecnicas avanzadas como es la implementacion de una maquina virtual para evitar mostrar el codigo real.
El objetivo es descifrar todos y cada uno de los componentes de este malware obteniendo el codigo original antes de pasar por su VM.
Para ello se ha creado distintas herramientas que facilitan esta tarea, veremos como fueron implementandose.
Por ultimo analizaremos el payload final y las tecnicas que utiliza para realizar sus implantes en distintos procesos del sistema, como es el uso de un sistema de archivos virtual (VFS), utilizado para ocultar los distintos componentes.
Eduardo Blázquez - Técnicas de Ingeniería Inversa I & II [rooted2018]RootedCON
Esta charla tratará de enseñar todos los conocimientos básicos para poder llevar a cabo el análisis de un programa dentro de un debugger. Para esto, se enseñará la arquitectura y el lenguaje ensamblador usados en el intel x86 de 32 bits, para después realizar un reversing de un binario para la resolución de un crackme. La teoría, así como las técnicas mostradas en esta charla, servirán a todos los oyentes como bases necesarias en el mundo del análisis de malware, así como en el mundo del exploiting. Es por tanto recomendable a todos los oyentes que quieran seguir el ejemplo que se verá, traer un ordenador portatil con windows (puede usarse una máquina virtual) ya sea de 64 o 32 bits, con el debugger OllyDBG o el debugger x64debugger instalados.
Carlos Brendel - Sobreviviendo al exterior con tu IPS [rooted2018]RootedCON
¿Qué hacer cuando se publica una nueva vulnerabilidad en un servicio que utilizamos? Veremos una vulnerabilidad reciente, analizaremos el método de explotación y aprenderemos a proteger nuestro servidor vulnerable.
Pablo González - Jugando a lo Super Mario entre túneles y máquinas [rooted2018]RootedCON
En esta ponencia se explicarán de forma técnica y práctica el cómo realizar saltos entre máquinas con técnicas como la tunelización SSH, Port-Forwarding, Pivoting o PortProxy. En la ponencia se explicarán las diferentes técnicas y se detallará ejemplo de cada caso y uso en escenarios reales de pentesting. Se utilizarán ejemplos manuales y después uso de herramientas, intentando focalizar en ejemplos que sean sencillos de asimilar por los asistentes. Acabaremos montando un entorno similar a un escenario real y veremos como podemos llegar a diferentes máquinas con estas diferentes técnicas dentro de la fase de post-explotación. Jugaremos como Super Mario entre tuberías y llegaremos a rincones inexplorados desde nuestro punto de inicio.
Juan Antonio Calles & Patricia Rada - Biohacking: Almacenando información en ...RootedCON
A lo largo de la ponencia, se presentará el estado del arte sobre el almacenamiento de información en el material genético, con foco principal en la posibilidad que brinda el ADN de las bacterias tras los recientes descubrimientos de técnicas como CRISPR. Asimismo se darán a conocer las ventajas y desventajas que hasta la fecha ofrece este modelo y sus posibles áreas de mejora, con especial interés en el campo de la esteganografía.
Eduardo Sanchez & Rafael Sojo - Taller de CTF [rooted2018]RootedCON
La preparación de un equipo de CTF requiere de multitud de skills debido a las diferentes disciplinas que hay en el mundo del hacking. Los participantes se enfrentan a diferentes retos asignándole unas puntuaciones. En esta charla/taller se explicará desde nivel básico hasta un nivel medio diferentes técnicas de hacking utilizadas en varias áreas con el objetivo de que el asistente aprenda diferentes técnicas de resolución de retos hacking.Veremos diferentes algoritmos de cifrado utilizados en retos de Crypto, aprenderemos a identificar la información que hay oculta en imágenes, vídeos, sonidos y otros tipos de ficheros; usaremos conceptos de forense para obtener información útil de una imagen de disco duro, móvil o captura de paquetes de una red. Aprenderemos a manejar un proxy inverso para filtrar el tráfico de una Web o comprobar diferentes vulnerabilidades, obtener el código de una aplicación de un ejecutable o inspeccionar paquetes de una captura de tráfico de red. 90 minutos donde aprenderemos a utilizar diferentes herramientas y scripts muy útiles, así como servicios Web que nos facilitan mucho el trabajo en diferentes operaciones. Todo con el objetivo de prepararte para jugar en los diferentes CTFs que tenemos en las CONs españolas u otras que podemos participar por Internet.
Jose M Mejia - Usando computación paralela GPU en malware y herramientas de h...RootedCON
La ponencia se centra en como hoy en día, cualquiera tiene a su alcance una GPU con una posibilidad de proceso paralelo importante, y de como pueden evolucionar tanto el malware, como las herramientas de hacking que puedan hacer uso de ello (bruteforcers, fuzzers, passwd crackers....). No se trata de lanzar threads tradicionales vía CPU...
A veces la diferencia entre poder acceder a un sistema remoto con éxito o fallar puede ser el conocimiento de una herramienta, una línea de comando o incluso una técnica de evasión de AV/Firewall. Esta plática brindará consejos y trucos para poder hackear "like a Boss", que le dará una ventaja durante la auditoría de un sistema
Ponente: Roberto Salgado. Director técnico y co-fundador de Websec México. Roberto ha participado y contribuido en proyectos importantes como ModSecurity, PHPIDS, sqlmap y el libro “Web Application Obfuscation“. Creó la base de conocimientos de inyección SQL, una de las referencias más completas disponibles en la web y Panoptic, un buscador de rutas de archivos comunes con vulnerabilidades tipo LFI. También desarrollo el método más rápido para extraer información de bases de datos vulnerables a inyección a ciegas.
Introducción al escaneo masivo
Herramientas: Nmap, Dnmap, Zmap, Masscan
Escaneo con Botnet de ruteadores
Escaneos diarios de todo Internet por un año
Estadísticas de dispositivos de México
Puertas traseras de dispositivos populares de México
Eduardo Sanchez & Rafael Sojo - Taller de CTF [rooted2018]RootedCON
La preparación de un equipo de CTF requiere de multitud de skills debido a las diferentes disciplinas que hay en el mundo del hacking. Los participantes se enfrentan a diferentes retos asignándole unas puntuaciones. En esta charla/taller se explicará desde nivel básico hasta un nivel medio diferentes técnicas de hacking utilizadas en varias áreas con el objetivo de que el asistente aprenda diferentes técnicas de resolución de retos hacking.Veremos diferentes algoritmos de cifrado utilizados en retos de Crypto, aprenderemos a identificar la información que hay oculta en imágenes, vídeos, sonidos y otros tipos de ficheros; usaremos conceptos de forense para obtener información útil de una imagen de disco duro, móvil o captura de paquetes de una red. Aprenderemos a manejar un proxy inverso para filtrar el tráfico de una Web o comprobar diferentes vulnerabilidades, obtener el código de una aplicación de un ejecutable o inspeccionar paquetes de una captura de tráfico de red. 90 minutos donde aprenderemos a utilizar diferentes herramientas y scripts muy útiles, así como servicios Web que nos facilitan mucho el trabajo en diferentes operaciones. Todo con el objetivo de prepararte para jugar en los diferentes CTFs que tenemos en las CONs españolas u otras que podemos participar por Internet.
Jose M Mejia - Usando computación paralela GPU en malware y herramientas de h...RootedCON
La ponencia se centra en como hoy en día, cualquiera tiene a su alcance una GPU con una posibilidad de proceso paralelo importante, y de como pueden evolucionar tanto el malware, como las herramientas de hacking que puedan hacer uso de ello (bruteforcers, fuzzers, passwd crackers....). No se trata de lanzar threads tradicionales vía CPU...
A veces la diferencia entre poder acceder a un sistema remoto con éxito o fallar puede ser el conocimiento de una herramienta, una línea de comando o incluso una técnica de evasión de AV/Firewall. Esta plática brindará consejos y trucos para poder hackear "like a Boss", que le dará una ventaja durante la auditoría de un sistema
Ponente: Roberto Salgado. Director técnico y co-fundador de Websec México. Roberto ha participado y contribuido en proyectos importantes como ModSecurity, PHPIDS, sqlmap y el libro “Web Application Obfuscation“. Creó la base de conocimientos de inyección SQL, una de las referencias más completas disponibles en la web y Panoptic, un buscador de rutas de archivos comunes con vulnerabilidades tipo LFI. También desarrollo el método más rápido para extraer información de bases de datos vulnerables a inyección a ciegas.
Introducción al escaneo masivo
Herramientas: Nmap, Dnmap, Zmap, Masscan
Escaneo con Botnet de ruteadores
Escaneos diarios de todo Internet por un año
Estadísticas de dispositivos de México
Puertas traseras de dispositivos populares de México
3Redu: Responsabilidad, Resiliencia y Respetocdraco
¡Hola! Somos 3Redu, conformados por Juan Camilo y Cristian. Entendemos las dificultades que enfrentan muchos estudiantes al tratar de comprender conceptos matemáticos. Nuestro objetivo es brindar una solución inclusiva y accesible para todos.
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informáticavazquezgarciajesusma
En este proyecto de investigación nos adentraremos en el fascinante mundo de la intersección entre el arte y los medios de comunicación en el campo de la informática.
La rápida evolución de la tecnología ha llevado a una fusión cada vez más estrecha entre el arte y los medios digitales, generando nuevas formas de expresión y comunicación.
Continuando con el desarrollo de nuestro proyecto haremos uso del método inductivo porque organizamos nuestra investigación a la particular a lo general. El diseño metodológico del trabajo es no experimental y transversal ya que no existe manipulación deliberada de las variables ni de la situación, si no que se observa los fundamental y como se dan en su contestó natural para después analizarlos.
El diseño es transversal porque los datos se recolectan en un solo momento y su propósito es describir variables y analizar su interrelación, solo se desea saber la incidencia y el valor de uno o más variables, el diseño será descriptivo porque se requiere establecer relación entre dos o más de estás.
Mediante una encuesta recopilamos la información de este proyecto los alumnos tengan conocimiento de la evolución del arte y los medios de comunicación en la información y su importancia para la institución.
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informáticavazquezgarciajesusma
En este proyecto de investigación nos adentraremos en el fascinante mundo de la intersección entre el arte y los medios de comunicación en el campo de la informática.
La rápida evolución de la tecnología ha llevado a una fusión cada vez más estrecha entre el arte y los medios digitales, generando nuevas formas de expresión y comunicación.
Continuando con el desarrollo de nuestro proyecto haremos uso del método inductivo porque organizamos nuestra investigación a la particular a lo general. El diseño metodológico del trabajo es no experimental y transversal ya que no existe manipulación deliberada de las variables ni de la situación, si no que se observa los fundamental y como se dan en su contestó natural para después analizarlos.
El diseño es transversal porque los datos se recolectan en un solo momento y su propósito es describir variables y analizar su interrelación, solo se desea saber la incidencia y el valor de uno o más variables, el diseño será descriptivo porque se requiere establecer relación entre dos o más de estás.
Mediante una encuesta recopilamos la información de este proyecto los alumnos tengan conocimiento de la evolución del arte y los medios de comunicación en la información y su importancia para la institución.
Actualmente, y debido al desarrollo tecnológico de campos como la informática y la electrónica, la mayoría de las bases de datos están en formato digital, siendo este un componente electrónico, por tanto se ha desarrollado y se ofrece un amplio rango de soluciones al problema del almacenamiento de datos.
En este documento analizamos ciertos conceptos relacionados con la ficha 1 y 2. Y concluimos, dando el porque es importante desarrollar nuestras habilidades de pensamiento.
Sara Sofia Bedoya Montezuma.
9-1.
2. GNU/Linux Exploiting 2
• Manuel Blanco Parajón
• Jugador habitual de competiciones “CTF”
• w0pr
• ID-10-T
• Estudiante de Ingeniería Informática
• Autodidacta
# whoami
@manuelbp01
manuelbp01@gmail.com
3. GNU/Linux Exploiting 3
• ¿Qué vamos a ver en este taller?
Introducción a la explotación de vulnerabilidades en software
• Requisitos recomendados
• Nivel básico de programación en C
• Manejo sencillo de la shell GNU/Linux
• Conocimientos básicos de Ingeniería Inversa
• Fundamentos de Computadores
• Resultados
Ser capaz de desarrollar tu primer exploit
Introducción
5. GNU/Linux Exploiting 5
• Bug: Error de software o fallo de programación que causa un
comportamiento anómalo o desencadena un resultado inesperado en la
aplicación.
• Vulnerabilidad: Clase particular de bug que puede ser aprovechado por
un atacante para comprometer la seguridad, integridad, disponibilidad y
confidencialidad de un sistema.
• Exploit: Fragmento de software utilizado para aprovechar una
vulnerabilidad de un sistema, con el fin de conseguir un comportamiento
no deseado para el mismo.
• Payload: Efecto que se desea lograr al explotar una vulnerabilidad.
Términos
6. GNU/Linux Exploiting 6
• Ingeniería Inversa: Proceso llevado a cabo con el objetivo de obtener
información a partir de un producto final.
• Análisis estático
• Análisis dinámico
Ingeniería Inversa
7. GNU/Linux Exploiting 7
• Análisis estático: Tipo de análisis de software que se realiza sin ejecutar
el programa.
• Ejemplo: Podemos utilizar objdump como un desensamblador
(traduce código máquina a ensamblador)
Ingeniería Inversa
8. GNU/Linux Exploiting 8
• Análisis dinámico: Tipo de análisis de software que se realiza
ejecutando el programa.
• Ejemplo
• strace: Permite monitorear las llamadas al sistema y las señales.
• ltrace: Permite monitorear las llamadas a las librerías compartidas.
Ingeniería Inversa
9. GNU/Linux Exploiting 9
• IDA 7.0 Freeware Version
https://www.hex-rays.com/products/ida/support/download_freeware.shtml
Herramientas útiles
14. GNU/Linux Exploiting 14
• Estructuras de datos (tablas) que muestran la distribución de la
memoria
Mapa de memoria
15. GNU/Linux Exploiting 15
• Segmentación de memoria: División de la memoria primaria en segmentos
o secciones
• Los segmentos normalmente corresponden a las divisiones naturales de un
programa, como las rutinas o las tablas de datos.
• data: rw-
• code: r-x
• stack: rw-
• heap: rw-
Segmentación de memoria
16. GNU/Linux Exploiting 16
• ¿Qué sucede cuando ejecutas un archivo ELF?
• $ ./test
• Normalmente el programa estará en el disco, y el kernel será el encargado de
realizar una serie de procedimientos para el mapeo de la memoria del
programa.
Flujo de ejecución
17. GNU/Linux Exploiting 17
Flujo de ejecución
./test
fork()
execve(“./test”, *argv[], *envp[])
sys_execve()
do_execve() search_binary_handler()
load_elf_binary()
ld.so
_start
__libc_start_main _init
main
user mode
kernel mode
18. GNU/Linux Exploiting 18
Cómo se realiza el mapeo del programa a la memoria virtual
• En el encabezado del programa
• Se guardan qué segmentos se deben mapear y sus respectivas
ubicaciones
• También se guarda qué secciones pertenecen a qué segmentos
• Durante el mapeo la memoria se dividirá en distintos segmentos
dependiendo de sus respectivos permisos
• Un segmento puede contener 0 o varias secciones
Flujo de ejecución
20. GNU/Linux Exploiting 20
Cómo se realiza el mapeo del programa a la memoria virtual
Flujo de ejecución
otra sección
.data
.bss
.got.plt
.rodata
.text
.init
ELF encabezado
RW
R o RX
kernel space
DATA VMA
CODE VMA
stack
heap
En disco En memoria
21. GNU/Linux Exploiting 21
Registros
• Registros de propósito general
• EAX EBX ECX EDX – 32 bit
• AX BX CX DX – 16 bit
• AH BH CH DH – 8 bit (parte alta)
• AL BL CL DL – 8 bit (parte baja)
Ensamblador x86
AH AL
EAX
AX
22. GNU/Linux Exploiting 22
Registros
• Stack Pointer
• ESP – 32 bit
• Apunta a la cima de la pila
• Base Pointer
• EBP – 32 bit
• Apunta a la base de la pila
• La pila es una estructura de datos (cola LIFO) que permite almacenar y
recuperar datos
Ensamblador x86
23. GNU/Linux Exploiting 23
EBP: 0xffffcfd8
0x804871c
???
???
0x804871c
???
???
0xffffcfd8
Funcionamiento CPU
Prólogo de la función
Llamada a get_flag
RET addr
RET addr
Frame pointer
* La representación real de la pila sería al revés
26. GNU/Linux Exploiting 26
Registros
• Registro contador del programa
• EIP
• Apunta a la siguiente instrucción a ejecutar
• Registro flag
• eflags
• Almacena los resultados de ejecución
• Registro de segmento
• cs ss ds es fs gs
Ensamblador x86
27. GNU/Linux Exploiting 27
Buffer: Espacio de memoria reservado para almacenar datos de
manera temporal.
Si se introducen más datos que los que el buffer puede almacenar,
entonces se produce un desbordamiento.
Buffer Overflow
29. GNU/Linux Exploiting 29
Stack Smash
buffer (64 bytes)
variable
EBP
RET
argc
argv
envp
variable
EBP
RET
argc
argv
envp
A AA A
A A A A
A … … …
buffer (64 bytes)
AAA
A A A …
…
A A A A
Recordemos que la pila crece desde las
direcciones altas hacia las bajas, la
representación real sería al revés.
32. GNU/Linux Exploiting 32
Stack Smash
El buffer podía almacenar 64 bytes, lo hemos desbordado y a
continuación hemos sobrescrito la variable correctamente.
Recordemos que en el formato little-endian el orden es del byte
menos significativo hasta el byte más significativo.
34. GNU/Linux Exploiting 34
Return to Text
La representación de la pila sería:
Nuestro objetivo es sobrescribir la dirección de retorno con la dirección de la función win()
buffer (64 bytes)
EBP
RET
35. GNU/Linux Exploiting 35
Return to Text
Procedemos a calcular el desplazamiento necesario para llegar a
sobrescribir la dirección de retorno. Para este proceso podemos
utilizar un patrón cíclico (una secuencia única que nos permitirá
calcular dicho offset).
42. GNU/Linux Exploiting 42
Return to Shellcode
Esta ocasión nuestro fin es lograr ejecutar código arbitrario en el
sistema, para dicha labor utilizaremos un shellcode.
43. GNU/Linux Exploiting 43
Return to Shellcode
Un shellcode es un conjunto de instrucciones normalmente programadas en
lenguaje ensamblador y representadas en forma de códigos de operación, su
propósito es ejecutar la operación que se haya programado.
Shellcode que ejecuta /bin/sh con execve()
44. GNU/Linux Exploiting 44
Return to Shellcode
El buffer podía almacenar 64 bytes, lo hemos desbordado y a
continuación hemos sobrescrito la variable correctamente.
Recordemos que en el formato little-endian el orden es del byte
menos significativo hasta el byte más significativo.
45. GNU/Linux Exploiting 45
Return to Shellcode
Procedemos a desactivar la ASLR:
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
A continuación ponemos un punto de ruptura en la llamada a gets() y observamos
los parámetros que recibe:
46. GNU/Linux Exploiting 46
Return to Shellcode
Ahora que sabemos cual es la dirección de inicio de nuestro buffer, podemos
alojar nuestro shellcode en el mismo y saltar a el:
47. GNU/Linux Exploiting 47
Return to Shellcode
Vamos a probar a ejecutarlo fuera del depurador
Vemos que algo no va bien, habilitaremos la generación de core dumps (crasheos)
y procederemos con un análisis post mortem.
ulimit -c unlimited
48. GNU/Linux Exploiting 48
Return to Shellcode
Analizamos un poco el core dump y rápidamente localizamos el shellcode
gdb -q --core core
49. GNU/Linux Exploiting 49
Return to Shellcode
Modificamos el exploit con la nueva dirección y ejecutamos de
nuevo…
¿Dónde está mi shell?
51. GNU/Linux Exploiting 51
Return to Shellcode
Parece ser que estamos perdiendo el contexto de la entrada estándar, debemos mantener stdin
abierto.
(python exploit.py; cat) | ./return-to-shellcode
cat exploit - | ./return-to-shellcode
52. GNU/Linux Exploiting 52
Protecciones
ASLR (Address Space Layout Randomization)
La aleatoriedad en la disposición del espacio de direcciones es una técnica que intenta mitigar o
dificultar la explotación de vulnerabilidades basadas en la corrupción de memoria (originalmente
se implementó en PaX).
En 32 bits la entropía no es muy alta pues 12 bits quedan estáticos, es posible realizar un ataque
de fuerza bruta. Luego se verán maneras de sortear esta mitigación.
En este caso tendríamos una probabilidad de
1
165 para adivinar la dirección del buffer.
53. GNU/Linux Exploiting 53
Protecciones
NX (No eXecute)
Normalmente las páginas de memoria suelen estar marcadas como no ejecutables gracias a la
protección NX (non-execute).
Esto significa que aunque logremos inyectar un shellcode en la memoria y logremos alterar el flujo
del programa para que salte a nuestra zona controlada, no podremos ejecutarlo.
54. GNU/Linux Exploiting 54
Protecciones
PIE/PIC (Position Independent Execution)
Este mecanismo de protección permite realizar una aleatorización en los segmentos de texto y
datos.
Es decir, se realiza un direccionamiento relativo, en cada ejecución se generará de manera pseudo
aleatoria una dirección base y se irán calculando el resto de direcciones mediante sumas de
desplazamientos.
Por defecto gcc no compila con PIE, para utilizar esta protección se deben utilizar las flags -fPIC -
pie
55. GNU/Linux Exploiting 55
Protecciones
StackGuard
Este mecanismo de protección consiste en generar un valor aleatorio (canario) en el prólogo de
una función, salvaguardarlo justo antes del frame pointer y dirección de retorno en la pila.
En el epílogo de la función realizará la operación lógica de disyunción exclusiva con el valor actual
y el generado anteriormente, de manera que detectará si ha sido modificado o no.
buffer
EBP
canario
RET
56. GNU/Linux Exploiting 56
PLT/GOT
La PLT (Procedure Linkage Table) es usada para llamar a
procedimientos/funciones cuya dirección no se conoce durante el
enlazado, es el enlazador dinámico el encargado de resolverla durante
la ejecución.
La GOT (Global Offsets Table) es otra tabla que contiene direcciones
absolutas los procedimientos/funciones que serán utilizados, se utiliza
de manera similar a la PLT.
57. GNU/Linux Exploiting 57
Enlace perezoso (Lazy Binding)
En el enlace perezoso (procesos llevado a cabo por el cargador de ELF) cuando un
binario está cargado en memoria y una función es llamada por primera vez, la PLT
realiza un salto a la GOT donde resolverá la entrada que aún no ha sido resuelta.
En ese momento el enlazador dinámico es invocado, este resolverá y almacenará
en la GOT la dirección del símbolo correspondiente a la función invocada.
Las siguientes llamadas a la función no volverán a pasar por dicho proceso, pues
su dirección ya estará resuelta en la GOT.
58. GNU/Linux Exploiting 58
Protecciones
RELRO (Relocation Read-Only)
RELRO Parcial: Reordena las secciones ELF de manera que las
secciones internas de datos (.got, .dtors, etc.) precedan las secciones
de datos del programa (.data y .bss), la problemática es que la GOT es
escribible.
RELRO Completo: Remapea toda la GOT como solo lectura. Es la única
manera de mitigar cualquier tipo de técnica que trate de modificar la
GOT, pues protege las secciones de datos internos en el ELF para que
no se sobrescriban (a medida que se reordenan las secciones ELF).
Flags para compilar con Full RELRO: gcc -Wl,-z,relro,-z,now
60. GNU/Linux Exploiting 60
GOT Hijacking
Para poder implementar el enlazado perezoso la GOT debe ser escribible.
El objetivo sería sobrescribir alguna entrada de la GOT, de manera que afecte al
flujo del programa.
…
…
call foo@plt
…
…
printf
system
…
.text
.got.plt
jmp *(foo@GOT)
push index
jmp PLT0
foo@plt
push *(GOT + 4)
jmp *(GOT + 8)
PLT0
Cuando se produce un call foo, se realizará un jmp a la
función system.
61. GNU/Linux Exploiting 61
Return to Library
El objetivo de esta técnica es sortear la protección NX.
Para lograr dicho fin, debemos sobrescribir la dirección de retorno con
una llamada de librería del sistema.
Uno de los problemas sería la ASLR, para poder realizar esta
metodología en dicho escenario sería necesaria alguna fuga de
información que nos permitiese calcular la dirección base de la
librería del sistema.
63. GNU/Linux Exploiting 63
Return to Library
Procederemos a ejecutar system("/bin/sh"), debemos situar los
argumentos en la pila de manera que cuando se ejecute system estos
sean interpretados como tal.
AAAAAAAAAA
AAAAAAAAAA
AAAAAAAAAA
AAAAAAAAAA
AAAAAAAAAA
system
fake RET
& /bin/sh
65. GNU/Linux Exploiting 65
Return to Library
Ponemos un punto de ruptura en la instrucción ret y verificamos que
todo se encuentra en el lugar correcto
66. GNU/Linux Exploiting 66
Return to Library
Podemos utilizar exit como dirección de retorno, para evitar generar
un core dump al finalizar e intentar ejecutar "0x41414141".
67. GNU/Linux Exploiting 67
Condición de carrera (Race Condition)
Son un tipo de error lógico donde dos flujos de código se ejecutan de
forma concurrente y el resultado final depende del orden de
ejecución, como consecuencia las acciones de uno sobre los datos
puede influir en los resultados del otro.
71. GNU/Linux Exploiting 71
Format String
Este tipo de bug ocurre cuando una entrada de datos se evalúa por
una función de manera incorrecta (normalmente la función
pertenecerá a la familia *printf()).
Explotando dicha vulnerabilidad se puede lograr desde una fuga de
memoria hasta una escritura.
73. GNU/Linux Exploiting 73
Format String
Este tipo de bug ocurre cuando una entrada de datos se evalúa por
una función de manera incorrecta (normalmente la función
pertenecerá a la familia *printf()).
Explotando dicha vulnerabilidad obtenemos una primitiva de lectura y
escritura.
74. GNU/Linux Exploiting 74
Format String
Procedemos pues a introducir algún testigo de formato e intentamos
volcar valores de la pila.
75. GNU/Linux Exploiting 75
Format String
Utilicemos un depurador, para visualizar mejor lo que sucede.
Vemos como los valores examinados coinciden con el volcado.
76. GNU/Linux Exploiting 76
Format String
Vamos a escribir los dos bytes inferiores (LOB) del objetivo:
• r <<< $(python -c 'print "x34xa0x04x08" + "%16701d%7$hn"')
Ahora vamos a escribir los dos bytes superiores (HOB):
• r <<< $(python -c 'print "x36xa0x04x08" + "%16701d%7$hn"')
77. GNU/Linux Exploiting 77
Format String
• Reglas de escritura:
• Si HOB > LOB
• [dirección+2] [dirección] [LOB - 8] [offset+1] [HOB-LOB] [offset]
• Si HOB < LOB
• [dirección+2] [dirección] [HOB - 8] [offset] [LOB-HOB] [offset+1]
78. GNU/Linux Exploiting 78
Format String
Vamos a aprovechar esta fuga de información (infoleak), para
bypassear el StackGuard
79. GNU/Linux Exploiting 79
Format String
Vamos a ver el canario que genera, poner un punto de ruptura en la
llamada al sistema y buscar dicho valor en la pila
80. GNU/Linux Exploiting 80
Format String
Vemos que la posición del canario es $esp + 540, como las
direcciones son de 4 bytes:
540
4
= 135. Podemos utilizar el testigo de
acceso directo: %135$p
81. GNU/Linux Exploiting 81
ROP (Return-oriented programming)
Esta técnica comúnmente nos permitirá evadir la protección NX.
El objetivo consiste en lograr ejecutar una secuencia de instrucciones
máquina llamadas gadgets (presentes en la memoria de la máquina)
con el fin de lograr ejecutar operaciones arbitrarias en la máquina.
Cada gadget generalmente termina en una instrucción de retorno y se
suelen encontrar en subrutinas del programa y/o bibliotecas
compartidas.
Utilizaremos una herramienta para localizar los gadgets fácilmente:
• https://github.com/sashs/Ropper
85. GNU/Linux Exploiting 85
ROP
Ahora que sabemos los argumentos que recibe, buscaremos los
gadgets necesarios para controlar los registros y efectuar la llamada al
sistema.
La instrucción int 0x80 provoca una interrupción software (llamada al
sistema), es una instrucción especial que causa que el procesador
transfiera el control a un código privilegiado (núcleo).
86. GNU/Linux Exploiting 86
ROP
Desactivemos la ASLR y veamos cual es la dirección del stack:
Ahora tracearemos nuestro rop-chain y verifiquemos que la pila
queda con permisos de ejecución.
89. GNU/Linux Exploiting 89
ROP
Y finalmente hemos logrado nuestro fin
Ahora que tenemos control de la pila, podemos alojar nuestro
shellcode al inicio del buffer y hacer un exploit en condiciones
92. GNU/Linux Exploiting 92
ROP
Habilitamos los core dumps y ajustamos el exploit con la dirección del
buffer fuera del depurador.
Y finalmente hemos logrado nuestro objetivo!