├── .gitignore ├── LICENSE ├── README.md ├── assets ├── 1747996785328.png ├── demo │ └── 1.png ├── logo.icns ├── logo.ico ├── logo.png └── qrcode_1747839744296.jpg ├── build.py ├── main.py ├── public └── index.html ├── requirements.txt ├── run.py └── 漏洞赏金工具.spec /.gitignore: -------------------------------------------------------------------------------- 1 | # Python 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | *.so 6 | .Python 7 | build/ 8 | develop-eggs/ 9 | dist/ 10 | downloads/ 11 | eggs/ 12 | .eggs/ 13 | lib/ 14 | lib64/ 15 | parts/ 16 | sdist/ 17 | var/ 18 | wheels/ 19 | *.egg-info/ 20 | .installed.cfg 21 | *.egg 22 | 23 | # IDE 24 | .idea/ 25 | .vscode/ 26 | *.swp 27 | *.swo 28 | 29 | # 虚拟环境 30 | venv/ 31 | env/ 32 | ENV/ 33 | 34 | # 日志文件 35 | *.log 36 | logs/ 37 | 38 | # 本地配置文件 39 | .env 40 | .env.local 41 | 42 | # 系统文件 43 | .DS_Store 44 | Thumbs.db 45 | 46 | # 工具生成的临时文件 47 | subdomain.txt 48 | httpx_out.txt 49 | 50 | # 打包文件 51 | *.spec 52 | *.pyc 53 | *.pyo 54 | *.pyd 55 | *.so 56 | *.dylib 57 | *.dll 58 | *.exe 59 | 60 | # 测试覆盖率 61 | .coverage 62 | htmlcov/ 63 | 64 | # 其他 65 | *.bak 66 | *.swp 67 | *.swo 68 | *~ 69 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | 木兰宽松许可证, 第2版 2 | 3 | 2020年1月 http://license.coscl.org.cn/MulanPSL2 4 | 5 | 您对“软件”的复制、使用、修改及分发受木兰宽松许可证,第2版(“本许可证”)的如下条款的约束: 6 | 7 | 0. 定义 8 | 9 | “软件” 是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。 10 | 11 | “贡献” 是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。 12 | 13 | “贡献者” 是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。 14 | 15 | “法人实体” 是指提交贡献的机构及其“关联实体”。 16 | 17 | “关联实体” 是指,对“本许可证”下的行为方而言,控制、受控制或与其共同受控制的机构,此处的控制是指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。 18 | 19 | 1. 授予版权许可 20 | 21 | 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可以复制、使用、修改、分发其“贡献”,不论修改与否。 22 | 23 | 2. 授予专利许可 24 | 25 | 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的(根据本条规定撤销除外)专利许可,供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软件”结合而将必然会侵犯的专利权利要求,不包括对“贡献”的修改或包含“贡献”的其他结合。如果您或您的“关联实体”直接或间接地,就“软件”或其中的“贡献”对任何人发起专利侵权诉讼(包括反诉或交叉诉讼)或其他专利维权行动,指控其侵犯专利权,则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权行动之日终止。 26 | 27 | 3. 无商标许可 28 | 29 | “本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可,但您为满足第4条规定的声明义务而必须使用除外。 30 | 31 | 4. 分发限制 32 | 33 | 您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发,不论修改与否,但您必须向接收者提供“本许可证”的副本,并保留“软件”中的版权、商标、专利及免责声明。 34 | 35 | 5. 免责声明与责任限制 36 | 37 | “软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下,“贡献者”或版权所有者不对任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于何种法律理论,即使其曾被建议有此种损失的可能性。 38 | 39 | 6. 语言 40 | 41 | “本许可证”以中英文双语表述,中英文版本具有同等法律效力。如果中英文版本存在任何冲突不一致,以中文版为准。 42 | 43 | 条款结束 44 | 45 | 如何将木兰宽松许可证,第2版,应用到您的软件 46 | 47 | 如果您希望将木兰宽松许可证,第2版,应用到您的新软件,为了方便接收者查阅,建议您完成如下三步: 48 | 49 | 1, 请您补充如下声明中的空白,包括软件名、软件的首次发表年份以及您作为版权人的名字; 50 | 51 | 2, 请您在软件包的一级目录下创建以“LICENSE”为名的文件,将整个许可证文本放入该文件中; 52 | 53 | 3, 请将如下声明文本放入每个源文件的头部注释中。 54 | 55 | Copyright (c) 2025 钟智强 56 | 漏洞赏金工具 v1.0 is licensed under Mulan PSL v2. 57 | You can use this software according to the terms and conditions of the Mulan PSL v2. 58 | You may obtain a copy of Mulan PSL v2 at: 59 | http://license.coscl.org.cn/MulanPSL2 60 | THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 61 | EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 62 | MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 63 | See the Mulan PSL v2 for more details. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 🕷️ 漏洞赏金工具 v1.0 2 | 3 | ## 🌟 项目简介 4 | 5 | 漏洞赏金工具是一款专为安全研究人员和白帽子黑客设计的图形化渗透测试工具集。它集成了多个常用的安全测试工具,提供了直观的用户界面,让漏洞挖掘变得更加简单和高效。 6 | 7 | ## 🖼️ 功能演示 8 | 9 | ### 主界面 10 | 11 | ![主界面](assets/demo/1.png) 12 | 13 | ## ✨ 主要特性 14 | 15 | - 🎨 美观的图形界面 16 | 17 | - 支持多种主题切换(超级英雄风、赛博朋克、暗黑模式等) 18 | - 实时日志输出展示 19 | - 简洁直观的工具选择界面 20 | 21 | - 🛠️ 集成多种渗透测试工具 22 | 23 | - curl:HTTP 请求测试 24 | - nmap:端口扫描和服务检测 25 | - subfinder:子域名发现 26 | - httpx:HTTP 服务探测 27 | - dirsearch:Web 目录扫描 28 | - xsstrike:XSS 漏洞扫描 29 | - sqlmap:SQL 注入检测 30 | - hakrawler:Web 爬虫工具 31 | 32 | - 🚀 便捷的操作体验 33 | 34 | - 一键启动多个工具 35 | - 实时查看扫描进度 36 | - 随时暂停/继续扫描 37 | - 日志导出功能 38 | 39 | - 🔧 高度可定制 40 | - SQLMap 高级选项配置 41 | - 自定义工具参数 42 | - 灵活的主题切换 43 | 44 | ## 📦 环境要求 45 | 46 | - Python 3.7+ 47 | - 操作系统支持: 48 | - macOS 49 | - Windows 50 | - Linux 51 | 52 | ## 🔨 安装步骤 53 | 54 | 1. 克隆项目代码: 55 | 56 | ```bash 57 | git clone https://github.com/ctkqiang/bbtool.git 58 | 59 | 或 60 | 61 | git clone https://gitcode.com/ctkqiang_sr/bbtool.git 62 | 63 | cd bug-bounty-tool 64 | ``` 65 | 66 | 2. 安装依赖: 67 | 68 | ```bash 69 | pip3 install -r requirements.txt 70 | ``` 71 | 72 | 3. 安装必要的工具: 73 | 74 | ### macOS 75 | 76 | ```bash 77 | # 使用 Homebrew 安装基础工具 78 | brew install curl nmap subfinder httpx 79 | 80 | # 使用 pip 安装 Python 工具 81 | pip3 install dirsearch xsstrike sqlmap 82 | 83 | # 使用 Go 安装其他工具 84 | go install github.com/hakluke/hakrawler@latest 85 | ``` 86 | 87 | ### Linux 88 | 89 | ```bash 90 | # 安装基础工具 91 | sudo apt-get install curl nmap 92 | 93 | # 安装 Go 工具 94 | GO111MODULE=on go install -v github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest 95 | GO111MODULE=on go install -v github.com/projectdiscovery/httpx/cmd/httpx@latest 96 | go install github.com/hakluke/hakrawler@latest 97 | 98 | # 安装 Python 工具 99 | pip3 install dirsearch xsstrike sqlmap 100 | ``` 101 | 102 | ### Windows 103 | 104 | ```powershell 105 | # 使用 winget 安装基础工具 106 | winget install curl nmap 107 | 108 | # 安装 Go 工具 109 | go install -v github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest 110 | go install -v github.com/projectdiscovery/httpx/cmd/httpx@latest 111 | go install github.com/hakluke/hakrawler@latest 112 | 113 | # 安装 Python 工具 114 | pip3 install dirsearch xsstrike sqlmap 115 | ``` 116 | 117 | 4. SETPATH 118 | > ⚠️ 如果不设置 PATH,以下工具都可能提示 "command not found"、"无法识别的命令",程序运行失败! 119 | > ❗ 务必在安装后配置环境变量!否则你的脚本/终端调用不到! 120 | > 🧠 提示:安装后一定测试 subfinder -h、httpx -h 是否能正常运行,否则就要检查 PATH! 121 | 122 | --- 123 | 124 | 🔧 环境变量配置指南: 125 | 126 | ## 🍏 macOS 127 | 128 | | 工具 | 安装命令 | 需要添加到 PATH | 129 | | ----------- | ------------------------------------------------ | ---------------------- | 130 | | `curl` | `brew install curl` | 自动添加 | 131 | | `nmap` | `brew install nmap` | 自动添加 | 132 | | `subfinder` | `brew install subfinder` | `/opt/homebrew/bin` | 133 | | `httpx` | `brew install httpx` | `/opt/homebrew/bin` | 134 | | `dirsearch` | `pip3 install dirsearch` | `~/.local/bin`(有时) | 135 | | `xsstrike` | `pip3 install xsstrike` | `~/.local/bin` | 136 | | `sqlmap` | `pip3 install sqlmap` | `~/.local/bin` | 137 | | `hakrawler` | `go install github.com/hakluke/hakrawler@latest` | `$HOME/go/bin` | 138 | 139 | ### 设置 PATH(macOS, zsh 版) 140 | 141 | ```bash 142 | nano ~/.zshrc 143 | ``` 144 | 145 | 加入以下内容 👇 146 | 147 | ```bash 148 | export PATH="$PATH:/opt/homebrew/bin:$HOME/go/bin:$HOME/.local/bin" 149 | ``` 150 | 151 | 然后刷新: 152 | 153 | ```bash 154 | source ~/.zshrc 155 | ``` 156 | 157 | --- 158 | 159 | ## 🪟 Windows 160 | 161 | | 工具 | 安装命令 | 默认路径(需手动加 PATH) | 162 | | ----------- | ----------------------- | -------------------------------------------------------------- | 163 | | `curl` | `winget install curl` | 自动添加 | 164 | | `nmap` | `winget install nmap` | 自动添加 | 165 | | `subfinder` | `go install ...` | `%USERPROFILE%\go\bin` | 166 | | `httpx` | `go install ...` | `%USERPROFILE%\go\bin` | 167 | | `dirsearch` | `pip install dirsearch` | `%USERPROFILE%\AppData\Local\Programs\Python\PythonXX\Scripts` | 168 | | `xsstrike` | `pip install xsstrike` | 同上 | 169 | | `sqlmap` | `pip install sqlmap` | 同上 | 170 | | `hakrawler` | `go install ...` | `%USERPROFILE%\go\bin` | 171 | 172 | ### 设置 PATH(Windows) 173 | 174 | 1. 打开「开始菜单」→ 搜索“环境变量”→ 系统变量 → `Path` → 编辑 175 | 2. 添加如下路径(根据你自己的 Python 路径调整): 176 | 177 | ```powershell 178 | %USERPROFILE%\go\bin 179 | %USERPROFILE%\AppData\Local\Programs\Python\Python311\Scripts 180 | ``` 181 | 182 | 3. 保存 → 重启 CMD 或 PowerShell → 测试工具是否可运行 183 | 184 | --- 185 | 186 | ## 🐧 Linux(Debian / Ubuntu) 187 | 188 | | 工具 | 安装命令 | 需要添加到 PATH | 189 | | ----------- | ------------------------ | --------------- | 190 | | `curl` | `sudo apt install curl` | 自动添加 | 191 | | `nmap` | `sudo apt install nmap` | 自动添加 | 192 | | `subfinder` | `go install ...` | `$HOME/go/bin` | 193 | | `httpx` | `go install ...` | `$HOME/go/bin` | 194 | | `dirsearch` | `pip3 install dirsearch` | `~/.local/bin` | 195 | | `xsstrike` | `pip3 install xsstrike` | `~/.local/bin` | 196 | | `sqlmap` | `pip3 install sqlmap` | `~/.local/bin` | 197 | | `hakrawler` | `go install ...` | `$HOME/go/bin` | 198 | 199 | ### 设置 PATH(bash/zsh) 200 | 201 | ```bash 202 | nano ~/.bashrc # 如果你用 bash 203 | nano ~/.zshrc # 如果你用 zsh 204 | ``` 205 | 206 | 添加: 207 | 208 | ```bash 209 | export PATH="$PATH:$HOME/go/bin:$HOME/.local/bin" 210 | ``` 211 | 212 | 保存后刷新: 213 | 214 | ```bash 215 | source ~/.bashrc # 或 source ~/.zshrc 216 | ``` 217 | 218 | --- 219 | 220 | ## ✅ 验证工具是否 OK 221 | 222 | ```bash 223 | which subfinder 224 | subfinder -h 225 | 226 | which httpx 227 | httpx -h 228 | 229 | sqlmap --version 230 | xsstrike --version 231 | ``` 232 | 233 | ## 🚀 使用指南 234 | 235 | 1. 启动程序: 236 | 237 | ```bash 238 | python3 run.py 239 | ``` 240 | 241 | 2. 基本操作流程: 242 | 243 | - 在目标地址栏输入要测试的网站地址 244 | - 在工具选择区勾选需要使用的工具 245 | - 点击"开始扫描"按钮开始测试 246 | - 可随时点击"停止扫描"终止操作 247 | 248 | 3. SQLMap 高级选项: 249 | 250 | - 基础模式:基本的 SQL 注入测试 251 | - 高风险测试:使用更激进的测试方法 252 | - POST 请求:测试 POST 参数注入 253 | - Cookie 注入:测试 Cookie 中的注入点 254 | - 自定义头:添加自定义 HTTP 头 255 | - 枚举数据库:列出所有数据库 256 | - 枚举表:列出指定数据库的表 257 | - 枚举字段:列出指定表的字段 258 | - Dump 数据:导出指定数据 259 | - 代理模式:使用代理进行测试 260 | - OS Shell:尝试获取系统 Shell 261 | 262 | 4. 主题切换: 263 | 264 | - superhero:夜晚超级英雄风,深色高对比 265 | - vapor:赛博朋克紫色调,未来感满满 266 | - darkly:暗黑风格,柔和护眼 267 | - cyborg:机械感黑色主题 268 | - solar:明亮温暖的阳光色系 269 | 270 | 5. 快捷键操作: 271 | - Ctrl+S:保存日志 272 | - Ctrl+Q:退出程序 273 | - F5:清除日志 274 | - F1:显示帮助 275 | 276 | ## 📝 注意事项 277 | 278 | 1. 使用安全: 279 | 280 | - 请在获得授权的情况下使用本工具 281 | - 遵守相关法律法规 282 | - 不要对未经授权的目标进行测试 283 | 284 | 2. 工具使用建议: 285 | 286 | - 建议先使用基础工具进行扫描 287 | - 根据扫描结果选择性使用高级选项 288 | - 重要操作前请先保存日志 289 | - 定期检查工具更新 290 | 291 | 3. 性能优化: 292 | - 避免同时运行过多工具 293 | - 大型目标建议分批次扫描 294 | - 及时清理日志避免内存占用 295 | 296 | ## 🤝 贡献指南 297 | 298 | 欢迎提交 Issue 和 Pull Request 来帮助改进这个项目! 299 | 300 | 1. Fork 本仓库 301 | 2. 创建您的特性分支 (git checkout -b feature/AmazingFeature) 302 | 3. 提交您的更改 (git commit -m 'Add some AmazingFeature') 303 | 4. 推送到分支 (git push origin feature/AmazingFeature) 304 | 5. 打开一个 Pull Request 305 | 306 | ## 👥 作者 307 | 308 | - 作者:钟智强 309 | - 邮箱:johnmelodymel@qq.com 310 | - QQ:3072486255 311 | - 微信:ctkqiang 312 | 313 | ## 🙏 致谢 314 | 315 | 感谢以下开源项目,没有它们就没有这个工具: 316 | 317 | - [ttkbootstrap](https://github.com/israel-dryer/ttkbootstrap) 318 | - [curl](https://curl.se/) 319 | - [nmap](https://nmap.org/) 320 | - [subfinder](https://github.com/projectdiscovery/subfinder) 321 | - [httpx](https://github.com/projectdiscovery/httpx) 322 | - [dirsearch](https://github.com/maurosoria/dirsearch) 323 | - [xsstrike](https://github.com/s0md3v/XSStrike) 324 | - [sqlmap](https://sqlmap.org/) 325 | - [hakrawler](https://github.com/hakluke/hakrawler) 326 | 327 | ## 📞 联系方式 328 | 329 | 如果您有任何问题或建议,欢迎通过以下方式联系我: 330 | 331 | - GitHub Issues 332 | - 邮箱:johnmelodymel@qq.com 333 | - QQ:3072486255 334 | - 微信:ctkqiang 335 | 336 | ## 🔄 更新日志 337 | 338 | ### v1.0 (2024-01) 339 | 340 | - 🎉 首次发布 341 | - 🎨 支持多种主题切换 342 | - 🛠️ 集成多种渗透测试工具 343 | - 📝 完善的日志记录功能 344 | - 🔧 SQLMap 高级选项支持 345 | 346 | ### 🤝 加入技术交流群 347 | 348 | 欢迎加入我们的技术交流群,与其他安全研究者分享经验和知识! 349 | 350 |
351 | 352 | 353 | 360 | 367 | 368 |
354 | 355 |
356 | QQ交流群: 934810107 357 |
358 | (扫码加入,一起探讨安全技术) 359 |
361 | 362 |
363 | 钉钉交流群 364 |
365 | (扫码加入,一起探讨安全技术) 366 |
369 |
370 | 371 | --- 372 | 373 | ## 许可证 374 | 375 | 本项目采用 **木兰宽松许可证 (Mulan PSL)** 进行许可。 376 | 有关详细信息,请参阅 [LICENSE](LICENSE) 文件。 377 | (魔法契约要保管好哟~) 378 | 379 | [![License: Mulan PSL v2](https://img.shields.io/badge/License-Mulan%20PSL%202-blue.svg)](http://license.coscl.org.cn/MulanPSL2) 380 | 381 | ## 🌟 开源项目赞助计划 382 | 383 | ### 用捐赠助力发展 384 | 385 | 感谢您使用本项目!您的支持是开源持续发展的核心动力。 386 | 每一份捐赠都将直接用于: 387 | ✅ 服务器与基础设施维护(魔法城堡的维修费哟~) 388 | ✅ 新功能开发与版本迭代(魔法技能树要升级哒~) 389 | ✅ 文档优化与社区建设(魔法图书馆要扩建呀~) 390 | 391 | 点滴支持皆能汇聚成海,让我们共同打造更强大的开源工具! 392 | (小仙子们在向你比心哟~) 393 | 394 | --- 395 | 396 | ### 🌐 全球捐赠通道 397 | 398 | #### 国内用户 399 | 400 |
401 | 402 |
403 | 404 | 405 | 410 | 415 | 416 |
406 | 407 |
408 | 🔵 支付宝(小企鹅在收金币哟~) 409 |
411 | 412 |
413 | 🟢 微信支付(小绿龙在收金币哟~) 414 |
417 |
418 |
419 | 420 | #### 国际用户 421 | 422 |
423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 |
439 | 440 | --- 441 | 442 | ### 📌 开发者社交图谱 443 | 444 | #### 技术交流 445 | 446 |
447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 |
459 | 460 | #### 社交互动 461 | 462 |
463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 |
475 | 476 | --- 477 | 478 | 🙌 感谢您成为开源社区的重要一员! 479 | 💬 捐赠后欢迎通过社交平台与我联系,您的名字将出现在项目致谢列表! 480 | -------------------------------------------------------------------------------- /assets/1747996785328.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ctkqiang/BBtool/5e46382dab4350f7f6a6ad51af92c2201b36c9fc/assets/1747996785328.png -------------------------------------------------------------------------------- /assets/demo/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ctkqiang/BBtool/5e46382dab4350f7f6a6ad51af92c2201b36c9fc/assets/demo/1.png -------------------------------------------------------------------------------- /assets/logo.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ctkqiang/BBtool/5e46382dab4350f7f6a6ad51af92c2201b36c9fc/assets/logo.icns -------------------------------------------------------------------------------- /assets/logo.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ctkqiang/BBtool/5e46382dab4350f7f6a6ad51af92c2201b36c9fc/assets/logo.ico -------------------------------------------------------------------------------- /assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ctkqiang/BBtool/5e46382dab4350f7f6a6ad51af92c2201b36c9fc/assets/logo.png -------------------------------------------------------------------------------- /assets/qrcode_1747839744296.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ctkqiang/BBtool/5e46382dab4350f7f6a6ad51af92c2201b36c9fc/assets/qrcode_1747839744296.jpg -------------------------------------------------------------------------------- /build.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import subprocess 3 | from pathlib import Path 4 | 5 | def clean(paths): 6 | for path in paths: 7 | if path.exists(): 8 | print(f"🧹 清理旧文件: {path}") 9 | if path.is_file(): 10 | path.unlink() 11 | else: 12 | subprocess.run(["rm", "-rf", str(path)]) 13 | 14 | def build_mac(script_name, icon_path, app_name): 15 | print("🍎 macOS 平台,开始打包 .app...") 16 | cmd = [ 17 | "pyinstaller", "--windowed", "--noconsole", 18 | f"--icon={icon_path}", 19 | f"--name={app_name}", 20 | script_name 21 | ] 22 | result = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) 23 | 24 | if result.returncode != 0: 25 | print("❌ 打包失败:\n", result.stderr) 26 | return 27 | 28 | app_path = Path("dist") / f"{app_name}.app" 29 | if app_path.exists(): 30 | print(f"✅ .app 打包完成:{app_path.resolve()}") 31 | subprocess.run(["touch", str(app_path)]) 32 | subprocess.run(["killall", "Finder"]) 33 | 34 | create_dmg(app_path, app_name) 35 | else: 36 | print("⚠️ 未找到 .app 文件") 37 | 38 | def create_dmg(app_path: Path, app_name: str): 39 | dmg_path = Path("dist") / f"{app_name}.dmg" 40 | temp_dir = Path("dist/dmg_temp") 41 | app_link = temp_dir / app_path.name 42 | apps_link = temp_dir / "Applications" 43 | 44 | print("📦 正在创建 .dmg 安装包...") 45 | 46 | # 创建临时目录并链接 .app 和系统 Applications 文件夹 47 | temp_dir.mkdir(parents=True, exist_ok=True) 48 | subprocess.run(["cp", "-R", str(app_path), str(app_link)]) 49 | subprocess.run(["ln", "-s", "/Applications", str(apps_link)]) 50 | 51 | # 使用 hdiutil 创建 dmg 52 | subprocess.run([ 53 | "hdiutil", "create", "-volname", app_name, 54 | "-srcfolder", str(temp_dir), 55 | "-ov", "-format", "UDZO", 56 | str(dmg_path) 57 | ]) 58 | 59 | # 清理临时目录 60 | subprocess.run(["rm", "-rf", str(temp_dir)]) 61 | print(f"✅ .dmg 创建完成:{dmg_path.resolve()}") 62 | 63 | subprocess.run(["open", "dist"]) 64 | 65 | def build_windows(script_name, icon_path, app_name): 66 | print("🔧 Windows 平台,开始打包 EXE...") 67 | cmd = [ 68 | "pyinstaller", "--windowed", "--noconsole", 69 | f"--icon={icon_path}", 70 | f"--name={app_name}", 71 | script_name 72 | ] 73 | result = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) 74 | if result.returncode == 0: 75 | print("✅ Windows EXE 打包完成") 76 | else: 77 | print("❌ 打包失败:\n", result.stderr) 78 | 79 | def build(): 80 | script_name = "main.py" 81 | icon_win = "./assets/logo.ico" 82 | icon_mac = "./assets/logo.icns" 83 | app_name = "漏洞赏金工具" 84 | 85 | clean([ 86 | Path("dist"), 87 | Path("build"), 88 | Path(f"{app_name}.spec") 89 | ]) 90 | 91 | if sys.platform == "darwin": 92 | build_mac(script_name, icon_mac, app_name) 93 | elif sys.platform == "win32": 94 | build_windows(script_name, icon_win, app_name) 95 | else: 96 | print(f"❌ 当前平台 {sys.platform} 暂不支持打包") 97 | 98 | if __name__ == "__main__": 99 | build() 100 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import ttkbootstrap as ttk 2 | from ttkbootstrap.constants import * 3 | from tkinter import filedialog, scrolledtext 4 | import threading 5 | import subprocess 6 | import datetime 7 | import sys 8 | import glob 9 | import tkinter as tk 10 | import os 11 | import time 12 | import ctypes 13 | 14 | tools = { 15 | 'curl': 'curl -v -A "Mozilla/5.0" -H "Accept: */*" -H "Connection: keep-alive" {target}' if sys.platform != 'win32' else 'curl -v -A "Mozilla/5.0" -H "Accept: */*" -H "Connection: keep-alive" "{target}"', 16 | 'nmap': 'nmap -sV -p- -T4 {target}', 17 | 'subfinder': 'subfinder -d {target} -all | tee subdomain.txt', 18 | 'httpx': 'httpx --list subdomain.txt -ports 80,443,8000,8080,3000 -title -tech-detect -status-code -o httpx_out.txt', 19 | 'dirsearch': 'dirsearch -u http://{target} -e php,html,js', 20 | 'xsstrike': 'xsstrike -u http://{target} --crawl --skip', 21 | # sqlmap 基础模式 22 | 'sqlmap_basic': 'sqlmap -u "{target}" --batch', 23 | 'sqlmap_aggressive': 'sqlmap -u "{target}" --level=5 --risk=3 --batch', 24 | 'sqlmap_post': 'sqlmap -u "{target}" --data="username=admin&password=1" --batch', 25 | 'sqlmap_cookie': 'sqlmap -u "{target}" --cookie="PHPSESSID=12345" --batch', 26 | 'sqlmap_headers': 'sqlmap -u "{target}" --headers="X-Forwarded-For: 127.0.0.1" --batch', 27 | 'sqlmap_dbs': 'sqlmap -u "{target}" --dbs --batch', 28 | 'sqlmap_tables': 'sqlmap -u "{target}" -D <数据库名> --tables --batch', 29 | 'sqlmap_columns': 'sqlmap -u "{target}" -D <数据库名> -T <表名> --columns --batch', 30 | 'sqlmap_dump': 'sqlmap -u "{target}" -D <数据库名> -T <表名> -C <字段1>,<字段2> --dump --batch', 31 | 'sqlmap_proxy': 'sqlmap -u "{target}" --proxy="http://127.0.0.1:8080" --batch', 32 | 'sqlmap_os_shell': 'sqlmap -u "{target}" --os-shell --batch', 33 | 'hakrawler': 'echo {target} | hakrawler', 34 | } 35 | 36 | # 添加工具安装命令 37 | tool_install_commands = { 38 | 'macos': { 39 | 'curl': 'brew install curl', 40 | 'nmap': 'brew install nmap', 41 | 'subfinder': 'brew install subfinder', 42 | 'httpx': 'brew install httpx', 43 | 'dirsearch': 'pip3 install dirsearch', 44 | 'xsstrike': 'pip3 install xsstrike', 45 | 'sqlmap': 'pip3 install sqlmap', 46 | 'hakrawler': 'go install github.com/hakluke/hakrawler@latest' 47 | }, 48 | 'windows': { 49 | 'curl': 'winget install curl', 50 | 'nmap': 'winget install nmap', 51 | 'subfinder': 'go install -v github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest', 52 | 'httpx': 'go install -v github.com/projectdiscovery/httpx/cmd/httpx@latest', 53 | 'dirsearch': 'pip3 install dirsearch', 54 | 'xsstrike': 'pip3 install xsstrike', 55 | 'sqlmap': 'pip3 install sqlmap', 56 | 'hakrawler': 'go install github.com/hakluke/hakrawler@latest' 57 | }, 58 | 'linux': { 59 | 'curl': 'sudo apt-get install curl', 60 | 'nmap': 'sudo apt-get install nmap', 61 | 'subfinder': 'GO111MODULE=on go install -v github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest', 62 | 'httpx': 'GO111MODULE=on go install -v github.com/projectdiscovery/httpx/cmd/httpx@latest', 63 | 'dirsearch': 'pip3 install dirsearch', 64 | 'xsstrike': 'pip3 install xsstrike', 65 | 'sqlmap': 'pip3 install sqlmap', 66 | 'hakrawler': 'go install github.com/hakluke/hakrawler@latest' 67 | } 68 | } 69 | 70 | class BugBountyApp: 71 | def __init__(self, root): 72 | self.root = root 73 | self.root.title("🕷️ 漏洞赏金工具 v1.0.2(灵儿定制)") 74 | self.root.geometry("800x600") 75 | self.log_data = "" 76 | self.scanning = False 77 | self.current_process = None 78 | 79 | # 创建菜单栏 80 | self.menubar = tk.Menu(root) 81 | root.config(menu=self.menubar) 82 | 83 | # 文件菜单 84 | file_menu = tk.Menu(self.menubar, tearoff=0) 85 | self.menubar.add_cascade(label="文件", menu=file_menu) 86 | file_menu.add_command(label="保存日志", command=self.save_logs) 87 | file_menu.add_separator() 88 | file_menu.add_command(label="退出", command=root.quit) 89 | 90 | # 主题菜单 91 | theme_menu = tk.Menu(self.menubar, tearoff=0) 92 | self.menubar.add_cascade(label="主题", menu=theme_menu) 93 | themes = { 94 | "superhero": "超级英雄风", 95 | "vapor": "赛博朋克", 96 | "darkly": "暗黑模式", 97 | "cyborg": "机械风格", 98 | "solar": "阳光模式" 99 | } 100 | 101 | for theme_id, theme_name in themes.items(): 102 | theme_menu.add_command( 103 | label=theme_name, 104 | command=lambda t=theme_id: self.change_theme(t) 105 | ) 106 | 107 | # 帮助菜单 108 | help_menu = tk.Menu(self.menubar, tearoff=0) 109 | self.menubar.add_cascade(label="帮助", menu=help_menu) 110 | help_menu.add_command(label="使用指南", command=self.show_guide) 111 | help_menu.add_command(label="工具说明", command=self.show_tools_info) 112 | help_menu.add_command(label="检查更新", command=self.check_update) 113 | help_menu.add_command(label="安装工具", command=self.check_tools_installation) 114 | help_menu.add_separator() 115 | help_menu.add_command(label="关于", command=self.show_about) 116 | 117 | # "superhero" - 夜晚超级英雄风,深色高对比,熬夜打赏金必备酷炫风 118 | # "flatly" - 扁平简洁,明亮清爽,白天写代码的良伴 119 | # "vapor" - 赛博朋克紫色调,神秘又未来感满满,赏金猎人的赛博战衣 120 | # "cyborg" - 机械感黑色主题,冷酷且护眼,适合深夜的安全审计 121 | # "darkly" - 暗黑风,柔和点的黑色调,眼睛敏感的灵儿的福音 122 | # "journal" - 文艺手账风,浅色柔和,适合记录和总结漏洞笔记 123 | # "litera" - 干净明亮,简约风格,清爽无负担 124 | # "minty" - 清新薄荷绿,提神醒脑,赏金猎人也要养眼 125 | # "pulse" - 红色热情动感,聚焦重点,关键时刻给你动力满满 126 | # "sandstone" - 沙石色调,温暖自然,带点复古气息 127 | # "simplex" - 简单大方,浅色风格,轻量且易读 128 | # "sketchy" - 手绘风趣味满满,放松时刻必备 129 | # "slate" - 深灰稳重,冷峻专业,职场精英风范 130 | # "solar" - 明亮温暖的阳光色系, optimistic 131 | # "spacelab" - 科技蓝,未来感强,专业且冷静 132 | # "united" - 统一风格,明亮且亲切,通用且适合新手 133 | # "yeti" - 清新冰蓝,北极风范,极简且清爽 134 | self.style = ttk.Style("superhero") 135 | 136 | frame_top = ttk.Frame(root, padding=10) 137 | frame_top.pack(fill=X) 138 | 139 | ttk.Label(frame_top, text="🌐 目标地址:", font=("微软雅黑", 14)).pack(side=LEFT, padx=5) 140 | self.target_entry = ttk.Entry(frame_top, width=50) 141 | self.target_entry.pack(side=LEFT, padx=5) 142 | 143 | # Store frame_tools as instance variable 144 | self.frame_tools = ttk.LabelFrame(root, text="🧰 工具选择", padding=(10, 5)) 145 | self.frame_tools.pack(fill=X, padx=10, pady=10) 146 | 147 | # Main tools selection 148 | self.tool_vars = {} 149 | main_tools = ['curl', 'nmap', 'subfinder', 'httpx', 'dirsearch', 'xsstrike', 'sqlmap'] 150 | for i, tool in enumerate(main_tools): 151 | var = ttk.BooleanVar() 152 | chk = ttk.Checkbutton(self.frame_tools, text=tool, variable=var, bootstyle="info-round-toggle") 153 | chk.grid(row=i//3, column=i%3, padx=10, pady=5, sticky=W) 154 | self.tool_vars[tool] = var 155 | if tool == 'sqlmap': 156 | var.trace_add('write', self.toggle_sqlmap_options) 157 | 158 | # SQLMap advanced options frame (initially hidden) 159 | self.sqlmap_options_frame = ttk.LabelFrame(root, text="SQLMap 高级选项", padding=(10, 5)) 160 | self.sqlmap_option_vars = {} 161 | 162 | # SQLMap advanced options 163 | self.sqlmap_options = [ 164 | ('基础模式', 'sqlmap_basic'), 165 | ('高风险测试', 'sqlmap_aggressive'), 166 | ('POST请求', 'sqlmap_post'), 167 | ('Cookie注入', 'sqlmap_cookie'), 168 | ('自定义头', 'sqlmap_headers'), 169 | ('枚举数据库', 'sqlmap_dbs'), 170 | ('枚举表', 'sqlmap_tables'), 171 | ('枚举字段', 'sqlmap_columns'), 172 | ('Dump数据', 'sqlmap_dump'), 173 | ('代理模式', 'sqlmap_proxy'), 174 | ('OS Shell', 'sqlmap_os_shell') 175 | ] 176 | 177 | for i, (label, key) in enumerate(self.sqlmap_options): 178 | var = ttk.BooleanVar() 179 | chk = ttk.Checkbutton( 180 | self.sqlmap_options_frame, 181 | text=label, 182 | variable=var, 183 | bootstyle="secondary-round-toggle" 184 | ) 185 | chk.grid(row=i//3, column=i%3, padx=10, pady=5, sticky=W) 186 | self.sqlmap_option_vars[key] = var 187 | 188 | # Initially hide the SQLMap options 189 | self.sqlmap_options_frame.pack_forget() 190 | frame_buttons = ttk.Frame(root, padding=(10, 5)) 191 | frame_buttons.pack(fill=X) 192 | 193 | self.start_btn = ttk.Button(frame_buttons, text="▶️ 开始扫描", bootstyle="success", command=self.run_tools) 194 | self.start_btn.pack(side=LEFT, padx=5) 195 | 196 | self.stop_btn = ttk.Button(frame_buttons, text="⏹️ 停止扫描", bootstyle="danger", command=self.stop_scan, state="disabled") 197 | self.stop_btn.pack(side=LEFT, padx=5) 198 | 199 | self.clear_btn = ttk.Button(frame_buttons, text="🧹 清除日志", bootstyle="warning", command=self.clear_logs) 200 | self.clear_btn.pack(side=LEFT, padx=5) 201 | 202 | self.save_btn = ttk.Button(frame_buttons, text="💾 保存日志", bootstyle="primary", command=self.save_logs) 203 | self.save_btn.pack(side=LEFT, padx=5) 204 | 205 | ttk.Label(root, text="实时日志输出:", font=("微软雅黑", 13)).pack(anchor=W, padx=10) 206 | 207 | self.log_area = scrolledtext.ScrolledText(root, height=20, font=("Arial", 14, "bold")) 208 | self.log_area.pack(fill=BOTH, expand=True, padx=10, pady=5) 209 | 210 | def show_guide(self): 211 | """显示使用指南""" 212 | guide_text = """ 213 | 🎯 使用指南 214 | 215 | 1. 基本操作 216 | • 在目标地址栏输入要测试的网站地址 217 | • 在工具选择区勾选需要使用的工具 218 | • 点击"开始扫描"按钮开始测试 219 | • 可随时点击"停止扫描"终止操作 220 | 221 | 2. 注意事项 222 | • 使用前请确保已安装所需工具 223 | • 建议先使用基础工具进行扫描 224 | • 扫描过程中请遵守相关法律法规 225 | • 建议在授权情况下使用本工具 226 | 227 | 3. 快捷操作 228 | • Ctrl+S:保存日志 229 | • Ctrl+Q:退出程序 230 | • F5:清除日志 231 | • F1:显示帮助 232 | 233 | 4. 主题切换 234 | • 可根据使用场景选择不同主题 235 | • 夜间模式更护眼 236 | • 支持自定义主题色彩""" 237 | 238 | self._show_help_window("使用指南", guide_text) 239 | 240 | def show_tools_info(self): 241 | """显示工具说明""" 242 | tools_text = """ 243 | 🛠️ 工具说明 244 | 245 | 1. curl 246 | • 功能:HTTP请求测试工具 247 | • 用途:测试网站响应和HTTP头信息 248 | • 特点:轻量级、易用、标准输出 249 | 250 | 2. nmap 251 | • 功能:网络扫描和端口检测 252 | • 用途:发现开放端口和服务版本 253 | • 特点:功能强大、可定制性高 254 | 255 | 3. subfinder 256 | • 功能:子域名发现工具 257 | • 用途:收集目标的所有子域名 258 | • 特点:速度快、准确率高 259 | 260 | 4. httpx 261 | • 功能:HTTP探测工具 262 | • 用途:批量探测HTTP服务 263 | • 特点:支持多端口、识别技术栈 264 | 265 | 5. dirsearch 266 | • 功能:目录扫描工具 267 | • 用途:发现网站隐藏目录 268 | • 特点:内置字典、支持多线程 269 | 270 | 6. xsstrike 271 | • 功能:XSS漏洞扫描 272 | • 用途:检测跨站脚本漏洞 273 | • 特点:智能检测、支持DOM XSS 274 | 275 | 7. sqlmap 276 | • 功能:SQL注入检测 277 | • 用途:自动化SQL注入测试 278 | • 特点:支持多种数据库、自动绕过""" 279 | 280 | self._show_help_window("工具说明", tools_text) 281 | 282 | def check_update(self): 283 | update_text = """ 284 | ✨ 版本信息 285 | 286 | 当前版本:v1.0 287 | 发布日期:2024-01 288 | 最新版本:v1.0 289 | 290 | 您的软件已经是最新版本! 291 | 292 | 如需获取最新版本信息,请关注: 293 | • GitHub: github.com/johnmelodyme 294 | • 邮箱: johnmelodymel@qq.com 295 | • QQ: 3072486255""" 296 | 297 | self._show_help_window("检查更新", update_text) 298 | 299 | def log(self, msg): 300 | timestamp = datetime.datetime.now().strftime("[%H:%M:%S]") 301 | full_msg = f"{timestamp} {msg}\n" 302 | self.log_area.insert("end", full_msg) 303 | self.log_area.yview("end") 304 | self.log_data += full_msg 305 | 306 | def run_command(self, cmd): 307 | try: 308 | self.log(f"💥 执行命令:{cmd}") 309 | shell_path = '/bin/zsh' if sys.platform == 'darwin' else '/bin/sh' 310 | 311 | # 根据操作系统为 subprocess 选择合适的 shell 执行环境: 312 | # - Windows 平台:使用默认的 cmd.exe(不传 executable 参数) 313 | # - macOS 平台:优先使用 /bin/zsh(更现代) 314 | # - 其他类 Unix 系统:使用 /bin/sh(传统兼容性更好) 315 | # 316 | # 注:如果在 Windows 下指定了不存在的 Unix Shell 路径(如 /bin/sh), 317 | # 会触发 WinError 3(找不到路径)错误,因此需特别处理。 318 | 319 | if sys.platform == "win32": 320 | self.current_process = subprocess.Popen( 321 | cmd, 322 | shell=True, 323 | stdout=subprocess.PIPE, 324 | stderr=subprocess.PIPE, 325 | text=True 326 | ) 327 | else: 328 | self.current_process = subprocess.Popen( 329 | cmd, 330 | shell=True, 331 | executable=shell_path, # 添加executable参数指定shell路径 332 | stdout=subprocess.PIPE, 333 | stderr=subprocess.PIPE, 334 | text=True 335 | ) 336 | 337 | while self.scanning: 338 | output = self.current_process.stdout.readline() 339 | if output == '' and self.current_process.poll() is not None: 340 | break 341 | if output: 342 | self.log(output.strip()) 343 | 344 | error = self.current_process.stderr.readline() 345 | if error: 346 | self.log(f"⚠️ {error.strip()}") 347 | 348 | if not self.scanning: 349 | self.current_process.terminate() 350 | self.log("🛑 扫描已停止") 351 | 352 | except Exception as e: 353 | self.log(f"🔥 错误:{e}") 354 | 355 | def toggle_sqlmap_options(self, *args): 356 | """Toggle visibility of SQLMap advanced options""" 357 | if self.tool_vars['sqlmap'].get(): 358 | # Show SQLMap options after the tools frame 359 | self.sqlmap_options_frame.pack(fill=X, padx=10, pady=5, after=self.frame_tools) 360 | else: 361 | # Hide SQLMap options and reset all checkboxes 362 | self.sqlmap_options_frame.pack_forget() 363 | for var in self.sqlmap_option_vars.values(): 364 | var.set(False) 365 | 366 | def run_tools(self): 367 | target = self.target_entry.get().strip() 368 | if not target: 369 | self.log("❌ 请输入目标地址") 370 | return 371 | 372 | selected = [tool for tool, var in self.tool_vars.items() if var.get()] 373 | if not selected: 374 | self.log("⚠️ 请至少选择一个工具") 375 | return 376 | 377 | # 处理目标地址,为 nmap 工具移除 http:// 和 https:// 前缀 378 | processed_target = target 379 | if 'nmap' in selected: 380 | if processed_target.startswith('http://'): 381 | processed_target = processed_target[7:] 382 | elif processed_target.startswith('https://'): 383 | processed_target = processed_target[8:] 384 | processed_target = processed_target.rstrip('/') 385 | 386 | # 处理 sqlmap 选项 387 | sqlmap_selected = [] 388 | if 'sqlmap' in selected: 389 | for key, var in self.sqlmap_option_vars.items(): 390 | if var.get(): 391 | sqlmap_selected.append(key) 392 | if not sqlmap_selected: 393 | sqlmap_selected = ['sqlmap_basic'] 394 | selected.remove('sqlmap') 395 | selected += sqlmap_selected 396 | 397 | self.scanning = True 398 | self.start_btn.configure(state="disabled") 399 | self.stop_btn.configure(state="normal") 400 | 401 | def thread_func(): 402 | for tool in selected: 403 | if not self.scanning: 404 | break 405 | current_target = processed_target if tool == 'nmap' else target 406 | cmd = tools[tool].format(target=current_target) 407 | self.run_command(cmd) 408 | self.scanning = False 409 | self.start_btn.configure(state="normal") 410 | self.stop_btn.configure(state="disabled") 411 | 412 | threading.Thread(target=thread_func).start() 413 | 414 | def stop_scan(self): 415 | self.scanning = False 416 | if self.current_process: 417 | self.current_process.terminate() 418 | self.log("🛑 正在停止扫描...") 419 | 420 | def clear_logs(self): 421 | self.log_area.delete(1.0, "end") 422 | self.log_data = "" 423 | self.log("✨ 日志已清除") 424 | 425 | def save_logs(self): 426 | try: 427 | # 设置默认文件名(包含时间戳) 428 | timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") 429 | default_filename = f"bug_bounty_log_{timestamp}.txt" 430 | 431 | # 根据操作系统设置保存对话框的参数 432 | if sys.platform == 'win32': 433 | filetypes = [("文本文件", "*.txt"), ("所有文件", "*.*")] 434 | defaultextension = ".txt" 435 | initialdir = os.path.expanduser("~\\Documents") 436 | else: 437 | filetypes = [("文本文件", ".txt"), ("所有文件", ".*")] 438 | defaultextension = ".txt" 439 | initialdir = os.path.expanduser("~/Documents") 440 | 441 | filepath = filedialog.asksaveasfilename( 442 | initialfile=default_filename, 443 | initialdir=initialdir, 444 | defaultextension=defaultextension, 445 | filetypes=filetypes, 446 | title="保存扫描日志" 447 | ) 448 | 449 | if filepath: 450 | # 使用utf-8编码保存,确保中文正常显示 451 | with open(filepath, "w", encoding="utf-8") as f: 452 | # 添加日志头部信息 453 | header = f"漏洞赏金扫描日志\n时间:{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n{'='*50}\n\n" 454 | f.write(header + self.log_data) 455 | 456 | self.log(f"✅ 日志已保存到:{filepath}") 457 | 458 | # 如果是Windows,自动打开保存目录 459 | if sys.platform == 'win32': 460 | os.startfile(os.path.dirname(filepath)) 461 | 462 | except Exception as e: 463 | self.log(f"❌ 保存日志失败:{str(e)}") 464 | if sys.platform == 'win32': 465 | self.log("请检查文件路径是否包含特殊字符,或尝试使用管理员权限运行程序。") 466 | 467 | def change_theme(self, theme_name): 468 | self.style.theme_use(theme_name) 469 | self.log(f"✨ 已切换到{theme_name}主题") 470 | 471 | def show_about(self): 472 | about_text = """🕷️ 漏洞赏金工具 v1.0.2 473 | 474 | 集成多种安全测试工具的漏洞赏金猎人助手: 475 | 476 | • curl - HTTP请求测试 477 | • nmap - 端口扫描和服务检测 478 | • subfinder - 子域名发现 479 | • httpx - HTTP探测和分析 480 | • dirsearch - Web路径扫描 481 | • xsstrike - XSS漏洞扫描 482 | • sqlmap - SQL注入测试 483 | 484 | 作者: 钟智强 485 | 电邮: johnmelodymel@qq.com 486 | QQ: 3072486255 487 | 微信: ctkqiang 488 | 489 | 版权所有 © 2025 钟智强定制 490 | 保留所有权利 491 | 492 | 本工具仅供安全研究和授权测试使用, 493 | 禁止用于非法用途。 494 | """ 495 | about_window = ttk.Toplevel(self.root) 496 | about_window.title("关于") 497 | about_window.geometry("400x400") 498 | 499 | # 添加图标 500 | try: 501 | icon_path = os.path.join("assets", "logo.png") 502 | if os.path.exists(icon_path): 503 | img = tk.PhotoImage(file=icon_path) 504 | about_window.iconphoto(True, img) 505 | except Exception: 506 | pass 507 | 508 | # 创建内容框架 509 | content_frame = ttk.Frame(about_window, padding=20) 510 | content_frame.pack(fill=BOTH, expand=True) 511 | 512 | # 添加标题 513 | title_label = ttk.Label( 514 | content_frame, 515 | text="漏洞赏金工具", 516 | font=("微软雅黑", 18, "bold") 517 | ) 518 | title_label.pack(pady=(0, 10)) 519 | 520 | # 添加版本号 521 | version_label = ttk.Label( 522 | content_frame, 523 | text="Version 1.0", 524 | font=("微软雅黑", 10) 525 | ) 526 | version_label.pack(pady=(0, 20)) 527 | 528 | # 添加主要内容 529 | text = scrolledtext.ScrolledText( 530 | content_frame, 531 | wrap=tk.WORD, 532 | height=15, 533 | font=("微软雅黑", 10) 534 | ) 535 | text.pack(expand=True, fill=BOTH) 536 | text.insert("1.0", about_text) 537 | text.configure(state="disabled") 538 | 539 | # 添加确定按钮 540 | ttk.Button( 541 | content_frame, 542 | text="确定", 543 | command=about_window.destroy, 544 | style="primary.TButton" 545 | ).pack(pady=(20, 0)) 546 | 547 | # 检查工具安装状态 548 | self.check_tools_installation() 549 | 550 | def check_tools_installation(self): 551 | missing_tools = [] 552 | for tool in tools.keys(): 553 | if not self.is_tool_installed(tool): 554 | missing_tools.append(tool) 555 | 556 | if missing_tools: 557 | self.show_installation_dialog(missing_tools) 558 | 559 | def is_tool_installed(self, tool_name): 560 | try: 561 | if tool_name.startswith('sqlmap_'): 562 | tool_name = 'sqlmap' 563 | 564 | # Windows系统特殊处理 565 | if sys.platform == 'win32': 566 | # 检查系统PATH中的所有目录 567 | paths = os.environ['PATH'].split(';') 568 | # 检查常见的工具安装路径 569 | additional_paths = [ 570 | os.path.expanduser('~\\go\\bin'), 571 | os.path.expanduser('~\\AppData\\Local\\Programs\\Python\\Python3*\\Scripts'), 572 | os.path.expanduser('~\\AppData\\Local\\Programs\\Python\\Python3*'), 573 | 'C:\\Program Files\\Go\\bin', 574 | 'C:\\Program Files (x86)\\Nmap' 575 | ] 576 | paths.extend(additional_paths) 577 | 578 | # 检查可执行文件是否存在 579 | for path in paths: 580 | if '*' in path: # 处理通配符路径 581 | 582 | matching_paths = glob.glob(path) 583 | for match_path in matching_paths: 584 | exe_path = os.path.join(match_path, tool_name + '.exe') 585 | if os.path.exists(exe_path): 586 | return True 587 | else: 588 | exe_path = os.path.join(path, tool_name + '.exe') 589 | if os.path.exists(exe_path): 590 | return True 591 | return False 592 | else: 593 | # Unix系统使用which命令 594 | result = subprocess.run(['which', tool_name], stdout=subprocess.PIPE, stderr=subprocess.PIPE) 595 | return result.returncode == 0 596 | except Exception as e: 597 | print(f"检查工具路径时出错:{e}") 598 | return False 599 | 600 | def show_installation_dialog(self, missing_tools): 601 | dialog = ttk.Toplevel(self.root) 602 | dialog.title("🛠️ 工具状态检查") 603 | dialog.geometry("800x500") 604 | 605 | content_frame = ttk.Frame(dialog, padding=20) 606 | content_frame.pack(fill=BOTH, expand=True) 607 | 608 | ttk.Label( 609 | content_frame, 610 | text="工具安装状态:", 611 | font=("微软雅黑", 14, "bold") 612 | ).pack(pady=(0, 10)) 613 | 614 | # 创建工具列表框架 615 | tools_frame = ttk.Frame(content_frame) 616 | tools_frame.pack(fill=X, pady=10) 617 | 618 | # 为所有工具创建状态指示器 619 | self.progress_bars = {} 620 | 621 | all_tools = [tool for tool in tools.keys() if not tool.startswith('sqlmap_') or tool == 'sqlmap'] 622 | 623 | for tool in all_tools: 624 | tool_frame = ttk.Frame(tools_frame) 625 | tool_frame.pack(fill=X, pady=5) 626 | 627 | # 创建状态指示器 628 | status_indicator = ttk.Label( 629 | tool_frame, 630 | text="●", 631 | font=("微软雅黑", 12), 632 | foreground="green" if tool not in missing_tools else "red" 633 | ) 634 | status_indicator.pack(side=LEFT, padx=(0, 5)) 635 | 636 | # 工具名称 637 | ttk.Label( 638 | tool_frame, 639 | text=f"{tool}", 640 | font=("微软雅黑", 12) 641 | ).pack(side=LEFT) 642 | 643 | # 状态文本 644 | status_text = "已安装" if tool not in missing_tools else "未安装" 645 | ttk.Label( 646 | tool_frame, 647 | text=f"({status_text})", 648 | font=("微软雅黑", 10), 649 | foreground="green" if tool not in missing_tools else "red" 650 | ).pack(side=LEFT, padx=5) 651 | 652 | # 只为未安装的工具添加进度条 653 | if tool in missing_tools: 654 | progress = ttk.Progressbar( 655 | tool_frame, 656 | length=200, 657 | mode='determinate', 658 | bootstyle="success" 659 | ) 660 | progress.pack(side=LEFT, padx=10) 661 | self.progress_bars[tool] = progress 662 | 663 | # 只在有未安装工具时显示安装按钮 664 | if missing_tools: 665 | ttk.Button( 666 | content_frame, 667 | text="一键安装缺失工具", 668 | command=lambda: self.install_tools(missing_tools, dialog), 669 | bootstyle="success" 670 | ).pack(pady=20) 671 | 672 | # 添加说明文本 673 | note_text = """注意: 674 | • 工具安装需要管理员权限 675 | • 安装过程可能需要几分钟 676 | • 请确保网络连接正常 677 | • macOS用户需要先安装Homebrew 678 | • 安装完成后需要重启应用""" 679 | 680 | note = scrolledtext.ScrolledText( 681 | content_frame, 682 | wrap=tk.WORD, 683 | height=6, 684 | font=("微软雅黑", 10) 685 | ) 686 | note.pack(fill=X) 687 | note.insert("1.0", note_text) 688 | note.configure(state="disabled") 689 | else: 690 | ttk.Label( 691 | content_frame, 692 | text="✅ 所有工具已安装完成!", 693 | font=("微软雅黑", 12, "bold"), 694 | foreground="green" 695 | ).pack(pady=20) 696 | 697 | def install_tools(self, missing_tools, dialog): 698 | def install_thread(): 699 | if sys.platform == "win32": 700 | # 检查是否以管理员权限运行 701 | 702 | if not ctypes.windll.shell32.IsUserAnAdmin(): 703 | self.log("⚠️ 请以管理员权限运行程序进行工具安装") 704 | return 705 | 706 | # 确保Go环境已安装 707 | if any(tool in missing_tools for tool in ['subfinder', 'httpx', 'hakrawler']): 708 | if not self.check_tool_path('go'): 709 | self.log("⚠️ 请先安装Go语言环境:https://golang.org/dl/") 710 | return 711 | 712 | # 确保Python环境已安装 713 | if any(tool in missing_tools for tool in ['dirsearch', 'xsstrike', 'sqlmap']): 714 | if not self.check_tool_path('python3') and not self.check_tool_path('python'): 715 | self.log("⚠️ 请先安装Python环境:https://www.python.org/downloads/") 716 | return 717 | 718 | failed_tools = [] 719 | path_setup_needed = [] 720 | 721 | for tool in missing_tools: 722 | try: 723 | self.progress_bars[tool]['value'] = 0 724 | dialog.update() 725 | 726 | # Get OS-specific install command 727 | cmd = tool_install_commands[os_type][tool] 728 | process = subprocess.Popen( 729 | cmd, 730 | shell=True, 731 | stdout=subprocess.PIPE, 732 | stderr=subprocess.PIPE, 733 | text=True 734 | ) 735 | 736 | while process.poll() is None: 737 | if self.progress_bars[tool]['value'] < 90: 738 | self.progress_bars[tool]['value'] += 1 739 | dialog.update() 740 | time.sleep(0.1) 741 | 742 | if process.returncode == 0: 743 | self.progress_bars[tool]['value'] = 100 744 | 745 | # Check if tool needs PATH setup 746 | if not self.check_tool_path(tool): 747 | path_setup_needed.append(tool) 748 | else: 749 | self.progress_bars[tool]['bootstyle'] = "danger" 750 | failed_tools.append(tool) 751 | 752 | except Exception as e: 753 | self.progress_bars[tool]['bootstyle'] = "danger" 754 | failed_tools.append(tool) 755 | print(f"安装 {tool} 时出错:{e}") 756 | 757 | dialog.update() 758 | 759 | # Show installation results 760 | result_frame = ttk.Frame(dialog, padding=20) 761 | result_frame.pack(fill=X) 762 | 763 | if failed_tools: 764 | fail_msg = f"⚠️ 以下工具安装失败:\n{', '.join(failed_tools)}" 765 | ttk.Label( 766 | result_frame, 767 | text=fail_msg, 768 | font=("微软雅黑", 12), 769 | foreground="red" 770 | ).pack(pady=5) 771 | 772 | if path_setup_needed: 773 | if os_type == 'macos': 774 | path_msg = "需要将以下工具添加到环境变量,请在终端执行:\n" 775 | path_msg += "echo 'export PATH=\"$PATH:/usr/local/bin:/usr/local/go/bin:$HOME/go/bin\"' >> ~/.zshrc\n" 776 | path_msg += "source ~/.zshrc" 777 | elif os_type == 'linux': 778 | path_msg = "需要将以下工具添加到环境变量,请在终端执行:\n" 779 | path_msg += "echo 'export PATH=\"$PATH:/usr/local/go/bin:$HOME/go/bin\"' >> ~/.bashrc\n" 780 | path_msg += "source ~/.bashrc" 781 | else: 782 | path_msg = "请将以下路径添加到系统环境变量Path中:\n" 783 | path_msg += "1. %USERPROFILE%\\go\\bin\n" 784 | path_msg += "2. %LOCALAPPDATA%\\Programs\\Python\\Python3*\\Scripts\n" 785 | path_msg += "\n添加方法:\n" 786 | path_msg += "1. 按Win+X,选择'系统'\n" 787 | path_msg += "2. 点击'高级系统设置'\n" 788 | path_msg += "3. 点击'环境变量'\n" 789 | path_msg += "4. 在'用户变量'中找到'Path'\n" 790 | path_msg += "5. 点击'编辑'并添加上述路径\n" 791 | path_msg += "6. 重启终端和应用程序" 792 | 793 | self.log(path_msg) 794 | 795 | if not failed_tools and not path_setup_needed: 796 | ttk.Label( 797 | result_frame, 798 | text="✅ 所有工具安装成功!", 799 | font=("微软雅黑", 12, "bold") 800 | ).pack(pady=5) 801 | 802 | ttk.Button( 803 | result_frame, 804 | text="重启应用", 805 | command=self.restart_app, 806 | bootstyle="success" 807 | ).pack(pady=10) 808 | 809 | threading.Thread(target=install_thread).start() 810 | 811 | def restart_app(self): 812 | """重启应用""" 813 | python = sys.executable 814 | os.execl(python, python, *sys.argv) 815 | 816 | def show_guide(self): 817 | """显示使用指南""" 818 | guide_text = """🎯 使用指南 819 | 820 | 1. 基本操作 821 | • 在目标地址栏输入要测试的网站地址 822 | • 在工具选择区勾选需要使用的工具 823 | • 点击"开始扫描"按钮开始测试 824 | • 可随时点击"停止扫描"终止操作 825 | 826 | 2. 注意事项 827 | • 使用前请确保已安装所需工具 828 | • 建议先使用基础工具进行扫描 829 | • 扫描过程中请遵守相关法律法规 830 | • 建议在授权情况下使用本工具 831 | 832 | 3. 快捷操作 833 | • Ctrl+S:保存日志 834 | • Ctrl+Q:退出程序 835 | • F5:清除日志 836 | • F1:显示帮助 837 | 838 | 4. 主题切换 839 | • 可根据使用场景选择不同主题 840 | • 夜间模式更护眼 841 | • 支持自定义主题色彩""" 842 | 843 | self._show_help_window("使用指南", guide_text) 844 | 845 | def show_tools_info(self): 846 | """显示工具说明""" 847 | tools_text = """ 848 | 🛠️ 工具说明 849 | 850 | 1. curl 851 | • 功能:HTTP请求测试工具 852 | • 用途:测试网站响应和HTTP头信息 853 | • 特点:轻量级、易用、标准输出 854 | 855 | 2. nmap 856 | • 功能:网络扫描和端口检测 857 | • 用途:发现开放端口和服务版本 858 | • 特点:功能强大、可定制性高 859 | 860 | 3. subfinder 861 | • 功能:子域名发现工具 862 | • 用途:收集目标的所有子域名 863 | • 特点:速度快、准确率高 864 | 865 | 4. httpx 866 | • 功能:HTTP探测工具 867 | • 用途:批量探测HTTP服务 868 | • 特点:支持多端口、识别技术栈 869 | 870 | 5. dirsearch 871 | • 功能:目录扫描工具 872 | • 用途:发现网站隐藏目录 873 | • 特点:内置字典、支持多线程 874 | 875 | 6. xsstrike 876 | • 功能:XSS漏洞扫描 877 | • 用途:检测跨站脚本漏洞 878 | • 特点:智能检测、支持DOM XSS 879 | 880 | 7. sqlmap 881 | • 功能:SQL注入检测 882 | • 用途:自动化SQL注入测试 883 | • 特点:支持多种数据库、自动绕过""" 884 | 885 | self._show_help_window("工具说明", tools_text) 886 | 887 | def check_update(self): 888 | """检查更新""" 889 | update_text = """ 890 | ✨ 版本信息 891 | 892 | 当前版本:v1.0 893 | 发布日期:2024-01 894 | 最新版本:v1.0 895 | 896 | 您的软件已经是最新版本! 897 | 898 | 如需获取最新版本信息,请关注: 899 | • GitHub: github.com/johnmelodyme 900 | • 邮箱: johnmelodymel@qq.com 901 | • QQ: 3072486255""" 902 | 903 | self._show_help_window("检查更新", update_text) 904 | 905 | def _show_help_window(self, title, content): 906 | """通用帮助窗口显示函数""" 907 | help_window = ttk.Toplevel(self.root) 908 | help_window.title(title) 909 | help_window.geometry("500x600") 910 | 911 | # 创建内容框架 912 | content_frame = ttk.Frame(help_window, padding=20) 913 | content_frame.pack(fill=BOTH, expand=True) 914 | 915 | # 添加标题 916 | ttk.Label( 917 | content_frame, 918 | text=title, 919 | font=("微软雅黑", 18, "bold") 920 | ).pack(pady=(0, 20)) 921 | 922 | # 添加内容 923 | text = scrolledtext.ScrolledText( 924 | content_frame, 925 | wrap=tk.WORD, 926 | height=20, 927 | font=("微软雅黑", 11) 928 | ) 929 | text.pack(expand=True, fill=BOTH) 930 | text.insert("1.0", content) 931 | text.configure(state="disabled") 932 | 933 | # 添加确定按钮 934 | ttk.Button( 935 | content_frame, 936 | text="确定", 937 | command=help_window.destroy, 938 | style="primary.TButton" 939 | ).pack(pady=(20, 0)) 940 | 941 | if __name__ == "__main__": 942 | root = ttk.Window(themename="vapor") 943 | try: 944 | icon_path = os.path.join("assets", "logo.png") 945 | if os.path.exists(icon_path): 946 | img = tk.PhotoImage(file=icon_path) 947 | root.iconphoto(True, img) 948 | else: 949 | if sys.platform == "darwin": 950 | icon_path = os.path.join("assets", "logo.png") 951 | if os.path.exists(icon_path): 952 | img = tk.PhotoImage(file=icon_path) 953 | root.iconphoto(True, img) 954 | elif sys.platform == "win32": 955 | icon_path = os.path.join("assets", "logo.ico") 956 | if os.path.exists(icon_path): 957 | root.iconbitmap(icon_path) 958 | except Exception as e: 959 | print(f"Warning: Could not load application icon: {e}") 960 | 961 | app = BugBountyApp(root) 962 | root.mainloop() 963 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 🕷️ 漏洞赏金工具 - 安全测试的得力助手 7 | 8 | 9 | 10 | 274 | 275 | 276 | 299 | 300 |
301 |
302 |

🕷️ 漏洞赏金工具

303 |

专为安全研究人员和白帽子黑客设计的图形化渗透测试工具集

304 |
305 | 立即下载 306 | GitHub 307 |
308 |
309 |
310 | 311 |
312 |
313 |

✨ 主要特性

314 |
315 |
316 |
317 |
318 | 319 |

美观的界面

320 |

支持多种主题切换,实时日志输出,简洁直观的操作界面

321 |
322 |
323 |
324 |
325 |
326 |
327 | 328 |

工具集成

329 |

集成多种常用的安全测试工具,一站式完成渗透测试任务

330 |
331 |
332 |
333 |
334 |
335 |
336 | 337 |

便捷操作

338 |

一键启动多个工具,实时查看进度,随时暂停继续

339 |
340 |
341 |
342 |
343 |
344 |
345 | 346 |
347 |
348 |

🛠️ 集成工具

349 |
350 |
351 |
352 |
353 |
curl
354 |

HTTP请求测试工具

355 |
356 |
357 |
358 |
359 |
360 |
361 |
nmap
362 |

端口扫描和服务检测

363 |
364 |
365 |
366 |
367 |
368 |
369 |
sqlmap
370 |

SQL注入检测工具

371 |
372 |
373 |
374 |
375 |
376 |
377 |
xsstrike
378 |

XSS漏洞扫描工具

379 |
380 |
381 |
382 |
383 |
384 |
385 | 386 |
387 |
388 |

📸 演示图片

389 | Demo Image 390 |
391 |
392 | 393 |
394 |
395 |

📥 立即下载

396 |
397 |
398 |
399 |

选择您的操作系统

400 | 411 |
412 |
413 |
414 |
415 |
416 | 417 | 429 | 430 | 431 | 432 | 433 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | # GUI 依赖 2 | ttkbootstrap>=1.0.0 3 | 4 | # 安全工具 5 | dirsearch>=0.4.3 6 | xsstrike>=3.1.5 7 | sqlmap>=1.6.12 8 | -------------------------------------------------------------------------------- /run.py: -------------------------------------------------------------------------------- 1 | # 导入所需的库 2 | import time # 用于实现延时功能 3 | import subprocess # 用于创建和管理子进程 4 | from watchdog.observers import Observer # 用于监控文件系统变化 5 | from watchdog.events import FileSystemEventHandler # 用于处理文件系统事件 6 | 7 | class ReloadHandler(FileSystemEventHandler): 8 | """文件变更处理器,继承自FileSystemEventHandler 9 | 用于监控main.py文件的变化并自动重启程序 10 | """ 11 | def __init__(self, command): 12 | self.command = command # 要执行的命令 13 | self.process = None # 存储子进程对象 14 | self.run_script() # 初始化时运行脚本 15 | 16 | def run_script(self): 17 | """运行Python脚本 18 | 如果已有进程在运行,先终止它再启动新进程 19 | """ 20 | if self.process: 21 | self.process.kill() # 终止现有进程 22 | print("🚀 Running script...\n") 23 | self.process = subprocess.Popen(self.command, shell=True) # 创建新进程 24 | 25 | def on_modified(self, event): 26 | """文件修改事件处理函数 27 | 当main.py文件发生变化时自动重启程序 28 | """ 29 | if event.src_path.endswith("main.py"): 30 | print(f"📁 Detected change in: {event.src_path}") 31 | self.run_script() 32 | 33 | if __name__ == "__main__": 34 | path = "." # 监控当前目录 35 | event_handler = ReloadHandler("python3 main.py") # 创建事件处理器 36 | observer = Observer() # 创建观察者对象 37 | observer.schedule(event_handler, path=path, recursive=False) # 设置监控 38 | observer.start() # 启动监控 39 | print("🧿 Watching for changes in main.py...") 40 | 41 | try: 42 | while True: 43 | time.sleep(1) # 主循环,每秒检查一次 44 | except KeyboardInterrupt: 45 | observer.stop() # 处理Ctrl+C中断 46 | observer.join() # 等待观察者线程结束 47 | -------------------------------------------------------------------------------- /漏洞赏金工具.spec: -------------------------------------------------------------------------------- 1 | # -*- mode: python ; coding: utf-8 -*- 2 | 3 | 4 | a = Analysis( 5 | ['main.py'], 6 | pathex=[], 7 | binaries=[], 8 | datas=[], 9 | hiddenimports=[], 10 | hookspath=[], 11 | hooksconfig={}, 12 | runtime_hooks=[], 13 | excludes=[], 14 | noarchive=False, 15 | optimize=0, 16 | ) 17 | pyz = PYZ(a.pure) 18 | 19 | exe = EXE( 20 | pyz, 21 | a.scripts, 22 | [], 23 | exclude_binaries=True, 24 | name='漏洞赏金工具', 25 | debug=False, 26 | bootloader_ignore_signals=False, 27 | strip=False, 28 | upx=True, 29 | console=False, 30 | disable_windowed_traceback=False, 31 | argv_emulation=False, 32 | target_arch=None, 33 | codesign_identity=None, 34 | entitlements_file=None, 35 | icon=['assets/logo.icns'], 36 | ) 37 | coll = COLLECT( 38 | exe, 39 | a.binaries, 40 | a.datas, 41 | strip=False, 42 | upx=True, 43 | upx_exclude=[], 44 | name='漏洞赏金工具', 45 | ) 46 | app = BUNDLE( 47 | coll, 48 | name='漏洞赏金工具.app', 49 | icon='./assets/logo.icns', 50 | bundle_identifier=None, 51 | ) 52 | --------------------------------------------------------------------------------