ღ Miranda

DNS代理工具DNSChef分析

DNSChef is a highly configurable DNS proxy for Penetration Testers and Malware Analysts and it is written in Python.

Installing

可以去DNSChef的官方网站上去下载: http://thesprawl.org/projects/dnschef/

同时需要安装两个依赖包:


Running

这个工具只有一个py文件,并且只有612行,是一个十分小巧的工具,主要功能就是DNS代理,需要将被代理的机器的DNS服务器地址指向本机。

需要指定一个log文件,用--logfile="dnschef.log",并且使用sudo运行。

不加参数默认使用的是8.8.8.8的DNS服务器,全部DNS请求都能返回真实的IP地址,在测试时可以使用linux的host命令:

这条命令请求了127.0.0.1(本机)这个DNS服务器baidu.com的IP地址,在full proxy的模式下返回的结果为:

下里面可以用--fakeip参数指定虚假的DNS解析:

输出变为:

程序输出一条

可见将baidu.com的A记录改为了127.0.0.1

同时也可以用其他参数改MX,CNAME等记录:

可以用--fakedomains指定要欺骗的域名,其他域名解析是正常的,也可以用--truedomains指定正常解析的域名,更多的使用信息可以参考官网和使用手册。


Analysis

这个工具主要使用了dnslib,IPy,SocketServer这三个库,dnslib用来处理和发送DNS请求包,IPy主要用来处理ipv6的地址,SocketServer是Python的内建库(Python3改名为socketserver),用来建立本地服务器。

main()函数十分简单,主要用optparse添加了命令行参数和帮助信息,从命令行接受了传入的参数,进行一系列判断,给变量赋值,最后传给start_cooking这个函数执行服务器程序。

start_cooking函数的主要部分:

这个部分指定了日志文件,通过用户参数创建TCP或UDP服务,然后定义多线程,指定为守护进程,启动服务并在主线程中循环。

来看ThreadedTCPServer这个class:

这个类继承了SocketServer中的ThreadingMixIn, TCPServer分别用来创建多线程和TCP服务,并且重写了__init__函数,添加了一些变量,再调用默认构造函数__init__(self,server_address,RequestHandlerClass),这些变量在RequestHandlerClass类中可以用self.server.的方式访问。

主要的处理函数是TCPHandler这个类,继承自SocketServer.BaseRequestHandler和自定义的DNSHandler:

覆盖了BaseRequestHandlerhandle函数,作用是接受客户端的请求,response = self.parse(data)这句调用了DNSHandlerparse的方法得到返回包最后发送给客户端。

最重要的部分就是DNSHandler这个类了,有三个函数parse,findnametodns,proxyrequest,最后一个比较简单,就是单纯的向DNS服务器发起请求再返回查询结果:

来看findnametodns:

这里传入了要查询的域名和之前定义的域名对应关系,这个字典形如{'baidu.com' :192.168.1.1},先把域名拆为各级域并且倒序排列,比如baidu.com变成['com', 'baidu'],匹配就返回指定的host,可能为IP地址或者是FalseFalse代表可能指定了truedomains参数,在parse函数里回去请求真实的DNS服务器,注意for-else语句当for循环正常结束时执行else里的语句,就是在nametodns里如果有匹配的域名,就返回对应的值,如果遍历都没找到符合的就返回False,这里的False就说明需要请求真实的IP,parse函数里主要对各种类型的DNS请求做了处理,构造数据包,这里就不展开说了,注意162行这里的判断有些问题,将*改为ANY:

不然对文档里的:

可能实验不成功。

发表评论

电子邮件地址不会被公开。