python开发子域名扫描器

python开发子域名扫描器

  • 1. 前言
  • 2. 子域名扫描器开发
    • 2.1. 第一阶段
    • 2.2. 第二阶段
    • 2.3. 第三阶段
    • 2.4. 第四阶段
  • 3. 总结

1. 前言

不想对内容解释过多了,自行去百度搜索相关的参数怎么使用的吧。对于编写工具基本上用到的无非就是多线程、请求等等这些,很多情况下基本上就是照搬就可以了。

2. 子域名扫描器开发

关于子域名扫描器,网上一大堆在线的扫描器,而且在线扫描,还能避免自己地址被发现,其实也挺好的,但是吧总归要了解一下程序是怎么开发的,请求是怎么开发的。

我在没写扫描器的时候感觉不就是通过请求来简单的判断呀,确实,从端口扫描器到目录扫描器再到子域名扫描器,第一阶段的入门扫描都很简单,python也有相应的包基本导入就可以了,但是当添加多线程后,就要考虑到组合,例如本次子域名一些http不会自动跳转到https,你就能说这个域名不通?包括ssl证书、不安全连接等等,都可能存在误报,编写后就能发现在简单的请求下代码就几行。但是如果考虑的全面的话,代码量就不断的增加。

子域名扫描器源码获取:子域名源码

2.1. 第一阶段

这一个开发的阶段很简单就几行代码,可以看到基本上就是一个读取文件,然后去执行get请求,有效就输出,无效也输出。

import requestsdef scan_subdomains(main_domain, subdomain_file):with open(subdomain_file, 'r') as file:for subdomain in file:# 去除行尾的换行符并添加主域名full_subdomain = f"{subdomain.strip()}.{main_domain}"try:# 发送GET请求到该子域名response = requests.get(f"https://{full_subdomain}", timeout=5)# 检查HTTP状态码if response.status_code == 200:print(f"有效域名---->{full_subdomain}")except requests.RequestException as e:# 处理请求异常,如连接错误、超时、SSL问题等print(f"无效域名---->{full_subdomain}")if __name__ == "__main__":main_domain = "baidu.com"subdomain_file = "ym.txt"  # 假设你的子域名前缀文件名为ym.txtscan_subdomains(main_domain, subdomain_file)#基础程序,设定固定的文件,及内容

在这里插入图片描述

2.2. 第二阶段

这个阶段如果想要将脚本发给其它人使用,那么就需要设定一些手动输入的,比如在第一阶段中请求的域名、子域名文件都是固定的,倘若别人不是按照你设定的,那么必然会出现问题,这时候就需要添加一个给用户自行输入的功能。

同时在代码中添加https和http的判断,默认使用https进行测试,如果https不通则使用http再次进行测试。

import requests
import argparsedef scan_subdomains(main_domain, subdomain_file, default_protocol="https"):protocols = [default_protocol]if default_protocol == "https" and "http" not in protocols:  # 默认以https执行,如果https不通则执行httpprotocols.append("http")with open(subdomain_file, 'r') as file:for subdomain in file:subdomain = subdomain.strip()  # 去除行尾的换行符if not subdomain:  # 忽略空行continuefor protocol in protocols:  # 循环协议url = f"{protocol}://{subdomain}.{main_domain}" # 组合urltry:response = requests.get(url, timeout=5)  # 请求get 延迟5秒if response.status_code == 200:print(f"有效域名---->{url}")break  # 如果找到有效域名,则不再尝试其他协议except requests.RequestException as e:# 可以在这里打印异常信息,以便调试continue  # 忽略异常,继续尝试下一个协议或下一个子域名if __name__ == "__main__":# 使用 argparse 解析命令行参数parser = argparse.ArgumentParser()parser.add_argument('-i', dest='main_domain', type=str, required=True, help='输入主域名')parser.add_argument('-f', dest='subdomain_file', type=str, required=True,help='输入包含子域名文件')args = parser.parse_args()main_domain = args.main_domainsubdomain_file = args.subdomain_filescan_subdomains(main_domain, subdomain_file)# 添加手动输入域名和文件

在这里插入图片描述

2.3. 第三阶段

基本上如果自己使用第二阶段已经可以了,但是如果涉及到很多的子域名测试,单线程的情况下运行会很慢,那么就需要添加多线程功能。

同时这里,我添加了可控的多线程功能,允许用户自行输入线程数,同时对之前的https与http进行了更新,允许用户手动输入测试https还是http,如果不输入,则默认https与http均测试。

import requests
from concurrent.futures import ThreadPoolExecutor, as_completed
import argparsedef check_subdomain(args):subdomain, main_domain, protocol = args  # 解包url = f"{protocol}://{subdomain}.{main_domain}"try:response = requests.get(url, timeout=5)if response.status_code == 200:return url  # 返回有效的域名except requests.RequestException as e:return None  # 请求异常,返回Nonedef scan_subdomains(main_domain, subdomain_file, max_workers, protocols):with open(subdomain_file, 'r') as file:subdomains = [line.strip() for line in file if line.strip()]  # 去除空行,首尾换行符results = []  # 用于存储有效的域名with ThreadPoolExecutor(max_workers=max_workers) as executor:futures = {# 根据subdomains和protocols进行组合,也就是根据子域名和协议进行组合。executor.submit(check_subdomain, (subdomain, main_domain, protocol))for subdomain in subdomainsfor protocol in protocols}for future in as_completed(futures):result = future.result()  # 获取每个任务的结果if result:results.append(result)print(f"有效域名---->{result}")return resultsif __name__ == "__main__":banner = """  程序名称: 子域名检查器    作者: Yu to   开发时间: 2024年9月    版本号: 1.0    使用说明:  - url地址仅可手动输入一个。  - 目录文件中每行一个,注意空行、空白字符等。  - 线程数量支持单个整数,默认为1,尽量不要过大,避免出现请求失败、请求遗漏等情况。  """print(banner)parser = argparse.ArgumentParser()parser.add_argument('-i', dest='main_domain', type=str, required=True, help='输入主域名')parser.add_argument('-f', dest='subdomain_file', type=str, required=True, help='输入包含子域名文件')parser.add_argument('-t', dest='max_workers', type=int, default=1, help='设置并发线程的最大数量,默认为1')parser.add_argument('-a', dest='protocol', type=str, default='both',choices=['https', 'http', 'both'],help='指定协议类型,可以是 https、http 或 both(同时测试两种协议),默认为 both')args = parser.parse_args()main_domain = args.main_domainsubdomain_file = args.subdomain_filemax_workers = args.max_workers# 判断用户输入的协议if args.protocol == 'both':protocols = ['https', 'http']else:protocols = [args.protocol]scan_subdomains(main_domain, subdomain_file, max_workers, protocols)

在这里插入图片描述

2.4. 第四阶段

这个阶段基本上就是最终的一个阶段了,添加了用户可以使用CTRL+C进行提前结束,并且添加了时间记录,可以直观的看出一共允许了多少秒,并且将所有的结果都写入到文件中,避免出现不小心结束终端,导致辛辛苦苦测试出来的结果丢失。

可以看一下最下面的图,分别使用默认1线程和10线程测试的速度。

import requests
from concurrent.futures import ThreadPoolExecutor, as_completed
import argparse
import timedef check_subdomain(args):subdomain, main_domain, protocol = argsurl = f"{protocol}://{subdomain}.{main_domain}"try:response = requests.get(url, timeout=5)if response.status_code == 200:return url  # 返回有效的域名except requests.RequestException:return None  # 请求异常,返回Nonedef scan_subdomains(main_domain, subdomain_file, max_workers, protocols, result_file):with open(subdomain_file, 'r') as file:subdomains = [line.strip() for line in file if line.strip()]results = []  # 用于存储有效的域名with ThreadPoolExecutor(max_workers=max_workers) as executor:futures = {executor.submit(check_subdomain, (subdomain, main_domain, protocol))for subdomain in subdomainsfor protocol in protocols}try:for future in as_completed(futures):result = future.result()  # 获取每个任务的结果if result:results.append(result)print(f"有效域名---->{result}")# 每次找到一个有效域名就立即写入文件with open(result_file, 'a') as f:f.write(f"{result}\n")except KeyboardInterrupt:print("\n程序被用户中断。")return results  # 返回中断时的结果return resultsif __name__ == "__main__":banner = """  程序名称: 子域名检查器    作者: Yu to   开发时间: 2024年9月    版本号: 1.1    使用说明:  - url地址仅可手动输入一个。  - 目录文件中每行一个,注意空行、空白字符等。  - 线程数量支持单个整数,默认为1,尽量不要过大,避免出现请求失败、请求遗漏等情况。- 支持指定http、https协议,默认检测http和https。"""print(banner)parser = argparse.ArgumentParser()parser.add_argument('-i', dest='main_domain', type=str, required=True, help='输入主域名')parser.add_argument('-f', dest='subdomain_file', type=str, required=True, help='输入包含子域名文件')parser.add_argument('-t', dest='max_workers', type=int, default=1, help='设置并发线程的最大数量,默认为1')parser.add_argument('-a', dest='protocol', type=str, default='both',choices=['https', 'http', 'both'],help='指定协议类型,可以是 https、http 或 both(同时测试两种协议),默认为 both')args = parser.parse_args()main_domain = args.main_domainsubdomain_file = args.subdomain_filemax_workers = args.max_workers# 判断用户输入的协议if args.protocol == 'both':protocols = ['https', 'http']else:protocols = [args.protocol]result_file = 'scan_results.txt'# 清空结果文件,防止追加到上次的内容with open(result_file, 'w') as f:f.write("扫描结果:\n")start_time = time.time()  # 记录开始时间with open(result_file, 'a') as f:f.write(f"开始时间: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(start_time))}\n")try:scan_subdomains(main_domain, subdomain_file, max_workers, protocols, result_file)except Exception as e:print(f"程序出现错误: {e}")end_time = time.time()  # 记录结束时间elapsed_time = end_time - start_timewith open(result_file, 'a') as f:f.write(f"运行时间: {elapsed_time:.2f} 秒\n")print(f"运行时间: {elapsed_time:.2f}秒")print("运行结果已写入到scan_results.txt文件中")

在这里插入图片描述

3. 总结

总得来说整体程序的编写基本上都是之前几个脚本模板的套写,有点像之前我写过的poc编写的那样,基本上都是套,无非就是判断需要根据实际的情况来进行判断一下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/145796.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Elasticsearch】-spring boot 依赖包冲突问题

<dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.17.24</version></dependency> 在pom的配置中&#xff0c;只引入了elasticsearch-7.17.24 &#xff0c;但实际上会同时…

android编译make详细过程日志查看showcommands/verbose.log

背景&#xff1a; 平时做aosp开发时候&#xff0c;如果要编译某一个模块就会直接使用命令make&#xff0c;或者make xxx模块。 比如&#xff1a; make SettingsProvider make SystemUI make bootanimation这样就直接有对应的apk&#xff0c;或者bin文件了&#xff0c;具体这些…

20240921 每日AI必读资讯

AI、悟空、西湖文创集盒……2024云栖大会有超多硬核科技&#xff01; - 9月19日&#xff0c;一年一度的阿里云栖大会拉开帷幕 - 阿里现任掌舵者吴泳铭、CTO周靖人携手大模型领域当红炸子鸡月之暗面CEO杨植麟、小鹏汽车CEO何小鹏等一众明星企业创始人给业界带来了一场久违的国…

Docker + Win 10 学习记录

下载Docker Release notes | Docker Docs 推荐使用4.33版本&#xff0c;最新的Docker版本在win10 22H2无法安装。需要升级到win11. 查看Win10版本是否与最新版的Docker兼容 运行 win R&#xff0c; 然后输入winver 如果你的Docker版本无法在当前的win10安装&#xff0c;请更…

搜索引擎onesearch3实现解释和升级到Elasticsearch v8系列(五)-聚合

聚合 聚合基于Query结果的统计&#xff0c;执行过程是搜索的一部分&#xff0c;Onesearch支持0代码构建聚合&#xff0c;聚合目前完全在引擎层 0代码聚合 上图是聚合的配置&#xff0c;包括2个pdm文档聚合统计 termsOfExt term桶聚合&#xff0c;统计ext&#xff0c;如&…

热点|创邻图查询范式引爆LDBC TUC2024

2024年8月30日至31日&#xff0c;创邻科技Galaxybase团队联合蚂蚁集团TuGraph团队、阿里巴巴GraphScope团队共同主办第18届LDBC TUC会议。在本次会议中&#xff0c;来自全球图数据库领域的学者和技术专家做了很多精彩的分享&#xff0c;共同探讨图技术的最新进展。创邻科技Gala…

MySQL高阶1853-转换日期格式

目录 题目 准备数据 分析数据 总结 题目 给定一个Days表&#xff0c;请你编写SQL查询语句&#xff0c;将Days表中的每一个日期转化为"day_name, month_name day, year"格式的字符串。 返回的结果表 不计顺序 。 准备数据 Create table If Not Exists Days (d…

【Kubernetes知识点】HPA如何控制不同的资源实现自动扩缩容?

【Kubernetes知识点】HPA如何控制不同的资源实现自动扩缩容&#xff1f; 目录 1 概念 1.1 什么是HPA1.2 Deployment 与 HPA 的关系 1.2.1 工作原理 1.3 StatefulSet 与 HPA 的关系 1.3.1 工作原理 2 实验案例&#xff1a;HPA 控制 StatefulSet 进行扩缩容 2.1 部署一个有状态…

[产品管理-28]:NPDP新产品开发 - 26 - 产品生命周期管理 - 产品上市的八大步骤

目录 一、产品发布 1.1 传统的产品上市发布步骤&#xff1a;线性一次性发布 1. 产品概念提出与市场调研 2. 产品开发与测试 3. 生产准备与质量控制 4. 营销策略制定 5. 产品上市发布 6. 持续优化与迭代 1.2 新型的产品上市发布步骤&#xff1a;逐步迭代&#xff0c;多…

【mysql技术内幕】

MySQL之技术内幕 1.MVCC模式2. 实现mvcc模式的基础点3.MySQL锁的类型4. 谈谈分库分表5. 分表后的id咋么保证唯一性呢&#xff1f;6. 分表后非sharding key的查询咋么处理的&#xff1f; 1.MVCC模式 MVCC, 是multi-version concurrency control的缩写&#xff0c;即多版本并发控…

基于RK3588,AI边缘模块,单片6TOPS,可集群堆叠,Mixtile Blade 3

Mixtile Blade 3 是一款经济实惠、节能的 SBC&#xff0c;围绕下一代 8 纳米瑞芯微 RK3588 处理器构建。它非常适合快速开发、AI 应用程序原型设计和边缘计算&#xff0c;允许您集群多个 Mixtile Blade 3 SBC 以扩展您的部署。 硬件布局正反面 开箱即用的 Mixtile Blade 3 是一…

Jordan标准型

Jordan(若尔当)标准型知识梳理 szmike Keep curious 已关注 raDar 等 634 人赞同了该文章 本文主要介绍什么是Jordan标准型以及怎么把一个矩阵化为Jordan标准型。 一&#xff0c;Jordan标准型的定义 矩阵 J 除了主对角线和主对角线上方元素之外&#xff0c;其余都是0&…

漫步者头戴式耳机怎么样?漫步者、西圣、索尼三大耳机测评对比

自头戴式耳机诞生以来&#xff0c;凭借其出色的音质表现和时尚造型&#xff0c;迅速赢得了音乐爱好者的青睐。头戴式耳机不仅能够带来更加沉浸的听觉体验&#xff0c;还具备较强的降噪功能&#xff0c;让用户在嘈杂环境中依然能专注于音乐世界。 与入耳式耳机相比&#xff0c;…

AIGC生图基础知识

一、引言 AIGC&#xff0c;即AI-Generated Content&#xff0c;是一种利用大型预训练模型如生成对抗网络&#xff08;GAN&#xff09;、扩散网络&#xff08;Diffusion&#xff09;和语言大模型&#xff08;Transformer&#xff09;等人工智能技术&#xff0c;通过对大量数据进…

通过springcloud gateway优雅的进行springcloud oauth2认证和权限控制

代码地址 如果对你有帮助请给个start&#xff0c;本项目会持续更新&#xff0c;目标是做一个可用的快速微服务开发平台&#xff0c;成为接私活&#xff0c;毕设的开发神器&#xff0c; 欢迎大神们多提意见和建议 使用的都是spring官方最新的版本&#xff0c;版本如下&#xff1…

样本册3D翻页电子版和印刷版同时拥有是一种什么体验

​在数字化时代&#xff0c;样本册3D翻页电子版的兴起&#xff0c;让传统印刷版样本册面临着前所未有的挑战。与此同时&#xff0c;许多企业也开始尝试将两者相结合&#xff0c;以满足更多元化的市场需求。那么&#xff0c;拥有一份既具备数字化优势&#xff0c;又保留传统印刷…

生信初学者教程(一):欢迎

文章目录 配套数据R包版本安装包版权答疑在生物信息学(生信)领域,随着高通量测序技术的不断发展,大量数据涌现,为科研工作者提供了丰富的资源。然而,对于初学者而言,如何从海量的数据中挖掘有价值的信息,并开展一个完整的生信项目,仍然是一个挑战。目前,市面上针对初…

PACKMOL 一:手把手教你用Linux安装 packmol

文章目录 1. PACKMOL介绍PACKMOL的主要用途&#xff1a;使用场景&#xff1a;优点&#xff1a; 2. PACKMO安装3. PACKMO验证结束语 1. PACKMOL介绍 PACKMOL 是一个开源软件&#xff0c;用于生成分子动力学模拟所需的初始结构。它的主要功能是根据用户定义的几何约束&#xff0…

Excel--WPS 函数与公式技巧(轻松搞定各类排名)

一、直接按成绩或数值的排序&#xff08;rank函数轻松搞定&#xff09; 以上函数非常简单&#xff0c;记住两点&#xff1a; 1.rank排名同分作为同一名次&#xff0c;后面的名次需要占位&#xff0c;如&#xff0c;以上两个70分&#xff0c;同为第8名&#xff0c;那么第9名将被…

局域网变压器市场价值

2024 年全球局域网变压器市场价值为 3.056 亿美元&#xff0c;预计到 2030 年将达到 4.426 亿美元&#xff0c;2024-2030 年的复合年增长率为 5.4%。 局域网变压器市场包括用于改变电信号电压或格式的产品&#xff0c;以改善和简化局域网 (LAN) 上的数据传输。这些变压器对于保…