paint-brush
Utiliser les conteneurs Kali Linux Docker pour prendre en charge le grattage Web cachépar@csfx
4,090 lectures
4,090 lectures

Utiliser les conteneurs Kali Linux Docker pour prendre en charge le grattage Web caché

par Colin Barrett-Fox13m2023/07/23
Read on Terminal Reader

Trop long; Pour lire

Libérez la puissance de Kali Linux sur les réseaux Docker en ajoutant une interface graphique au conteneur. Améliorez la collecte d'informations avec le grattage Web anonymisé optimisé par Python, Selenium et le navigateur Tor. Dans la partie 2 de cette série, tout ce qui se trouve dans les conteneurs sera mis à l'épreuve.
featured image - Utiliser les conteneurs Kali Linux Docker pour prendre en charge le grattage Web caché
Colin Barrett-Fox HackerNoon profile picture
0-item
1-item

Libérez la puissance de Kali Linux sur les réseaux Docker en ajoutant une interface graphique au conteneur et améliorez la collecte d'informations avec le grattage Web anonymisé alimenté par Python, Selenium et le navigateur Tor.


En tant qu'ingénieur DevOps, j'ai à la fois expédié et permis à d'autres ingénieurs d'expédier plusieurs centaines de milliers de conteneurs. J'utilise la livraison continue et diverses méthodes d'orchestration : Kubernetes, Lambda Containers sur AWS, Elastic Container Service (ECS) soutenu par Elastic Compute Cloud (EC2) et Fargate. Les conteneurs sont utiles pour les systèmes de construction personnalisés, les déploiements automatisés, l'analyse des vulnérabilités, les objectifs de recherche, l'analyse des données, l'apprentissage automatique, l'archivage des logiciels hérités, le développement local et le grattage Web.


Dans ce guide, je passerai en revue les étapes que j'ai suivies pour ajouter une interface graphique au conteneur officiel Kali Linux de DockerHub en utilisant Xvfb et un serveur VNC. Le code dont je parle ici est publié dans le référentiel open source kalilinux-xvfb et est continuellement livré à Docker Hub pour une utilisation générale. Enfin, dans la partie 2 de cette série, tout ce qui se trouve dans les conteneurs sera mis à l'épreuve. J'utiliserai un script Python personnalisé, Pytest et Selenium pour automatiser l'instance du navigateur Tor et collecter des données sur le Web.


Réseaux de conteneurs

Présentation du réseau de conteneurs et de la connectivité



Une partie de la motivation derrière Kali Linux dans un conteneur est de gagner en visibilité sur l'espace réseau privé créé par la machine hôte pour les conteneurs. La configuration par défaut de Docker Desktop consiste à utiliser un réseau NAT. À moins que le ou les ports ne soient liés à la machine hôte, avec docker run -p , ce service ne sera pas accessible depuis l'hôte.


Les logiciels

Voici des sections récapitulatives ajoutées avec des liens pour chacun des progiciels suivants :


  • Kali Linux

  • Bureau Docker

  • Navigateur Tor

  • Lanceur de navigateur Tor

  • Xvfb

  • Sélénium


Liens supplémentaires pour les logiciels que j'ai utilisés :


Kali Linux


Kali Linux est une distribution Linux basée sur Debian destinée aux tests de pénétration avancés et à l'audit de sécurité. 1


J'ai choisi Kali Linux pour la quantité d'outils axés sur la sécurité disponibles. L'équipe Kali Linux fournit une image Docker régulièrement mise à jour. Une grande partie des logiciels requis est disponible pour l'image Kali Linux Docker et j'utiliserai le gestionnaire de packages pour les installer.


Bureau Docker

Docker Desktop est un framework permettant d'exécuter des conteneurs localement. Les conteneurs sont un moyen de regrouper le système d'exploitation et l'état de l'application dans une image de système d'exploitation réutilisable. Des ressources supplémentaires sont disponibles sur le site Web de Docker .


Les conteneurs et les machines virtuelles présentent des avantages similaires en matière d'isolation et d'allocation des ressources, mais fonctionnent différemment car les conteneurs virtualisent le système d'exploitation au lieu du matériel. 2


Étant donné que les conteneurs Docker sont plus légers que les machines virtuelles, je les privilégie fortement dans mes efforts de développement. À long terme, cet état peut être stocké sous forme de petit fichier texte et il est beaucoup plus facile de suivre les changements au fil du temps avec git et des outils similaires. La possibilité de dériver à nouveau une image à partir d'un fichier texte est puissante. Cependant, il est tout à fait possible qu'un Dockerfile tombe en ruine au fil du temps et ne puisse pas être construit à une date ultérieure. Comme tout autre système d'exploitation et infrastructure en tant que code, il est important de tout garder à jour.


Une alternative à Docker serait d'utiliser une machine virtuelle ou une installation bare metal. Cependant, je pense que les conteneurs sont le banc d'essai idéal pour exécuter des robots d'exploration Web éphémères, car ils sont faciles à provisionner et à nettoyer. Je peux exécuter plusieurs conteneurs sur une seule machine, en parallèle, qui peuvent être démarrés et arrêtés presque instantanément. Ensuite, chaque fois que j'ai besoin d'une isolation supplémentaire, toute cette configuration peut également être exécutée à partir d'une machine virtuelle.


Navigateur Tor

Le routeur Onion (Tor) est un réseau mondial d'ordinateurs qui acheminent le trafic via une série de sauts cryptés. Cela permet à un utilisateur de naviguer sur Internet de manière quelque peu anonyme et permet également à un utilisateur d'accéder à des sites Web qui ne sont disponibles que sur le réseau Tor.


  • Tor Browser est une version lourdement configurée de Firefox qui met l'accent sur la confidentialité et la sécurité. Il peut utiliser le réseau Tor prêt à l'emploi.

  • torbrowser-launcher est inclus dans de nombreux systèmes d'exploitation Linux et permet de démarrer un navigateur Web sur le réseau Tor extrêmement facilement.


Sélénium

Selenium est un outil d'automatisation des navigateurs Web. J'ai choisi Python dans cet exemple, mais il existe de nombreux langages et outils disponibles.


J'utiliserai Selenium pour automatiser ce navigateur Tor sur le réseau Tor. J'essaie de tirer parti de la configuration existante du navigateur soucieux de la sécurité pour limiter le partage d'informations aux cibles. Je pourrai nettoyer les états d'exécution des conteneurs en les arrêtant. La session WebDriver résultante aura une adresse IP aléatoire vendue via Tor, ce qui en fait un outil très puissant pour le grattage Web.


Xvfb

Le composant XOrg Xvfb peut être utilisé pour simuler un écran pour le système X window. J'utiliserai ensuite cet écran pour démarrer un serveur X dans le conteneur. Cette technique d'émulation n'est pas particulièrement rapide, et les applications lourdes en graphisme bénéficieront d'un GPU.

Aperçu des fichiers

Les Dockerfiles doivent s'appuyer sur n'importe quelle distribution Linux, macOS ou Windows pouvant exécuter Docker. J'ai testé cela sur Docker Desktop en utilisant un processeur Intel. Il existe une variante ARM pour le conteneur de base officiel de Kalilinux. J'apprécierais les commentaires de quiconque essaie de l'exécuter sur ARM.


  1. Fichier Docker
  2. TorBrowser.Dockerfile
  3. TorBrowser-root.Dockerfile
  4. startx-once.sh
  5. start-vnc-server-once.sh
  6. ssh-keys.sh
  7. torrc
  8. .github/workflows/main.yml


Fichier Docker

C'est le Dockerfile que j'ai utilisé pour créer l'image de base. J'ai ajouté quelques commentaires pour expliquer ce que fait chaque ligne.


 # 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



startx-once.sh

Aide à démarrer le serveur X. J'utilise la commande Xvfb pour démarrer le serveur X. Si un PID est présent et que quelque chose ne va pas avec le serveur X, je peux arrêter le processus et le redémarrer. J'ai expérimenté le blocage des sessions X du réseau, bien que cela puisse être inutile, je l'ajoute quand même: -nolisten tcp discussion on super user

 #!/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


ssh-keys.sh

Les clients VNC sont loin d'être idéaux pour copier et coller du texte. Cela peut être résolu en ajoutant des clés SSH au conteneur pour aider d'autres hôtes à s'y connecter. Cela ouvre la possibilité d'utiliser des tunnels SSH pour se connecter au conteneur.


La commande ssh-keygen suivante a été référencée à partir de cet article 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 je vais utiliser ces clés, j'ai besoin de la clé privée sur mon poste de travail. J'utilise les commandes suivantes pour copier la clé privée sur ma machine hôte à partir de docker, mais il existe une multitude de façons de le faire. Il y a eu une bonne discussion à ce sujet sur Stack Overflow .


Trouver l'ID du conteneur avec la commande ps :

 docker ps 


sortie de la commande docker ps


Utilisation de l'ID de conteneur pour copier le avec la commande 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


torrc

Cela doit être copié dans le conteneur, mais il ne s'agit que de sections non commentées de la configuration passe-partout fournie par le projet Tor ici .

 # /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


TorBrowser.Dockerfile

Ce Dockerfile s'appuie sur le Dockerfile précédent et ajoute le navigateur Tor et Python au mélange. J'utilise le paquet torbrowser-launcher pour installer le navigateur Tor.


 # 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


TorBrowser-root.Dockerfile

Comme avant mais avec moins de configuration. Utilisera l'utilisateur 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


.github/workflows/main.yml

Le fichier de workflow Github Actions crée l'image Docker et la transmet à Docker Hub. Il s'agit du workflow de stock de la documentation de Docker , avec des balises supplémentaires en cours de poussée. J'ai ajouté unhoraire pour déclencher cette action une fois par jour.


Utilisation des actions GitHub pour la livraison continue de conteneurs



 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


Utilisation des conteneurs

Maintenant, je peux tester les conteneurs et voir s'ils fonctionnent. Je vais utiliser la balise torbrowser pour cet exemple.


Construire les conteneurs (facultatif)

Consultez la documentation de construction de l'interface de ligne de commande Docker pour plus d'informations sur la commande docker build . Pour créer des conteneurs localement, j'utilise les commandes suivantes, sinon ils peuvent être extraits de Docker Hub à la demande au cours des étapes suivantes.

 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 .


Exécution des conteneurs avec un volume

Je dois monter un volume sur le conteneur pour pouvoir accéder aux fichiers sur lesquels je travaille. J'utilise le répertoire ${HOME}/src comme volume.


Quelques brèves notes sur les indicateurs que nous utilisons sont incluses ci-dessous, sinon consultez la documentation d'exécution de Docker CLI pour plus d'informations sur la commande docker run .


  • -it est utilisé pour exécuter le conteneur en mode interactif.

  • --rm est utilisé pour supprimer les couches du conteneur lorsqu'il se termine.

  • -p est utilisé pour mapper le port du conteneur à la machine hôte.

  • -v est utilisé pour monter un volume de la machine hôte vers le conteneur.


 # 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


Utilisation du navigateur Tor à partir du conteneur

Ensuite, je souhaite ouvrir le conteneur utilisateur, me connecter via VNC et exécuter le lanceur de navigateur Tor pour vérifier que tout fonctionne jusqu'à présent. Le lanceur de navigateur Tor ne fonctionnera pas avec l'utilisateur root.

Démarrez le conteneur avec l'utilisateur par défaut :


 docker run -it --rm -p 5901:5901 -v "${HOME}/src":/src excitingtheory/kalilinux-xvfb:torbrowser


En démarrant le serveur VNC dans le conteneur, le serveur demandera le mot de passe principal, je définis un mot de passe supplémentaire en lecture seule.

 /opt/start-vnc-server-once.sh


Vous trouverez ci-dessous un exemple de sortie.

Sortie du démarrage du serveur VNC


Connectez-vous sur macOS

La boîte de dialogue de connexion au serveur se trouve dans le menu Finder : Go -> Connect to Server .

L'exemple de boîte de dialogue macOS 'Connect to Server' pointe vers vnc://localhost:5901


Une fois la boîte de dialogue ouverte, entrez l'adresse vnc://localhost:5901 et cliquez sur Connect . J'ai enregistré cette adresse en favori pour un accès facile.

Se connecter sur Windows

Un client vnc comme TightVNC peut s'y connecter sur localhost:5901 .

Connecté au bureau Kali Linux Xfce4

Une fois connecté, je peux voir le bureau xfce4.

Le bureau hébergé sur le conteneur, accessible via le client VNC.


Maintenant, je peux démarrer le lanceur de navigateur Tor à partir du terminal dans la session VNC.

 torbrowser-launcher 


Exécution de torbrowser-launcher dans Docker via le client VNC


Une fois le navigateur ouvert, je peux vérifier s'il fonctionne en accédant au vérificateur de connexion du projet Tor

Un exemple de test réussi :

Test de connexion réussi sur https://check.torproject.org/




J'ai ouvert le site sur ma machine hôte, qui n'était pas connectée, pour comparer :

Test de connexion infructueux sur https://check.torproject.org/




Progrès jusqu'à présent

C'est la configuration du système d'exploitation que je voulais terminer avant de commencer à travailler avec Selenium et Python. Pour récapituler, j'ai fait ce qui suit :


  1. Dépendances installées pour Selenium, Python et un environnement de bureau xfce4 simple.
  2. Création et déploiement de trois images Docker interdépendantes avec GitHub Actions.
  3. Démarrage réussi d'un serveur VNC dans un conteneur Docker.
  4. Connecté à l'environnement de bureau d'un conteneur en cours d'exécution avec un client VNC.
  5. Testé l'exécution de Tor Browser Launcher à partir du conteneur et vérifié qu'il se connecte au réseau Tor.


Maintenant qu'il existe un environnement de conteneur de travail. Consultez le prochain article de cette série sur le grattage Web Python secret.