
Venom - Un proxy multi-sauts pour testeurs de pénétration
Venom est un outil de proxy multi-niveaux développé en Go, conçu pour les testeurs de pénétration.
Venom permet de connecter plusieurs nœuds, puis d'utiliser ces nœuds comme tremplins pour construire un proxy multi-niveaux.
Les testeurs de pénétration peuvent utiliser Venom pour acheminer facilement le trafic réseau vers des couches internes multiples et gérer aisément les nœuds proxy.
Cet outil est réservé à la recherche en sécurité et à l'enseignement. L'utilisateur assume l'entière responsabilité légale et associée découlant de l'utilisation de cet outil ! L'auteur décline toute responsabilité légale ou connexe !
Comme les appareils IoT (architecture arm/mips/...) ont généralement des ressources limitées, pour réduire la taille du binaire, les binaires compilés pour l'environnement IoT dans ce projet ne prennent pas en charge la réutilisation de ports ni le tunnel SSH, et les limites de concurrence et la taille du tampon sont réduites pour économiser la mémoire.
Vous pouvez télécharger et utiliser directement les exécutables précompilés dans la version.
Si vous souhaitez compiler ce projet à partir des sources, vous devez installer go >= 1.11, puis exécuter les commandes suivantes :
go get -u github.com/Dliv3/Venom/...
# $GOPATH est la variable d'environnement configurée lors de l'installation de Go, visible via la commande go env
cd $GOPATH/src/github.com/Dliv3/Venom
# Les binaires compilés sont stockés dans le dossier release du répertoire courant
./build.sh
Vidéo de démonstration YouTube : https://www.youtube.com/playlist?list=PLtZO9vwOND91vZ7yCmlAvISmEl2iQKjdI
Les nœuds admin et agent peuvent tous deux écouter les connexions ou initier des connexions
Le nœud admin écoute un port, l'agent initie la connexion :
./admin_macos_x64 -lport 9999
./agent_linux_x64 -rhost 192.168.0.103 -rport 9999
L'agent écoute un port, l'admin initie la connexion :
./agent_linux_x64 -lport 8888
./admin_macos_x64 -rhost 192.168.204.139 -rport 8888
Le nœud agent prend en charge la réutilisation de ports
L'agent propose deux méthodes de réutilisation de ports :
Grâce à la fonction de réutilisation de ports de Venom, il est possible de réutiliser les ports de services comme apache, mysql, etc. sous Windows, mais pas ceux de services comme RDP, IIS pour le moment. Sous Linux, la plupart des ports de service peuvent être réutilisés. Le port réutilisé continue à fournir normalement son service d'origine.
Première méthode de réutilisation de ports
# Exemple avec apache sous Windows
# Réutilise le port 80 d'apache sans affecter le service HTTP normal
# La valeur de -lhost doit être l'IP locale, ne pas utiliser 0.0.0.0 (sinon la réutilisation échoue)
./agent.exe -lhost 192.168.204.139 -reuse-port 80
./admin_macos_x64 -rhost 192.168.204.139 -rport 80
help Affiche l'aide
(admin node) >>> help
help Informations d'aide.
exit Quitter.
show Afficher la topologie réseau.
getdes Voir la description du nœud cible.
setdes [info] Ajouter une description au nœud cible.
goto [id] Sélectionner l'id comme nœud cible.
listen [lport] Écouter sur un port du nœud cible.
connect [rhost] [rport] Connecter un nouveau nœud via le nœud cible.
sshconnect [user@ip:port] [dport] Connecter un nouveau nœud via tunnel SSH.
shell Démarrer un shell interactif sur le nœud cible.
upload [local_file] [remote_file] Téléverser des fichiers vers le nœud cible.
download [remote_file] [local_file] Télécharger des fichiers depuis le nœud cible.
socks [lport] Démarrer un serveur SOCKS5.
lforward [lhost] [sport] [dport] Rediriger un port local sport vers un port distant dport.
rforward [rhost] [sport] [dport] Rediriger un port distant sport vers un port local dport.
show Affiche la topologie réseau
A représente le nœud admin, les chiffres représentent les nœuds agent.
Le diagramme ci-dessous indique que le nœud admin est connecté au nœud 1, le nœud 1 est connecté aux nœuds 2 et 4, et le nœud 2 est connecté au nœud 3.
(node 1) >>> show
A
+ -- 1
+ -- 2
+ -- 3
+ -- 4
show sur le nœud admin pour synchroniser la topologie et les identifiants.script/port_reuse.py pour activer les règles de réutilisation de ports définies par l'agent sur la machine cible.Deuxième méthode de réutilisation de ports
# Exemple avec apache sous Linux
# Nécessite les droits root
sudo ./agent_linux_x64 -lport 8080 -reuse-port 80
Cette méthode définit une règle iptables sur la machine locale pour rediriger le trafic du port reuse-port vers le port lport, puis l'agent distribue le trafic.
Note importante : si le programme est terminé par un signal sigterm ou sigint (kill ou ctrl-c), le programme nettoie automatiquement les règles iptables. Si l'agent est tué par kill -9, le nettoyage automatique n'est pas possible (car l'agent ne peut pas gérer le signal sigkill), il faut nettoyer manuellement.
Pour éviter que les règles iptables ne soient pas automatiquement nettoyées, empêchant l'accès au service sur le port 80, la deuxième méthode utilise iptables -m recent pour contrôler l'activation de la règle de redirection via des paquets TCP spéciaux.
L'implémentation ici s'inspire de https://threathunter.org/topic/594545184ea5b2f5516e2033
# Démarre les règles iptables définies par l'agent sur la machine Linux
# Si rhost est sur le réseau interne, utilisez le proxy SOCKS5 pour le trafic du script (voir ci-dessous)
python scripts/port_reuse.py --start --rhost 192.168.204.135 --rport 80
# Connecte le nœud agent
./admin_macos_x64 -rhost 192.168.204.135 -rport 80
# Pour désactiver la règle de redirection
python scripts/port_reuse.py --stop --rhost 192.168.204.135 --rport 80
Chiffrement des communications entre nœuds
Venom offre le chiffrement des communications entre nœuds. L'utilisateur peut spécifier un mot de passe via l'option -passwd, qui sera utilisé pour générer la clé de chiffrement AES.
# Spécifie le mot de passe dlive@dubhe avec -passwd
./admin_macos_x64 -lport 8889 -passwd dlive@dubhe
# L'agent se connecte au nœud admin avec le même mot de passe
./agent_macos_x64 -rhost 192.168.0.103 -rport 8889 -passwd dlive@dubhe
Note : pour interagir avec un nouveau nœud, exécutez d'abord la commande show sur le nœud admin pour synchroniser la topologie et les identifiants des nœuds.
goto Opérer sur un nœud
(admin node) >>> goto 1
(node 1) >>>
Après être allé sur un nœud avec goto, vous pouvez utiliser les commandes présentées ci-après.
getdes/setdes Obtenir/définir la description du nœud
(node 1) >>> setdes linux x64 blahblahblah
(node 1) >>> getdes
linux x64 blahblahblah
connect/listen/sshconnect Interconnexion de nœuds
Le nœud 1 se connecte au port 9999 de 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
Le nœud 1 écoute sur le port 9997, puis une autre machine exécute ./agent_linux_x64 -rhost 192.168.204.139 -rport 9997 pour se connecter au nœud 1 :
(node 1) >>> listen 9997
listen 9997
the port 9997 is successfully listening on the remote node!
(node 1) >>> show
A
+ -- 1
+ -- 2
+ -- 3
Sur 192.168.0.104, exécutez ./agent_linux_x64 -lport 9999 ; le nœud 3 utilise sshconnect pour établir un tunnel SSH vers le port 9999 de 192.168.0.104. Vous pouvez utiliser un mot de passe ou une clé privée SSH pour l'authentification.
(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 Obtient un shell interactif sur le nœud
(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 Téléverser/télécharger des fichiers vers/depuis le nœud
Téléverser le fichier local /tmp/test.pdf vers le nœud 1 sous /tmp/test2.pdf :
(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!
Télécharger le fichier /tmp/test2.pdf du nœud 1 vers le local /tmp/test3.pdf :
(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 Établit un proxy SOCKS5 vers un nœud
(node 1) >>> socks 7777
a socks5 proxy of the target node has started up on local port 7777
Après avoir exécuté la commande socks, un port local s'ouvre sur le nœud admin (7777 dans l'exemple). Utilisez ce port pour le proxy SOCKS5.
lforward/rforward Rediriger un port local vers un port distant / rediriger un port distant vers un port local
lforward redirige le port local 8888 du nœud admin vers le port 8888 du nœud 1 :
(node 1) >>> lforward 127.0.0.1 8888 8888
forward local network 127.0.0.1 port 8888 to remote port 8888
rforward redirige le port 8889 de l'adresse 192.168.204.103 (réseau du nœud 1) vers le port local 8889 du nœud admin :
(node 1) >>> rforward 192.168.204.103 8889 8889
forward remote network 192.168.204.103 port 8889 to local port 8889