
Venom - Un proxy de múltiples saltos para probadores de penetración
Venom es una herramienta de proxy multinivel desarrollada en Go diseñada para probadores de penetración.
Venom permite conectar múltiples nodos y utilizar estos nodos como saltos para construir un proxy multinivel.
Los probadores de penetración pueden usar Venom para enrutar fácilmente el tráfico de red a través de múltiples capas de redes internas y gestionar los nodos proxy de manera eficiente.
Esta herramienta está destinada exclusivamente a la investigación de seguridad y la enseñanza; el usuario asume toda la responsabilidad legal y relacionada derivada del uso de esta herramienta. ¡El autor no asume ninguna responsabilidad legal o relacionada!
Dado que los dispositivos IoT (arquitecturas ARM/MIPS/...) suelen tener recursos limitados, los binarios compilados para este proyecto en entornos IoT no admiten la reutilización de puertos ni el túnel SSH. Además, para reducir el uso de memoria, se limita el número de conexiones concurrentes y el tamaño del búfer.
Puede descargar y usar directamente los ejecutables compilados en el release.
Si desea compilar el proyecto desde el código fuente, necesita instalar go >= 1.11 y luego ejecutar los siguientes comandos:
go get -u github.com/Dliv3/Venom/...
# $GOPATH es la variable de entorno configurada al instalar Go; se puede ver con el comando go env
cd $GOPATH/src/github.com/Dliv3/Venom
# Los binarios compilados se guardan en la carpeta release en el directorio actual
./build.sh
Video de demostración en Youtube: https://www.youtube.com/playlist?list=PLtZO9vwOND91vZ7yCmlAvISmEl2iQKjdI
Tanto el nodo admin como el nodo agent pueden escuchar conexiones o iniciar conexiones
El admin escucha en un puerto, el agent inicia la conexión:
./admin_macos_x64 -lport 9999
./agent_linux_x64 -rhost 192.168.0.103 -rport 9999
El agent escucha en un puerto, el admin inicia la conexión:
./agent_linux_x64 -lport 8888
./admin_macos_x64 -rhost 192.168.204.139 -rport 8888
El nodo agent soporta reutilización de puertos
El agent proporciona dos métodos de reutilización de puertos:
Con la función de reutilización de puertos de Venom, en Windows se pueden reutilizar puertos de servicios como Apache y MySQL, pero no los de RDP o IIS. En Linux se pueden reutilizar la mayoría de los puertos de servicio. El puerto reutilizado seguirá funcionando normalmente para su servicio original.
Primer método de reutilización de puertos
# Ejemplo con Apache en Windows
# Reutiliza el puerto 80 de Apache sin afectar su servicio HTTP normal
# El valor de -lhost debe ser la IP local; no se puede usar 0.0.0.0, de lo contrario la reutilización falla
./agent.exe -lhost 192.168.204.139 -reuse-port 80
./admin_macos_x64 -rhost 192.168.204.139 -rport 80
help Muestra la ayuda
(admin node) >>> help
help Información de ayuda.
exit Salir.
show Mostrar topología de red.
getdes Ver la descripción del nodo objetivo.
setdes [info] Agregar una descripción al nodo objetivo.
goto [id] Seleccionar id como nodo objetivo.
listen [lport] Escuchar en un puerto en el nodo objetivo.
connect [rhost] [rport] Conectar un nuevo nodo a través del nodo objetivo.
sshconnect [user@ip:port] [dport] Conectar un nuevo nodo a través de un túnel SSH.
shell Iniciar un shell interactivo en el nodo objetivo.
upload [local_file] [remote_file] Subir archivos al nodo objetivo.
download [remote_file] [local_file] Descargar archivos desde el nodo objetivo.
socks [lport] Iniciar un servidor SOCKS5.
lforward [lhost] [sport] [dport] Redirigir un puerto local a un puerto remoto.
rforward [rhost] [sport] [dport] Redirigir un puerto remoto a un puerto local.
show Muestra la topología de red
A representa el nodo admin, los números representan nodos agent.
El siguiente diagrama de topología muestra que el nodo admin tiene conectado el nodo 1, el nodo 1 tiene conectados los nodos 2 y 4, y el nodo 2 tiene conectado el nodo 3.
(node 1) >>> show
A
+ -- 1
+ -- 2
+ -- 3
+ -- 4
show en el nodo admin para sincronizar la topología de red y los números de nodo.script/port_reuse.py para activar las reglas de reutilización de puertos configuradas por el agent en la máquina objetivo.Segundo método de reutilización de puertos
# Ejemplo con Apache en Linux
# Requiere permisos de root
sudo ./agent_linux_x64 -lport 8080 -reuse-port 80
Este método establece reglas iptables en la máquina local para redirigir el tráfico de reuse-port a lport, y luego el agent distribuye el tráfico.
Tenga en cuenta que si el programa termina mediante las señales sigterm o sigint (kill o Ctrl+C), el programa limpiará automáticamente las reglas iptables. Si el agent se mata con kill -9, las reglas iptables no se limpian automáticamente y es necesario hacerlo manualmente, ya que el agent no puede manejar la señal sigkill.
Para evitar que las reglas iptables no se limpien automáticamente e impidan al probador de penetración acceder al servicio en el puerto 80, el segundo método utiliza iptables -m recent para controlar si las reglas de redirección están activas mediante paquetes TCP especiales.
La implementación aquí se basa en https://threathunter.org/topic/594545184ea5b2f5516e2033
# Inicia el agent con las reglas iptables configuradas en la máquina Linux
# Si rhost está en la red interna, se puede usar un proxy SOCKS5 para el tráfico del script; ver más abajo el uso del proxy SOCKS5
python scripts/port_reuse.py --start --rhost 192.168.204.135 --rport 80
# Conectarse al nodo agent
./admin_macos_x64 -rhost 192.168.204.135 -rport 80
# Para desactivar las reglas de redirección
python scripts/port_reuse.py --stop --rhost 192.168.204.135 --rport 80
Cifrado de comunicación entre nodos
Venom proporciona cifrado de comunicación entre nodos. El usuario puede especificar una contraseña mediante la opción -passwd, que se utiliza para generar la clave de cifrado AES.
# Especifica la contraseña como dlive@dubhe con -passwd
./admin_macos_x64 -lport 8889 -passwd dlive@dubhe
# El agent especifica la misma contraseña para conectarse al nodo admin
./agent_macos_x64 -rhost 192.168.0.103 -rport 8889 -passwd dlive@dubhe
Nota: para operar sobre un nodo recién agregado, primero debe ejecutar el comando show en el nodo admin para sincronizar la topología de red y los números de nodo.
goto Operar en un nodo
(admin node) >>> goto 1
(node 1) >>>
Una vez que haya ido a un nodo, puede usar los comandos que se describen a continuación.
getdes/setdes Obtener/establecer la descripción del nodo
(node 1) >>> setdes linux x64 blahblahblah
(node 1) >>> getdes
linux x64 blahblahblah
connect/listen/sshconnect Conexión entre nodos
El nodo 1 se conecta al puerto 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
El nodo 1 escucha en el puerto 9997; luego en otra máquina ejecute ./agent_linux_x64 -rhost 192.168.204.139 -rport 9997 para conectarse 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
En 192.168.0.104 ejecute ./agent_linux_x64 -lport 9999; el nodo 3 establece un túnel SSH mediante sshconnect para conectarse al puerto 9999 de 192.168.0.104. Puede usar contraseña o clave privada SSH para la autenticación.
(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 Obtener un shell interactivo en el 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 Subir/descargar archivos desde/hacia el nodo
Subir el archivo local /tmp/test.pdf al nodo 1 como /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!
Descargar el archivo /tmp/test2.pdf del nodo 1 a local como /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 Establecer un proxy SOCKS5 hacia un nodo
(node 1) >>> socks 7777
a socks5 proxy of the target node has started up on local port 7777
Después de ejecutar el comando socks, se abrirá un puerto local en el nodo admin, como el 7777 mencionado. Use el 7777 para el proxy SOCKS5.
lforward/rforward Redirigir un puerto local a uno remoto / redirigir un puerto remoto a uno local
lforward redirige el puerto local 8888 del nodo admin al puerto 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 redirige el puerto 8889 de la red del nodo 1 (192.168.204.103) al puerto local 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