Python 實戰:內網滲透中的信息收集自動化腳本(2)

用途限制聲明,本文僅用于網絡安全技術研究、教育與知識分享。文中涉及的滲透測試方法與工具,嚴禁用于未經授權的網絡攻擊、數據竊取或任何違法活動。任何因不當使用本文內容導致的法律后果,作者及發布平臺不承擔任何責任。滲透測試涉及復雜技術操作,可能對目標系統造成數據損壞、服務中斷等風險。讀者需充分評估技術能力與潛在后果,在合法合規前提下謹慎實踐。

這次主要介紹子域名爆破腳本,關于這個腳本大家應該不會陌生一個工具,oneforall子域名爆破,接下來我們就從代碼的角度看看是如何進行子域名爆破的,先提供源碼,再進行逐個模塊分析

import dns.resolver
import socket
import argparse
import time
from datetime import datetime
from concurrent.futures import ThreadPoolExecutor, as_completed
import logging
from typing import List, Optional# 配置日志輸出
logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(levelname)s - %(message)s',handlers=[logging.FileHandler("dns_exploration.log"),logging.StreamHandler()]
)
logger = logging.getLogger(__name__)def reverse_dns(ip: str) -> Optional[List[str]]:"""反向DNS查詢,獲取IP對應的域名信息"""try:result = socket.gethostbyaddr(ip)return [result[0]] + result[1]except (socket.herror, socket.timeout):return Nonedef dns_request(domain: str, record_type: str = 'A') -> List[str]:"""DNS查詢函數,支持多種記錄類型:param domain: 待查詢域名:param record_type: DNS記錄類型(A, AAAA, CNAME, MX, NS等):return: 查詢到的記錄列表"""ips = []try:resolver = dns.resolver.Resolver()resolver.timeout = 5  # 超時時間resolver.lifetime = 10  # 總生命周期result = resolver.resolve(domain, record_type)for answer in result:record_value = answer.to_text()ips.append(record_value)logger.info(f"域名: {domain} | 類型: {record_type} | 記錄值: {record_value}")# 對A/AAAA記錄進行反向查詢if record_type in ['A', 'AAAA']:reverse_domains = reverse_dns(record_value)if reverse_domains:logger.info(f"  反向解析: {', '.join(reverse_domains)}")except dns.resolver.NXDOMAIN:logger.debug(f"域名不存在: {domain} (類型: {record_type})")except dns.resolver.NoAnswer:logger.debug(f"無{record_type}記錄: {domain}")except (dns.exception.Timeout, dns.resolver.NoNameservers):logger.warning(f"查詢超時/無可用DNS服務器: {domain} (類型: {record_type})")except Exception as e:logger.error(f"查詢錯誤 {domain}: {str(e)}")return ipsdef check_subdomain(word: str, domain: str, record_types: List[str], nums: bool) -> List[str]:"""檢查單個子域名(含數字后綴變種)"""successes = []# 基礎子域名subdomain = f"{word}.{domain}"for rtype in record_types:if dns_request(subdomain, rtype):successes.append(subdomain)# 帶數字后綴的子域名if nums:for i in range(10):num_subdomain = f"{word}{i}.{domain}"for rtype in record_types:if dns_request(num_subdomain, rtype):successes.append(num_subdomain)return successesdef subdomain_search(domain: str, dictionary: List[str], nums: bool = False,record_types: List[str] = ['A'], threads: int = 5) -> List[str]:"""子域名枚舉主函數:param domain: 主域名:param dictionary: 子域名字典列表:param nums: 是否檢查數字后綴:param record_types: 需要查詢的DNS記錄類型:param threads: 線程數,控制并發:return: 所有存在的子域名列表"""successes = []total = len(dictionary)start_time = time.time()with ThreadPoolExecutor(max_workers=threads) as executor:# 提交所有任務futures = {executor.submit(check_subdomain, word, domain, record_types, nums): wordfor word in dictionary}# 跟蹤進度completed = 0for future in as_completed(futures):completed += 1progress = (completed / total) * 100logger.info(f"進度: {progress:.2f}% ({completed}/{total})")successes.extend(future.result())logger.info(f"枚舉完成,耗時: {time.time() - start_time:.2f}秒")return list(set(successes))  # 去重def save_results(results: List[str], domain: str) -> None:"""保存結果到文件"""timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")filename = f"subdomains_{domain}_{timestamp}.txt"with open(filename, "w") as f:for subdomain in sorted(results):f.write(f"{subdomain}\n")logger.info(f"結果已保存到: {filename}")def main():# 命令行參數解析parser = argparse.ArgumentParser(description="高級DNS子域名枚舉工具")parser.add_argument("-d", "--domain", required=True, help="目標主域名 (例如: google.com)")parser.add_argument("-f", "--file", default="subdomains.txt", help="子域名字典文件路徑")parser.add_argument("-n", "--nums", action="store_true", help="檢查帶數字(0-9)后綴的子域名")parser.add_argument("-t", "--types", default="A", help="DNS記錄類型,多個用逗號分隔 (例如: A,AAAA,CNAME)")parser.add_argument("-th", "--threads", type=int, default=5, help="并發線程數 (默認: 5)")args = parser.parse_args()# 解析記錄類型record_types = [t.strip().upper() for t in args.types.split(',')]# 讀取字典文件try:with open(args.file, "r", encoding="utf-8") as f:dictionary = [line.strip() for line in f if line.strip()]logger.info(f"已加載字典文件: {args.file} (共{len(dictionary)}個條目)")except FileNotFoundError:logger.error(f"字典文件不存在: {args.file}")return# 執行子域名枚舉logger.info(f"開始枚舉 {args.domain} 的子域名...")results = subdomain_search(domain=args.domain,dictionary=dictionary,nums=args.nums,record_types=record_types,threads=args.threads)# 輸出結果if results:logger.info(f"共發現 {len(results)} 個有效子域名:")for sub in sorted(results):logger.info(f"  - {sub}")save_results(results, args.domain)else:logger.info("未發現有效子域名")if __name__ == "__main__":main()

1. 模塊導入與日志配置

import dns.resolver
import socket
import argparse
import time
from datetime import datetime
from concurrent.futures import ThreadPoolExecutor, as_completed
import logging
from typing import List, Optional# 配置日志輸出
logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(levelname)s - %(message)s',handlers=[logging.FileHandler("dns_exploration.log"),logging.StreamHandler()]
)
logger = logging.getLogger(__name__)
解析:
  • 模塊選擇邏輯

    • dns.resolver:核心 DNS 查詢工具,用于解析域名的各類 DNS 記錄(替代原始版本的基礎查詢)。
    • socket:僅保留反向 DNS 查詢功能(IP→域名映射)。
    • argparse:實現命令行參數解析,讓工具支持靈活配置(如指定域名、字典文件等)。
    • concurrent.futures:提供線程池支持,實現并發查詢以提升效率(解決原始版本單線程慢的問題)。
    • logging:替代原始的print輸出,支持多級別日志(INFO/WARNING/ERROR)和雙目標輸出(控制臺 + 文件)。
    • typing:添加類型注解,提升代碼可讀性和 IDE 支持(如List[str]表示字符串列表)。
  • 日志配置細節

    • level=logging.INFO:默認輸出 INFO 及以上級別日志(DEBUG 信息需手動開啟)。
    • format:包含時間戳、日志級別和消息內容,便于追溯執行過程。
    • handlers:同時輸出到文件(dns_exploration.log)和控制臺,既保留記錄又方便實時查看。

2. 反向 DNS 查詢函數?reverse_dns

def reverse_dns(ip: str) -> Optional[List[str]]:"""反向DNS查詢,獲取IP對應的域名信息"""try:result = socket.gethostbyaddr(ip)return [result[0]] + result[1]except (socket.herror, socket.timeout):return None
解析:
  • 功能定位:通過 IP 地址反向解析對應的域名(IP→域名映射),補充正向 DNS 查詢的信息。
  • 參數與返回值
    • 輸入ip: str:待查詢的 IP 地址(IPv4 或 IPv6)。
    • 返回Optional[List[str]]:可能為None(解析失敗)或域名列表(主域名 + 別名)。
  • 異常處理
    • socket.herror:主機不存在或無反向記錄時觸發。
    • socket.timeout:查詢超時(新增處理,解決原始版本未處理超時的問題)。
  • 實現細節socket.gethostbyaddr(ip)返回元組(主機名, 別名列表, IP列表),此處提取主機名和別名合并為列表返回。

3. DNS 查詢函數?dns_request

def dns_request(domain: str, record_type: str = 'A') -> List[str]:"""DNS查詢函數,支持多種記錄類型:param domain: 待查詢域名:param record_type: DNS記錄類型(A, AAAA, CNAME, MX, NS等):return: 查詢到的記錄列表"""ips = []try:resolver = dns.resolver.Resolver()resolver.timeout = 5  # 超時時間resolver.lifetime = 10  # 總生命周期result = resolver.resolve(domain, record_type)for answer in result:record_value = answer.to_text()ips.append(record_value)logger.info(f"域名: {domain} | 類型: {record_type} | 記錄值: {record_value}")# 對A/AAAA記錄進行反向查詢if record_type in ['A', 'AAAA']:reverse_domains = reverse_dns(record_value)if reverse_domains:logger.info(f"  反向解析: {', '.join(reverse_domains)}")except dns.resolver.NXDOMAIN:logger.debug(f"域名不存在: {domain} (類型: {record_type})")except dns.resolver.NoAnswer:logger.debug(f"無{record_type}記錄: {domain}")except (dns.exception.Timeout, dns.resolver.NoNameservers):logger.warning(f"查詢超時/無可用DNS服務器: {domain} (類型: {record_type})")except Exception as e:logger.error(f"查詢錯誤 {domain}: {str(e)}")return ips
解析:
  • 核心改進:從原始版本僅支持 A 記錄查詢,擴展為支持任意 DNS 記錄類型(A/AAAA/CNAME/MX 等)。
  • ** resolver 配置 **:
    • timeout=5:單次查詢超時時間(5 秒),避免長時間阻塞。
    • lifetime=10:總查詢生命周期(10 秒),包含重試時間,防止無限等待。
  • 記錄處理邏輯
    • 對查詢結果result遍歷,將每條記錄轉為文本(如 A 記錄的 IP、CNAME 的域名)并存儲。
    • 僅對 A/AAAA 記錄(IP 地址記錄)觸發反向查詢,因為其他類型(如 MX)的記錄值不是 IP,無需反向解析。
  • 異常處理增強
    • NXDOMAIN:域名不存在(DEBUG 級別,避免日志冗余)。
    • NoAnswer:域名存在但無指定類型記錄(如查詢 AAAA 但域名僅支持 IPv4)。
    • Timeout/NoNameservers:警告級別,提示網絡或 DNS 服務器問題。
    • 通用異常捕獲:防止未預料的錯誤導致程序崩潰。

4. 子域名檢查函數?check_subdomain

def check_subdomain(word: str, domain: str, record_types: List[str], nums: bool) -> List[str]:"""檢查單個子域名(含數字后綴變種)"""successes = []# 基礎子域名subdomain = f"{word}.{domain}"for rtype in record_types:if dns_request(subdomain, rtype):successes.append(subdomain)# 帶數字后綴的子域名if nums:for i in range(10):num_subdomain = f"{word}{i}.{domain}"for rtype in record_types:if dns_request(num_subdomain, rtype):successes.append(num_subdomain)return successes
解析:
  • 功能定位:處理單個字典詞的子域名生成與查詢,是并發任務的最小執行單元。
  • 邏輯拆分
    1. 基礎子域名:將字典詞與主域名拼接(如word + .google.com),查詢所有指定記錄類型。
    2. 數字后綴子域名:若nums=True,在字典詞后拼接 0-9 數字(如word0.google.com),再查詢記錄類型。
  • 去重預備:返回的successes列表可能包含重復子域名(如同一子域名同時有 A 和 CNAME 記錄),后續在主函數中通過list(set(successes))去重。

5. 子域名枚舉主函數?subdomain_search

def subdomain_search(domain: str, dictionary: List[str], nums: bool = False,record_types: List[str] = ['A'], threads: int = 5) -> List[str]:"""子域名枚舉主函數:param domain: 主域名:param dictionary: 子域名字典列表:param nums: 是否檢查數字后綴:param record_types: 需要查詢的DNS記錄類型:param threads: 線程數,控制并發:return: 所有存在的子域名列表"""successes = []total = len(dictionary)start_time = time.time()with ThreadPoolExecutor(max_workers=threads) as executor:# 提交所有任務futures = {executor.submit(check_subdomain, word, domain, record_types, nums): wordfor word in dictionary}# 跟蹤進度completed = 0for future in as_completed(futures):completed += 1progress = (completed / total) * 100logger.info(f"進度: {progress:.2f}% ({completed}/{total})")successes.extend(future.result())logger.info(f"枚舉完成,耗時: {time.time() - start_time:.2f}秒")return list(set(successes))  # 去重
解析:
  • 并發核心:使用ThreadPoolExecutor實現多線程查詢,解決原始版本單線程效率低下的問題。max_workers=threads控制并發數(默認 5,可通過命令行調整)。
  • 任務管理
    • executor.submit:為每個字典詞提交一個check_subdomain任務,返回Future對象(代表異步任務)。
    • as_completed(futures):迭代已完成的任務,實時獲取結果并更新進度。
  • 進度跟蹤:通過completed/total計算進度百分比,讓用戶了解枚舉進展(原始版本無進度提示)。
  • 性能優化
    • 并發查詢大幅縮短總耗時(尤其字典較大時)。
    • 最終通過list(set(successes))去重,避免同一子域名被多次記錄。

6. 結果保存與主函數?main

def save_results(results: List[str], domain: str) -> None:"""保存結果到文件"""timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")filename = f"subdomains_{domain}_{timestamp}.txt"with open(filename, "w") as f:for subdomain in sorted(results):f.write(f"{subdomain}\n")logger.info(f"結果已保存到: {filename}")def main():# 命令行參數解析parser = argparse.ArgumentParser(description="高級DNS子域名枚舉工具")parser.add_argument("-d", "--domain", required=True, help="目標主域名 (例如: google.com)")parser.add_argument("-f", "--file", default="subdomains.txt", help="子域名字典文件路徑")parser.add_argument("-n", "--nums", action="store_true", help="檢查帶數字(0-9)后綴的子域名")parser.add_argument("-t", "--types", default="A", help="DNS記錄類型,多個用逗號分隔 (例如: A,AAAA,CNAME)")parser.add_argument("-th", "--threads", type=int, default=5, help="并發線程數 (默認: 5)")args = parser.parse_args()# 解析記錄類型record_types = [t.strip().upper() for t in args.types.split(',')]# 讀取字典文件try:with open(args.file, "r", encoding="utf-8") as f:dictionary = [line.strip() for line in f if line.strip()]logger.info(f"已加載字典文件: {args.file} (共{len(dictionary)}個條目)")except FileNotFoundError:logger.error(f"字典文件不存在: {args.file}")return# 執行子域名枚舉logger.info(f"開始枚舉 {args.domain} 的子域名...")results = subdomain_search(domain=args.domain,dictionary=dictionary,nums=args.nums,record_types=record_types,threads=args.threads)# 輸出結果if results:logger.info(f"共發現 {len(results)} 個有效子域名:")for sub in sorted(results):logger.info(f"  - {sub}")save_results(results, args.domain)else:logger.info("未發現有效子域名")
解析:
  • save_results?函數

    • 生成帶時間戳的文件名(如subdomains_google.com_20240520_153045.txt),避免結果文件覆蓋。
    • 對結果排序后寫入,方便閱讀和后續處理。
  • main?函數(程序入口)

    1. 參數解析:通過argparse定義命令行參數,支持用戶靈活配置目標域名、字典文件、記錄類型等(原始版本需硬編碼修改參數)。
    2. 字典加載:讀取子域名字典文件,過濾空行,統計條目數(便于進度計算)。
    3. 流程調度:調用subdomain_search執行枚舉,最終輸出結果并保存到文件。

通過此代碼,我們能夠了解子域名爆破的內在邏輯,以及通過附加的功能以及不斷優化從而能夠在大多數的情況下進行子域名爆破。以上源代碼能夠進行基本的使用,這里主要作用是能夠通過代碼了解工具的內在原理,代碼可自行進行完善等操作。還有,爆破就重要的一點,就是需要一個強大的字典。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/94419.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/94419.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/94419.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

批量轉雙層PDF軟件:高效轉換,提升文檔管理效率

在文檔管理和信息檢索中,雙層PDF文件因其獨特的結構而備受青睞。雙層PDF文件不僅保留了原始文檔的外觀,還增加了對文檔內容進行搜索和選擇的功能,極大地提高了文檔管理和信息檢索的效率。批量轉雙層PDF軟件正是為了解決這一需求而設計的&…

rust語言 (1.88) egui (0.32.1) 學習筆記(逐行注釋)(七) 鼠標在控件上懸浮時的提示

文本提示on_hover_text ui.label("標簽").on_hover_text("這是一個標簽"); ui.text_edit_singleline(&mut edittext).on_hover_text("這是輸入框"); if ui.button("提交").on_hover_text("這是一個按鈕").clicked(){}提…

【NVIDIA-B200】生產報錯 Test CUDA failure common.cu:1035 ‘system not yet initialized‘

目錄 1. 檢查 NVIDIA 驅動狀態 2. 驗證 CUDA 安裝情況 3. 檢查相關服務運行狀態(多 GPU 場景關鍵) 4. 用簡單 CUDA 程序驗證基礎功能 5. 重啟系統 6. 排查硬件相關問題 7.實際生產解決步驟 報錯日志: # Collective test starting: all_reduce_perf # nThread 1 nGpu…

ansible playbook 實戰案例roles | 實現基于nfs的日志歸檔

文章目錄一、核心功能描述二、roles內容2.1 文件結構2.2 tasks文件內容2.3 files文件內容免費個人運維知識庫,歡迎您的訂閱:literator_ray.flowus.cn 一、核心功能描述 這個 Ansible Role 的核心功能是:?實現自動化日志歸檔系統&#xff0c…

RabbitMQ:技巧匯總

目錄一、基礎知識1.1、RabbitMQ:Windows版本安裝部署1.2、RabbitMQ:Linux版本安裝部署1.3、RabbitMQ:數據隔離1.4、RabbitMQ:交換機(Exchange)1.5、RabbitMQ:SpringAMQP入門案例1.6、RabbitMQ&a…

【ARM vs RISC-V:芯片架構雙雄爭霸,誰將主宰AI時代?】

2010年,加州大學伯克利分校的實驗室誕生了一個顛覆性的構想——RISC-V開源指令集。誰曾想,這個學術項目會在15年后讓芯片巨頭ARM如臨大敵?2025年7月,ARM悄悄上線riscv-basics.com質疑網站又緊急撤下的戲劇性事件,揭開了…

深入理解紋理與QtOpenGL的實現

引言 在現代計算機圖形學中,紋理(Texture)是增強三維模型視覺效果的重要工具。通過將二維圖像映射到三維模型表面,紋理可以為簡單的幾何形狀添加復雜的細節和真實感。OpenGL作為廣泛使用的圖形庫,提供了強大的紋理處理…

CrystalDiskInfo中文版(硬盤檢測工具) 中文版

獲取地址:硬盤檢測工具 Process Lasso是一款獨特的調試進程級別的系統優化工具,主要功能是基于其特別的算法動態調整各個進程的優先級并設為合理的優先級以實現為系統減負的目的,可有效避免藍屏、假死、進程停止響應、進程占用 CPU 時間過多…

K8S集群-基于Ingress資源實現域名訪問

目錄 一、準備 1、在master節點部署ingress的資源清單文件 2、在node節點部署ingress-1.11.tar鏡像(根據部署環境選擇版本) 二、基于NodePort模式驗證 1、在master節點進入ingress的資源清單文件 2、修改deploy.yaml文件 3、生成deploy.yaml資源 4…

iOS 數據持久化

📱 iOS數據持久化 ? 核心概念 數據持久化是指將內存中的數據以特定格式保存到持久存儲介質(如硬盤)的過程,使得應用重啟后數據依然可用。在iOS中,由于沙盒機制的限制,應用只能訪問自己沙盒內的文件。 沙盒…

數據結構 -- 樹

一、樹的基本概念(一)定義樹是由 n(n ≥ 0) 個結點組成的有限集合,是一種非線性層次結構:當 n 0 時,稱為空樹;當 n > 0 時,存在唯一的根結點(無前驅結點&…

單片機---------WIFI模塊

1.ESP-12F模組基礎知識ESP12-F模組(安信可(Ai-Thinker)ESP8266系列模組)是一款基于樂鑫(Espressif)公司ESP8266芯片的Wi-Fi無線通信模塊,廣泛應用于物聯網(IoT)領域。它體…

迅為RK3562開發板Android修改uboot logo

本文檔配套資料在網盤資料“iTOP-3562 開發板\02_【iTOP-RK3562 開發板】開發資料\07_Android 系統開發配套資料\05_Android 修改 uboot logo 配套資料”路徑下。1 準備 logo系統默認 uboot logo,如下圖所示:我們如果想要替換這個 logo,首先要制作一個新…

反催收APP開發思路:用Flutter打造證據鏈管理工具

針對非法催收問題,熊哥分享了一款反催收APP的開發思路,旨在幫助“誠而不幸”的負債人收集騷擾證據,通過Flutter實現跨平臺部署。本文整理其核心功能與技術方案,助力開發者快速上手!一、核心功能:證據收集與…

市政道路井蓋缺失識別誤報率↓82%!陌訊多模態融合算法實戰優化與邊緣部署

原創聲明本文為原創技術解析文章,核心技術參數、架構設計及實戰數據引用自 “陌訊技術白皮書”,文中算法實現與優化方案均基于實測驗證,禁止未經授權轉載或篡改內容。一、行業痛點:市政井蓋識別的 “三大攔路虎”市政道路井蓋作為…

navicat及SQLyog的下載和安裝

navicat安裝和使用navicat下載和安裝navicat 下載navicat 的安裝SQLyog下載和安裝SQLyog 的下載SQLyog 的安裝連接到MySQL數據庫navicat下載和安裝 navicat 下載 navicat下載地址 這兩個都是滿足我們需求的,均可 這樣我們就得到了一個雙擊可執行的exe文件 navic…

在TencentOS3上部署OpenTenBase:從入門到實戰的完整指南

文章目錄前言初識OpenTenBase:不只是又一個分布式數據庫OpenTenBase的核心特性環境準備系統環境檢查安裝必要的依賴包用戶環境配置:安全第一創建專用用戶配置SSH免密登錄(單機部署也需要)源碼編譯:從零開始構建獲取源碼…

flink常見問題之超出文件描述符限制

引言Apache Flink 是一個強大且流行的流處理框架,它支持高吞吐量和低延遲的數據處理。在處理大規模數據流時,Flink 用戶可能會遇到各種性能瓶頸,其中之一就是文件描述符的限制。文件描述符是操作系統用來表示打開文件或其他輸入/輸出資源的一…

雅菲奧朗SRE知識墻分享(一):『SRE對智能運維領域所產生的深遠影響』

一、SRE推動了運維與開發的融合1、增強協作:SRE模式鼓勵運維與開發團隊之間的緊密合作,共享知識、資源和責任,共同解決系統穩定性和性能問題。2、共同目標:通過共同設定系統可靠性和性能目標,運維和開發團隊能夠協同工…

【JVM內存結構系列】一、入門:先搞懂整體框架,再學細節——避免從一開始就混淆概念

在Java開發中,你是否遇到過這些困惑:明明代碼沒寫錯,卻突然拋出OutOfMemoryError?調優GC參數時,不知道-Xms和-XX:MetaspaceSize分別影響哪塊內存?面試時被問“JVM內存結構和Java內存模型有啥區別”,只能含糊其辭? 其實,這些問題的根源都指向同一個核心——沒搞懂JVM的…