Libere el poder de Kali Linux en las redes Docker agregando una GUI nuevamente al contenedor y aumente el nivel de recopilación de información con raspado web anónimo con tecnología de Python, Selenium y Tor Browser.
Como ingeniero de DevOps, he enviado y permitido que otros ingenieros envíen muchos cientos de miles de contenedores. Uso Continuous Delivery y una variedad de métodos de orquestación: Kubernetes, Lambda Containers en AWS, Elastic Container Service (ECS) respaldado por Elastic Compute Cloud (EC2) y Fargate. Los contenedores son útiles para sistemas de compilación personalizados, implementaciones automatizadas, análisis de vulnerabilidades, fines de investigación, análisis de datos, aprendizaje automático, archivado de software heredado, desarrollo local y web scraping.
En esta guía, repasaré los pasos que realicé para agregar una GUI al contenedor oficial de Kali Linux desde DockerHub usando Xvfb y un servidor VNC. El código del que hablo aquí está publicado en el repositorio de código abierto kalilinux-xvfb y se entrega continuamente a Docker Hub para uso general. Finalmente, en la Parte 2 de esta serie, se pondrá a prueba todo lo que hay en los contenedores. Usaré un script de Python personalizado, Pytest y Selenium para automatizar la instancia del navegador Tor y recopilar datos de la web.
Parte de la motivación detrás de tener Kali Linux en un contenedor es ganar visibilidad en el espacio de la red privada creado por la máquina host para los contenedores. La configuración predeterminada de Docker Desktop es usar una red NAT. A menos que los puertos estén vinculados a la máquina host, con docker run -p , no se podrá acceder a ese servicio desde el host.
Aquí se agregan secciones de resumen con enlaces para cada uno de los siguientes paquetes de software:
kali linux
Escritorio acoplable
Navegador Tor
Lanzador del navegador Tor
xvfb
Selenio
Enlaces adicionales para el software que utilicé:
Kali Linux es una distribución de Linux basada en Debian destinada a pruebas de penetración avanzadas y auditorías de seguridad. 1
Elegí Kali Linux por la gran cantidad de herramientas centradas en la seguridad que están disponibles. El equipo de Kali Linux proporciona una imagen de Docker que se actualiza periódicamente. Gran parte del software requerido está disponible para la imagen Docker de Kali Linux y usaré el administrador de paquetes para instalarlos.
Docker Desktop es un marco para ejecutar contenedores localmente. Los contenedores son una forma de empaquetar el sistema operativo y el estado de la aplicación en una imagen de sistema operativo reutilizable. Hay recursos adicionales disponibles en el sitio web de Docker .
Los contenedores y las máquinas virtuales tienen beneficios similares de asignación y aislamiento de recursos, pero funcionan de manera diferente porque los contenedores virtualizan el sistema operativo en lugar del hardware. 2
Dado que los contenedores Docker son más livianos que las máquinas virtuales, los prefiero mucho en mis esfuerzos de desarrollo. A largo plazo, este estado se puede almacenar como un pequeño archivo de texto y es mucho más fácil rastrear los cambios a lo largo del tiempo con git y herramientas similares. La capacidad de derivar una imagen nuevamente de un archivo de texto es poderosa. Sin embargo, es muy posible que un Dockerfile se deteriore con el tiempo y no se pueda compilar en una fecha posterior. Al igual que cualquier otro sistema operativo e infraestructura como código, es importante mantener todo actualizado.
Una alternativa a Docker sería usar una máquina virtual o una instalación completa. Sin embargo, creo que los contenedores son el banco de pruebas perfecto para ejecutar rastreadores web efímeros porque son fáciles de aprovisionar y limpiar. Puedo ejecutar muchos contenedores en una sola máquina, en paralelo, que se pueden iniciar y detener casi al instante. Luego, siempre que necesite un aislamiento adicional, toda esta configuración también se puede ejecutar desde dentro de una máquina virtual.
The Onion Router (Tor) es una red global de computadoras que enrutan el tráfico a través de una serie de saltos encriptados. Esto permite que un usuario navegue por Internet de forma algo anónima y también permite que un usuario acceda a sitios web que solo están disponibles en la red Tor.
Tor Browser es una versión muy configurada de Firefox que se centra en la privacidad y la seguridad. Puede usar la Red Tor lista para usar.
torbrowser-launcher está incluido en muchos sistemas operativos Linux y hace que iniciar un navegador web en la red Tor sea extremadamente fácil.
Selenium es una herramienta para automatizar navegadores web. Elegí Python en este ejemplo, pero hay muchos lenguajes y herramientas disponibles.
Usaré Selenium para automatizar este navegador Tor en la red Tor. Estoy intentando aprovechar la configuración existente del navegador consciente de la seguridad para limitar el intercambio de información a los objetivos. Podré limpiar los estados de tiempo de ejecución de los contenedores deteniéndolos. La sesión resultante de WebDriver tendrá una dirección IP aleatoria vendida a través de Tor, lo que la convierte en una herramienta muy poderosa para el web scraping.
El componente XOrg Xvfb se puede utilizar para simular una pantalla en el sistema de ventanas X. Luego usaré esta pantalla para iniciar un servidor X en el contenedor. Esta técnica de emulación no es particularmente rápida y las aplicaciones con muchos gráficos se beneficiarán de una GPU.
Los Dockerfiles deben basarse en cualquier distribución de Linux, macOS o Windows que pueda ejecutar Docker. He probado esto en Docker Desktop usando un procesador Intel. Hay una variante ARM para el contenedor base oficial de Kalilinux. Agradecería los comentarios de cualquiera que intente ejecutar esto en ARM.
Este es el Dockerfile que usé para construir la imagen base. He agregado algunos comentarios para explicar lo que hace cada línea.
# From the official Kali Linux Docker image rolling release FROM kalilinux/kali-rolling # Leaving this here for now, but it's not needed ARG DISPLAY_NUMBER=1 ENV DISPLAY=:$DISPLAY_NUMBER # Install the packages we need # Got lucky with this one, there was a ticket about this: # https://github.com/dnschneid/crouton/issues/4461 `xfce4 dbus-launch not found` in this version of the image so installing dbus-x11 RUN apt-get update -y -q \ && apt-get install -y -q xvfb xfce4 xfce4-goodies tightvncserver net-tools curl openssh-server dbus-x11 # This line copies the shell scripts from the local directory to the container, and makes them executable. COPY *.sh /opt/ RUN chmod 755 /opt/*.sh # This line runs the shell scripts that start the X server, and generate the SSH keys. RUN /opt/startx-once.sh RUN /opt/ssh-keys.sh # This line sets the entrypoint to bash, so that we can run commands in the container. ENTRYPOINT /bin/bash
Ayuda a iniciar el servidor X. Estoy usando el comando Xvfb para iniciar el servidor X. Si hay un PID presente y algo anda mal con el servidor X, puedo cancelar el proceso y comenzarlo de nuevo. Experimenté con el bloqueo de X sesiones de la red, aunque puede ser innecesario, todavía lo estoy agregando de todos modos: -noescucha la discusión de tcp sobre el superusuario
#!/bin/bash FILE=/opt/.x.pid if [[ -f "$FILE" ]]; then echo "$FILE exist" echo "PID: " `cat $FILE` else Xvfb -nolisten tcp $DISPLAY & echo $? > $FILE fi
Los clientes VNC son menos que ideales para copiar y pegar texto. Esto se puede remediar agregando claves SSH al contenedor para ayudar a otros hosts a conectarse a él. Esto abre la posibilidad de usar túneles SSH para conectarse al contenedor.
Se hizo referencia al siguiente comando ssh-keygen
de este artículo de Stack Exchange
#!/bin/bash # Generate SSH keys ssh-keygen -b 2048 -t rsa -f ~/.ssh/id_rsa -q -N "" cat ~/.ssh/id_rsa >> ~/.ssh/authorized_keys
Si voy a usar estas claves, necesito la clave privada en mi estación de trabajo. Estoy usando los siguientes comandos para copiar la clave privada a mi máquina host desde la ventana acoplable, pero hay muchas formas de hacerlo. Hubo una buena discusión sobre esto en Stack Overflow .
Encontrar la ID del contenedor con el comando ps :
docker ps
Usando la ID del contenedor para copiar con el comando cp :
# For root docker cp <containerId>:/root/.ssh/id_rsa /target/path/on/host # Otherwise for the user configured in the Dockerfile docker cp <containerId>:/home/username/.ssh/id_rsa /target/path/on/host
Esto debe copiarse en el contenedor, pero son solo secciones sin comentarios de la configuración repetitiva que el Proyecto Tor proporciona aquí .
# /etc/tor/torrc ## Tor opens a SOCKS proxy on port 9050 by default -- even if you don't ## configure one below. Set "SOCKSPort 0" if you plan to run Tor only ## as a relay, and not make any local application connections yourself. SOCKSPort 9050 # Default: Bind to localhost:9050 for local connections. #SOCKSPort 192.168.0.1:9100 # Bind to this address:port too. ## Uncomment this to start the process in the background... or use ## --runasdaemon 1 on the command line. This is ignored on Windows; ## see the FAQ entry if you want Tor to run as an NT service. RunAsDaemon 1 ## The port on which Tor will listen for local connections from Tor ## controller applications, as documented in control-spec.txt. ControlPort 9051 ## If you enable the controlport, be sure to enable one of these ## authentication methods, to prevent attackers from accessing it. #HashedControlPassword 16:872860B76453A77D60CA2BB8C1A7042072093276A3D701AD684053EC4C CookieAuthentication 1
Este Dockerfile se basa en el Dockerfile anterior y agrega Tor Browser y Python a la mezcla. Estoy usando el paquete torbrowser-launcher para instalar Tor Browser.
# From the base Dockerfile: FROM excitingtheory/kalilinux-xvfb ARG DISPLAY_NUMBER=1 ENV DISPLAY=:$DISPLAY_NUMBER # More info about torbrowser-launcher: # https://github.com/micahflee/torbrowser-launcher RUN apt-get update -y -q \ && apt-get install -y -q torbrowser-launcher python3 python3-pip # Create a user and add them to the sudo group, sudo still TBD but leaving for now, will not be able to switch users in this container. RUN useradd -s /bin/bash -m username \ && usermod -aG sudo username # Install python packages RUN pip3 install selenium pytest COPY torrc /etc/tor/torrc # Set the user and home directory for the container USER username ENV USER=username ENV HOME=/home/username # Run the shell scripts that start the X server, and generate the SSH keys. RUN /opt/startx-once.sh RUN /opt/ssh-keys.sh # This line sets the entrypoint to bash, so that we can run commands in the container. ENTRYPOINT /bin/bash
Igual que antes pero con menos configuración. Utilizará el usuario root.
# From the base Dockerfile: FROM excitingtheory/kalilinux-xvfb ARG DISPLAY_NUMBER=1 ENV DISPLAY=:$DISPLAY_NUMBER # More info about torbrowser-launcher: # https://github.com/micahflee/torbrowser-launcher RUN apt-get update -y -q \ && apt-get install -y -q torbrowser-launcher python3 python3-pip # Install python packages RUN pip3 install selenium pytest # Copy the tor config file into the containera COPY torrc /etc/tor/torrc # Run the shell scripts that start the X server, and generate the SSH keys. RUN /opt/startx-once.sh RUN /opt/ssh-keys.sh # This line sets the entrypoint to bash, so that we can run commands in the container. ENTRYPOINT /bin/bash
El archivo de flujo de trabajo de Github Actions crea la imagen de Docker y la envía a Docker Hub. Este es el flujo de trabajo de stock de la documentación de Docker , con etiquetas adicionales insertadas. Agregué unprograma para activar esta acción una vez al día.
name: docker build and push on: push: branches: - "main" schedule: - cron: '20 16 * * *' jobs: build: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v3 - name: Login to Docker Hub uses: docker/login-action@v2 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 - name: Build and push base image uses: docker/build-push-action@v4 with: context: . file: ./Dockerfile push: true tags: excitingtheory/kalilinux-xvfb:latest - name: Build and push torbrowser root image uses: docker/build-push-action@v4 with: context: . file: ./TorBrowser-root.Dockerfile push: true tags: excitingtheory/kalilinux-xvfb:torbrowser-root - name: Build and push torbrowser image uses: docker/build-push-action@v4 with: context: . file: ./TorBrowser.Dockerfile push: true tags: excitingtheory/kalilinux-xvfb:torbrowser
Ahora puedo probar los contenedores y ver si funcionan. Voy a usar la etiqueta torbrowser
para este ejemplo.
Consulte la Documentación de compilación de la CLI de Docker para obtener más información sobre el comando docker build
. Para construir contenedores localmente, uso los siguientes comandos; de lo contrario, se pueden extraer de Docker Hub a pedido durante los siguientes pasos.
docker build -t excitingtheory/kalilinux-xvfb . docker build -t excitingtheory/kalilinux:torbrowser -f TorBrowser.Dockerfile . docker build -t excitingtheory/kalilinux:torbrowser-root -f TorBrowser-root.Dockerfile .
Necesito montar un volumen en el contenedor para poder acceder a los archivos en los que estoy trabajando. Estoy usando el directorio ${HOME}/src
como volumen.
A continuación se incluyen algunas notas breves sobre las banderas que estamos usando; de lo contrario, consulte la Documentación de ejecución de la CLI de Docker para obtener más información sobre el comando docker run
.
-it
utiliza para ejecutar el contenedor en modo interactivo.
--rm
se usa para eliminar las capas del contenedor cuando sale.
-p
se usa para asignar el puerto desde el contenedor a la máquina host.
-v
se usa para montar un volumen desde la máquina host al contenedor.
# Run the base container docker run -it --rm -p 5901:5901 -v "${HOME}/src":/src excitingtheory/kalilinux-xvfb # Run the container with the default user docker run -it --rm -p 5901:5901 -v "${HOME}/src":/src excitingtheory/kalilinux-xvfb:torbrowser # Run the container with the root user docker run -it --rm -p 5901:5901 -v "${HOME}/src":/src excitingtheory/kalilinux-xvfb:torbrowser-root
A continuación, quiero abrir el contenedor de usuarios, iniciar sesión a través de VNC y ejecutar Tor Browser Launcher para verificar que todo funciona hasta el momento. El iniciador del navegador Tor no funcionará con el usuario root.
Inicie el contenedor con el usuario predeterminado:
docker run -it --rm -p 5901:5901 -v "${HOME}/src":/src excitingtheory/kalilinux-xvfb:torbrowser
Al iniciar el servidor VNC en el contenedor, el servidor solicitará la contraseña principal, estoy configurando una contraseña adicional de solo lectura.
/opt/start-vnc-server-once.sh
A continuación se muestra un ejemplo de la salida.
El cuadro de diálogo de conexión al servidor se puede encontrar en el menú del buscador: Go
-> Connect to Server
.
Una vez que se abra el cuadro de diálogo, ingrese la dirección vnc://localhost:5901
y haga clic en Connect
. He guardado esta dirección como favorita para facilitar el acceso.
Un cliente vnc como TightVNC puede conectarse a esto en localhost:5901
.
Una vez conectado, puedo ver el escritorio xfce4.
Ahora puedo iniciar Tor Browser Launcher desde el terminal en la sesión de VNC.
torbrowser-launcher
Una vez que el navegador está abierto, puedo verificar si funciona yendo al Comprobador de conexión del proyecto Tor
Esta es la configuración del sistema operativo que quería terminar antes de comenzar a trabajar con Selenium y Python. En resumen, he hecho lo siguiente:
Ahora que hay un entorno de contenedor de trabajo. Consulte la siguiente publicación de esta serie sobre raspado web encubierto de Python.