Generador de imágenes Docker para infosec

Docker Image Creator

Este es un proyecto que llevaba tiempo dándole vueltas con Fran y que por fin he encontrado algo de tiempo para dedicarle.

La idea es muy sencilla, básicamente es el crear una imagen Docker con ciertas herramientas sin tener que tener conocimientos de cómo crear una imagen Docker o de cómo instalar dichas herramientas.

Por ejemplo, supongamos que queremos lanzar sqlmap contra una aplicación web, y en ese momento no tenemos a mano nuestra querida Kali, y tampoco queremos buscar sqlmap e instalarla en nuestro sistema. Una forma muy conveniente y limpia sería ejecutarla desde de un contenedor Docker, y cuando terminemos nos deshacemos del contendor y listo. Nuestro sistema se queda “intacto”. Para esto, uno tendría que crear un fichero Dockerfile, añadir los comandos necesarios para instalar sqlmap, y por último construir la imagen Docker, o buscar una imagen ya creada con sqlmap y usar dicha imagen, etc.

Docker Image Generator es un proyecto que permite crear imágenes Docker sin tener que crear Dockerfiles, que contenga las herramientas que le digamos, siempre y cuando estén disponibles en el proyecto.

Este proyecto, aunque las herramientas que incluye son de ciberseguridad, es un proyecto genérico que puede ser extendido con herramientas de cualquier tipo, siempre y cuando puedan correr dentro de un contenedor Docker.

El proyecto está escrito en go y he creado los binarios para Linux, MacOS y Windows.

Si lo prefieres, puedes compilar tú mismo el proyecto (necesitarás una versión de go con soporte para módulos en tu sistema). Para ello sólo tienes que clonar el repositorio y ejecutar:

go build

O puedes usar make

make build

Una vez compilado o descargado (y extraído el contenido del .tgz) el proyecto, deberías tener un binario llamado doig, un directorio llamado tools y un fichero llamado Dockerfile.template.

Veamos la ayuda:

./doig -h
This tool creates a customized docker image with the tools you need

Usage: doig [--tools TOOLS] [--category CATEGORY] [--image IMAGE] [--dockerfile] [--list]

Options:
  --tools TOOLS, -t TOOLS
                        List of tools separated by blank spaces
  --category CATEGORY, -c CATEGORY
                        List of categories separated by blank spaces
  --image IMAGE, -i IMAGE
                        Image name in lowercase
  --dockerfile, -d       Prints out the Dockerfile
  --list, -l             List the available tools and categories
  --help, -h             display this help and exit

Veamos las herramientas que tenemos disponibles:

./doig -l
[*] Tools
  [-] altdns
  [-] amass
  [-] anonsurf
  [-] bucket_finder
  ...
[*] Categories
  [-] powershell
  [-] scanner
  [-] reversing
  [-] osint
  ...

Si miramos dentro del directorio tools, ahí podremos ver todas las herramientas registradas. Cómo se puede ver, los ficheros son ficheros .ini, y su contenido es muy sencillo, lo que nos permite extender esta aplicación con más herramientas de cualquier tipo. Todo lo que tenemos que hacer es saber que necesitamos hacer dentro de la imagen para instalarlas.

Veamos un ejemplo de cómo podríamos crear una imagen con sqlmap y nmap:

./doig -i ejemplo -t nmap sqlmap
...
...
Successfully built b2a1675f6331
Successfully tagged ejemplo:latest

Tools added to the image:
  [-] sqlmap
  [-] nmap

Lo que hemos hecho es especificar con la opción -t las herramientas que queremos, y con la opción -i decimos que queremos crear una imagen con el nombre dado, en este caso ejemplo.

Si en vez de crear una imagen docker, queremos simplemente obtener el fichero Dockerfile para generar la imagen, podemos usar la opción -d:

./doig -d -t nmap sqlmap

FROM ubuntu:18.04

RUN apt update && \
    apt install -y software-properties-common git curl p7zip-full wget whois locales python3 python3-pip && \
    add-apt-repository -y ppa:longsleep/golang-backports && \
    apt update && \
    localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
WORKDIR /opt
ENV LANG en_US.utf8

RUN   apt install -y nmap && \
  apt install -y sqlmap && \
  rm -rf /var/lib/apt/lists/*

Si hemos ejecutado el comando que nos genera la imagen, deberíamos tener un imagen llamada ejemplo, y todo lo que tenemos que hacer es ejecutar un contenedor con dicha imagen:

docker run -it ejemplo
root@f754ee45fac7:/opt#

Y desde ahí deberíamos ser capaz de ejecutar tanto nmap, como sqlmap.

También podríamos ejectuar cualquiera de esos comandos directamente sin tener que entrar en una shell en el contenedor:

docker run -it ejemplo nmap localhost

Starting Nmap 7.60 ( https://nmap.org ) at 2020-04-12 14:22 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000046s latency).
Other addresses for localhost (not scanned): ::1
All 1000 scanned ports on localhost (127.0.0.1) are closed

Nmap done: 1 IP address (1 host up) scanned in 1.68 seconds

** Recuerda que el comando se ejecuta dentro del contenedor, por lo que localhost es el contenedor y no tú host.

Por último mencionar que cada herramienta tiene definida una categoría, y existe la posibilidad de instalar todas las herramientas de una o más categorías con la opción -c:

./doig -c recon -i imagen-recon
...
...
Successfully built bb4598f26508
Successfully tagged imagen-recon:latest

Tools added to the image:
  [-] wafw00f
  [-] cloudflair
  [-] massdns
  [-] theharvester
  ...

El comando anterior instala todas las herramientas en la categoría recon. Cómo se puede ver, al final se listan las herramientas instaladas en la imagen.

Al hora de correr el contendor, se le puede sacar mucho más partido si sabemos usar Docker. por ejemplo puedes querer compartir ficheros entre el contenedor y tu sistema, o ejecutar el contenedor con cierto privilegios, etc. Si quiere aprender más sobre Docker, internet está lleno de recursos, pero si prefieres documentació en español y en papel te recomiendo este magnífico libro: Docker: SecDevOps ;)

Docker: SecDevOps

El proyecto está en continuo desarrollo, y estamos trabajando en mejorar el código (refactorización, tests, etc), estamos añadiendo más herramientas y nuevas funcionalidades.

Si lo pruebas y encuentras errores reportalos para que los podamos arreglar o colabora con un pull request, tanto para mejoras, cómo para añadir nuevas herramientas.

Quiero dar las gracias Oscar por su colaboración con el proyecto, así cómo a los viejos de la vieja escuela: Fran, Alberto y Enrique, por sus ideas, apoyo y aguantarme :D