Creando certificados X.509 caducados

  • May 9, 2020
  • tuxotron
  • Expired Certificate

    Ayer hice una presentación sobre TLS para desarrolladores, bueno más bien un taller, y uno de los ejercicios consistía en ejecutar un servicio con un certificado caducado para hacer algunas pruebas.

    Para ello tenía que crearme un certificado caducado, y yo que soy muy listo, me dije nada, cuando cree al certificado lo pongo el número de días de caducidad en negativo y listo. Así, si queremos crear un certificado que caducó hace 5 días:

    openssl req -x509 -newkey rsa:4096 -keyout server.key -out server.crt -days -5
    req: Non-positive number "-5" for -days
    req: Use -help for summary.
    

    Pues eso, que al final no soy tan listo :D

    Así que a buscar se dijo. La mayoría de las soluciones que encontré requerían el cambio de la fecha del sistema por una fecha pasada y luego generando el certificado pasándole el número de días de su caducidad, que obviamente, sumando dicho valor a la fecha de sistema no pasara la fecha actual.

    La verdad que la idea de cambiar la fecha del sistema pues no me hacía mucha gracia, pero luego pensé, bueno si lo hago desde un contenedor ¿Qué más da? Así que levanté un contendor con ubuntu y ejecuté el comando date:

    docker run -it --rm ubuntu:18.04
    root@c09ad5d2689d:/# date +%Y%m%d -s "20200101"
    date: cannot set date: Operation not permitted
    20200101
    root@c09ad5d2689d:/#
    

    Otro batacazo :(. Claro esto tiene sentido. Los miles que os habéis leído el libro de Docker: SecDevOps XD sabréis que un contenedor Docker no es más que un proceso más en el sistema, y éste comparte el mismo reloj. Por lo tanto cambiar la fecha en el contenedor cambiaría también la fecha del sistema, además para ello, tendrías que correr el contenedor con privilegios elevados (–privileged).

    Volviendo a la casilla cero, la idea era el no cambiar la fecha del sistema, así que después de seguir buscando una solución al problema, finalmente encontré una utilidad llamada faketime. Esta utilidad de acuerdo a la documentación, es una simple capa encima de la librería libfaketime. Dicha librería permite la modificación de la fecha para una aplicación sin afectar al sistema. Esta librería intercepta algunas llamadas del sistema y faketime haciendo uso de LD_PRELOAD nos permite establecer la fecha y la hora para una aplicación específica.

    Por lo tanto, ejecutando el siguiente comando:

    faketime '2020-01-01' openssl req -x509 -newkey rsa:4096 -keyout server.key -out server.crt -days 1
    

    Creamos un certificado cuya validez va desde el 1 de enero al 2 de enero del 2020. Verifiquémoslo:

    openssl x509 -in server.crt -text -noout
    
    ...
        Validity
            Not Before: Jan  1 00:00:05 2020 GMT
            Not After : Jan  2 00:00:05 2020 GMT
    ...
    

    faketime acepta varias formas de especificar la fecha como puede observarse en la documentación:

    faketime 'last Friday 5 pm' /bin/date
    faketime '2008-12-24 08:15:42' /bin/date
    faketime -f '+2,5y x10,0' /bin/bash -c 'date; while true; do echo $SECONDS ; sleep 1 ; done'
    ...
    ...
    

    Si quieres probarlo por ti mismo, puedes instalártela o puedes crearte un contenedor Docker. Para ello o bien te creas la imagen de forma manual, o puedes usar doig:

    doig -u -i mytools -t faketime
    

    Y luegos ejecutas el contenedor:

    docker run -it --rm mytools
    

    Por cierto si quieres jugar con “certificados con problemas”, https://badssl.com es un gran recurso.

Generador de imágenes Docker para infosec

  • April 12, 2020
  • tuxotron
  • 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

asn-search, herramienta de reconocimiento

  • February 26, 2020
  • tuxotron
  • Recon

    Uno de los pasos en la fase de reconocimiento o colección de datos sobre un objetivo, es averiguar que IPs están asociadas con el mismo. Para ello, una forma muy usada es buscar los ASN asociados a éste, y a partir de ahí usar alguna herramienta a la que le podamos pasar dicha información y nos de las IPs asociadas.

    Una web que ofrece datos bastante precisos es Electric Hurricane. De ahí podemos sacar la lista de ASNs, volcarla a un fichero y luego mandar dicho fichero a alguna herramienta como nmap, amass, etc.

    Este fin de semana me entretuve un rato jugando con este modelo y decidí automatizar el proceso del volcado de ASNs de Electric Hurricane. Para ello inicialmente intenté ejectuar curl para la extracción de dichos datos, pero esto no resultó ya que la página que muestra datos ejecuta javascript para los mismos, luego intenté hacer web scrapping, esta opción tampoco funcionó y tampoco quería usar algo como Selenium, así que por último intenté usar un navegador en modo headless, y así pude grabar la página con los datos y luego a través de un script en python extraer la información. Para automatizar todo y no tener dependencias de navegador, python, etc, decidí montar todo este tinglado en Docker (sí, es otra dependencia, pero más limpia :) ).

    Podéis encontrar el proyecto en github, y lo podéis usar de la siguiente manera:

    docker run -it --cap-add=SYS_ADMIN tuxotron/asn-search aol
    
    aol
    AS15445
    AS13084
    62.51.0.0/16
    

    Para volcarlo a un fichero sólo tienes que redirigir la salida a un fichero y luego usarlo como fuente de alguna otra herramienta.

    De vez en cuando te encontrarás con el siguiente error:

    [0227/012256.257103:ERROR:headless_shell.cc(481)] Failed to serialize document: Uncaught
    

    Por lo visto es un error en Chromium con la opción headless.

    De todas formas, si te da ese error, ejecuta el comando varias veces más y debería de funcionar.

    No es más que un proyecto de fin de semana… Happy Hacking!