Venom

简介

Venom 是使用 Go 开发的多级代理工具,可将多个节点进行连接,然后以节点为跳板,构建多级代理。

渗透测试人员可以使用Venom轻松地将网络流量代理到多层内网,并轻松地管理代理节点。

特性

安装

可以直接下载使用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

端口复用

端口复用可在不影响原有服务的情况使用该端口。

复用方法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权限 , 通过 sigtermsigint 结束程序(killCTRL-c) ,程序可自动清理 iptables 规则。若 agentkill -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 显示网络拓扑

(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 node) >>> show
A
+ -- 1
(admin node) >>> goto 1
(node 1) >>>
./agent_linux_x64 -lport 8080
(node 1) >>> connect 172.17.0.22 8080
...
(node 1) >>> show
A
+ -- 1
     + -- 2

listen 互连

由父节点监听端口,子节点连接父节点

(admin node) >>> goto 1
(node 1) >>> listen 8080
./agent -rhost 172.17.0.11 -rport 8080
(node 1) >>> show
A
+ -- 1
     + -- 2

sshconnect 互连

由父节点使用 ssh 方式连接子节点

./agent_linux_x64 -lport 8080
(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 端口

(node 1) >>> lforward 127.0.0.1 80 8080
curl http://172.17.0.11:8080

rforward 将远程端口转发到本地端口

将 agent 节点的 80 端口转发到 admin 节点的 8080 端口

(node 1) >>> rforward 172.17.0.22 80 8080
curl http://192.168.0.99:8080

参考

多级代理工具Venom使用 - xuanlv、 - 博客园 (cnblogs.com)

Dliv3/Venom(github README)

内网代理神器Venom及三层代理演示 - 简书 (jianshu.com)