利用Python实现DGA检测
作者:飞鸟 发布于:2017-11-15 21:33 Wednesday 分类:网络安全
前段时间爆发的利用永恒之蓝进行勒索及xshell等事件,各大厂家都站在不同的角度分析了相应的事件及程序,对于对逆向不了解看着的确很吃力。上段时间看到宫总及袁哥都在讲DNS对于分析这种攻击的可行性。
永恒之蓝和xshell事件有如下的特征:
1. 永恒之蓝中黑客预留了一个没有注册的域名,用于防护事件不受控制时,启用该域名可以抑制事件的扩大。
2. Xshell事件中黑客通过DNS的txt字段进行传输数据与指令
两起事件都有一个共同特征就是利用DNS来进行事件的抑制与数据与指令的下发,这样的话,针对这种类型的黑客攻击与安全事件,我们可以站在底层网络来分析这事件。
利用永恒之蓝进行勒索事件中黑客预留的域名是DGA域名,在某些条件下探测该DGA域名是否可以正常解析,若解析成功则不进行加密,若解析成功则不加密。
DGA一般都是通过硬编码写入到程序中,在没有能力对其逆向的情况下,我们可以分析网络流量来分析DNS请求的DGA域名。这样就需要了解哪些域名是DGA域名,这里面有多种方法与思路:
1. 利用开放平台里的DGA库,目前个人所了解的国内360在开放相应的数据,这个也是个人首推的选择
2. DGA域名有个特征,很多DGA并没有注册,黑客前期会生成大量的DGA域名,但是在某些情况下,如传输数据与命令或抑制事件时,会选择性的注册少量域名,这样的话可以对DNS解析不成功的域名进行记录,并将这些域名进行进行,若其没有注册,且域名很随机可以判断为疑似DGA域名。这里面有大牛介绍过http://www.freebuf.com/geek/144459.html
3. 深度学习检测DGA域名,可参考http://www.freebuf.com/articles/network/139697.html
由于上面的方法二和方法三都有人实现了,这里面我主要介绍方法一的实现。这个思路是这样:通过监测网络流量(有条件的同学可以在大网环境下测试下),分析DNS的请求,一旦请求的DNS和DGA库中的匹配,输出相应的IP、端口,当然后期也可以做相应的统计与告警。
DGA库网上找了有一些,个人了解的国内推荐360的开放DGA的数据,100W+的DGA数据,并且每天都有更新。有需要的同学可直接下载,http://data.netlab.360.com/feeds/dga/dga.txt
DNS检测DGA实现的代码如下:
#coding:utf-8 import time from scapy.all import * from requests import * conf.iface='Intel(R) Dual Band Wireless-AC 8260' list=[] dgalist = open('dga.txt','r') dgalist = (dgalist.readlines())[18:] for dga in dgalist : list.append(dga.split('\t')[1]) data = set(list) f = open("./aa.txt",'w+') #Capture and Filter DGA def capture(packet): if packet: i =0 for p in packet: src = p[i][IP].src dst = p[i][IP].dst sport = p[i][UDP].sport dport = p[i][UDP].dport qr = str(p[i][DNS].qr) rcode = str(p[i][DNS].rcode) if '0' in qr: try: qr = 'Query' qname = p[i][DNS].qd.qname if type(qname) == bytes: qname = (qname.decode('utf-8'))[:-1] if qname in data: print("[*] Found DGA Request:-->",src,sport,qr,qname) print(src,sport,qr,qname,file=f) except Exception as e: pass if '1' in qr: if '0' in rcode: for j in range(10): try: qr = 'Response' rrname = p[j][DNS].an[j].rrname rdata = p[j][DNS].an[j].rdata if type(rrname) == bytes: rrname = (rrname.decode('utf-8'))[:-1] if type(rdata) == bytes: rdata = (rdata.decode('utf-8'))[:-1] if rrname in data: print ("[*] Found DGA Response:-->",src,dst,qr,rrname,rdata,'\n') print (src,dst,qr,rrname,rdata,file=f) except Exception as e: pass i = i + 1 #update dgafile def dgafileupdate(): url = 'http://data.netlab.360.com/feeds/dga/dga.txt' dgafile = get(url) with open('./dga.txt','w') as f: f.write(dgafile.text) print('Download DGAFile Finished') if __name__ == '__main__': sniff(prn=capture,filter='udp port 53') while True: dgafileupdate() time.sleep(86400)
在代码实现过程中,本个DGA正常解析成功的IP地址也记录了下来,DGA都有问题,那么解析的IP基本上也不正常。在大网环境下可以记录下相应的IP地址,在做Passive DNS时可以利用这些数据完善相应的库。
考虑到DGA的文件每天都会更新,可以进行定时下载该文件。
测试后,效果如下:
标签: DNS Python DGA xshell 永恒之蓝
版权所有:《蚂蚁网-多维人生,三实而立!》 => 《利用Python实现DGA检测》
本文地址:http://www.vants.org/?post=287
除非注明,文章均为 《蚂蚁网-多维人生,三实而立!》 原创,欢迎转载!转载请注明本文地址,谢谢。
日历
最新日志
链接
分类
最新碎语
- 如果一个人想要做一件真正忠于自己内心的事情,那么往往只能一个人独自去做"——理查德·耶茨
2019-06-25 21:34
- 日后我们知道,真正的人生道路是由内心决定的。不论我们的道路看上去如此曲折、如此荒谬地背离我们的愿望,它终归还是把我们引到我们看不见的目的地。(茨威格《昨日世界》)
2019-03-16 21:27
- 如果你渴望得到某样东西,你得让它自由,如果它回到你身边,它就是属于你的,如果它不会回来,你就从未拥有过它。——大仲马《基督山伯爵》
2018-10-09 22:07
- 人生有两大悲剧:一个是没有得到你心爱的东西;另一个是得到了你心爱的东西。人生有两大快乐:一个是没有得到你心爱的东西,于是可以寻求和创造;另一个是得到了你心爱的东西,于是可以去品味和体验。——弗洛伊德
2018-09-25 18:06
- 一个人越有思想,发现有个性的人就越多。普通人是看不出人与人之间的差别的——布莱兹·帕斯卡尔
2018-08-30 18:44
存档
- 2020年11月(2)
- 2018年1月(1)
- 2017年12月(1)
- 2017年11月(6)
- 2017年6月(1)
- 2017年5月(1)
- 2017年4月(1)
- 2017年3月(1)
- 2016年11月(1)
- 2016年4月(1)
- 2015年7月(2)
- 2015年6月(1)
- 2015年5月(5)
- 2014年12月(1)
- 2014年11月(1)
- 2014年10月(1)
- 2014年8月(1)
- 2014年7月(1)
- 2014年6月(1)
- 2014年5月(1)
- 2014年4月(3)
- 2014年2月(2)
- 2014年1月(2)
- 2013年12月(1)
- 2013年11月(1)
- 2013年10月(2)
- 2013年9月(1)
- 2013年8月(1)
- 2013年7月(3)
- 2013年6月(2)
- 2013年5月(1)
- 2013年4月(3)
- 2013年3月(1)
- 2013年2月(2)
- 2013年1月(2)
- 2012年12月(11)
- 2012年11月(12)
- 2012年10月(12)
- 2012年9月(26)
- 2012年8月(29)
- 2012年7月(18)
- 2012年6月(2)
- 2012年5月(25)
- 2012年4月(16)
- 2012年3月(13)
- 2012年2月(6)
发表评论: