// 红队渗透 · 2025-02-06

Chisel工具详解:一文搞懂正反向端口转发及多级代理

引言

在网络安全、渗透测试和内网穿透领域,端口转发工具扮演着至关重要的角色。它们能够帮助用户绕过防火墙限制,实现远程访问、代理链路构建以及网络资源共享。其中,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等)。以下是常见安装方式:

  1. 直接下载二进制文件:

  2. 使用Go安装:

    • 确保Go环境已安装(go1.18+),运行go install github.com/jpillora/chisel@latest。安装后,Chisel位于$GOPATH/bin/chisel。
  3. Docker方式:

    • 拉取镜像:docker pull jpillora/chisel,运行容器:docker run --rm -it jpillora/chisel --help。 这适合隔离环境测试。
  4. 包管理器:

    • Fedora用户:sudo dnf install chisel。
    • macOS Homebrew:brew install chisel(需社区tap)。

安装完成后,运行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)防火墙。

  • 隧道流程:

    1. 客户端发起WebSocket连接(ws:// 或 wss://)。
    2. 服务器接受连接,协商加密密钥。
    3. 客户端发送“remote spec”指令,定义转发规则。
    4. 数据双向流动:本地端口 -> 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端口。

  1. 服务器启动(无需特殊选项):

    chisel server -p 8080
  2. 客户端连接:

    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端口。

  1. 服务器启动(启用反向):

    chisel server -p 8080 --reverse
  2. 客户端连接(内网机):

    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端点。

  1. 服务器启用SOCKS5:

    chisel server -p 8080 --socks5

    默认监听1080端口。

  2. 客户端连接:

    chisel client server:8080 socks
    • 客户端启动内部SOCKS5服务器于localhost:1080。
    • 配置浏览器/工具指向127.0.0.1:1080,流量经隧道转发至服务器,再出网。

示例:浏览器设置SOCKS5代理后,访问google.com,实际从服务器出网。日志显示[INFO] SOCKS5 proxying enabled。

反向SOCKS5

反向SOCKS用于外部访问内网任意服务。

  1. 服务器:

    chisel server -p 8080 --reverse --socks5
  2. 客户端(内网):

    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。

  1. 一级服务器A启动:

    chisel server -p 8080 --host A-ip
  2. 二级服务器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。
  3. 内网客户端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。

日志追踪:每个跳点显示[INFO] Proxying via upstream。性能随级数衰减,建议不超过5级。

实际案例:渗透测试多级跳板

在打HackTheBox等靶场时,常会用到双重Chisel pivot。

  • 场景:外部攻击机 -> VPS (Chisel Server1) -> compromised host1 (Client1, Server2) -> inner host2 (Client2)。
    1. VPS: chisel server -p 8080 --reverse --socks5
    2. Host1: chisel client VPS:8080 socks; chisel server -p 8081 --socks5
    3. Host2: chisel client host1-ip:8081 R:445:localhost:445(SMB转发)。
  • 攻击:proxychains smbclient //VPS-ip/445 访问内网SMB。

多级代理是Chisel的杀手锏,让复杂网络如掌中物。

总结

Chisel以其简洁、高效的设计,完美诠释了端口转发艺术。从正向的本地共享,到反向的远程暴露,再到多级代理的链路构建,本文已全面覆盖。掌握Chisel,不仅提升你的网络技能,还能在实际项目中游刃有余。建议动手实践:搭建本地环境,模拟场景。

原文 https://blog.csdn.net/2301_79518550/article/details/145471555