Venom
简介
Venom 是使用 Go 开发的多级代理工具,可将多个节点进行连接,然后以节点为跳板,构建多级代理。
渗透测试人员可以使用Venom轻松地将网络流量代理到多层内网,并轻松地管理代理节点。
特性
- 可视化网络拓扑
- 多级socks5代理
- 多级端口转发
- 端口复用 (apache/mysql/...)
- ssh隧道
- 交互式shell
- 文件的上传和下载
- 节点间通信加密
- 支持多种平台(Linux/Windows/MacOS)和多种架构(x86/x64/arm/mips)
安装
可以直接下载使用release中编译好的可执行文件
使用
admin节点:
$ ./venom_admin -lport <port>
$ ./venom_admin -rhost <ip> -rport <port> [-passwd <password>]
选项:
-lport <port>
监听本地端口
-passwd <password>
加密通信时使用的密码(可选)
-rhost <ip>
远程ip地址
-rport <port>
远程主机上的端口
agent节点:
$ ./venom_agent -lport <port>
$ ./venom_agent -rhost <ip> -rport <port> [-passwd <password>]
$ ./venom_agent -lhost <ip> -reuse-port <port> [-passwd <password>]
$ ./venom_agent -lport <port> -reuse-port <port> [-passwd <password>]
选项:
-lhost <ip>
本地ip地址
-lport <port>
监听本地端口
-passwd <password>
加密通信时使用的密码(可选)
-reuse-port <port>
需要复用的端口
-rhost <ip>
远程ip地址
-rport <port>
远程主机上的端口
正向连接(agent监听端口,admin发起连接)
./agent_linux_x64 -lport 8888
./admin_macos_x64 -rhost 172.17.0.11 -rport 8888
反向连接(admin监听端口,agent发起连接)
./admin_macos_x64 -lport 9999
./agent_linux_64 -rhost 192.168.0.99 -rport 9999
-
正向代理: 服务端不直接服务真实的请求客户端,由代理服务代真实客户端向服务端发起请求连接,服务端不可见真实发起请求的客户端,如科学上网
-
反向代理: 请求端不直接请求真实的服务服务端,由代理服务代真实服务端提供服务,客户端不可见真实提供服务的服务端,如 Nginx 就是反向代理服务,用来做负载均衡
端口复用
端口复用可在不影响原有服务的情况使用该端口。
复用方法1
指定监听某一个本地IP上的端口复用, **无法监听所有本地IP ( 0.0.0.0
) ** :
./agent.exe -lhost 172.17.0.11 -reuse-port 80
./admin_macos_x64 -rhost 172.17.0.11 -rport 80
复用方法2
通过 iptables
转发端口流量获得复用, 仅Linux 使用,且需要root权限 , 通过 sigterm
、sigint
结束程序(kill
或 CTRL-c
) ,程序可自动清理 iptables
规则。若 agent
被 kill -9
杀掉则无法自动清理 iptables
规则。为了避免iptables规则不能自动被清理导致无法访问被复用端口服务,Venom
自带的 python
脚本,采用 iptables -m recent
通过特殊的 TCP
包控制 iptables
转发规则
sudo ./agent_linux_x64 -lport 8080 -reuse-port 80
python scripts/port_reuse.py --start --rhost 172.17.0.11 --rport 80
# 当回显出现 “[+]Done!” 时再执行
./admin_linux_x64 -rhost 172.17.0.11 -rport 80
# 如果要关闭转发规则
python scripts/port_reuse.py --stop --rhost 172.17.0.11 --rport 80
节点间加密通信
通过 -passwd
选项指定密码,用于生产 AES
加密所需的密钥
# 通过-passwd指定密码为dlive@dubhe
./admin_macos_x64 -lport 8889 -passwd dlive@dubhe
# agent指定相同的密码与admin节点连接
./agent_macos_x64 -rhost 172.17.0.11 -rport 8889 -passwd dlive@dubhe
admin 节点内置命令
help 帮助信息
exit 退出
show 显示网络拓扑
getdes 查看目标节点的描述信息
setdes <info> 设置目标节点的描述消息
goto <id> 操作目标节点
listen <lport> 侦听目标节点上的端口
connect <rhost> <rport> 通过目标节点连接到新节点
sshconnect <user@ip:port> <dport> 通过SSH隧道连接到新节点
shell 在目标节点上启动一个交互式shell
upload <local_file> <remote_file> 将文件上传到目标节点
download <remote_file> <local_file> 从目标节点下载文件
socks <lport> 启动Socks5服务器
lforward <lhost> <sport> <dport> 将本地端口转发到远程端口
rforward <rhost> <sport> <dport> 将远程端口转发到本地端口
show
显示网络拓扑
A
表示admin
节点数字
表示agent
节点
(node 1) >>> show
A
+ -- 1
+ -- 2
+ -- 3
+ -- 4
admin节点下连接了1节点,1节点下连接了2、4节点,2节点下连接了3节点
注意:新加入的节点,需要先在admin节点运行 show
命令同步网络拓扑和节点编号,才能进行操作
goto
操作某节点
(admin node) >>> goto 1
(node 1) >>>
getdes
/ setdes
获取/设置节点描述消息
(node 1) >>> setdes linux x64 blahblahblah
(node 1) >>> getdes
linux x64 blahblahblah
connect
/ listen
/ sshconnect
节点间互连
connect
互连
由子节点监听端口,父节点连接子节点
- admin 节点
(admin node) >>> show
A
+ -- 1
(admin node) >>> goto 1
(node 1) >>>
- agent 节点2
./agent_linux_x64 -lport 8080
- admin 节点
(node 1) >>> connect 172.17.0.22 8080
...
(node 1) >>> show
A
+ -- 1
+ -- 2
listen
互连
由父节点监听端口,子节点连接父节点
- admin 节点
(admin node) >>> goto 1
(node 1) >>> listen 8080
- agent 节点2
./agent -rhost 172.17.0.11 -rport 8080
- admin 节点
(node 1) >>> show
A
+ -- 1
+ -- 2
sshconnect
互连
由父节点使用 ssh
方式连接子节点
- agent 节点2
./agent_linux_x64 -lport 8080
- admin 节点
(admin node) >>> goto 1
(node 1) >>> sshconnect root@172.17.0.22 8080
use password (1) / ssh key (2)?1
...
(node 1) >>> show
A
+ -- 1
+ -- 2
会出现ssh认证 : 1 密码登录 , 2 密钥登录
注意:使用的端口是子节点监听的端口,而不是ssh默认的端口,不然admin就无法获取到拓扑了
upload
/ download
向节点上传/下载文件
(admin node) >>> goto 1
(node 1) >>> upload <file_path> <upload_path>
(node 1) >>> download <file_path> <download_path>
节点启用 socks
代理
通过 goto 进入节点后,启用 socks 代理 , 开启代理后 admin 节点将监听所指定端口,通过该端口即可连接到节点上开启的 socks 代理
(node 1) >>> socks 8888
交互式shell建立
(node 1) >>> shell
$ ipconfig
.....
lforward
/rforward
转发端口
lforward
将本地端口转发到远程端口
将 admin 节点的 80
端口转发到 agent 节点的 8080
端口
- admin 节点
(node 1) >>> lforward 127.0.0.1 80 8080
- agent 节点
curl http://172.17.0.11:8080
rforward
将远程端口转发到本地端口
将 agent 节点的 80
端口转发到 admin 节点的 8080
端口
- agent 节点
(node 1) >>> rforward 172.17.0.22 80 8080
- admin 节点
curl http://192.168.0.99:8080