jueves, septiembre 13, 2018

Cómo montar un entorno de pentesting desde cero con Docker (Parte 1 de 2)

Hace unos días, Chema Alonso nos habló del "máster de Ciberseguridad" (una ruta a seguir para aprender o perfeccionar tus conocimientos) en 0xWord donde según la disciplina y el nivel que quieras, puedas elegir unos libros u otros de seguridad informática. Para poder practicar todas las técnicas y programas que hay en ellos, llegará el momento de hacer pruebas en un laboratorio.

Figura 1: Cómo montar un entorno de pentesting desde cero con Docker (Parte 1 de 2)

Hay muchas formas de montar uno, siendo las máquinas virtuales el más utilizado. Pero hoy os vamos a explicar cómo crear un sencillo y escalable entorno para pruebas de Ethical Hacking utilizando nuestro querido Docker. ¿Por qué Docker? En primer lugar, por la rapidez y la sencillez. Instalar máquinas virtuales con vulnerabilidades requiere un proceso completo de instalación del S.O., las aplicaciones vulnerables, configuración de red, etcétera.


Incluso teniendo ya alguna máquina ya pre-configurada, requerirá una considerable cantidad de recursos de tu sistema siendo complicado tener un número elevado de máquinas a la vez. Es aquí donde aparecen las bondades de Docker. En una sola máquina host, es posible instalar una serie de contenedores los cuales podrán ser herramientas de pentesting (como por ejemplo Kali Linux) o contenedores vulnerables con fallos conocidos. Todo esto en unos minutos y sólo ocupando una máquina virtual con 2GB como mínimo y algo de espacio de disco.

Vamos a ver cómo podemos montar un pequeño laboratorio de pruebas en Docker en sólo unos minutos, 20 en concreto, de los cuales 15 minutos corresponden a la instalación de las herramientas en la distribución Kali Linux (como puedes ver el vídeo que acompaña este post en la segunda parte). Hemos optado por esta opción (selección del top10 de herramientas) porque no es demasiado grande y además contiene justo lo que más se suele utilizar. Este es un sencillo esquema de la infraestructura que vamos a instalar para hacer nuestras prácticas:

Figura 3: Esquema de la infraestructura a a crear

Como ya hemos comentado, la máquina host sobre la cual vamos a hacer las pruebas debe de tener al menos 2GB de memoria RAM. Una vez la tenemos en ejecución y Docker instalado, si tecleamos el siguiente comando obtendremos un listado de las redes disponibles:

Figura 4: Listado de redes disponibles en Docker

La red que nos interesa es “bridge”. Esta red está asociada a la interface “docker0”, la cual se crea por defecto y tiene la dirección IP 172.17.0.1/24 (actúa de Gateway). Vamos a ver la información más relevante de esta red “bridge”, para ello ejecutaremos la instrucción “inspect” de Docker:
docker network inspect bridge
Figura 5: Salida de la ejecución del comando network inspect de Docker para la red bridge

Aquí podemos ver todos los detalles de la misma, como por ejemplo la “Subnet”, la dirección IP del Gateway, el nombre “docker0” para la interface, etcétera. Si hubiera algún contenedor ya creado aparecería también en este listado en el apartado “Containers.

El primer paso para montar nuestro entorno de pruebas será descargar una imagen de Kali Linux y ejecutar un contenedor a partir de ella. Docker nos ofrece una imagen basada en Fedora 21 pero antes de utilizarla tendremos que realizar algunas operaciones previas. Para obtener la imagen Kali ejecutaremos el siguiente comando:
docker pull kalilinux/kali-linux-docker
Figura 6: Descarga de la imagen Kali con el comando pull

El siguiente punto será crear un contenedor basado en esta imagen y acceder al mismo. Para poder identificar mejor luego los contenedores, le daremos un nombre a cada uno de ellos durante la ejecución, en este caso lo llamaremos “Contenedor_Kali”:
docker run -ti --name Contenedor_Kali kalilinux/kali-linux-docker /bin/bash
Como antes hemos realizado el “pull” de la imagen, debería levantar directamente con el contenedor. En caso de no haber realizado previamente dicho “pull”, el mismo comando “run” descargará la imagen (es una buena práctica hacer primero el “pull”, sobre todo para tenerlo organizado y evitar sorpresas a la hora de levantar un contenedor y que tenga que descargar la imagen) y luego nos dará acceso al contenedor como se puede apreciar en la siguiente imagen:

Figura 7: Descarga de la imagen Kali y acceso al contenedor usando el comando run de Docker

Una vez estamos dentro de la Shell del contenedor (en el caso del ejemplo, root@07884529f092) vemos que si intentamos ejecutar el comando “nmap” nos indica que no está instalado. Existe un paquete especial de instalación llamado “kali-linux-top10” el cual nos instalará las diez aplicaciones más utilizadas en Kali, que son las siguientes:
1. Aircrack-ng
2. Burpsuite
3. Hydra
4. John
5. Maltego
6. Metasploit Framework
7. Nmap
8. OWASP-Zap
9. Sql-map
10. WikeShark
Como podemos ver, incluye nmap y sobre todo Metasploit. Antes de instalar este paquete tendremos que actualizar el contenedor Kali:
apt update
apt dist-upgrade
apt autoremove
apt clean
Y luego finalmente, instalamos el paquete (esto tardará un poco en instalarse, unos 15 minutos más o menos tal y como hemos mencionado antes):
apt install kali-linux-top10
Figura 8: Proceso de actualización e instalación del top 10 de utilidades dentro del contenedor Kali

En este punto ya tenemos nuestro contenedor con Kali llamado “Contenedor_Kali” y las herramientas más utilizadas. Hay que tener en cuenta que, si salimos del contenedor y volvamos a ejecutar el comando “docker run ...” estaremos creando un contenedor nuevo y parecerá que hemos perdido todas las actualizaciones que hemos realizado (esto vale para cualquier otro contenedor Docker).

Por eso, cuando salgamos del contenedor, si tenemos que volver a él hay que realizar dos pasos. El primero es levantar de nuevo el contenedor (usando su id o en nuestro caso, el nombre) y luego acceder:

docker start Contenedor_Kali
docker exec -it Contenedor_Kali /bin/bash
Figura 9: Proceso para acceder de nuevo al contendor “Contenedor_Kali”
después de salir. Se comprueba que “nmap” sigue instalado

Si queremos guardar la imagen actualizada y personalizada para futuros proyectos y así poder lanzar Kali con todas las herramientas que vayamos instalando, tendremos que crear una nueva de la siguiente manera:
docker commit Contenedor_Kali imagen-kali
Este comando creará una nueva imagen llamada “imagen-kali” que podemos utilizar para levantar otro contenedor (con todas las actualizaciones y las aplicaciones instaladas) simplemente tecleando:
docker run -ti Imagen_Kali /bin/bash
Vamos a suponer que esta instalación es un entorno temporal, si queremos dar persistencia a la información que almacenemos en el contenedor Kali y personalizarlo un poco, será necesario utilizar volúmenes y por supuesto un dockerfile (en nuestro artículo de WordPress in Paranoid Mode explicamos como montar varios contenedores Docker usando Dockerfile y DockerCompose). Podéis echar un vistazo a este enlace el cual explica en detalle cómo instalar Kali y también como crear los volúmenes.

Figura 10: Creación de una imagen propia Kali partiendo del contenedor “Contenedor_Kali”.

Una vez tenemos nuestro contenedor Kali corriendo, pasaremos a la instalación de las máquinas vulnerables, pero eso lo veremos en la segunda parte de este artículo.

Autor: Fran Ramírez, (@cyberhadesblog y @cybercaronte) miembro del equipo de Crazy Ideas en CDO en Telefónica, co-autor del libro "Microhistorias: Anécdotas y Curiosidades de la historia de la informática (y los hackers)", del libro "Docker: SecDevOps" y del blog Cyberhades.

6 comentarios:

kabracity dijo...

Otra alternativa al docker commit es crear tu propio Dockerfile partiendo de la imagen base de kalilinux y añadiendo el paquete kali-linux-top10. Me parece más cómodo ese enfoque de cara a hacer modificaciones, o a actualizar nuestra imagen cuando lo haga la imagen base.

P.D: Disfruté mucho tu libro de Microhistorias :)!

cybercaronte dijo...

Hola kabracity, ante todo gracias por el comentario y nos alegra que te haya gustado el libro de MicroHistorias ;)
Tienes razón, como bien comentas, la alternativa DockerFile es posiblemente a mejor opción. Lo que ocurre que ya hablamos de este método cuando contamos WordPress In Paranoid Mode en este mismo blog y no quería volver a repetirlo. Además siempre es bueno saber alguna otra forma de crear las imágenes por si acaso.

En la segunda parte del post hago justamente el mismo comentario que has hecho ;)

Gracias de nuevo.

Unknown dijo...
Este comentario ha sido eliminado por el autor.
fvillalobosf dijo...

Continuando un poco con el comentario de @kabracity, ademas de implementar la creación de un Dockerfile se podría hacer todo esto con Docker-Compose, de tal forma que sea mas fácil "Levantar" todos los servicios. Ademas en mi caso me ayuda mucho a tener una mejor idea de todos los contenedores que interaccionan entre si. ¡Gracias por el artículo, es muy bueno!

erik_redd dijo...

lo bueno de estos tutoriales es que mas que aprender a vulnerar maquinas lo que aprendes realmente es a utilizar nuevas tecnologias, antes de las maquinas virtuales imagino que no habia nada o bueno si chroot, luego nacieron las maquinas virtuales, y ahora estamos con esto de docker y contenedores, yo que soy un neófito me lo paso bien haciendo estos tutoriales, muchas gracias.

Carlos Ibarra dijo...

Excelente post. muchas gracias por compartir sus conocimientos.
Como mencionan arriba, aprendemos de seguridad y de nuevas tecnologías. Gracias Totales....

Entrada destacada

Seis recomendaciones personales de libros de @0xWord para disfrutar y aprender

Este verano pude disfrutar de la lectura de un libro que me encantó. El libro de Factfulness que me había regalado mi compañera Beatriz Ce...

Entradas populares