利用Python实现DGA域名检测

前段时间爆发的利用永恒之蓝进行勒索及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实现的代码如下:

在代码实现过程中,本个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)

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

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏码农阿宇

一种关于缓存数据何时更新的解决思路

为什么写? 和大家一样,我有每天逛逛博客园的习惯,今天在博客园看到了“一只攻城狮”写的《初遇 Asp.net MVC 数据库依赖缓存那些事儿》。该朋友利用.Ne...

51360
来自专栏顶级程序员

11个让你吃惊的Linux终端命令

我已经用了十年的Linux了,通过今天这篇文章我将向大家展示一系列的命令、工具和技巧,我希望一开始就有人告诉我这些,而不是曾在我成长道路上绊住我。 ? 1.命...

58470
来自专栏Coding+

使用 youtube-dl 下载网络视频

youtube-dl 是一个命令行程序,用于从 YouTube.com 和其他几个网站下载视频。它需要 Python 解释器,版本2.6,2.7或3.2+,它是...

2.9K20
来自专栏北京马哥教育

Ext3 和 ext4 文件系统在线调整大小内幕

磁盘布局 为了更好的理解在线调整大小工作机制,我们首先需要理解 ext3 和 ext4 文件系统的磁盘布局,对于该功能的实现来说,这两个文件系统在磁盘上的结构是...

40560
来自专栏FreeBuf

全能无线渗透测试工具,一个LAZY就搞定了

近来一直在研究无线安全方面的东西,特别是在无线渗透测试这块,每次渗透测试时总要来回不停的切换操作和挑选利器,很是麻烦。就想看看是否可以有一款功能全面的集合型工具...

32950
来自专栏安恒信息

紧急 | Struts 2最新高危漏洞余波未平, S2-046攻击手段曝光

近日,Apache发布官方安全通告。由于没有正确的处理文件上传,导致Struts 2的Jakarta Multipart解析器中存在严重安全漏洞。攻击者可以通过...

34770
来自专栏嵌入式程序猿

究竟哪款适合你

随着物联网的越来越火,嵌入式工程师需要更多的网络知识,其中TCP/IP协议栈是我们经常要用到的,在公众号里曾给大家介绍过开源的Uip和LwIP协议栈,并在fre...

35370
来自专栏企鹅号快讯

11个让你吃惊的Linux终端命令

我已经用了十年的linux了,通过今天这篇文章我将向大家展示一系列的命令、工具和技巧,我希望一开始就有人告诉我这些,而不是曾在我成长道路上绊住我。 ? 1. 命...

24990
来自专栏企鹅号快讯

入门干货之用DVG打造你的项目主页-Docfx、Vs、Github

由于这三项技术涉及到的要点以及内容较多,希望大家有空能自己挖掘一下更多更深的用法。 0x01、介绍 VS,即VS2017以及以上版本,宇宙最好的IDE,集成了宇...

22160
来自专栏coding

RabbitMQ实战1.消息代理01.消息代理02.安装RabbitMQ03.生产者-消费者模式04.队列操作

肯定不是,这种直接与生产者交易的成本太大了!大到不可承受。因此有了中间商的存在。中间商将生产者与消费者的所有环节都透明化,使最终的交易流程极其简单。

8710

扫码关注云+社区

领取腾讯云代金券