Slides de la sesión impartida en DrupalCamp Spain 2018 por Zequi Vázquez, en la que se describe cómo funcionan tres de las vulnerabilidades más relevantes del core de Drupal en los últimos años.
How to use Redis with MuleSoft. A quick start presentation.
DrupalCamp Spain 2018: CSI, autopsia de vulnerabilidades
1.
2. Sobre mi
¿Qui´en soy?
Ezequiel ”Zequi”V´azquez
Desarrollo backend
Sysadmin & DevOps
Hacking & Seguridad
Ponente en CONs desde 2013
Zequi V´azquez @RabbitLair CSI: Autopsia de Vulnerabilidades
6. La vida de un parche
Etapas
1 Descubrimiento de vulnerabilidad → equipo seguridad
2 Implementaci´on de parche, publicaci´on de nueva versi´on
3 Hackers estudian parche con ingenier´ıa inversa → POC
4 Confirmaci´on POC → ataques masivos
Zequi V´azquez @RabbitLair CSI: Autopsia de Vulnerabilidades
7. Vale, yo parcheo, pero . . .
Zequi V´azquez @RabbitLair CSI: Autopsia de Vulnerabilidades
8. Vale, yo parcheo, pero . . .
Zequi V´azquez @RabbitLair CSI: Autopsia de Vulnerabilidades
11. Drupalgeddon 1
Arrays en m´etodo HTTP POST
El m´etodo POST env´ıa valores al servidor
Generalmente, enteros o strings, pero tambi´en arrays
Zequi V´azquez @RabbitLair CSI: Autopsia de Vulnerabilidades
12. Drupalgeddon 1
Sanitizaci´on de consultas a BD
Fichero includes/database/database.inc
M´etodo expandArguments
Consultas con condici´on “column IN (a, b, c, . . . )”
Zequi V´azquez @RabbitLair CSI: Autopsia de Vulnerabilidades
13. Drupalgeddon 1
Sanitizaci´on de consultas a BD
Fichero includes/database/database.inc
M´etodo expandArguments
Consultas con condici´on “column IN (a, b, c, . . . )”
Zequi V´azquez @RabbitLair CSI: Autopsia de Vulnerabilidades
14. Drupalgeddon 1
Sanitizaci´on de consultas a BD
Fichero includes/database/database.inc
M´etodo expandArguments
Consultas con condici´on “column IN (a, b, c, . . . )”
Zequi V´azquez @RabbitLair CSI: Autopsia de Vulnerabilidades
15. Drupalgeddon 1
La vulnerabilidad
No se sanitiza correctamente el ´ındice del array
La variable envenenada se pasa a la base de datos
Resultado: Se puede inyectar SQL a discrecci´on
Zequi V´azquez @RabbitLair CSI: Autopsia de Vulnerabilidades
16. Drupalgeddon 1
La vulnerabilidad
No se sanitiza correctamente el ´ındice del array
La variable envenenada se pasa a la base de datos
Resultado: Se puede inyectar SQL a discrecci´on
Zequi V´azquez @RabbitLair CSI: Autopsia de Vulnerabilidades
17. Drupalgeddon 1
Vamos a verlo
Zequi V´azquez @RabbitLair CSI: Autopsia de Vulnerabilidades
19. Drupalgeddon 2
Los render arrays
En Drupal 4.7 se introdujo la Forms API
Array cuyas claves comienzan por “#”
En Drupal 7 se generaliz´o para renderizarlo todo
Comportamiento recursivo
Callbacks: post render, pre render, value callback, . . .
Zequi V´azquez @RabbitLair CSI: Autopsia de Vulnerabilidades
20. Drupalgeddon 2
Enviando formularios
El valor enviado se almacena en #value
M´etodo POST de HTTP permite valores de tipo array
Zequi V´azquez @RabbitLair CSI: Autopsia de Vulnerabilidades
21. Drupalgeddon 2
La vulnerabilidad
Usamos POSTMAN o similar para saltarnos el formulario
En un campo en el que se asume un string, se env´ıa un array
El array enviado tiene ´ındices comenzando por “#”
Zequi V´azquez @RabbitLair CSI: Autopsia de Vulnerabilidades
22. Drupalgeddon 2
La vulnerabilidad
Enga˜namos a Drupal para que re-renderice el campo mail
Usamos la Ajax API para ello
El campo se renderiza, y el post render se ejecuta
Zequi V´azquez @RabbitLair CSI: Autopsia de Vulnerabilidades
23. Drupalgeddon 2
Vamos a verlo
Zequi V´azquez @RabbitLair CSI: Autopsia de Vulnerabilidades
25. Drupalgeddon 3
El par´ametro destination
Par´ametro GET que redirige a una URL tras finalizar ejecuci´on
Se pasa por stripDangerousValues para sanitizarlo
No detecta doble codificaci´on: “#” → “ %23” → “ %2523”
Zequi V´azquez @RabbitLair CSI: Autopsia de Vulnerabilidades
26. Drupalgeddon 3
El par´ametro destination
Par´ametro GET que redirige a una URL tras finalizar ejecuci´on
Se pasa por stripDangerousValues para sanitizarlo
No detecta doble codificaci´on: “#” → “ %23” → “ %2523”
La opci´on trigering element name
Fichero includes/ajax.inc
Identifica qu´e elemento se us´o para el env´ıo
Marca un elemento de formulario para re-renderizar
Zequi V´azquez @RabbitLair CSI: Autopsia de Vulnerabilidades
27. Drupalgeddon 3
La vulnerabilidad: primer paso
POST a la URL de un formulario de confirmaci´on
trigering element name con valor form id en POST data
Destination contiene un campo con post render envenenado
La llamada POST redirige al formulario de confirmaci´on
El payload debe ir codificado para URL
Zequi V´azquez @RabbitLair CSI: Autopsia de Vulnerabilidades
28. Drupalgeddon 3
La vulnerabilidad: primer paso
POST a la URL de un formulario de confirmaci´on
trigering element name con valor form id en POST data
Destination contiene un campo con post render envenenado
La llamada POST redirige al formulario de confirmaci´on
El payload debe ir codificado para URL
Zequi V´azquez @RabbitLair CSI: Autopsia de Vulnerabilidades
29. Drupalgeddon 3
La vulnerabilidad: segundo paso
Ejecutar como AJAX llamada POST a la acci´on de cancelar
/file/ajax/actions/cancel/ %23options/path/[form build id]
Ajax API procesa el formulario, y ejecuta el post render
Zequi V´azquez @RabbitLair CSI: Autopsia de Vulnerabilidades
30. Drupalgeddon 3
Vamos a verlo
Zequi V´azquez @RabbitLair CSI: Autopsia de Vulnerabilidades
32. Ataques “in the wild”
No hag´ais esto en casa
Extracci´on completa de base de datos
Malware de minado de criptomonedas
Servidor como proxy malicioso
Infecci´on de usuarios
Defacement / Black SEO
???
Zequi V´azquez @RabbitLair CSI: Autopsia de Vulnerabilidades