引言
在网络安全、渗透测试和内网穿透领域,端口转发工具扮演着至关重要的角色。它们能够帮助用户绕过防火墙限制,实现远程访问、代理链路构建以及网络资源共享。其中,Chisel作为一款高效、轻量级的开源工具,以其基于Go语言的单执行文件设计和HTTP/WebSocket隧道机制脱颖而出。Chisel的全称是“Chisel - A fast TCP/UDP tunnel over HTTP”, 它不仅支持TCP和UDP协议的隧道转发,还内置加密机制、认证功能和SOCKS5代理支持,使其成为渗透测试者和运维工程师的首选工具。
为什么选择Chisel?传统工具如SSH隧道或ngrok虽强大,但往往受限于协议兼容性或性能瓶颈。Chisel利用HTTP协议伪装流量,轻松穿越防火墙;其WebSocket实现确保了低延迟和高吞吐量;此外,它支持正向端口转发(Local Port Forwarding)、反向端口转发(Remote Port Forwarding)以及多级代理(Multi-Hop Chaining),这些特性在复杂网络环境中尤为实用。例如,在红队渗透测试中,Chisel可用于内网跳板构建,帮助攻击者从外部访问目标内部服务。
本文将从安装开始,逐步深入Chisel的核心功能,重点剖析正向与反向端口转发的工作原理、配置示例和应用场景,并详细阐述多级代理的实现方法。
Chisel的安装与基本配置
安装方法
Chisel的安装极其简便,因为它是Go语言编写的单二进制文件,支持多平台(Windows、Linux、macOS、ARM等)。以下是常见安装方式:
-
直接下载二进制文件:
- 访问GitHub Releases页面(https://github.com/jpillora/chisel/releases),选择对应平台的版本下载。例如,Linux x64用户下载
chisel_1.10.0_linux_amd64.gz,解压后直接运行./chisel --help验证。 - 快速脚本安装:
curl https://i.jpillora.com/chisel! | bash,这会自动下载并置于PATH中。
- 访问GitHub Releases页面(https://github.com/jpillora/chisel/releases),选择对应平台的版本下载。例如,Linux x64用户下载
-
使用Go安装:
- 确保Go环境已安装(go1.18+),运行
go install github.com/jpillora/chisel@latest。安装后,Chisel位于$GOPATH/bin/chisel。
- 确保Go环境已安装(go1.18+),运行
-
Docker方式:
- 拉取镜像:
docker pull jpillora/chisel,运行容器:docker run --rm -it jpillora/chisel --help。 这适合隔离环境测试。
- 拉取镜像:
-
包管理器:
- Fedora用户:
sudo dnf install chisel。 - macOS Homebrew:
brew install chisel(需社区tap)。
- Fedora用户:
安装完成后,运行chisel version检查版本。Chisel体积小巧,仅几MB,功能却十分强大。
基本配置与启动
Chisel分为服务器(server)和客户端(client)两种模式。服务器监听外部连接,客户端发起隧道请求。
-
服务器启动:
chisel server -p 8080 --host 0.0.0.0-p 8080:监听端口,默认8080。--host 0.0.0.0:绑定地址,默认0.0.0.0(所有接口)。
-
客户端连接:
chisel client <server-url> <remote-spec><server-url>:服务器地址,如https://example.com:8080(支持HTTPS)。<remote-spec>:隧道规格,如3000:remote-host:80。
Chisel默认启用加密,使用ECDSA SSH密钥对。服务器启动时生成内存密钥,指纹如p2I7Y...。客户端可使用--fingerprint <fp>验证服务器身份,防止MITM攻击。
环境变量支持:HOST=0.0.0.0 PORT=8080 chisel server。日志级别通过--loglevel debug调整,便于调试。
在实际部署中,建议将服务器置于云主机(如AWS EC2),客户端运行于目标机器。接下来,我们深入端口转发机制。
Chisel的基本原理
Chisel的核心是基于HTTP的隧道机制:客户端通过WebSocket握手与服务器建立持久连接,然后封装TCP/UDP数据包在WebSocket帧中传输。这使得流量看起来像普通HTTPS请求,易于绕过深度包检测(DPI)防火墙。
-
隧道流程:
- 客户端发起WebSocket连接(ws:// 或 wss://)。
- 服务器接受连接,协商加密密钥。
- 客户端发送“remote spec”指令,定义转发规则。
- 数据双向流动:本地端口 -> WebSocket -> 远程端口。
-
协议支持:
- TCP:默认,用于HTTP、SSH等。
- UDP:通过
/udp后缀启用,如3000:remote:53/udp(DNS隧道)。
-
性能优势: Chisel的Go实现确保零拷贝传输,吞吐量可达数百Mbps。相比SSH隧道,它更轻量;相比FRP,它更注重安全。
理解原理后,我们进入重点:正向端口转发。
正向端口转发详解
概念与原理
正向端口转发(Forward Port Forwarding),也称本地端口转发,是将客户端本地端口的流量转发到远程服务器的目标端口。场景:外部访问内部服务,如从攻击机访问目标内网Web服务器。
原理:客户端监听本地端口,当有连接时,将数据封装发送至服务器,服务器解封装后转发至远程主机。这类似于SSH的-L选项,但Chisel更灵活,支持动态规格。
格式:<local-port>:<remote-host>:<remote-port>[/tcp|udp]
<local-port>:客户端监听端口,默认同remote-port。<remote-host>:远程主机(服务器视角),默认为0.0.0.0。<remote-port>:远程端口。- 协议:默认TCP。
基本示例
假设服务器运行在server.example.com:8080,我们想将客户端的3000端口转发到远程的Google 80端口。
-
服务器启动(无需特殊选项):
chisel server -p 8080 -
客户端连接:
chisel client server.example.com:8080 3000:google.com:80- 解释:客户端监听localhost:3000,连接时转发至服务器,再至google.com:80。
- 测试:
curl http://localhost:3000应返回Google首页。
输出日志:
[chisel] [INFO] Client fingerprint verified
[chisel] [INFO] Proxying tcp://localhost:3000 -> google.com:80
高级正向转发
-
指定本地主机:
127.0.0.1:3000:0.0.0.0:80只监听127.0.0.1,避免外部访问。
-
多隧道:
chisel client server:8080 3000:google.com:80 4000:example.com:443同时转发多个端口。
-
UDP转发(DNS示例):
chisel client server:8080 53:8.8.8.8:53/udp使用
dig @localhost example.com测试。
在渗透测试中,正向转发常用于访问内网服务:假设目标机内有Web服务80端口,客户端运行于目标,服务器外部。 攻击者通过curl http://client-ip:3000访问内网Web。
应用场景与注意事项
- 场景1:远程调试。开发时,将本地工具端口转发到生产服务器。
- 场景2:内网扫描。结合Nmap:
nmap -p 80 --proxy socks5://localhost:1080 target(后文SOCKS结合)。 - 注意:防火墙可能阻挡高端口,使用低端口如1080。日志中监控
[ERROR] Failed to connect调试连接失败。
正向转发简单高效,但当目标在内网无法主动连接外部时,反向转发就派上用场。
反向端口转发详解
概念与原理
反向端口转发(Reverse Port Forwarding),也称远程端口转发,是将服务器端的端口流量反向转发到客户端的目标端口。场景:内网机器主动连接外部服务器,实现外部访问内网资源,如从VPS访问家用NAS。
原理:客户端发起连接后,服务器监听指定端口,当外部连接服务器端口时,将流量反向封装发送至客户端,客户端解封装转发至本地服务。需服务器启用--reverse选项。
格式:R:<local-port>:<remote-host>:<remote-port>[/tcp|udp]
R:前缀表示反向。<local-port>:服务器监听端口。<remote-host>:客户端本地主机,默认0.0.0.0。<remote-port>:客户端目标端口。
基本示例
假设内网客户端想暴露SSH 22端口到外部服务器的2222端口。
-
服务器启动(启用反向):
chisel server -p 8080 --reverse -
客户端连接(内网机):
chisel client server.example.com:8080 R:2222:localhost:22- 解释:服务器监听2222端口,连接时转发至客户端的localhost:22。
- 测试:外部机
ssh user@server.example.com -p 2222,连接内网SSH。
日志:
[server] [INFO] Reverse tunnel established: tcp://0.0.0.0:2222 <- client:22
高级反向转发
-
多反向隧道:
chisel client server:8080 R:2222:localhost:22 R:3389:localhost:3389同时暴露SSH和RDP。
-
指定远程主机:
R:2222:192.168.1.100:22转发到客户端特定IP的22端口。
-
UDP反向(罕见,但用于VoIP):
R:5060:localhost:5060/udp
在红队场景,反向转发是跳板利器:目标机运行客户端,暴露Meterpreter端口,攻击者从服务器访问。 例如,结合Metasploit:客户端R:4444:localhost:4444,服务器nc -lvnp 4444捕获shell。
应用场景与注意事项
- 场景1:远程访问家用设备。家用路由器内网NAS,通过VPS反向暴露。
- 场景2:云服务器桥接。多云环境间互联。
- 注意:
--reverse后服务器端口易暴露,使用防火墙限制(如iptables)。客户端断线重连需--keepalive。
正反向转发互补,接下来结合SOCKS5增强灵活性。
SOCKS5代理支持
正向SOCKS5
SOCKS5是动态代理协议,允许任意TCP/UDP流量通过代理。Chisel内置SOCKS5服务器,客户端可连接服务器的SOCKS端点。
-
服务器启用SOCKS5:
chisel server -p 8080 --socks5默认监听1080端口。
-
客户端连接:
chisel client server:8080 socks- 客户端启动内部SOCKS5服务器于localhost:1080。
- 配置浏览器/工具指向
127.0.0.1:1080,流量经隧道转发至服务器,再出网。
示例:浏览器设置SOCKS5代理后,访问google.com,实际从服务器出网。日志显示[INFO] SOCKS5 proxying enabled。
反向SOCKS5
反向SOCKS用于外部访问内网任意服务。
-
服务器:
chisel server -p 8080 --reverse --socks5 -
客户端(内网):
chisel client server:8080 R:socks- 服务器监听1080作为SOCKS入口,反向转发至客户端内部SOCKS。
- 外部工具配置
server-ip:1080,扫描内网如proxychains nmap -sT 192.168.1.0/24。
应用与优化
- Proxychains集成:编辑
/etc/proxychains.conf添加socks5 127.0.0.1 1080,运行proxychains curl ifconfig.me查看出口IP。 - 认证:SOCKS5默认无认证,后文详述。
- 场景:渗透中,反向SOCKS构建全内网代理,绕过单机限制。
SOCKS5使Chisel从静态转发转向动态代理,完美过渡到多级代理。
多级代理(Multi-Hop Chaining)详解
概念与原理
多级代理是指将多个Chisel隧道或代理链路串联,形成跳板链路。Chisel通过--proxy选项支持HTTP CONNECT或SOCKS5上游代理,实现任意级联。原理:客户端在连接服务器前,先通过上游代理握手,流量层层封装。
这在深度防御网络中至关重要:如企业防火墙+代理服务器,单级隧道易被阻,多级可伪装流量路径。
格式:--proxy [http|socks]://[user:pass@]host:port
双级代理示例
假设一级服务器A(外部VPS),二级服务器B(中继云主机),目标内网C。
-
一级服务器A启动:
chisel server -p 8080 --host A-ip -
二级服务器B作为客户端连接A,并启动自身服务器:
chisel client --proxy socks5://B-upstream:1080 A-ip:8080 socks chisel server -p 8081 --socks5 # B作为二级服务器--proxy:B通过上游SOCKS连接A。- B暴露SOCKS于8081。
-
内网客户端C连接B:
chisel client B-ip:8081 R:socks- C的反向SOCKS经B->A->出网。
测试:外部配置proxychains到A的SOCKS,运行proxychains nmap inner-host,流量路径:外部->A->B->C。
三级及以上多级链
扩展到三级:添加C作为三级客户端连接B的SOCKS。
- 命令链:
- 服务器1:
chisel server -p 8080 - 客户端2:
chisel client --proxy http://user:pass@proxy1:3128 server1:8080 socks并chisel server -p 8081 --socks5 - 客户端3:
chisel client --proxy socks5://server2:1080 server2:8081 R:socks并自身server。
- 服务器1:
日志追踪:每个跳点显示[INFO] Proxying via upstream。性能随级数衰减,建议不超过5级。
实际案例:渗透测试多级跳板
在打HackTheBox等靶场时,常会用到双重Chisel pivot。
- 场景:外部攻击机 -> VPS (Chisel Server1) -> compromised host1 (Client1, Server2) -> inner host2 (Client2)。
- VPS:
chisel server -p 8080 --reverse --socks5 - Host1:
chisel client VPS:8080 socks; chisel server -p 8081 --socks5 - Host2:
chisel client host1-ip:8081 R:445:localhost:445(SMB转发)。
- VPS:
- 攻击:
proxychains smbclient //VPS-ip/445访问内网SMB。
多级代理是Chisel的杀手锏,让复杂网络如掌中物。
总结
Chisel以其简洁、高效的设计,完美诠释了端口转发艺术。从正向的本地共享,到反向的远程暴露,再到多级代理的链路构建,本文已全面覆盖。掌握Chisel,不仅提升你的网络技能,还能在实际项目中游刃有余。建议动手实践:搭建本地环境,模拟场景。
原文 https://blog.csdn.net/2301_79518550/article/details/145471555