python数据库开发 dga_利用Python实现DGA域名检测

*本文原创作者:feiniao,本文属于 FreeBuf 原创奖励计划,未经许可禁止转载。前段时间爆发的利用永恒之蓝进行勒索及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

由于上面的方法二和方法三都有人实现了,这里面我主要介绍方法一的实现。这个思路是这样:通过监测网络流量(有条件的同学可以在大网环境下测试下),分析DNS的请求,一旦请求的DNS和DGA库中的匹配,输出相应的IP、端口,当然后期也可以做相应的统计与告警。

DGA库网上找了有一些,个人了解的国内推荐360的开放DGA的数据,100W+的DGA数据,并且每天都有更新。有需要的同学可直接下载,http://data.netlab.360.com/feeds/dga/dga.txt

DNS检测DGA实现的代码如下:

在代码实现过程中,本个DGA正常解析成功的IP地址也记录了下来,DGA都有问题,那么解析的IP基本上也不正常。在大网环境下可以记录下相应的IP地址,在做Passive DNS时可以利用这些数据完善相应的库。

考虑到DGA的文件每天都会更新,可以进行定时下载该文件。

测试后,效果如下:

这样的话就实现了监测异常DGA记录,内网环境下可以分析机器被黑或者中马,大网环境下可以通过DNS侧重了解区域安全态势。

完整实现的代码如下:#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)

#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:

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)

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")

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)

*本文原创作者:feiniao,本文属于 FreeBuf 原创奖励计划,未经许可禁止转载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值