Python 实现子域名查询与爆破

简介: 该工具第一是查询执行参数`-a Search xxx.com`第二是爆破`-a Blast domain wordlist`,工具同样可以使用DNS域名的枚举,和上面的区别就在于该方法使用了DNS迭代查询.

该工具第一是查询执行参数-a Search xxx.com第二是爆破-a Blast domain wordlist,工具同样可以使用DNS域名的枚举,和上面的区别就在于该方法使用了DNS迭代查询.

Web子域名查询: 该工具第一是查询执行参数-a Search xxx.com第二是爆破-a Blast domain wordlist

import requests
import re,linecache,argparse

head={'user-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}

def Banner():
    print("  _          ____  _                _    ")
    print(" | |   _   _/ ___|| |__   __ _ _ __| | __")
    print(" | |  | | | \___ \| '_ \ / _` | '__| |/ /")
    print(" | |__| |_| |___) | | | | (_| | |  |   < ")
    print(" |_____\__, |____/|_| |_|\__,_|_|  |_|\_\\")
    print("       |___/                             \n")
    print("E-Mail: me@lyshark.com")

# 查询子域名
def SearchDomain(domain):
    url = "https://crt.sh/?q=" + domain
    try:
        req = requests.get(url=url,headers=head,timeout=10)
        result = re.findall('<TD>(.*?)</TD>\n    <TD><A',req.text,re.S)
        for item in result:
            print(item)
    except Exception:
        pass

def VisitWeb(prefix,domain):
    try:
        url = "https://{}.{}".format(prefix,domain)
        ret = requests.get(url=url, headers=head, timeout=1)
        if(ret.status_code == 200):
            return 1
        else:
            return 0
    except:
        return 0

# 爆破子域名
def BlastWeb(domain,wordlist):
    forlen = len(linecache.getlines(wordlist))
    fp = open(wordlist,"r+")
    for i in range(0,forlen):
        main = str(fp.readline().split()[0])
        if VisitWeb(main, domain) != 0:
            print("旁站: {}.{} 存在".format(main,domain))

if __name__ == "__main__":
    Banner()
    def RunCMD(argc, args):
        if (argc == "Search"):
            SearchDomain(args[0])
        elif (argc == "Blast"):
            SubDomain = args[0]
            WordList = args[1]
            BlastWeb(SubDomain,WordList)

    Usage = "[*] Usage : main.py -a [Search | Blast] xxx.com"
    parser = argparse.ArgumentParser(usage=Usage)
    parser.add_argument("-a",dest="RunCMD",help="查询子域名命令")
    args = parser.parse_args()
    if args.RunCMD:
        argc = args.RunCMD
        RunCMD(argc,args)
    else:
        parser.print_help()

通过DNS爆破子域名: 该工具同样可以使用DNS域名的枚举,和上面的区别就在于该方法使用了DNS迭代查询.

import threading
import argparse
from queue import Queue
import dns.resolver

class BlastDNSDomain(threading.Thread):
    def __init__(self,queue,result):
        threading.Thread.__init__(self)
        self._queue = queue
        self.result = result
    def run(self):
        while not self._queue.empty():
            SubDomain = self._queue.get_nowait()
            try:
                result =dns.resolver.query(SubDomain,'A')
                if result.response.answer:
                    self.result.append(SubDomain)
                    print("[+] {}".format(SubDomain))
            except Exception:
                pass

def Banner():
    print("  _          ____  _                _    ")
    print(" | |   _   _/ ___|| |__   __ _ _ __| | __")
    print(" | |  | | | \___ \| '_ \ / _` | '__| |/ /")
    print(" | |__| |_| |___) | | | | (_| | |  |   < ")
    print(" |_____\__, |____/|_| |_|\__,_|_|  |_|\_\\")
    print("       |___/                             \n")
    print("E-Mail: me@lyshark.com")

if __name__ == "__main__":
    Banner()
    Usage = "main.py -d xxx.com -w dict.log -t 5"
    parser = OptionParser(usage=Usage)
    parser.add_argument("-d", "--domain", dest="Domain", help="Specify subdomain format")
    parser.add_argument("-w", "--wordlist", dest="WordList", help="Specify a dictionary file")
    parser.add_argument("-t", "--ThreadCount", dest="ThreadCount", help="Specify the number of execution threads")
    args = parser.parse_args()
    if args.Domain and args.WordList and args.ThreadCount:
        queue = Queue()
        result = []
        with open(args.WordList) as fp:
            for item in fp:
                queue.put(item.rstrip() + '.' + args.Domain)
                threads = []
                for item in range(int(args.ThreadCount)):
                    threads.append(BlastDNSDomain(queue, result))
                for t in threads:
                    t.start()
                for t in threads:
                    t.join()
        print("所有DNS域名: {}".format(set(result)))
    else:
        parser.print_help()
相关实践学习
基于函数计算快速搭建Hexo博客系统
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
目录
相关文章
|
1天前
|
Python
Python实现简易天气查询系统
Python实现简易天气查询系统
33 4
|
1天前
|
缓存 API 定位技术
使用Python调用百度地图API实现地址查询
使用Python调用百度地图API实现地址查询
129 0
|
1天前
|
SQL 关系型数据库 MySQL
用 Python 连接数据库并进行查询。
【2月更文挑战第12天】【2月更文挑战第32篇】用 Python 连接数据库并进行查询。
|
1天前
|
JSON 数据格式 索引
python之JMESPath:JSON 查询语法库示例详解
python之JMESPath:JSON 查询语法库示例详解
15 0
|
1天前
|
安全 网络协议 测试技术
安全开发实战(4)--whois与子域名爆破
本文介绍了在网络安全渗透测试中,如何使用Whois查询和子域名爆破来收集目标组织的信息。Whois查询可以获取域名的注册者联系信息、注册时间、DNS服务器等关键数据,而子域名爆破则能发现未公开的网络资产。Whois查询可以通过Python的`python-whois`库实现,它能返回大量关于域名的详细信息。子域名爆破通常涉及创建自定义字典,使用Python的`socket`模块将字典中的字符串与主域名组合,然后尝试解析IP地址,找到有效子域名。
|
1天前
|
开发者 Python
在Python中查询进程信息的实用指南
在Python中查询进程信息的实用指南
10 2
|
1天前
|
SQL 缓存 数据库
在Python Web开发过程中:数据库与缓存,如何使用ORM(例如Django ORM)执行查询并优化查询性能?
在Python Web开发中,使用ORM如Django ORM能简化数据库操作。为了优化查询性能,可以:选择合适索引,避免N+1查询(利用`select_related`和`prefetch_related`),批量读取数据(`iterator()`),使用缓存,分页查询,适时使用原生SQL,优化数据库配置,定期优化数据库并监控性能。这些策略能提升响应速度和用户体验。
18 0
|
1天前
域名信息查询同款WHOIS源码
域名查询一般是指查询域名的whois注册信息,域名WHOIS是当前域名系统中不可或缺的一项信息服务。在使用域名进行Internet冲浪时,很多用户希望进一步了解域名、名字服务器详细信息,这就会用到WHOIS。
25 5
|
1天前
|
数据采集 搜索推荐 数据挖掘
使用Python制作一个批量查询搜索排名的SEO免费工具
最近工作中需要用上 Google SEO(搜索引擎优化),有了解过的朋友们应该都知道SEO必不可少的工作之一就是查询关键词的搜索排名。关键词少的时候可以一个一个去查没什么问题,但是到了后期,一个网站都有几百上千的关键词,你再去一个一个查,至少要花费数小时的时间。 虽然市面上有很多SEO免费或者收费工具,但免费的基本都不能批量查,网上免费的最多也就只能10个10个查询,而且查询速度很慢。收费的工具如Ahrefs、SEMrush等以月为单位收费最低也都要上百美刀/月,当然如果觉得价格合适也可以进行购买,毕竟这些工具的很多功能都很实用。今天我给大家分享的这个排名搜索工具基于python实现,当然肯定
46 0
|
1天前
|
网络协议 Shell Linux
【Shell 命令集合 系统管理 】Linux 查询域名的注册信息 whois命令 使用指南
【Shell 命令集合 系统管理 】Linux 查询域名的注册信息 whois命令 使用指南
56 1