├── README.md └── screen_get.py /README.md: -------------------------------------------------------------------------------- 1 | 1.安装依赖 pip install selenium webdriver-manager tqdm 2 | 3 | 2.在py脚本所在文件夹下,创建targets.txt文件,运行脚本即可。 4 | 5 | 说明: 6 | 7 | 感谢夜组安全公众号的转发,因为第一版的效果不是很好。目前正在重构相关的截图逻辑,加入进度条显示。优化截图速度特别是面对资产多的情况。 8 | 新版本已上线!!!!,放在Releases,有相关问题提issue 9 | 10 | (1)该脚本旨在攻防中,批量的请求url,获取页面截图,以便初步判断脆弱资产。 11 | 12 | (2)脚本运行后,会在py文件所在的文件夹下创建screenshots文件夹,并把截图保存到该文件夹下,最后会生成html文档,以便快速筛选可能脆弱的资产 13 | 14 | 运行截图: 15 | 16 | 17 | 18 | ![1](https://github.com/user-attachments/assets/419e83ef-cc3f-49ec-97ec-f384ff5d01d8) 19 | 20 | 21 | 1.2版本已更新实现src资产的妙级截图 22 | 23 | image 24 | -------------------------------------------------------------------------------- /screen_get.py: -------------------------------------------------------------------------------- 1 | import os 2 | import re 3 | import time 4 | import random # 导入 random 用于生成随机数 5 | import concurrent.futures 6 | from tqdm import tqdm # 导入 tqdm 用于进度条 7 | from queue import PriorityQueue # 使用优先队列来根据响应时间优先处理 8 | from selenium import webdriver 9 | from selenium.webdriver.chrome.service import Service 10 | from selenium.webdriver.chrome.options import Options 11 | from webdriver_manager.chrome import ChromeDriverManager 12 | 13 | # 初始化 Chrome 浏览器的设置 14 | chrome_options = Options() 15 | chrome_options.add_argument("--headless") # 无头模式(不显示浏览器窗口) 16 | chrome_options.add_argument("--no-sandbox") 17 | chrome_options.add_argument("--disable-dev-shm-usage") 18 | 19 | 20 | # 自动下载 ChromeDriver 21 | def get_driver(): 22 | return webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options) 23 | 24 | 25 | # 创建一个用于存储截图的文件夹 26 | output_folder = "screenshots" 27 | os.makedirs(output_folder, exist_ok=True) 28 | 29 | # 创建 HTML 文件并写入初始内容 30 | html_file = "screenshots_report.html" 31 | with open(html_file, "w", encoding="utf-8") as f: 32 | f.write("URL Screenshot Report\n") 33 | f.write("\n") 34 | f.write("\n") # 添加表格头部 35 | 36 | 37 | # 使用随机数和时间戳生成唯一文件名 38 | def generate_filename(url): 39 | timestamp = time.strftime("%Y%m%d-%H%M%S") 40 | random_number = random.randint(1000, 9999) # 生成 1000 到 9999 的随机数 41 | file_name = f"screenshot_{random_number}_{timestamp}.png" 42 | return file_name 43 | 44 | 45 | # 定义访问和截图的函数,并测量访问时间 46 | def capture_screenshot(url, priority_queue): 47 | driver = get_driver() # 每个线程单独初始化一个 driver 48 | start_time = time.time() 49 | try: 50 | driver.get(url) 51 | print(f"正在访问 {url}...") 52 | 53 | # 生成截图文件的名称 54 | file_name = generate_filename(url) 55 | file_path = os.path.join(output_folder, file_name) 56 | 57 | # 截图并保存到指定路径 58 | driver.save_screenshot(file_path) 59 | print(f"已保存截图:{file_path}") 60 | 61 | # 截图完成后立即写入 HTML 文件 62 | with open(html_file, "a", encoding="utf-8") as f: 63 | f.write(f"\n") 64 | 65 | # 记录完成后的响应时间 66 | end_time = time.time() 67 | response_time = end_time - start_time 68 | priority_queue.put((response_time, url)) # 将 URL 和响应时间放入优先队列 69 | 70 | return (url, file_path) 71 | finally: 72 | driver.quit() 73 | 74 | 75 | # 使用优先队列动态调整优先级 76 | def prioritize_and_process_urls(urls): 77 | priority_queue = PriorityQueue() 78 | 79 | # 将初始 URL 放入优先队列,初始优先级为 0 80 | for url in urls: 81 | priority_queue.put((0, url)) 82 | 83 | # 使用多线程加速访问和截图 84 | max_threads = 10 85 | with concurrent.futures.ThreadPoolExecutor(max_threads) as executor: 86 | futures = [] 87 | progress = tqdm(total=len(urls), desc="Processing URLs") 88 | 89 | while not priority_queue.empty(): 90 | # 获取优先级最高的 URL(即响应时间最短的) 91 | priority, url = priority_queue.get() 92 | 93 | # 提交任务并将优先队列传递给 capture_screenshot 94 | future = executor.submit(capture_screenshot, url, priority_queue) 95 | futures.append(future) 96 | 97 | # 更新进度条 98 | progress.update(1) 99 | 100 | # 等待所有任务完成 101 | concurrent.futures.wait(futures) 102 | progress.close() 103 | 104 | 105 | # 从 targets.txt 文件中读取 URL 列表 106 | with open("targets.txt", "r", encoding="utf-8") as f: 107 | urls = [line.strip() for line in f if line.strip()] # 去除空行和多余空格 108 | 109 | # 优先处理并开始截图 110 | prioritize_and_process_urls(urls) 111 | 112 | # 最后关闭 HTML 文件的标签 113 | with open(html_file, "a", encoding="utf-8") as f: 114 | f.write("
URLScreenshot
{url}
\n") 115 | 116 | print(f"报告已生成:{html_file}") 117 | --------------------------------------------------------------------------------