paint-brush
Verwenden Sie Kali Linux Docker-Container, um verdecktes Web Scraping zu unterstützenvon@csfx
4,090 Lesungen
4,090 Lesungen

Verwenden Sie Kali Linux Docker-Container, um verdecktes Web Scraping zu unterstützen

von Colin Barrett-Fox13m2023/07/23
Read on Terminal Reader
Read this story w/o Javascript

Zu lang; Lesen

Nutzen Sie die Leistungsfähigkeit von Kali Linux in Docker-Netzwerken, indem Sie dem Container wieder eine GUI hinzufügen. Verbessern Sie die Informationserfassung mit anonymisiertem Web-Scraping auf Basis von Python, Selenium und Tor Browser. Im zweiten Teil dieser Serie wird alles, was sich in den Containern befindet, auf die Probe gestellt.
featured image - Verwenden Sie Kali Linux Docker-Container, um verdecktes Web Scraping zu unterstützen
Colin Barrett-Fox HackerNoon profile picture
0-item
1-item

Nutzen Sie die Leistungsfähigkeit von Kali Linux in Docker-Netzwerken, indem Sie dem Container eine grafische Benutzeroberfläche hinzufügen und die Informationserfassung mit anonymisiertem Web-Scraping auf Basis von Python, Selenium und Tor Browser verbessern.


Als DevOps-Ingenieur habe ich viele Hunderttausende Container versendet und anderen Ingenieuren die Möglichkeit gegeben, sie zu versenden. Ich verwende Continuous Delivery und verschiedene Orchestrierungsmethoden: Kubernetes, Lambda Containers auf AWS, Elastic Container Service (ECS), unterstützt von Elastic Compute Cloud (EC2) und Fargate. Container sind nützlich für benutzerdefinierte Build-Systeme, automatisierte Bereitstellungen, Schwachstellen-Scans, Forschungszwecke, Datenanalysen, maschinelles Lernen, Archivierung älterer Software, lokale Entwicklung und Web-Scraping.


In dieser Anleitung werde ich die Schritte durchgehen, die ich durchlaufen habe, um mithilfe von Xvfb und einem VNC-Server eine GUI zum offiziellen Kali-Linux-Container von DockerHub hinzuzufügen. Der hier besprochene Code wird im Open-Source-Repository kalilinux-xvfb veröffentlicht und kontinuierlich zur allgemeinen Verwendung an Docker Hub bereitgestellt. Abschließend wird in Teil 2 dieser Serie alles in den Containern auf die Probe gestellt. Ich werde ein benutzerdefiniertes Python-Skript, Pytest und Selenium verwenden, um die Tor-Browser-Instanz zu automatisieren und Daten aus dem Web zu sammeln.


Containernetzwerke

Überblick über Containernetzwerk und Konnektivität



Ein Teil der Motivation, Kali Linux in einem Container zu haben, besteht darin, Einblick in den privaten Netzwerkraum zu erhalten, der vom Host-Computer für Container erstellt wird. Das Standard-Setup von Docker Desktop ist die Verwendung eines NAT-Netzwerks. Sofern die Ports nicht mit docker run -p an den Host-Rechner gebunden sind, ist dieser Dienst vom Host aus nicht zugänglich.


Die Software

Hier sind zusammenfassende Abschnitte mit Links für jedes der folgenden Softwarepakete hinzugefügt:


  • Kali Linux

  • Docker-Desktop

  • Tor Browser

  • Tor-Browser-Launcher

  • Xvfb

  • Selen


Zusätzliche Links zu der von mir verwendeten Software:


Kali Linux


Kali Linux ist eine auf Debian basierende Linux-Distribution, die auf erweiterte Penetrationstests und Sicherheitsüberprüfungen abzielt. 1


Ich habe mich für Kali Linux entschieden, weil es so viele sicherheitsorientierte Tools gibt. Das Kali Linux-Team stellt ein Docker-Image bereit, das regelmäßig aktualisiert wird. Ein Großteil der erforderlichen Software ist für das Kali Linux Docker-Image verfügbar und ich werde sie mit dem Paketmanager installieren.


Docker-Desktop

Docker Desktop ist ein Framework zum lokalen Ausführen von Containern. Container sind eine Möglichkeit, den Betriebssystem- und Anwendungsstatus in einem wiederverwendbaren Betriebssystem-Image zu verpacken. Weitere Ressourcen sind auf der Docker-Website verfügbar.


Container und virtuelle Maschinen bieten ähnliche Vorteile bei der Ressourcenisolation und -zuweisung, funktionieren jedoch unterschiedlich, da Container das Betriebssystem und nicht die Hardware virtualisieren. 2


Da Docker-Container leichter sind als virtuelle Maschinen, bevorzuge ich sie bei meinen Entwicklungsbemühungen stark. Langfristig kann dieser Status als kleine Textdatei gespeichert werden und es ist viel einfacher, Änderungen im Laufe der Zeit mit Git und ähnlichen Tools zu verfolgen. Die Möglichkeit, ein Bild erneut aus einer Textdatei abzuleiten, ist leistungsstark. Es ist jedoch durchaus möglich, dass eine Docker-Datei mit der Zeit unbrauchbar wird und die Erstellung zu einem späteren Zeitpunkt fehlschlägt. Wie bei jedem anderen Betriebssystem und bei Infrastructure as Code ist es wichtig, alles auf dem neuesten Stand zu halten.


Eine Alternative zu Docker wäre die Verwendung einer virtuellen Maschine oder einer Bare-Metal-Installation. Ich glaube jedoch, dass Container die perfekte Testumgebung für die Ausführung kurzlebiger Webcrawler sind, da sie einfach bereitzustellen und zu bereinigen sind. Ich kann viele Container parallel auf einer einzigen Maschine ausführen, die fast sofort gestartet und gestoppt werden können. Wenn ich dann zusätzliche Isolierung benötige, kann das gesamte Setup auch von einer virtuellen Maschine aus ausgeführt werden.


Tor Browser

Der Onion Router (Tor) ist ein globales Netzwerk von Computern, die den Datenverkehr über eine Reihe verschlüsselter Hops weiterleiten. Dadurch kann ein Benutzer einigermaßen anonym im Internet surfen und auf Websites zugreifen, die nur im Tor-Netzwerk verfügbar sind.


  • Tor Browser ist eine stark konfigurierte Version von Firefox mit Schwerpunkt auf Datenschutz und Sicherheit. Es kann das Tor-Netzwerk sofort nutzen.

  • torbrowser-launcher ist in vielen Linux-Betriebssystemen enthalten und macht das Starten eines Webbrowsers im Tor-Netzwerk extrem einfach.


Selen

Selenium ist ein Tool zur Automatisierung von Webbrowsern. In diesem Beispiel habe ich mich für Python entschieden, aber es stehen viele Sprachen und Tools zur Verfügung.


Ich werde Selenium verwenden, um diesen Tor-Browser im Tor-Netzwerk zu automatisieren. Ich versuche, die vorhandene Konfiguration des sicherheitsbewussten Browsers auszunutzen, um die Weitergabe von Informationen an Ziele einzuschränken. Ich kann die Laufzeitzustände der Container bereinigen, indem ich sie stoppe. Die resultierende WebDriver-Sitzung verfügt über eine zufällige IP-Adresse, die über Tor verkauft wird, was es zu einem sehr leistungsstarken Tool für Web-Scraping macht.


Xvfb

Mit der XOrg-Komponente Xvfb kann ein Bildschirm für das X-Window-System simuliert werden. Über diesen Bildschirm werde ich dann einen X-Server im Container starten. Diese Emulationstechnik ist nicht besonders schnell und grafikintensive Anwendungen profitieren von einer GPU.

Übersicht über die Dateien

Die Docker-Dateien sollten auf jeder Linux-, macOS- oder Windows-Distribution aufbauen, die Docker ausführen kann. Ich habe dies auf Docker Desktop mit einem Intel-Prozessor getestet. Für den offiziellen Kalilinux-Basiscontainer gibt es eine ARM-Variante. Ich würde mich über Feedback von jedem freuen, der versucht, dies auf ARM auszuführen.


  1. Docker-Datei
  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


Docker-Datei

Dies ist die Docker-Datei, die ich zum Erstellen des Basis-Images verwendet habe. Ich habe ein paar Kommentare hinzugefügt, um zu erklären, was jede Zeile bewirkt.


 # 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

Hilft beim Starten des X-Servers. Ich verwende den Xvfb-Befehl, um den X-Server zu starten. Wenn eine PID vorhanden ist und etwas mit dem X-Server nicht stimmt, kann ich den Prozess abbrechen und erneut starten. Ich habe mit dem Blockieren von X-Sitzungen aus dem Netzwerk experimentiert, obwohl es vielleicht unnötig ist, füge ich es trotzdem hinzu: -nolisten tcp diskussion auf Superuser

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

VNC-Clients sind zum Kopieren und Einfügen von Text nicht ideal. Abhilfe schafft hier das Hinzufügen von SSH-Schlüsseln zum Container, um anderen Hosts die Verbindung zum Container zu erleichtern. Dies eröffnet die Möglichkeit, über SSH-Tunnel eine Verbindung zum Container herzustellen.


In diesem Stack Exchange-Artikel wurde auf den folgenden Befehl ssh-keygen verwiesen

 #!/bin/bash # Generate SSH keys ssh-keygen -b 2048 -t rsa -f ~/.ssh/id_rsa -q -N "" cat ~/.ssh/id_rsa >> ~/.ssh/authorized_keys


Wenn ich diese Schlüssel verwenden möchte, benötige ich den privaten Schlüssel auf meiner Workstation. Ich verwende die folgenden Befehle, um den privaten Schlüssel von Docker auf meinen Host-Rechner zu kopieren, aber es gibt eine Vielzahl von Möglichkeiten, dies zu tun. Es gab eine gute Diskussion dazu auf Stack Overflow .


Ermitteln der Container-ID mit dem ps-Befehl :

 docker ps 


Docker PS-Befehlsausgabe


Verwenden der Container-ID zum Kopieren mit dem cp-Befehl :

 # 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

Dies muss in den Container kopiert werden, ist aber nur unkommentierte Abschnitte aus der Boilerplate-Konfiguration, die das Tor-Projekt hier bereitstellt.

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

Diese Docker-Datei baut auf der vorherigen Docker-Datei auf und fügt dem Mix Tor Browser und Python hinzu. Ich verwende das torbrowser-launcher- Paket, um den Tor-Browser zu installieren.


 # 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

Genau wie zuvor, aber mit weniger Konfiguration. Wird den Root-Benutzer verwenden.


 # 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

Die Github Actions-Workflowdatei erstellt das Docker-Image und überträgt es an Docker Hub. Dies ist der Standard-Workflow aus der Docker-Dokumentation , wobei zusätzliche Tags gepusht werden. Ich habe einenZeitplan hinzugefügt, um diese Aktion einmal am Tag auszulösen.


Verwenden von GitHub-Aktionen für die kontinuierliche Bereitstellung von Containern



 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


Verwendung der Container

Jetzt kann ich die Container testen und sehen, ob sie funktionieren. Ich werde für dieses Beispiel das torbrowser -Tag verwenden.


Erstellen der Container (optional)

Weitere Informationen zum docker build Befehl finden Sie in der Docker-CLI-Build-Dokumentation . Um Container lokal zu erstellen, verwende ich die folgenden Befehle, ansonsten können sie in den nächsten Schritten bei Bedarf vom Docker Hub abgerufen werden.

 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 .


Ausführen der Container mit einem Volume

Ich muss ein Volume im Container bereitstellen, damit ich auf die Dateien zugreifen kann, an denen ich arbeite. Ich verwende das Verzeichnis ${HOME}/src als Volume.


Nachfolgend finden Sie einige kurze Hinweise zu den von uns verwendeten Flags. Weitere Informationen zum docker run Befehl finden Sie ansonsten in der Docker CLI Run-Dokumentation .


  • -it wird verwendet, um den Container im interaktiven Modus auszuführen.

  • --rm wird verwendet, um die Containerebenen zu entfernen, wenn es beendet wird.

  • -p wird verwendet, um den Port vom Container zum Host-Computer zuzuordnen.

  • -v wird verwendet, um ein Volume vom Host-Computer in den Container zu mounten.


 # 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


Verwendung des Tor-Browsers aus dem Container

Als nächstes möchte ich den Benutzercontainer öffnen, mich über VNC anmelden und den Tor Browser Launcher ausführen, um zu überprüfen, ob bisher alles funktioniert. Der Tor-Browser-Launcher funktioniert nicht mit dem Root-Benutzer.

Starten Sie den Container mit dem Standardbenutzer:


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


Beim Starten des VNC-Servers im Container fordert der Server zur Eingabe des Hauptkennworts auf. Ich lege ein zusätzliches Nur-Anzeige-Kennwort fest.

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


Nachfolgend finden Sie ein Beispiel für die Ausgabe.

Ausgabe vom Starten des VNC-Servers


Verbinden Sie sich unter macOS

Das Dialogfeld „Mit Server verbinden“ finden Sie im Finder-Menü: Go -> Connect to Server .

Das Beispiel des macOS-Dialogfelds „Mit Server verbinden“ zeigte auf vnc://localhost:5901


Sobald das Dialogfeld geöffnet ist, geben Sie die Adresse vnc://localhost:5901 ein und klicken Sie auf Connect . Ich habe diese Adresse als Favorit gespeichert, um den Zugriff zu erleichtern.

Unter Windows verbinden

Ein VNC-Client wie TightVNC kann unter localhost:5901 eine Verbindung dazu herstellen.

Verbunden mit Kali Linux Xfce4 Desktop

Sobald die Verbindung hergestellt ist, kann ich den xfce4-Desktop sehen.

Der im Container gehostete Desktop, auf den über den VNC-Client zugegriffen wird.


Jetzt kann ich den Tor Browser Launcher vom Terminal aus in der VNC-Sitzung starten.

 torbrowser-launcher 


Ausführen des Torbrowser-Launchers in Docker über den VNC-Client


Sobald der Browser geöffnet ist, kann ich mithilfe des Tor Project Connection Checkers überprüfen, ob er funktioniert

Ein Beispiel für einen erfolgreichen Test:

Erfolgreicher Verbindungstest auf https://check.torproject.org/




Ich habe die Site auf meinem Host-Rechner geöffnet, der nicht verbunden war, um Folgendes zu vergleichen:

Verbindungstest auf https://check.torproject.org/ fehlgeschlagen




Bisherige Fortschritte

Dies ist das Betriebssystem-Setup, das ich abschließen wollte, bevor ich anfing, mit Selenium und Python zu arbeiten. Um es noch einmal zusammenzufassen: Ich habe Folgendes getan:


  1. Installierte Abhängigkeiten für Selenium, Python und eine einfache xfce4-Desktopumgebung.
  2. Mit GitHub Actions drei voneinander abhängige Docker-Images erstellt und gepusht.
  3. Ein VNC-Server in einem Docker-Container wurde erfolgreich gestartet.
  4. Mit einem VNC-Client mit der Desktop-Umgebung eines laufenden Containers verbunden.
  5. Habe den Tor Browser Launcher aus dem Container getestet und überprüft, ob er eine Verbindung zum Tor-Netzwerk herstellt.


Jetzt gibt es eine funktionierende Containerumgebung. Schauen Sie sich den nächsten Beitrag dieser Reihe zum verdeckten Python-Web-Scraping an.