ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Venom多级内网代理实战:链路搭建、流量走向与稳定性调优

Venom多级内网代理实战:链路搭建、流量走向与稳定性调优

1. 从一次内网横向的困境说起

很多做内网安全评估的朋友都遇到过这种局面:好不容易拿下一台边界机器,结果发现目标内网被切成了好几个网段,防火墙策略卡得死死的,只有特定端口能通。你手里这台机器既不能直接访问数据库网段,也够不着域控,甚至连个像样的出网通道都没有。这时候如果只会用最基础的端口转发,那基本就是寸步难行。

Venom 就是在这种场景下被频繁提起的一个工具。它本质上是一个多级内网代理工具,用 Go 写的,核心能力是把一台台被控机器串成一条链路,让流量像走隧道一样一层层穿透进去。和传统的单级端口转发不同,Venom 支持多级级联,也就是说你可以让 A 机器连 B,B 连 C,C 连 D,最后从 D 的视角去访问它所在的网段。这个特性在复杂内网里非常关键,因为很多时候你没法一步到位,只能一跳一跳地往里摸。

这篇文章适合谁看?如果你已经会基本的反弹 shell、会配简单的端口转发,但对多级代理的链路管理、流量走向、稳定性调优还比较模糊,那这篇内容应该能帮到你。我会从设计思路讲到具体操作,再到踩过的坑,尽量把每个环节的“为什么”说清楚。需要提前说明的是,下面涉及的所有操作都应在合法授权的安全评估场景中进行,未经授权的测试是违规的。

2. Venom 的整体设计与链路思路拆解

2.1 为什么选多级代理而不是单级转发

单级端口转发工具(比如常见的本地转发、远程转发)解决的是“一台机器到另一台机器”的连通问题。但内网渗透的真实情况往往是链式的:你控制的机器 A 只能访问 B,B 只能访问 C,C 才能碰到最终目标。如果只有单级转发,你就得在每一跳上手动搭一套转发规则,链路一长,管理成本爆炸,而且任何一跳断了你都很难快速定位。

Venom 的设计思路是把每一台被控机器抽象成一个“节点”,节点之间通过一条控制通道连接,形成一个树状或链状的结构。你只需要在每台机器上运行一个 agent,然后在本地通过 admin 端去管理整个拓扑。流量的转发规则由 admin 统一下发,agent 负责执行。这样一来,多级链路的管理就变成了“加节点、连节点、开监听”三个动作,清晰很多。

另一个关键点是 Venom 支持多种监听类型,包括正向连接、反向连接,以及基于不同协议的传输。这意味着你可以根据目标网络的出站策略灵活选择:如果目标能出网,就用反向连接把 agent 连回来;如果只能内网互通,就用正向连接逐级跳。这种灵活性是它在实战中被反复使用的原因。

2.2 节点、监听与链路的关系

理解 Venom 要先理解三个概念:节点(node)、监听(listen)、链路(link)。

节点就是一台运行了 agent 的机器,每个节点有唯一的 ID。监听是节点上开放的一个入口,等待其他节点或 admin 连接。链路则是两个节点之间实际建立的连接。你可以把节点想成车站,监听想成站台,链路想成铁轨。admin 端就是调度中心,它决定哪趟车从哪个站台出发,走哪条铁轨到下一个站。

这里有个容易混淆的地方:一个节点可以开多个监听,也可以连多个上级。但实际使用中,为了链路清晰和稳定,通常建议保持树状结构,避免形成环路。环路会导致流量绕圈,轻则变慢,重则直接卡死。我在早期测试时就因为不小心让两个节点互相连接,结果整个链路响应变得极慢,排查了半天才发现是拓扑成了环。

2.3 传输协议的选择逻辑

Venom 的 agent 和 admin 之间、节点和节点之间需要传输数据,传输协议的选择直接影响稳定性和隐蔽性。常见的选项包括 TCP、TLS 等。TCP 最直接,速度快,但流量特征明显;TLS 多了加密层,能对抗简单的流量识别,但会带来额外的握手开销。

选择逻辑其实不复杂:如果目标网络有较严格的流量审计,优先考虑带加密的传输方式;如果只是内网互通、追求速度,TCP 就够了。另外要注意,某些内网环境对长连接有超时限制,这时候需要调整心跳间隔,让链路保持活跃。心跳太频繁会增加流量特征,太慢又容易被中间设备断开,这个平衡需要根据实际网络环境去试。

3. 核心细节解析与实操要点

3.1 环境准备与基础概念确认

在动手之前,先把环境理清楚。你需要准备三类机器:一台作为 admin 的控制端(通常是你自己的评估机),若干台作为跳板的被控机器,以及最终要访问的目标网段。每台跳板机器上需要能执行对应架构的 agent 二进制文件。

Venom 的 agent 是静态编译的,依赖很少,这点对实战很友好。但要注意目标机器的架构:x86、x64、ARM 的 agent 不通用。我遇到过几次在 ARM 设备上直接扔了 x64 的 agent,结果报格式错误,浪费了不少时间。所以第一步永远是确认目标架构,用uname -m或者看系统信息。

另外,agent 的运行权限会影响它能监听的端口范围。普通用户只能监听 1024 以上的端口,如果要监听低位端口,需要相应权限。实战中一般用高位端口就够了,没必要追求低位端口,反而容易引起注意。

3.2 节点添加与监听的建立

整个流程的第一步是在第一台跳板机器上运行 agent,让它连回 admin。假设 admin 监听在某个端口,agent 用反向连接的方式连回来。命令大致是这样的结构:

./agent -r <admin_ip>:<admin_port>

连上之后,admin 端会显示一个新的节点,并分配一个 ID。这时候你可以在 admin 里对这个节点操作,比如让它开一个监听:

listen <节点ID> <监听端口>

这个监听的作用是给下一级节点提供入口。下一台机器上的 agent 就连到这个监听端口上,形成第二级。如此反复,就能一层层往里延伸。

这里有个细节值得说:监听的绑定地址。默认可能绑定在 0.0.0.0,也就是所有网卡都监听。如果跳板机器有多张网卡,分别对应不同网段,你最好明确绑定到能通向下一级的那张网卡的地址上。否则可能出现下一级连不上,或者流量走了错误的网卡。我一般会先用ip addr看清楚网卡和网段,再决定绑定哪个地址。

3.3 链路建立后的流量走向

链路建好之后,流量是怎么走的?假设拓扑是 admin -> A -> B -> C,你想从 admin 访问 C 所在网段的某台机器。实际路径是:admin 把请求发给 A,A 转发给 B,B 转发给 C,C 再发到目标。返回的流量原路返回。

理解这个走向很重要,因为它决定了瓶颈在哪。每一跳都会增加延迟,链路越长,延迟越明显。如果中间某一跳的网络质量差,整个链路都会受影响。所以实战中要尽量选择网络质量好的机器作为跳板,比如同机房、同网段的机器优先。

还有一个容易忽略的点:MTU 和分片。多级隧道叠加后,有效 MTU 会变小,大包可能被分片甚至丢弃。如果发现某些操作(比如传大文件、跑扫描)特别慢或者失败,可以尝试调小 MTU 或者用分片友好的工具。这个坑我在传工具包的时候踩过,后来把包拆小就正常了。

3.4 注意事项与操作禁忌

有几个禁忌必须强调。第一,不要在未授权的环境里使用,这是底线。第二,不要在生产环境的高峰期做大规模扫描,流量突增很容易触发告警。第三,链路建好后要及时记录拓扑,节点一多很容易搞混哪个 ID 对应哪台机器。我习惯用一个简单的表格记录节点 ID、IP、角色和上级节点,后面排查问题时非常有用。

另外,agent 进程的隐藏和持久化要谨慎处理。有些评估场景允许留后门做持久化,有些不允许。一定要在授权范围内操作,并且评估结束后清理干净。留下未清理的 agent 既不负责任,也可能带来后续风险。

4. 完整实操过程与关键环节实现

4.1 第一级节点的建立与验证

假设你已经通过某种方式在边界机器 A 上获得了执行权限。第一步是把对应架构的 agent 传上去并运行。传文件的方式有很多,这里不展开,重点说运行和验证。

运行 agent 连回 admin 后,admin 端应该能看到新节点。这时候先别急着往下走,先验证链路是否稳定。可以做一个简单的测试:在 admin 里对 A 节点执行一个命令,看返回是否正常。如果返回慢或者丢包,说明这条链路质量有问题,需要先解决。

验证通过后,在 A 上开一个监听,准备迎接第二级。监听端口的选择有讲究:尽量选不常见的端口,避免和现有服务冲突,也降低被扫描发现的概率。开完监听后,可以用netstat确认端口确实在监听状态。

4.2 第二级、第三级节点的接入

第二台机器 B 需要能访问 A 的监听端口。在 B 上运行 agent,连接到 A 的监听地址。连上后,admin 里会出现 B 节点,并且能看到它的上级是 A。这时候链路就是 admin -> A -> B。

重复这个过程,在 B 上开监听,让 C 连上来,就形成了三级链路。每加一级,都要验证一次连通性。我通常会在每一级都做一个到上级的 ping 或者简单请求,确认这一跳是通的,再继续往下。这样一旦出问题,能立刻定位是哪一跳断了。

这里有个实操技巧:逐级验证而不是最后一起验。很多人喜欢把所有节点都连上再统一测试,结果出问题时不知道是哪一级的配置错了。逐级验证虽然麻烦一点,但排查成本低得多。

4.3 通过多级链路访问目标网段

链路建好后,最终目的是访问目标。假设 C 能访问目标网段 10.0.0.0/24,你想从 admin 直接访问 10.0.0.5 的某个服务。这时候需要在 admin 端配置一个转发规则,把本地的某个端口映射到目标地址和端口上。

配置完成后,你在本地访问 127.0.0.1:本地端口,流量就会沿着 admin -> A -> B -> C -> 10.0.0.5 的路径走。可以用 curl 或者浏览器验证是否通。如果通,说明整条链路工作正常。

这个环节的关键是端口映射的对应关系要清楚。本地端口、目标地址、目标端口三者要一一对应,配错了就会连到错误的地方。我习惯在配置前先画一个简单的映射表,配完再对照检查一遍。

4.4 链路稳定性调优与参数选择

链路跑起来之后,稳定性是下一个要解决的问题。影响稳定性的因素主要有三个:心跳间隔、超时设置、传输协议。

心跳间隔决定了节点之间多久通信一次。太短会增加流量,太长会被中间设备判定为空闲连接而断开。一般内网环境可以设得稍长一些,跨网络环境要短一些。具体数值没有标准答案,需要根据实际网络设备的超时策略去试。我的经验是从中等间隔开始,观察一段时间,如果频繁断连就缩短,如果流量特征太明显就适当延长。

超时设置影响的是连接断开后的重连行为。设置合理的话,短暂网络抖动后能自动恢复;设置不当则可能一直重连不上。传输协议方面,前面说过,有审计压力就用加密传输,追求速度就用 TCP。

还有一个调优点是并发连接数。如果通过链路做扫描或者大量请求,并发太高会把链路压垮,太低又慢。建议从小并发开始,逐步增加,观察链路延迟和丢包情况,找到那个“刚好不卡”的点。

5. 常见问题与排查技巧实录

5.1 节点连不上上级的排查顺序

节点连不上是最常见的问题。排查顺序建议从下往上:先确认 agent 进程是否在运行,再确认目标监听端口是否可达,然后确认防火墙策略,最后看 admin 端是否有报错。

具体来说,在跳板机器上用ps确认 agent 进程存在;用telnet或者nc测试到上级监听端口的连通性;如果连不通,检查中间是否有防火墙拦截;如果都通但 admin 看不到节点,可能是 agent 版本和 admin 版本不匹配,或者连接参数写错了。

我遇到过一种情况:agent 进程在,端口也通,但就是连不上。最后发现是目标机器的系统时间偏差太大,导致 TLS 握手失败。所以如果用了加密传输,时间同步也要检查。

5.2 链路时通时断的典型原因

链路时通时断通常有几个原因:网络抖动、心跳设置不当、中间设备主动断开空闲连接、或者链路中存在环路。

排查时先看断开的规律:是固定时间断还是随机断?固定时间断多半是中间设备的超时策略,需要调整心跳;随机断可能是网络质量问题。如果是加了新节点后才出现,重点检查新节点是否引入了环路。

环路的问题前面提过,这里再强调一次:加节点前先想清楚拓扑,确保是树状而不是环状。如果不小心形成了环,最快的解决办法是断开其中一个连接,重新规划。

5.3 流量异常与性能瓶颈定位

流量异常表现为速度突然变慢、大量重传、或者某些请求超时。定位思路是先确定瓶颈在哪一跳:可以在每一级节点上做简单的流量统计,看哪一级的流量明显异常。

常见瓶颈包括:某一跳的网络带宽不足、某一跳的机器性能太差(CPU 或内存吃紧)、MTU 不匹配导致分片。带宽和性能问题只能通过换跳板或者减少并发来解决;MTU 问题可以尝试调小 MTU 或者用分片友好的传输方式。

还有一个隐蔽的瓶颈是agent 本身的处理能力。如果 agent 所在机器负载很高,它的转发能力会下降。这时候可以考虑把 agent 的优先级调高,或者换一台负载低的机器。

5.4 常见问题速查表

问题现象可能原因排查动作解决方向
节点连不上上级进程未运行/端口不通/防火墙拦截查进程、测端口、看策略启动进程、放通端口、调整策略
admin 看不到节点版本不匹配/参数错误/时间偏差核对版本、检查参数、对时统一版本、修正参数、同步时间
链路时通时断心跳不当/网络抖动/环路观察断开规律、检查拓扑调整心跳、换跳板、消除环路
速度突然变慢带宽不足/性能瓶颈/MTU 问题逐跳统计流量、看负载换跳板、降并发、调 MTU
大文件传输失败MTU 分片/超时测试小包、看分片拆小包、调 MTU、延长超时

5.5 独家避坑经验

最后分享几个文档里不会写的经验。第一,节点 ID 一定要记,最好用表格,不然节点一多你根本分不清谁是谁。第二,每加一级都验证,不要攒着一起验,排查成本差很多。第三,心跳和超时要根据环境调,没有万能参数,抄别人的配置不一定适合你的网络。第四,评估结束要清理,把 agent 进程停掉,把添加的监听关掉,把传上去的文件删掉,这是职业素养。

还有一点关于工具选型的体会:Venom 适合链路清晰、需要多级穿透的场景。如果只是简单的单级转发,用系统自带的转发功能或者更轻量的工具就够了,没必要上 Venom。工具是拿来解决问题的,不是拿来炫技的,选最合适的而不是最复杂的。

我在实际使用中最大的体会是,多级代理的难点不在工具本身,而在对网络拓扑的理解和链路的规划。工具的命令就那么几条,但什么时候该加节点、加在哪、怎么绑地址、怎么调参数,这些才是真正考验经验的地方。多画图、多记录、多验证,比死记命令有用得多。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进