亲爱的HW安全之路的读者们,在当今复杂多变的网络安全环境中,一款强大而灵活的内网渗透工具对红队来说至关重要。今天,我们将深入探讨Chisel这款工具,剖析其工作原理,并分享一些实战技巧。
最近微信改变了推送规则,文章不再按时间轴排列了。不想错过最新推送的你,就 设为星标 吧。
Chisel是一个基于Go语言开发的高效TCP/UDP隧道工具。它的特点包括:
支持TCP和UDP协议,满足多样化的渗透需求
利用HTTP/HTTPS进行数据传输,易于绕过大多数防火墙
内置SSH加密,确保数据传输安全性
支持反向端口转发,便于内网穿透
轻量级设计,易于在目标系统上部署和隐藏
作为一个Go语言开发的工具,Chisel的安装和使用相对简单。以下是详细的安装步骤:
访问Chisel的GitHub发布页面:https://github.com/jpillora/chisel/releases
下载适合你操作系统的最新版本
解压下载的文件
将解压后的chisel可执行文件移动到系统的PATH路径下
Linux/MacOS示例:
1wget https://github.com/jpillora/chisel/releases/download/v1.8.1/chisel_1.8.1_linux_amd64.gz 2gunzip chisel_1.8.1_linux_amd64.gz 3chmod +x chisel_1.8.1_linux_amd64 4sudo mv chisel_1.8.1_linux_amd64 /usr/local/bin/chisel
Windows示例:
下载Windows版本的zip文件
解压到一个文件夹,如 C:\Tools\
将 C:\Tools\ 添加到系统环境变量PATH中
确保已安装Go环境(版本1.16+)
执行以下命令:
1go install github.com/jpillora/chisel@latest
Chisel的配置主要通过命令行参数完成。以下是一些常用的配置示例:
服务器端:
1chisel server -p 8080 --auth username:password
客户端(正向代理):
1chisel client server_ip:8080 9001:example.com:80
客户端(反向代理):
1chisel client server_ip:8080 R:3000:localhost:3000
注意:在实际渗透测试中,建议使用非标准端口和强密码,以提高安全性。
在某些场景下,我们可能需要为不同的目标系统编译Chisel。可以使用Go的交叉编译功能:
1# 编译Windows 64位版本 2GOOS=windows GOARCH=amd64 go build 3 4# 编译Linux ARM版本 5GOOS=linux GOARCH=arm go build
这种方法允许我们为各种目标环境准备最适合的Chisel版本。
Chisel采用客户端-服务器模式工作,其流程如下:
客户端发起HTTP/HTTPS连接请求服务器
双方协商加密参数,建立SSH通道
客户端请求打开指定端口的隧道
服务器确认后开始转发流量
应用层数据经过SSH加密后通过HTTP隧道传输
这种设计允许Chisel在高度受限的网络环境中运行,同时保持较高的安全性。
让我们看看Chisel的一些关键实现:
1// SSH隧道建立
2sshConn := p.sshTun.getSSH(ctx)
3dst, reqs, err := sshConn.OpenChannel("chisel", []byte(p.remote.Remote()))
4
5// 数据转发
6func Pipe(src io.ReadWriteCloser, dst io.ReadWriteCloser) (int64, int64) {
7 var sent, received int64
8 var wg sync.WaitGroup
9
10 wg.Add(2)
11 go func() {
12 received, _ = io.Copy(src, dst)
13 wg.Done()
14 }()
15 go func() {
16 sent, _ = io.Copy(dst, src)
17 wg.Done()
18 }()
19
20 wg.Wait()
21 return sent, received
22}
23
24// 多路复用
25func newMux(p packetConn) *mux {
26 m := &mux{
27 conn: p,
28 incomingChannels: make(chan NewChannel, chanSize),
29 incomingRequests: make(chan *Request, chanSize),
30 }
31 go m.loop()
32 return m
33}
这些代码片段展示了Chisel如何建立SSH隧道、实现双向数据转发以及处理多路复用。
Chisel采用多种技术来混淆流量,提高隐蔽性:
HTTP伪装:所有通信都封装在HTTP请求中
WebSocket伪装:进一步模仿正常的Web应用行为
数据包分片:将大数据包分割成多个小包发送
流量填充:在空闲时发送无意义的填充数据
动态端口:支持动态更换通信端口
代码示例:
1// HTTP伪装 2func (c *Client) connectHTTP(ctx context.Context) (net.Conn, error) { 3 req, err := http.NewRequest("GET", c.url.String(), nil) 4 if err != nil { 5 return nil, err 6 } 7 req.Header.Set("User-Agent", UserAgent) 8 req.Header.Set("Upgrade", "websocket") 9 // ... 其他HTTP头部设置 10} 11 12// 数据包分片 13func (ch *channel) WriteExtended(data []byte, extendedCode uint32) (n int, err error) { 14 for len(data) > 0 { 15 space := min(ch.maxRemotePayload, len(data)) 16 // ... 分片发送逻辑 17 } 18}
在内网渗透中,Chisel可以用于多种场景:
反向Shell:通过反向连接绕过防火墙,获取目标系统的远程控制
内网代理:在已控制的主机上设置SOCKS5代理,方便后续的内网探测
端口转发:将内网服务暴露到外网,便于远程访问内网资源
横向移动:在不同网段间建立隧道,扩大渗透范围
实战技巧:
使用反向连接时,可以将Chisel伪装成常见服务,如web服务器
结合其他工具如Metasploit,可以构建更复杂的攻击链
在多层内网中,可以使用Chisel构建多级代理链
作为红队成员,我们应该注意:
使用自定义的User-Agent和其他HTTP头,避免被防御系统识别
适当调整流量混淆参数,在隐蔽性和性能之间找到平衡
定期更换通信端口和服务器地址,增加追踪难度
在目标系统上使用后要彻底清理痕迹,包括日志和临时文件
考虑将Chisel与其他工具结合使用,如将流量通过Tor网络转发
随着网络安全领域的不断发展,像Chisel这样的工具也在不断进化。未来可能会看到:
更先进的流量混淆技术,如模仿特定应用的流量模式
与人工智能结合,自动调整行为以适应不同的网络环境
更强大的加密方式,以应对量子计算带来的挑战
Chisel作为一款强大的内网渗透工具,其灵活性和隐蔽性使它成为红队工具箱中不可或缺的一员。深入理解其工作原理和代码实现,不仅能帮助我们更好地利用这个工具,也能启发我们开发自己的定制工具。
在实际使用中,我们要注意结合具体的渗透测试场景,灵活运用Chisel的各项功能。同时,也要时刻保持警惕,确保合法合规地使用工具。
最后,贴上项目的地址:jpillora/chisel: A fast TCP/UDP tunnel over HTTP (github.com)