├── .github └── workflows │ └── python-publish.yml ├── LICENSE ├── README.md ├── __init__.py ├── probuster ├── __init__.py ├── __pycache__ │ ├── __init__.cpython-311.pyc │ ├── __init__.py │ ├── handler.cpython-311.pyc │ └── probuster.cpython-311.pyc ├── modules │ ├── __init__.py │ ├── __pycache__ │ │ ├── __init__.cpython-311.pyc │ │ ├── __init__.py │ │ └── handler.cpython-311.pyc │ ├── banner │ │ ├── __init__.py │ │ ├── __pycache__ │ │ │ ├── __init__.cpython-311.pyc │ │ │ ├── __init__.py │ │ │ └── banner.cpython-311.pyc │ │ └── banner.py │ ├── dir │ │ ├── __init__.py │ │ ├── __pycache__ │ │ │ ├── __init__.cpython-311.pyc │ │ │ ├── __init__.py │ │ │ └── dir.cpython-311.pyc │ │ └── dir.py │ ├── dnb │ │ ├── __init__.py │ │ ├── __pycache__ │ │ │ ├── __init__.cpython-311.pyc │ │ │ ├── __init__.py │ │ │ ├── dnb.cpython-311.pyc │ │ │ └── dns.cpython-311.pyc │ │ └── dnb.py │ ├── help │ │ ├── __init__.py │ │ ├── __pycache__ │ │ │ └── help.cpython-311.pyc │ │ └── help.py │ ├── probuster_documentation.py │ ├── version │ │ ├── __init__.py │ │ ├── __pycache__ │ │ │ ├── __init__.cpython-311.pyc │ │ │ ├── __init__.py │ │ │ └── version.cpython-311.pyc │ │ └── version.py │ ├── vhost │ │ ├── __init__.py │ │ ├── __pycache__ │ │ │ ├── __init__.cpython-311.pyc │ │ │ ├── __init__.py │ │ │ └── vhost.cpython-311.pyc │ │ └── vhost.py │ └── wordlist │ │ ├── __init__.py │ │ ├── __pycache__ │ │ ├── __init__.cpython-311.pyc │ │ ├── __init__.py │ │ └── wordlist.cpython-311.pyc │ │ ├── dirb.txt │ │ └── wordlist.py └── probuster.py ├── requirements.txt └── setup.py /.github/workflows/python-publish.yml: -------------------------------------------------------------------------------- 1 | 2 | name: Release to PyPI 3 | 4 | on: 5 | 6 | release: 7 | 8 | types: 9 | - created 10 | 11 | jobs: 12 | 13 | deploy: 14 | 15 | runs-on: ubuntu-latest 16 | 17 | steps: 18 | 19 | - name: Check out code 20 | 21 | uses: actions/checkout@v2 22 | 23 | 24 | - name: Set up Python 25 | 26 | uses: actions/setup-python@v2 27 | 28 | with: 29 | 30 | python-version: 3.x # Choose your Python version 31 | 32 | - name: Install dependencies 33 | run: | 34 | python3 -m pip install --upgrade pip 35 | pip install setuptools wheel twine 36 | 37 | - name: Build and publish 38 | run: | 39 | python3 setup.py sdist bdist_wheel 40 | python3 -m twine upload dist/*.tar.gz 41 | env: 42 | 43 | TWINE_USERNAME: ${{ secrets.PYPI_USER }} 44 | 45 | TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }} 46 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Sanjai kumar 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Probuster 2 | Probuster : A Python based Web Application Penetration testing tool for Information Gathering⚡. 3 | 4 | Probuster is a cutting-edge reconnaissance toolkit meticulously crafted for ethical hackers, penetration testers, bug bounty hunters and security professionals seeking unparalleled precision in the art of information gathering. This versatile tool seamlessly integrates four distinctive modes, empowering users with unprecedented insights into network landscapes. 5 | 6 | **DNS Mode: Unleash the Power of Threaded DNS Enumeration** 7 | 8 | In DNS mode, Probuster employs state-of-the-art threaded techniques to perform rapid and comprehensive DNS enumeration. Uncover hidden subdomains, identify potential vulnerabilities, and map the intricate web of domain structures with unparalleled efficiency. Probuster's DNS mode is designed for speed, accuracy, and reliability, ensuring a thorough examination of your target's digital footprint. 9 | 10 | **Dir Mode: Elevate Directory and File Enumeration to New Heights** 11 | 12 | Probuster's Dir mode elevates directory and file enumeration to new heights. Effortlessly scan web applications for hidden gems, vulnerable endpoints, and critical files. With Probuster's intelligent algorithms and intuitive interface, identify potential security loopholes and streamline your penetration testing workflow with unparalleled ease. 13 | 14 | **VHost Mode: Illuminate Virtual Host Structures with Precision** 15 | 16 | Illuminate the virtual host landscape using Probuster's VHost mode. Uncover obscured hosts, validate configurations, and gain a granular understanding of the web infrastructure. Probuster's VHost mode delivers accurate virtual host enumeration, enabling security professionals to assess attack surfaces comprehensively and make informed decisions. 17 | 18 | **Docs Mode: Explore Comprehensive Documentation with Ease** 19 | 20 | Probuster's Docs mode provides a seamlessly integrated documentation hub. Explore comprehensive guides, usage examples, and detailed explanations of each mode. Whether you're a seasoned professional or a beginner, Probuster's documentation ensures that you can harness the full power of the toolkit with confidence. 21 | 22 | **Key Features:** 23 | 24 | - **Threaded Efficiency:** Probuster harnesses the power of multithreading for rapid and parallelized reconnaissance, ensuring swift and effective scans. 25 | 26 | - **User-Friendly Interface:** A sleek and intuitive interface facilitates seamless navigation, making Probuster a tool of choice for both novice and seasoned cybersecurity professionals. 27 | 28 | - **Customizable Settings:** Tailor Probuster to your specific needs with customizable settings, allowing fine-tuning for different environments and scenarios. 29 | 30 | - **Comprehensive Reporting:** Generate detailed reports that encapsulate findings, aiding in concise communication of discovered vulnerabilities and potential risks. 31 | - **Tool management**: Probuster can be easily installed and easily manage your command line tool because Probuster ⚡ is also a python package 32 | - **Platform Independent:**: Probuster can be easily installed and can be easily build on any operating system and can be used for your Recon process even on your Android and Ios devices 33 | 34 | Probuster is not just a tool, it's a manifestation of excellence in reconnaissance, designed to empower ethical hackers with the precision needed to navigate the complexities of modern cybersecurity landscapes. Elevate your penetration testing 35 | capabilities with Probuster and redefine your approach to ethical hacking. 36 | 37 | ### Update or Install the latest version: 38 | 39 | ### Installation: 40 | 41 | ```bash 42 | pip install git+https://github.com/sanjai-AK47/Probuster.git 43 | 44 | probuster -h 45 | ``` 46 | If you system has encountered in system depended error use this command to install 47 | ```bash 48 | pip install git+https://github.com/sanjai-AK47/Probuster.git --break-system-packages 49 | ``` 50 | 51 | 52 | Probuster can be easily installed as you desired either through `pip` or `git clone` it depends on your choice 53 | 54 | ``` 55 | #### Installation through git clones: 56 | 57 | ```bash 58 | git clone https://github.com/sanjai-AK47/Probuster.git 59 | cd Probuster 60 | sudo pip install . or pip install . 61 | probuster -h 62 | ``` 63 | 64 | Hey Wait a Minute! how to use Probuster? 😆, see the documentation of Probuster by this command 65 | 66 | ```bash 67 | probuster doc 68 | ``` 69 | Then you will see the probuster documentation and its usages 70 | 71 | ## Probuster GitHub Repository 72 | 73 | Head over to the [Probuster GitHub repository](https://github.com/sanjai-AK47/Probuster). Dive into the code, contribute your expertise, and share your experiences and feedback. This tool is a collaborative effort, 74 | ## About the Author 75 | 76 | I'm D. Sanjai Kumar, the creator of Probuster. I'm passionate about advancing cybersecurity, and Probuster is a testament to that passion. Connect with me on [LinkedIn](https://www.linkedin.com/in/d-sanjai-kumar-109a7227b). 77 | 78 | ## Show Your Support 79 | 80 | If Probuster has rocked your ethical hacking world, let's spread the love! Give the repository a star :star: on [GitHub](https://github.com/sanjai-AK47/Probuster). Share it with your network, and let's build a community around this tool. 81 | 82 | Got feedback, suggestions, or want to contribute? Reach out to me directly. Let's keep pushing the boundaries of cybersecurity and innovation together. 83 | 84 | Thank you for choosing Probuster. Now, go out there and hack responsibly! 85 | 86 | --- 87 | 88 | ### Disclaimer: 89 | Probuster is designed for ethical hacking and penetration testing. Any use for malicious activities is strictly prohibited. 90 | 91 | Moye Moye ! 92 | 93 | --- 94 | -------------------------------------------------------------------------------- /__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/__init__.py -------------------------------------------------------------------------------- /probuster/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/__init__.py -------------------------------------------------------------------------------- /probuster/__pycache__/__init__.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/__pycache__/__init__.cpython-311.pyc -------------------------------------------------------------------------------- /probuster/__pycache__/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/__pycache__/__init__.py -------------------------------------------------------------------------------- /probuster/__pycache__/handler.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/__pycache__/handler.cpython-311.pyc -------------------------------------------------------------------------------- /probuster/__pycache__/probuster.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/__pycache__/probuster.cpython-311.pyc -------------------------------------------------------------------------------- /probuster/modules/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/modules/__init__.py -------------------------------------------------------------------------------- /probuster/modules/__pycache__/__init__.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/modules/__pycache__/__init__.cpython-311.pyc -------------------------------------------------------------------------------- /probuster/modules/__pycache__/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/modules/__pycache__/__init__.py -------------------------------------------------------------------------------- /probuster/modules/__pycache__/handler.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/modules/__pycache__/handler.cpython-311.pyc -------------------------------------------------------------------------------- /probuster/modules/banner/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/modules/banner/__init__.py -------------------------------------------------------------------------------- /probuster/modules/banner/__pycache__/__init__.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/modules/banner/__pycache__/__init__.cpython-311.pyc -------------------------------------------------------------------------------- /probuster/modules/banner/__pycache__/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/modules/banner/__pycache__/__init__.py -------------------------------------------------------------------------------- /probuster/modules/banner/__pycache__/banner.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/modules/banner/__pycache__/banner.cpython-311.pyc -------------------------------------------------------------------------------- /probuster/modules/banner/banner.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | from colorama import Fore,Back,Style 3 | from art import * 4 | import random 5 | import random 6 | 7 | 8 | 9 | red = Fore.RED 10 | 11 | green = Fore.GREEN 12 | 13 | magenta = Fore.MAGENTA 14 | 15 | cyan = Fore.CYAN 16 | 17 | mixed = Fore.RED + Fore.BLUE 18 | 19 | blue = Fore.BLUE 20 | 21 | yellow = Fore.YELLOW 22 | 23 | white = Fore.WHITE 24 | 25 | reset = Style.RESET_ALL 26 | 27 | bold = Style.BRIGHT 28 | 29 | colors = [ green, cyan, blue] 30 | 31 | random_color = random.choice(colors) 32 | 33 | 34 | def banner(): 35 | 36 | tool_name = "ProBuster" 37 | 38 | fonts = ["big", "ogre", "shadow", "script", "colossal" , "smslant", "graffiti", "slant"] 39 | selected_font = random.choice(fonts) 40 | banner = text2art(f"{tool_name}", font=selected_font) 41 | 42 | banner = f"""{banner} 43 | 44 | {bold}{white}Author : D.SanjaiKumar @CyberRevoltSecurities{reset}\n""" 45 | 46 | 47 | 48 | return banner 49 | -------------------------------------------------------------------------------- /probuster/modules/dir/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/modules/dir/__init__.py -------------------------------------------------------------------------------- /probuster/modules/dir/__pycache__/__init__.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/modules/dir/__pycache__/__init__.cpython-311.pyc -------------------------------------------------------------------------------- /probuster/modules/dir/__pycache__/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/modules/dir/__pycache__/__init__.py -------------------------------------------------------------------------------- /probuster/modules/dir/__pycache__/dir.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/modules/dir/__pycache__/dir.cpython-311.pyc -------------------------------------------------------------------------------- /probuster/modules/dir/dir.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | import os 3 | from colorama import Fore,Back,Style 4 | import requests 5 | from bs4 import BeautifulSoup 6 | import time as t 7 | import datetime 8 | import warnings 9 | import random 10 | from alive_progress import alive_bar 11 | import sys 12 | from requests.packages.urllib3.exceptions import InsecureRequestWarning 13 | import urllib3 14 | import asyncio 15 | import aiohttp 16 | import aiofiles 17 | from bs4 import XMLParsedAsHTMLWarning, MarkupResemblesLocatorWarning 18 | 19 | 20 | 21 | warnings.simplefilter('ignore', requests.packages.urllib3.exceptions.InsecureRequestWarning) 22 | 23 | warnings.filterwarnings("ignore") 24 | 25 | red = Fore.RED 26 | 27 | green = Fore.GREEN 28 | 29 | magenta = Fore.MAGENTA 30 | 31 | cyan = Fore.CYAN 32 | 33 | mixed = Fore.RED + Fore.BLUE 34 | 35 | blue = Fore.BLUE 36 | 37 | yellow = Fore.YELLOW 38 | 39 | white = Fore.WHITE 40 | 41 | lblue = Fore.LIGHTBLUE_EX 42 | 43 | reset = Style.RESET_ALL 44 | 45 | bold = Style.BRIGHT 46 | 47 | colors = [ green, cyan, blue] 48 | 49 | random_color = random.choice(colors) 50 | 51 | 52 | 53 | 54 | async def save(url, output): 55 | 56 | try: 57 | 58 | 59 | if output: 60 | 61 | 62 | 63 | if os.path.isfile(output): 64 | 65 | filename = output 66 | 67 | elif os.path.isdir(output): 68 | 69 | filename = os.path.join(output, f"Probuster_dir_results.txt") 70 | 71 | else: 72 | 73 | filename = output 74 | 75 | 76 | async with aiofiles.open(filename, "a") as w: 77 | 78 | 79 | await w.write(url + '\n') 80 | 81 | except KeyboardInterrupt as e: 82 | 83 | 84 | print(f"\n[{bold}{blue}INFO{reset}]: {bold}{white}Probuster exits..{reset}") 85 | 86 | SystemExit 87 | 88 | except asyncio.CancelledError as e: 89 | 90 | 91 | SystemExit 92 | 93 | 94 | 95 | except Exception as e: 96 | 97 | pass 98 | 99 | 100 | 101 | async def dirbust_req(url, proxy, output, verbose, titles, timeout, servers, application_types, word_counts, no_color, allow_redirect, match, exclude, session, sem, bar): 102 | 103 | 104 | try: 105 | 106 | async with sem: 107 | 108 | warnings.filterwarnings("ignore", category=ResourceWarning) 109 | 110 | urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) 111 | 112 | requests.packages.urllib3.disable_warnings(InsecureRequestWarning) 113 | 114 | 115 | proxies = { 116 | "http": proxy, 117 | "https": proxy 118 | } if proxy else None 119 | 120 | timeout = timeout if timeout else 10 121 | 122 | redirect = True if allow_redirect else False 123 | 124 | async with session.get(url, ssl=False, proxy=proxies, timeout=timeout, allow_redirects=redirect, max_redirects=10) as response: 125 | 126 | if response.status == 404: 127 | 128 | return 129 | 130 | response_text = await response.content.read() 131 | 132 | server1 = response.headers.get("server") 133 | 134 | content_type = response.headers.get("Content-Type") 135 | 136 | 137 | if content_type: 138 | 139 | content_type = content_type.split(";")[0].strip() 140 | 141 | 142 | with warnings.catch_warnings(): 143 | 144 | 145 | warnings.filterwarnings("ignore", category=UserWarning, module="bs4") 146 | 147 | warnings.filterwarnings('ignore', category=XMLParsedAsHTMLWarning) 148 | 149 | warnings.filterwarnings("ignore", category=MarkupResemblesLocatorWarning) 150 | 151 | soup = BeautifulSoup(response_text, "html.parser",from_encoding="iso-8859-1") 152 | 153 | text = soup.get_text() 154 | 155 | last_slash_index = url.rfind('/') 156 | 157 | if last_slash_index != -1: 158 | 159 | if not no_color: 160 | 161 | directory =f" {bold}{white}-{reset} {green}{url[last_slash_index + 0:]}{reset}" 162 | 163 | else: 164 | 165 | directory =f" - {url[last_slash_index + 1:]}" 166 | 167 | 168 | word_count = len(text.split()) 169 | 170 | title_tag = soup.title 171 | 172 | title = title_tag.string if title_tag else "" 173 | 174 | 175 | if not no_color: 176 | 177 | server = f" {bold}{white}-{reset} {bold}{white}[{reset}{bold}{white}{reset}{bold}{magenta}{server1}{reset}{bold}{white}]{reset} " if servers else "" 178 | 179 | else: 180 | 181 | server = f" - [{server1}] " if servers else "" 182 | 183 | if not no_color: 184 | 185 | content = f" {bold}{white}-{reset} {bold}{white}[{reset}{bold}{yellow}{content_type}{reset}{bold}{white}]{reset}" if application_types else "" 186 | 187 | else: 188 | 189 | content = f" - [{content_type}]" if application_types else "" 190 | 191 | if not no_color: 192 | 193 | word = f" {bold}{white}-{reset} {bold}{white}[{reset}{bold}{green}{word_count}{reset}{bold}{white}]{reset}" if word_counts else "" 194 | 195 | else: 196 | 197 | word = f" - [{word_count}]" if word_counts else "" 198 | 199 | if not no_color: 200 | 201 | title = f" {bold}{white}-{reset} {bold}{white}[{reset}{bold}{cyan}{title}{reset}{bold}{white}]{reset}" if titles else "" 202 | 203 | else: 204 | 205 | 206 | title = f" - [{title}]" if not titles else "" 207 | 208 | 209 | if response.status >=200 and response.status <=299: 210 | 211 | if not no_color: 212 | 213 | status =f" {bold}{white}-{reset} {bold}{yellow}{response.status}{reset}" 214 | 215 | else: 216 | 217 | status =f" - {response.status}" 218 | 219 | 220 | elif response.status >= 300 and response.status <=399: 221 | 222 | if not no_color: 223 | 224 | status =f" {bold}{white}-{reset} {bold}{blue}{response.status}{reset}" 225 | 226 | else: 227 | 228 | status =f" - {response.status}" 229 | 230 | else: 231 | 232 | if not no_color: 233 | 234 | status =f" {bold}{white}-{reset} {bold}{red}{response.status}{reset}" 235 | 236 | else: 237 | 238 | status =f" - {response.status}" 239 | 240 | if not no_color: 241 | 242 | url = f" {bold}{white}->{reset} {bold}{white}{url}{reset}" 243 | 244 | else: 245 | 246 | url = f" ->{reset} {url}" 247 | 248 | 249 | 250 | 251 | if exclude and int(response.status) in exclude: 252 | 253 | pass 254 | 255 | if not exclude and not match: 256 | 257 | 258 | 259 | if no_color: 260 | 261 | result = f"""[{datetime.datetime.now().strftime("%H:%M:%S.%f")[:-3]}]{status}{server}{content}{title}{word}{directory}{url}""" 262 | 263 | print(f"{result}\n") 264 | 265 | await save(result, output) 266 | 267 | else: 268 | 269 | result = f"""[{lblue}{datetime.datetime.now().strftime("%H:%M:%S.%f")[:-3]}{reset}]{status}{server}{content}{title}{word}{directory}{url}""" 270 | 271 | print(f"{result}\n") 272 | 273 | await save(result, output) 274 | 275 | if exclude and not match: 276 | 277 | 278 | if int(response.status) not in exclude: 279 | 280 | if no_color: 281 | 282 | result = f"""[{datetime.datetime.now().strftime("%H:%M:%S.%f")[:-3]}]{status}{server}{content}{title}{word}{directory}{url}""" 283 | 284 | print(f"{result}\n") 285 | 286 | await save(result, output) 287 | 288 | else: 289 | 290 | result = f"""[{lblue}{datetime.datetime.now().strftime("%H:%M:%S.%f")[:-3]}{reset}]{status}{server}{content}{title}{word}{directory}{url}""" 291 | 292 | print(f"{result}\n") 293 | 294 | await save(result, output) 295 | 296 | 297 | if match and int(response.status) in match: 298 | 299 | if no_color: 300 | 301 | result = f"""[{datetime.datetime.now().strftime("%H:%M:%S.%f")[:-3]}]{status}{server}{content}{title}{word}{directory}{url}""" 302 | 303 | print(f"{result}\n") 304 | 305 | await save(result, output) 306 | 307 | else: 308 | 309 | result = f"""[{lblue}{datetime.datetime.now().strftime("%H:%M:%S.%f")[:-3]}{reset}]{status}{server}{content}{title}{word}{directory}{url}""" 310 | 311 | print(f"{result}\n") 312 | 313 | await save(result, output) 314 | 315 | 316 | except KeyboardInterrupt as e: 317 | 318 | print(f"\n[{bold}{blue}INFO{reset}]: {bold}{white}Probuster exits..{reset}\n") 319 | 320 | SystemExit 321 | 322 | except asyncio.CancelledError as e: 323 | 324 | SystemExit 325 | 326 | except asyncio.TimeoutError: 327 | 328 | 329 | if verbose: 330 | 331 | print(f"[{bold}{red}INFO{reset}]: {bold}{white}Client Timeout Exceeds for: {url}{reset}") 332 | 333 | 334 | except Exception as e: 335 | 336 | pass 337 | 338 | finally: 339 | 340 | bar() 341 | 342 | async def dirbust_threader(hosts,concurrency,proxy, output, verbose, title, timeout, server, application_type, word_count, no_color, allow_redirect, match, exclude): 343 | 344 | try: 345 | 346 | 347 | sem = asyncio.Semaphore(concurrency) 348 | 349 | async with aiohttp.ClientSession() as session: 350 | 351 | with alive_bar(title=f"Probuster", total=len(hosts), enrich_print=False) as bar: 352 | 353 | tasks = [dirbust_req(url, proxy, output, verbose, title, timeout, server, application_type, word_count, no_color, allow_redirect, match, exclude, session, sem, bar) for url in hosts] 354 | 355 | await asyncio.gather(*tasks,return_exceptions=False) 356 | 357 | except KeyboardInterrupt as e: 358 | 359 | print(f"\n[{bold}{blue}INFO{reset}]: {bold}{white}Probuster exits..{reset}") 360 | 361 | SystemExit 362 | 363 | except asyncio.CancelledError as e: 364 | 365 | SystemExit 366 | 367 | except Exception as e: 368 | 369 | pass 370 | 371 | warnings.resetwarnings() 372 | 373 | -------------------------------------------------------------------------------- /probuster/modules/dnb/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/modules/dnb/__init__.py -------------------------------------------------------------------------------- /probuster/modules/dnb/__pycache__/__init__.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/modules/dnb/__pycache__/__init__.cpython-311.pyc -------------------------------------------------------------------------------- /probuster/modules/dnb/__pycache__/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/modules/dnb/__pycache__/__init__.py -------------------------------------------------------------------------------- /probuster/modules/dnb/__pycache__/dnb.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/modules/dnb/__pycache__/dnb.cpython-311.pyc -------------------------------------------------------------------------------- /probuster/modules/dnb/__pycache__/dns.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/modules/dnb/__pycache__/dns.cpython-311.pyc -------------------------------------------------------------------------------- /probuster/modules/dnb/dnb.py: -------------------------------------------------------------------------------- 1 | import dns.asyncresolver 2 | import time as t 3 | from colorama import Fore, Back, Style 4 | import asyncio 5 | import aiofiles 6 | from alive_progress import alive_bar 7 | import os 8 | import random 9 | import sys 10 | from aiodnsresolver import Resolver, TYPES, DnsError, DnsRecordDoesNotExist 11 | import warnings 12 | import logging 13 | import aiodns 14 | 15 | setter = logging.getLogger("aiodnsresolver") 16 | 17 | setter.setLevel(logging.CRITICAL) 18 | 19 | 20 | red = Fore.RED 21 | 22 | green = Fore.GREEN 23 | 24 | magenta = Fore.MAGENTA 25 | 26 | cyan = Fore.CYAN 27 | 28 | mixed = Fore.RED + Fore.BLUE 29 | 30 | blue = Fore.BLUE 31 | 32 | yellow = Fore.YELLOW 33 | 34 | white = Fore.WHITE 35 | 36 | lblue = Fore.LIGHTBLUE_EX 37 | 38 | reset = Style.RESET_ALL 39 | 40 | bold = Style.BRIGHT 41 | 42 | colors = [ green, cyan, blue] 43 | 44 | random_color = random.choice(colors) 45 | 46 | 47 | async def save(subdomain, ip, args): 48 | 49 | try: 50 | 51 | 52 | if args.output: 53 | 54 | 55 | 56 | if os.path.isfile(args.output): 57 | 58 | filename = args.output 59 | 60 | elif os.path.isdir(args.output): 61 | 62 | filename = os.path.join(args.output, f"{args.domain}_dns_results.txt") 63 | 64 | else: 65 | 66 | filename = args.output 67 | 68 | 69 | async with aiofiles.open(filename, "a") as w: 70 | 71 | 72 | await w.write(f"{subdomain} {ip}" + '\n') 73 | 74 | except KeyboardInterrupt as e: 75 | 76 | 77 | print(f"\n[{bold}{blue}INFO{reset}]: {bold}{white}Probuster exits..{reset}") 78 | 79 | SystemExit 80 | 81 | except TimeoutError as e: 82 | 83 | pass 84 | 85 | except asyncio.CancelledError as e: 86 | 87 | 88 | SystemExit 89 | 90 | except Exception as e: 91 | 92 | pass 93 | 94 | 95 | async def dnb_resolver(sem, subdomain, show_ip, output, verbose, no_color, bar): 96 | 97 | try: 98 | 99 | async with sem: 100 | 101 | resolver= aiodns.DNSResolver() 102 | 103 | resolved = await resolver.query(f"{subdomain}", "A") 104 | 105 | 106 | ips = resolved[0].host if resolved else "" 107 | 108 | ip = ips if show_ip else "" 109 | 110 | if no_color: 111 | 112 | print(f"[FOUND]: {subdomain} {ip}") 113 | 114 | await save(subdomain, ip, output) 115 | 116 | else: 117 | 118 | print(f"[{bold}{blue}FOUND{reset}]: {bold}{green}{subdomain}{reset} {bold}{yellow}{ip}{reset}") 119 | 120 | await save(subdomain, ip, output) 121 | 122 | 123 | except (DnsError, DnsRecordDoesNotExist, aiodns.error.DNSError) as e: 124 | 125 | if verbose: 126 | 127 | if no_color: 128 | 129 | print(f"[INVALID]: {subdomain}") 130 | 131 | else: 132 | 133 | print(f"[{bold}{magenta}INVALID{reset}]: {bold}{red}{subdomain}{reset}") 134 | 135 | except KeyboardInterrupt as e: 136 | 137 | 138 | print(f"\n[{bold}{blue}INFO{reset}]: {bold}{white}Probuster exits..{reset}") 139 | 140 | SystemExit 141 | 142 | except asyncio.CancelledError as e: 143 | 144 | 145 | SystemExit 146 | 147 | except Exception as e: 148 | 149 | pass 150 | 151 | finally: 152 | 153 | bar() 154 | 155 | async def dnb_handler(domain, show_ip, concurrency, wordlist, output, verbose, no_color, username): 156 | 157 | 158 | try: 159 | 160 | if not wordlist: 161 | 162 | print(f"[{bold}{red}INFO{reset}]: {bold}{white}Please provide a wordlist for Dns enumeration mode.{reset}") 163 | 164 | quit() 165 | 166 | 167 | 168 | 169 | print(f"""{bold}{white} 170 | 171 | ======================================================================================== 172 | [!]User : {username} 173 | 174 | [!]Mode : DNS Enumeration Mode 175 | 176 | [!]Doamin : {domain} 177 | 178 | [!]Wordlist : {wordlist} 179 | 180 | [!]Concurrency : {concurrency} 181 | 182 | ========================================================================================{reset} 183 | 184 | """) 185 | 186 | await dnb_thread(domain, show_ip, concurrency, wordlist, output, verbose, no_color) 187 | 188 | 189 | except KeyboardInterrupt as e: 190 | 191 | 192 | print(f"\n[{bold}{blue}INFO{reset}]: {bold}{white}Probuster exits..{reset}") 193 | 194 | SystemExit 195 | 196 | except asyncio.CancelledError as e: 197 | 198 | 199 | SystemExit 200 | 201 | except Exception as e: 202 | 203 | pass 204 | 205 | 206 | async def dnb_thread(domain, show_ip, concurrency, wordlist, output, verbose, no_color): 207 | 208 | try: 209 | 210 | sem = asyncio.Semaphore(concurrency) 211 | 212 | 213 | 214 | try: 215 | 216 | with open(wordlist, 'r', encoding='UTF-8') as wordlist: 217 | 218 | subdomains = [subdomain.strip() for subdomain in wordlist] 219 | 220 | except FileNotFoundError as e: 221 | 222 | print(f"[{bold}{red}INFO{reset}]: {bold}{white}Please check the {wordlist} wordlists exists for dns resolving and brutforcing..{reset}") 223 | 224 | with alive_bar(title="Probuster", enrich_print=False, total=len(subdomains)) as bar: 225 | 226 | 227 | tasks = [dnb_resolver(sem, f"{hostname}.{domain}", show_ip, output, verbose, no_color, bar)for hostname in subdomains] 228 | 229 | await asyncio.gather(*tasks, return_exceptions=False) 230 | 231 | except KeyboardInterrupt as e: 232 | 233 | 234 | print(f"\n[{bold}{blue}INFO{reset}]: {bold}{white}Probuster exits..{reset}") 235 | 236 | SystemExit 237 | 238 | except asyncio.CancelledError as e: 239 | 240 | 241 | SystemExit 242 | 243 | except Exception as e: 244 | 245 | pass 246 | 247 | 248 | warnings.resetwarnings() 249 | -------------------------------------------------------------------------------- /probuster/modules/help/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/modules/help/__init__.py -------------------------------------------------------------------------------- /probuster/modules/help/__pycache__/help.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/modules/help/__pycache__/help.cpython-311.pyc -------------------------------------------------------------------------------- /probuster/modules/help/help.py: -------------------------------------------------------------------------------- 1 | from colorama import Fore,Back,Style 2 | 3 | 4 | red = Fore.RED 5 | 6 | green = Fore.GREEN 7 | 8 | magenta = Fore.MAGENTA 9 | 10 | cyan = Fore.CYAN 11 | 12 | mixed = Fore.RED + Fore.BLUE 13 | 14 | blue = Fore.BLUE 15 | 16 | yellow = Fore.YELLOW 17 | 18 | white = Fore.WHITE 19 | 20 | reset = Style.RESET_ALL 21 | 22 | bold = Style.BRIGHT 23 | 24 | colors = [ green, cyan, blue] 25 | 26 | 27 | 28 | def mode_help(): 29 | 30 | print(f""" 31 | [{bold}{blue}DESCRIPTION{reset}]: {bold}{white}A Python based Web Application Penetration testing tool for Information Gathering and Content Discovery{reset}⚡. 32 | 33 | [{bold}{blue}MODES{reset}]: {bold}{white} 34 | 35 | 36 | - dir : Directory/file enumeration mode 37 | - vhost : Virtual host enumeration mode 38 | - dns : DNS enumeration mode 39 | - doc : Documentation mode for detailed documentation about Probuster 40 | - update : Update the Probuster to latest version 41 | - Version : Shows the Probuster current Version 42 | 43 | [{bold}{blue}FLAGS{reset}]: {bold}{white} 44 | 45 | -h, --help : Shows this help message and exits. 46 | 47 | [{bold}{blue}Usage{reset}]: {bold}{white} 48 | 49 | probuster [commands] 50 | 51 | Available Commands: 52 | 53 | - dir : Execute directory/file enumeration mode. 54 | - vhost : Execute virtual host enumeration mode. 55 | - dns : Execute DNS enumeration mode. 56 | - doc : Access detailed documentation for Probuster. 57 | - update : Updates the Probuster to latest version 58 | 59 | Help Commands: 60 | 61 | - dir : probuster dir -h 62 | - vhost : probuster vhost -h 63 | - dns : probuster dns -h 64 | - doc : probuster doc -h 65 | - update : probuster update -h 66 | 67 | Notes: 68 | 69 | - For each mode, additional options and flags are available. Use 'probuster [mode] -h' for mode-specific help. 70 | 71 | - Ensure you have the latest version of Probuster for optimal performance and access to the latest features. 72 | 73 | - Ensure with your concurrency value for good results. Probuster performance depends on the User system resources. 74 | 75 | For detailed information about each mode and usage examples, use 'probuster doc --show-doc' or probuster doc -shd. 76 | \n {reset}""") 77 | 78 | 79 | exit() 80 | 81 | def dir_mode_help(): 82 | 83 | print(f""" 84 | [{bold}{blue}MODE{reset}]: {bold}{white}Directory and Files Enumerations{reset} 85 | 86 | [{bold}{blue}Usage{reset}]: {bold}{white} 87 | 88 | probuster dir [options] 89 | 90 | Options for dir mode: 91 | 92 | -u, --url : Specify the target domain or ip for Directory/File Enumeration mode 93 | -dh, --dir-help : Show the help message for Directory Enumeration mode 94 | -c, --concurrency : Set Concurrency level for multiple process for Directory or File enumeration (default: 20) 95 | -w, --wordlist : Wordlist or hostname for Directory or File enumeration 96 | -pX. --proxy : Set proxy to pass your request through proxy (ex: 127.0.0.1) 97 | -o, --output : Give a file to save the output for Directory or File enumeration 98 | -v, --verbose : Set Verbose to show output (errors)! 99 | -t, --title : Get title of the found Directory or File 100 | -tO, --timeout : Set timeout for each request (default 10) 101 | -sV. --server : Get the server name of the found Directory or File 102 | -aT, --application-type : Get the application type of the found Directory or File 103 | -wC, --word-count : Get the word count of the found Directory or File 104 | -nc, --no-color : Disables the colorization output for found results 105 | -ar. --allow-redirect : Enabling it will make probuster to follow redirects 106 | -mc, --match : Matches the status code given by user for example: -mc 200 302 107 | -ex, --excluded : Excludes the negative codes and gives user desired results for example: -ex 400 404 500 108 | Notes: 109 | 110 | - Probuster Concurrency on Dir/file Enumerations depends on your system resources 111 | 112 | - Be careful and gentle with you concurrency value 113 | 114 | - Enable desired output flag options for found directories/files (ex: --title, --server, --application-type, --word-count, --match) 115 | """) 116 | 117 | exit() 118 | 119 | 120 | 121 | def vhost_mode_help(): 122 | 123 | print(f""" 124 | [{bold}{blue}MODE{reset}]: {bold}{white}Virtual Host Enumerations{reset} 125 | 126 | [{bold}{blue}Usage{reset}]: {bold}{white} 127 | 128 | probuster vhost [options] 129 | 130 | Options for vhost mode: 131 | 132 | -u, --url : Specify the target ip or host for vitrual host enumeration ( Most probably use IP address as the URL argument) 133 | -vh, --vhost-help : Show the help message for Vhost Enumeration mode 134 | -c, --concurrency : Set Concurrency level for multiple process for virtual host enumeration (default: 20) 135 | -w, --wordlist : Wordlist or hostname for brutforce and find virtual host 136 | -pX. --proxy : Set proxy to pass your request through proxy (ex: 127.0.0.1) 137 | -o, --output : Give a file to save the output of virtual host enumeration 138 | -v, --verbose : Set Verbose to show output (errors)! 139 | -t, --title : Get title of the found virtual host 140 | -tO, --timeout : Set timeout for each request (default 10) 141 | -sV. --server : Get the server name of the found virtual host 142 | -aT, --application-type : Get the application type of the found virtual host 143 | -wC, --word-count : Get the word count of the found virtual host 144 | -nc, --no-color : Disables the colorization output for found results 145 | -ar, --allow-redirect : Enabling it will make probuster to follow redirects 146 | -mc, --match : Matches the status code given by user for example: -mc 200 302 147 | -ex, --excluded : Excludes the negative codes and gives user desired results for example: -ex 400 404 500 148 | 149 | 150 | Notes: 151 | 152 | - Virtual host enumeration plays a vital role in expanding your attack vectors 153 | 154 | - Virtual host are hiddent host that you may not able to find through some alive subdomains 155 | 156 | - Probuster Vhost simplifies the Virtual host enumeration which explained here: https://shorturl.at/berBU 157 | 158 | - Probuster will bring new feature for virtual host brutforcing mode in upcoming updates 159 | 160 | 161 | """) 162 | 163 | exit() 164 | 165 | 166 | def dns_mode_help(): 167 | 168 | print(f""" 169 | [{bold}{blue}MODE{reset}]: {bold}{white}DNS Enumerations{reset} 170 | 171 | [{bold}{blue}Usage{reset}]: {bold}{white} 172 | 173 | probuster dns [options] 174 | 175 | Options for dns mode: 176 | 177 | -d, --domain : Domain name for Dns Brutforcing and find subdomains 178 | -dnh, --dns-help : Show the help message for DNS Enumeration mode 179 | -w, --wordlist : Wordlist for brutforcing subdomains 180 | -c, --concurrency : Set Concurrency level for multiple process for DNS enumeration (default: 20) 181 | -v, --verbose : Set Verbose to show output (errors)! 182 | -o, --output : Give a file to save the output of DNS enumeration 183 | -sip, --show-ip : Enable --show-ip will show the ip address of the found subdomain 184 | -nc, --no-color : Enable --no-color will print the output without any colors 185 | 186 | Notes: 187 | 188 | - Be Gentle with your concurrency value for Dns Enumeration 189 | 190 | - If your system is capable to handle high loads with high threads then you can use 2m+ wordlists """) 191 | 192 | exit() 193 | 194 | 195 | def doc_mode_help(): 196 | 197 | print(f""" 198 | [{bold}{blue}MODE{reset}]: {bold}{white}Probuster Documentation{reset} 199 | 200 | [{bold}{blue}Usage{reset}]: {bold}{white} 201 | 202 | probuster doc [options] 203 | 204 | Options for dns mode: 205 | 206 | -h, --help : Shows this help message and exits 207 | -shd, --show-doc : Generate the documentation for probuster 208 | """) 209 | 210 | exit() 211 | 212 | 213 | def update_mode_help(): 214 | 215 | print(f""" 216 | [{bold}{blue}MODE{reset}]: {bold}{white}Probuster Update{reset} 217 | 218 | [{bold}{blue}Usage{reset}]: {bold}{white} 219 | 220 | probuster doc [options] 221 | 222 | Options for dns mode: 223 | 224 | -h, --help : Shows this help message and exits 225 | -lt, --latest : Generate the documentation for probuster 226 | """) 227 | 228 | exit() 229 | 230 | def update_mode_help(): 231 | 232 | print(f""" 233 | [{bold}{blue}MODE{reset}]: {bold}{white}Probuster Update{reset} 234 | 235 | [{bold}{blue}Usage{reset}]: {bold}{white} 236 | 237 | probuster doc [options] 238 | 239 | Options for dns mode: 240 | 241 | -h, --help : Shows this help message and exits 242 | -v, --version : Shows the version of probuster 243 | """) 244 | 245 | exit() -------------------------------------------------------------------------------- /probuster/modules/probuster_documentation.py: -------------------------------------------------------------------------------- 1 | import streamlit as st 2 | import os 3 | 4 | 5 | def get_username(): 6 | 7 | try: 8 | 9 | username = os.getlogin() 10 | 11 | except OSError: 12 | 13 | username = os.getenv('USER') or os.getenv('LOGNAME') or os.getenv('USERNAME') or 'Unknown User' 14 | 15 | except Exception as e: 16 | 17 | username = "Unknown User" 18 | 19 | 20 | return username 21 | 22 | username = get_username() 23 | 24 | 25 | 26 | 27 | st.markdown(f"\n### Welcome to Probuster Documentation {username.upper()} :heart:\n") 28 | st.markdown(f"""--- 29 | 30 | #### Probuster: A Python based Web Application Penetration Tool for Information Gathering and Content Discovery:zap:""") 31 | st.markdown(f""" 32 | 33 | 34 | Probuster is a cutting-edge reconnaissance toolkit meticulously crafted for ethical hackers, penetration testers, bug bounty hunters and security professionals seeking unparalleled precision in the art of information gathering. This versatile tool seamlessly integrates four distinctive modes, empowering users with unprecedented insights into network landscapes. 35 | 36 | **DNS Mode: Unleash the Power of Threaded DNS Enumeration** 37 | 38 | In DNS mode, Probuster employs state-of-the-art threaded techniques to perform rapid and comprehensive DNS enumeration. Uncover hidden subdomains, identify potential vulnerabilities, and map the intricate web of domain structures with unparalleled efficiency. Probuster's DNS mode is designed for speed, accuracy, and reliability, ensuring a thorough examination of your target's digital footprint. 39 | 40 | **Dir Mode: Elevate Directory and File Enumeration to New Heights** 41 | 42 | Probuster's Dir mode elevates directory and file enumeration to new heights. Effortlessly scan web applications for hidden gems, vulnerable endpoints, and critical files. With Probuster's intelligent algorithms and intuitive interface, identify potential security loopholes and streamline your penetration testing workflow with unparalleled ease. 43 | 44 | **VHost Mode: Illuminate Virtual Host Structures with Precision** 45 | 46 | Illuminate the virtual host landscape using Probuster's VHost mode. Uncover obscured hosts, validate configurations, and gain a granular understanding of the web infrastructure. Probuster's VHost mode delivers accurate virtual host enumeration, enabling security professionals to assess attack surfaces comprehensively and make informed decisions. 47 | 48 | **Docs Mode: Explore Comprehensive Documentation with Ease** 49 | 50 | Probuster's Docs mode provides a seamlessly integrated documentation hub. Explore comprehensive guides, usage examples, and detailed explanations of each mode. Whether you're a seasoned professional or a beginner, Probuster's documentation ensures that you can harness the full power of the toolkit with confidence. 51 | 52 | **Key Features:** 53 | 54 | - **Threaded Efficiency:** Probuster harnesses the power of multithreading for rapid and parallelized reconnaissance, ensuring swift and effective scans. 55 | 56 | - **User-Friendly Interface:** A sleek and intuitive interface facilitates seamless navigation, making Probuster a tool of choice for both novice and seasoned cybersecurity professionals. 57 | 58 | - **Customizable Settings:** Tailor Probuster to your specific needs with customizable settings, allowing fine-tuning for different environments and scenarios. 59 | 60 | - **Comprehensive Reporting:** Generate detailed reports that encapsulate findings, aiding in concise communication of discovered vulnerabilities and potential risks. 61 | 62 | Probuster is not just a tool, it's a manifestation of excellence in reconnaissance, designed to empower ethical hackers with the precision needed to navigate the complexities of modern cybersecurity landscapes. Elevate your penetration testing capabilities with Probuster and redefine your approach to ethical hacking. 63 | 64 | ### Version 1.0.2 Update: 65 | 66 | - Unlike updating from version 1.0.1 to 1.0.2 , Probuster new version is updated and recoded from the scratch 67 | 68 | - Unlike Previous Versions traditional threading , Probuster new version converted to asynchronous performance and high in concurrent 69 | for all modes 70 | 71 | - Command line structure and command line arguments are changed for all modes in probuster new Version 72 | 73 | - Introduced new mode `Update` so users can update the probuster to new versions 74 | --- 75 | 76 | ### Contributor: 77 | 78 | - [Xer](https://www.linkedin.com/in/aslamx3r) contributed in probuster new version for enhancing the output methods and cli's arguments 79 | 80 | --- 81 | """) 82 | 83 | st.markdown(f""" 84 | 85 | ### Main Usage: 86 | ```yaml 87 | probuster -h 88 | 89 | 8888888b. 888888b. 888 90 | 888 Y88b 888 "88b 888 91 | 888 888 888 .88P 888 92 | 888 d88P 888d888 .d88b. 8888888K. 888 888 .d8888b 888888 .d88b. 888d888 93 | 8888888P" 888P" d88""88b 888 "Y88b 888 888 88K 888 d8P Y8b 888P" 94 | 888 888 888 888 888 888 888 888 "Y8888b. 888 88888888 888 95 | 888 888 Y88..88P 888 d88P Y88b 888 X88 Y88b. Y8b. 888 96 | 888 888 "Y88P" 8888888P" "Y88888 88888P' "Y888 "Y8888 888 97 | 98 | 99 | 100 | 101 | 102 | Author : D.SanjaiKumar @CyberRevoltSecurities 103 | 104 | 105 | [DESCRIPTION]: A Python based Web Application Penetration testing tool for Information Gathering and Content Discovery⚡. 106 | 107 | [MODES]: 108 | 109 | 110 | - dir : Directory/file enumeration mode 111 | - vhost : Virtual host enumeration mode 112 | - dns : DNS enumeration mode 113 | - doc : Documentation mode for detailed documentation about Probuster 114 | - update : Update the Probuster to latest version 115 | - Version : Shows the Probuster current Version 116 | 117 | [FLAGS]: 118 | 119 | -h, --help : Shows this help message and exits. 120 | 121 | [Usage]: 122 | 123 | probuster [commands] 124 | 125 | Available Commands: 126 | 127 | - dir : Execute directory/file enumeration mode. 128 | - vhost : Execute virtual host enumeration mode. 129 | - dns : Execute DNS enumeration mode. 130 | - doc : Access detailed documentation for Probuster. 131 | - update : Updates the Probuster to latest version 132 | 133 | Help Commands: 134 | 135 | - dir : probuster dir -h 136 | - vhost : probuster vhost -h 137 | - dns : probuster dns -h 138 | - doc : probuster doc -h 139 | - update : probuster update -h 140 | 141 | Notes: 142 | 143 | - For each mode, additional options and flags are available. Use 'probuster [mode] -h' for mode-specific help. 144 | 145 | - Ensure you have the latest version of Probuster for optimal performance and access to the latest features. 146 | 147 | - Ensure with your concurrency value for good results. Probuster performance depends on the User system resources. 148 | 149 | For detailed information about each mode and usage examples, use 'probuster doc --show-doc' or probuster doc -shd. 150 | 151 | 152 | ``` 153 | Probuster's main usage help serves as a gateway to its robust features. Use the command structure `probuster [commands]` to access specialized modes like `dir` for directory enumeration, `vhost` for virtual host analysis, and `dns` for threaded DNS enumeration. Additionally, explore detailed documentation effortlessly with the `doc` mode. Tailor your commands, leverage advanced features, and elevate your web application penetration testing with Probuster. 154 | Lets see some more information about all probuster modes and their usages for more detailed explaination see in below. 155 | 156 | """) 157 | 158 | st.markdown(f""" 159 | --- 160 | ### Probuster dir Mode Usage: 161 | 162 | ```yaml 163 | probuster dir -h 164 | 165 | ___ ___ _ 166 | | _ \ _ _ ___ | _ ) _ _ ___| |_ ___ _ _ 167 | | _/| '_|/ _ \| _ \| || |(_-<| _|/ -_)| '_| 168 | |_| |_| \___/|___/ \_,_|/__/ \__|\___||_| 169 | 170 | 171 | [Version]: Probuster current version v1.0.2 (latest) 172 | 173 | [MODE]: Directory and Files Enumerations 174 | 175 | [Usage]: 176 | 177 | probuster dir [options] 178 | 179 | Options for dir mode: 180 | 181 | -u, --url : Specify the target domain or ip for Directory/File Enumeration mode 182 | -dh, --dir-help : Show the help message for Directory Enumeration mode 183 | -c, --concurrency : Set Concurrency level for multiple process for Directory or File enumeration (default: 20) 184 | -w, --wordlist : Wordlist or hostname for Directory or File enumeration 185 | -pX. --proxy : Set proxy to pass your request through proxy (ex: 127.0.0.1) 186 | -o, --output : Give a file to save the output for Directory or File enumeration 187 | -v, --verbose : Set Verbose to show output (errors)! 188 | -t, --title : Get title of the found Directory or File 189 | -tO, --timeout : Set timeout for each request (default 10) 190 | -sV. --server : Get the server name of the found Directory or File 191 | -aT, --application-type : Get the application type of the found Directory or File 192 | -wC, --word-count : Get the word count of the found Directory or File 193 | -nc, --no-color : Disables the colorization output for found results 194 | -ar. --allow-redirect : Enabling it will make probuster to follow redirects 195 | -mc, --match : Matches the status code given by user for example: -mc 200 302 196 | -ex, --excluded : Excludes the negative codes and gives user desired results for example: -ex 400 404 500 197 | Notes: 198 | 199 | - Probuster Concurrency on Dir/file Enumerations depends on your system resources 200 | 201 | - Be careful and gentle with you concurrency value 202 | 203 | - Enable desired output flag options for found directories/files (ex: --title, --server, --application-type, --word-count, --match) 204 | 205 | 206 | ``` 207 | 208 | ### Dir Mode Examples: 209 | 210 | 211 | ```yaml 212 | probuster dir -u http://test.com -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -o dirfile.txt -c 500 -ex 404 -sp --title --server --application-type -wC 213 | 214 | 215 | ___ ___ _ 216 | | _ \ _ _ ___ | _ ) _ _ ___| |_ ___ _ _ 217 | | _/| '_|/ _ \| _ \| || |(_-<| _|/ -_)| '_| 218 | |_| |_| \___/|___/ \_,_|/__/ \__|\___||_| 219 | 220 | 221 | [Version]: Probuster current version v1.0.2 (latest) 222 | 223 | 224 | ======================================================================================== 225 | [!]User : {username} 226 | 227 | [!]Mode : Directory or File Enumeration 228 | 229 | [!]URL : http://test.com 230 | 231 | [!]Wordlist : /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt 232 | 233 | [!]Concurrency : 500 234 | 235 | [!]Time-Out : None 236 | 237 | ======================================================================================== 238 | 239 | http://test.com/images [403] [Apache] [text/html] [403:Forbidden] [165] 240 | http://test.com/js [403] [Apache] [text/html] [403:Forbidden] [165] 241 | http://test.com/documentation [403] [Apache] [text/html] [403:Forbidden] [165] 242 | http://test.com/dashboard [200] [Apache] [text/html] [Admin Dashboard] [2080] 243 | http://test.com/javascript [403][Apache] [text/html] [403:Forbidden] [165] 244 | http://test.com/javascript [403] [Apache] [text/html] [403:Forbidden] [165] 245 | 246 | |██████████████████████████████████ | 3598/4000 [80%] in 12.4s (3.23/s) 247 | ``` 248 | --- 249 | """) 250 | 251 | st.markdown(f""" 252 | 253 | ### Probuster dns Mode Usage: 254 | 255 | ```yaml 256 | probuster dns -h 257 | 258 | 259 | ___ ___ _ 260 | / _ \ _ __ ___ / __\ _ _ ___ | |_ ___ _ __ 261 | / /_)/| '__| / _ \ /__\//| | | |/ __|| __| / _ \| '__| 262 | / ___/ | | | (_) |/ \/ \| |_| |\__ \| |_ | __/| | 263 | \/ |_| \___/ \_____/ \__,_||___/ \__| \___||_| 264 | 265 | 266 | 267 | [Version]: Probuster current version v1.0.2 (latest) 268 | 269 | [MODE] : DNS Enumerations 270 | 271 | [Usage] : probuster dns [options] 272 | 273 | [MODE]: DNS Enumerations 274 | 275 | [Usage]: 276 | 277 | probuster dns [options] 278 | 279 | Options for dns mode: 280 | 281 | -d, --domain : Domain name for Dns Brutforcing and find subdomains 282 | -dnh, --dns-help : Show the help message for DNS Enumeration mode 283 | -w, --wordlist : Wordlist for brutforcing subdomains 284 | -c, --concurrency : Set Concurrency level for multiple process for DNS enumeration (default: 20) 285 | -v, --verbose : Set Verbose to show output (errors)! 286 | -o, --output : Give a file to save the output of DNS enumeration 287 | -sip, --show-ip : Enable --show-ip will show the ip address of the found subdomain 288 | -nc, --no-color : Enable --no-color will print the output without any colors 289 | 290 | Notes: 291 | 292 | - Be Gentle with your concurrency value for Dns Enumeration 293 | 294 | - If your system is capable to handle high loads with high threads then you can use 2m+ wordlists 295 | 296 | - Enable you progress bar to know about the your dns enumeration process 297 | ``` 298 | ---""") 299 | 300 | st.markdown(f""" 301 | ### Dns Mode Examples: 302 | 303 | ```yaml 304 | 305 | probuster dns -d microsoft.com -c 20 -o test.txt -w ~/wordlists/subdomains/subdomains1.txt -sp 306 | 307 | 308 | ___ ___ _ 309 | / _ \ _ __ ___ / __\ _ _ ___ | |_ ___ _ __ 310 | / /_)/| '__| / _ \ /__\//| | | |/ __|| __| / _ \| '__| 311 | / ___/ | | | (_) |/ \/ \| |_| |\__ \| |_ | __/| | 312 | \/ |_| \___/ \_____/ \__,_||___/ \__| \___||_| 313 | 314 | 315 | 316 | [Version]: Probuster current version v1.0.2 (latest) 317 | ======================================================================================== 318 | [!]User : {username} 319 | 320 | [!]Mode : DNS Enumeration 321 | 322 | [!]Doamin : microsoft.com 323 | 324 | [!]Wordlist : /home/user/wordlists/subdomains/subdomains.txt 325 | 326 | [!]Concurrency : 20 327 | 328 | ======================================================================================== 329 | 330 | 331 | [FOUND]: www.microsoft.com 332 | [FOUND]: s.microsoft.com 333 | [FOUND]: i.microsoft.com 334 | [FOUND]: connect.microsoft.com 335 | [FOUND]: connect.microsoft.com 336 | [FOUND]: assets.microsoft.com 337 | [FOUND]: maps.microsoft.com 338 | [FOUND]: cdn.microsoft.com 339 | [FOUND]: api.microsoft.com 340 | |███ | 3998/400000 [20%] in 12.4s (3.23/s) 341 | ``` 342 | ---""") 343 | 344 | st.markdown(f""" 345 | ### Probuster Vhost Mode Usage: 346 | 347 | ```yaml 348 | probuster vhost -h 349 | 350 | , __ , __ 351 | /|/ \ /|/ \ 352 | |___/ ,_ __ | __/ , _|_ _ ,_ 353 | | / | / \_ | \| | / \_ | |/ / | 354 | | |_/\__/ |(__/ \_/|_/ \/ |_/|__/ |_/ 355 | 356 | 357 | 358 | [Version]: Probuster current version v1.0.2 (latest) 359 | 360 | [MODE]: Virtual Host Enumerations 361 | 362 | [Usage]: 363 | 364 | probuster vhost [options] 365 | 366 | Options for vhost mode: 367 | 368 | -u, --url : Specify the target ip or host for vitrual host enumeration ( Most probably use IP address as the URL argument) 369 | -vh, --vhost-help : Show the help message for Vhost Enumeration mode 370 | -c, --concurrency : Set Concurrency level for multiple process for virtual host enumeration (default: 20) 371 | -w, --wordlist : Wordlist or hostname for brutforce and find virtual host 372 | -pX. --proxy : Set proxy to pass your request through proxy (ex: 127.0.0.1) 373 | -o, --output : Give a file to save the output of virtual host enumeration 374 | -v, --verbose : Set Verbose to show output (errors)! 375 | -t, --title : Get title of the found virtual host 376 | -tO, --timeout : Set timeout for each request (default 10) 377 | -sV. --server : Get the server name of the found virtual host 378 | -aT, --application-type : Get the server name of the found virtual host 379 | -wC, --word-count : Get the word count of the found virtual host 380 | -nc, --no-color : Disables the colorization output for found results 381 | -ar, --allow-redirect : Enabling it will make probuster to follow redirects 382 | -mc, --match : Matches the status code given by user for example: -mc 200 302 383 | -ex, --excluded : Excludes the negative codes and gives user desired results for example: -ex 400 404 500 384 | 385 | 386 | Notes: 387 | 388 | - Virtual host enumeration plays a vital role in expanding your attack vectors 389 | 390 | - Virtual host are hiddent host that you may not able to find through some alive subdomains 391 | 392 | - Probuster Vhost simplifies the Virtual host enumeration which explained here: https://shorturl.at/berBU 393 | 394 | - Probuster will bring new feature for virtual host brutforcing mode in upcoming updates 395 | 396 | 397 | ``` 398 | ---""") 399 | 400 | st.markdown(f""" 401 | ### Vhost Mode Examples: 402 | 403 | ```yaml 404 | probuster vhost -u https://20.236.44.162 -tO 5 -c 100 -sp -w ~/Desktop/Bugbounty/public/microsoft/all_subdomains.txt --server --title -aT -wC --output output.txt 405 | 406 | , __ , __ 407 | /|/ \ /|/ \ 408 | |___/ ,_ __ | __/ , _|_ _ ,_ 409 | | / | / \_ | \| | / \_ | |/ / | 410 | | |_/\__/ |(__/ \_/|_/ \/ |_/|__/ |_/ 411 | 412 | 413 | 414 | [Version]: Probuster current version v1.0.2 (latest) 415 | 416 | ======================================================================================== 417 | [!]User : {username} 418 | 419 | [!]Mode : Virtual Host Enumeration 420 | 421 | [!]URL : https://20.236.44.162 422 | 423 | [!]Wordlist : /home/user/Desktop/Bugbounty/public/microsoft/all_subdomains.txt 424 | 425 | [!]Concurrency : 100 426 | 427 | [!]Time-Out : 5 428 | 429 | ======================================================================================== 430 | 431 | academic.microsoft.com [400] [AkamaiGHost] [text/html] [Invalid URL] [13] 432 | Academic.microsoft.com [400] [AkamaiGHost] [text/html] [Invalid URL] [13] 433 | Academy.microsoft.com [400] [AkamaiGHost] [text/html] [Invalid URL] [13] 434 | academy.techcommunity.microsoft.com [400] [AkamaiGHost] [text/html] [Invalid URL] [13] 435 | academy.microsoft.com [400] [AkamaiGHost] [text/html] [Invalid URL] [13] 436 | academy.microsoft.com [400] [AkamaiGHost] [text/html] [Invalid URL] [13] 437 | |█████▌ | 12611/91392 [14%] in 8:27.5 (24.85/s) 438 | 439 | ``` 440 | ---""") 441 | 442 | st.markdown(f""" 443 | 444 | ## Probuster GitHub Repository 445 | 446 | Head over to the [Probuster GitHub repository](https://github.com/sanjai-AK47/Probuster). Dive into the code, contribute your expertise, and share your experiences and feedback. This tool is a collaborative effort, 447 | ## About the Author 448 | 449 | I'm D. Sanjai Kumar, the creator of Probuster. I'm passionate about advancing cybersecurity, and Probuster is a testament to that passion. Connect with me on [LinkedIn](https://www.linkedin.com/in/d-sanjai-kumar-109a7227b). 450 | 451 | ## Show Your Support 452 | 453 | If Probuster has rocked your ethical hacking world, let's spread the love! Give the repository a star :star: on [GitHub](https://github.com/sanjai-AK47/Probuster). Share it with your network, and let's build a community around this tool. 454 | 455 | Got feedback, suggestions, or want to contribute? Reach out to me directly. Let's keep pushing the boundaries of cybersecurity and innovation together. 456 | 457 | Thank you for choosing Probuster. Now, go out there and hack responsibly! 458 | 459 | --- 460 | **Disclaimer:** 461 | Probuster is designed for ethical hacking and penetration testing. Any use for malicious activities is strictly prohibited. 462 | """) 463 | st.markdown(f"---") -------------------------------------------------------------------------------- /probuster/modules/version/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/modules/version/__init__.py -------------------------------------------------------------------------------- /probuster/modules/version/__pycache__/__init__.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/modules/version/__pycache__/__init__.cpython-311.pyc -------------------------------------------------------------------------------- /probuster/modules/version/__pycache__/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/modules/version/__pycache__/__init__.py -------------------------------------------------------------------------------- /probuster/modules/version/__pycache__/version.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/modules/version/__pycache__/version.cpython-311.pyc -------------------------------------------------------------------------------- /probuster/modules/version/version.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | import random 3 | import os 4 | from colorama import Fore,Back,Style 5 | import requests 6 | import urllib3 7 | 8 | urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) 9 | 10 | requests.packages.urllib3.disable_warnings() 11 | 12 | red = Fore.RED 13 | 14 | green = Fore.GREEN 15 | 16 | magenta = Fore.MAGENTA 17 | 18 | cyan = Fore.CYAN 19 | 20 | mixed = Fore.RED + Fore.BLUE 21 | 22 | blue = Fore.BLUE 23 | 24 | yellow = Fore.YELLOW 25 | 26 | white = Fore.WHITE 27 | 28 | reset = Style.RESET_ALL 29 | 30 | bold = Style.BRIGHT 31 | 32 | colors = [ green, cyan, blue] 33 | 34 | random_color = random.choice(colors) 35 | 36 | def check_version(): 37 | 38 | 39 | url = f"https://api.github.com/repos/sanjai-AK47/Probuster/releases/latest" 40 | 41 | try: 42 | 43 | 44 | response = requests.get(url, verify=True, timeout=10) 45 | 46 | if response.status_code == 200: 47 | 48 | data = response.json() 49 | 50 | latest = data.get('tag_name') 51 | 52 | return latest 53 | 54 | 55 | 56 | except KeyboardInterrupt as e: 57 | 58 | print(f"[{bold}{blue}INFO{reset}]: {bold}{white}Probuster exits..{reset}") 59 | 60 | exit() 61 | 62 | 63 | except Exception as e: 64 | 65 | pass -------------------------------------------------------------------------------- /probuster/modules/vhost/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/modules/vhost/__init__.py -------------------------------------------------------------------------------- /probuster/modules/vhost/__pycache__/__init__.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/modules/vhost/__pycache__/__init__.cpython-311.pyc -------------------------------------------------------------------------------- /probuster/modules/vhost/__pycache__/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/modules/vhost/__pycache__/__init__.py -------------------------------------------------------------------------------- /probuster/modules/vhost/__pycache__/vhost.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/modules/vhost/__pycache__/vhost.cpython-311.pyc -------------------------------------------------------------------------------- /probuster/modules/vhost/vhost.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | import os 3 | from colorama import Fore,Back,Style 4 | import requests 5 | from bs4 import BeautifulSoup 6 | import time as t 7 | import datetime 8 | import warnings 9 | import random 10 | from alive_progress import alive_bar 11 | import sys 12 | from requests.packages.urllib3.exceptions import InsecureRequestWarning 13 | import urllib3 14 | import asyncio 15 | import aiohttp 16 | import aiofiles 17 | from bs4 import XMLParsedAsHTMLWarning, MarkupResemblesLocatorWarning 18 | 19 | 20 | 21 | warnings.simplefilter('ignore', requests.packages.urllib3.exceptions.InsecureRequestWarning) 22 | 23 | warnings.filterwarnings("ignore") 24 | 25 | red = Fore.RED 26 | 27 | green = Fore.GREEN 28 | 29 | magenta = Fore.MAGENTA 30 | 31 | cyan = Fore.CYAN 32 | 33 | mixed = Fore.RED + Fore.BLUE 34 | 35 | blue = Fore.BLUE 36 | 37 | yellow = Fore.YELLOW 38 | 39 | white = Fore.WHITE 40 | 41 | lblue = Fore.LIGHTBLUE_EX 42 | 43 | reset = Style.RESET_ALL 44 | 45 | bold = Style.BRIGHT 46 | 47 | colors = [ green, cyan, blue] 48 | 49 | random_color = random.choice(colors) 50 | 51 | 52 | 53 | 54 | async def save(url, output): 55 | 56 | try: 57 | 58 | 59 | if output: 60 | 61 | 62 | 63 | if os.path.isfile(output): 64 | 65 | filename = output 66 | 67 | elif os.path.isdir(output): 68 | 69 | filename = os.path.join(output, f"Probuster_vhost_results.txt") 70 | 71 | else: 72 | 73 | filename = output 74 | 75 | 76 | async with aiofiles.open(filename, "a") as w: 77 | 78 | 79 | await w.write(url + '\n') 80 | 81 | except KeyboardInterrupt as e: 82 | 83 | 84 | print(f"\n[{bold}{blue}INFO{reset}]: {bold}{white}Probuster exits..{reset}") 85 | 86 | SystemExit 87 | 88 | except asyncio.CancelledError as e: 89 | 90 | 91 | SystemExit 92 | 93 | 94 | 95 | except Exception as e: 96 | 97 | pass 98 | 99 | 100 | 101 | async def vhost_req(url, host,proxy, output, verbose, titles, timeout, servers, application_types, word_counts, no_color, allow_redirect, match, exclude, session, sem, bar): 102 | 103 | 104 | try: 105 | 106 | async with sem: 107 | 108 | warnings.filterwarnings("ignore", category=ResourceWarning) 109 | 110 | urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) 111 | 112 | requests.packages.urllib3.disable_warnings(InsecureRequestWarning) 113 | 114 | 115 | proxies = { 116 | "http": proxy, 117 | "https": proxy 118 | } if proxy else None 119 | 120 | timeout = timeout if timeout else 10 121 | 122 | redirect = True if allow_redirect else False 123 | 124 | headers={"Host": f"{host}"} 125 | 126 | async with session.get(url, ssl=False, proxy=proxies, timeout=timeout, allow_redirects=redirect) as response: 127 | 128 | 129 | response_text = await response.content.read() 130 | 131 | server = response.headers.get("server") 132 | 133 | content_type = response.headers.get("Content-Type") 134 | 135 | 136 | if content_type: 137 | 138 | content_type = content_type.split(";")[0].strip() 139 | 140 | 141 | with warnings.catch_warnings(): 142 | 143 | 144 | warnings.filterwarnings("ignore", category=UserWarning, module="bs4") 145 | 146 | warnings.filterwarnings('ignore', category=XMLParsedAsHTMLWarning) 147 | 148 | warnings.filterwarnings("ignore", category=MarkupResemblesLocatorWarning) 149 | 150 | soup = BeautifulSoup(response_text, "html.parser",from_encoding="iso-8859-1") 151 | 152 | text = soup.get_text() 153 | 154 | word_count = len(text.split()) 155 | 156 | title_tag = soup.title 157 | 158 | title = title_tag.string if title_tag else "" 159 | 160 | 161 | if not no_color: 162 | 163 | server = f"{bold}{white}[{reset}{bold}{white}{reset}{bold}{magenta}{server}{reset}{bold}{white}]{reset} " if servers else "" 164 | 165 | else: 166 | 167 | server = f"[{server}]" if servers else "" 168 | 169 | if not no_color: 170 | 171 | content = f"{bold}{white}[{reset}{bold}{yellow}{content_type}{reset}{bold}{white}]{reset}" if application_types else "" 172 | 173 | else: 174 | 175 | content = f"[{content_type}]" if application_types else "" 176 | 177 | if not no_color: 178 | 179 | word = f"{bold}{white}[{reset}{bold}{green}{word_count}{reset}{bold}{white}]{reset}" if word_counts else "" 180 | 181 | else: 182 | 183 | word = f"[{word_count}]" if word_counts else "" 184 | 185 | if not no_color: 186 | 187 | title = f"{bold}{white}[{reset}{bold}{cyan}{title}{reset}{bold}{white}]{reset}" if titles else "" 188 | 189 | else: 190 | 191 | title = f"[{title}]" if titles else "" 192 | 193 | 194 | if response.status >=200 and response.status <=299: 195 | 196 | if not no_color: 197 | 198 | status =f"{bold}{white}[{reset}{bold}{bold}{green}{response.status}{reset}{bold}{white}]{reset}" 199 | 200 | else: 201 | 202 | status =f"[{response.status}]" 203 | 204 | 205 | elif response.status >= 300 and response.status <=399: 206 | 207 | if not no_color: 208 | 209 | status =f"{bold}{white}[{reset}{bold}{bold}{yellow}{response.status}{reset}{bold}{white}]{reset}" 210 | 211 | else: 212 | 213 | status =f"[{response.status}]" 214 | 215 | else: 216 | 217 | if not no_color: 218 | 219 | status =f"{bold}{white}[{reset}{bold}{red}{response.status}{reset}{bold}{white}]{reset}" 220 | 221 | else: 222 | 223 | status =f"[{response.status}]" 224 | 225 | 226 | 227 | 228 | if not no_color: 229 | 230 | url = f"{bold}{white}{url}{reset}" 231 | 232 | else: 233 | 234 | url = f"{url}" 235 | 236 | 237 | 238 | if exclude and int(response.status) in exclude: 239 | 240 | pass 241 | 242 | if not exclude and not match: 243 | 244 | 245 | 246 | result = f"""{url} {status}{title}{server}{content}{word}""" 247 | 248 | print(f"{result}\n") 249 | 250 | await save(result, output) 251 | 252 | if exclude and not match: 253 | 254 | 255 | if int(response.status) not in exclude: 256 | 257 | result = f"""{url} {status}{title}{server}{content}{word}""" 258 | 259 | print(f"{result}\n") 260 | 261 | await save(result, output) 262 | 263 | 264 | if match and int(response.status) in match: 265 | 266 | result = f"""{url} {status}{title}{server}{content}{word}""" 267 | 268 | print(f"{result}\n") 269 | 270 | await save(result, output) 271 | 272 | 273 | except KeyboardInterrupt as e: 274 | 275 | print(f"\n[{bold}{blue}INFO{reset}]: {bold}{white}Probuster exits..{reset}\n") 276 | 277 | SystemExit 278 | 279 | except asyncio.CancelledError as e: 280 | 281 | SystemExit 282 | 283 | except asyncio.TimeoutError: 284 | 285 | 286 | if verbose: 287 | 288 | print(f"[{bold}{red}INFO{reset}]: {bold}{white}Client Timeout Exceeds for: {url}{reset}") 289 | 290 | 291 | except Exception as e: 292 | 293 | pass 294 | 295 | finally: 296 | 297 | bar() 298 | 299 | async def vhost_threader(hosts, url, concurrency,proxy, output, verbose, title, timeout, server, application_type, word_count, no_color, allow_redirect, match, exclude) : 300 | 301 | try: 302 | 303 | 304 | sem = asyncio.Semaphore(concurrency) 305 | 306 | async with aiohttp.ClientSession() as session: 307 | 308 | with alive_bar(title=f"Probuster", total=len(hosts), enrich_print=False) as bar: 309 | 310 | tasks = [vhost_req(url, host, proxy, output, verbose, title, timeout, server, application_type, word_count, no_color, allow_redirect, match, exclude, session, sem, bar) for host in hosts] 311 | 312 | await asyncio.gather(*tasks,return_exceptions=False) 313 | 314 | except KeyboardInterrupt as e: 315 | 316 | print(f"\n[{bold}{blue}INFO{reset}]: {bold}{white}Probuster exits..{reset}") 317 | 318 | SystemExit 319 | 320 | except asyncio.CancelledError as e: 321 | 322 | SystemExit 323 | 324 | except Exception as e: 325 | 326 | pass 327 | 328 | warnings.resetwarnings() 329 | 330 | -------------------------------------------------------------------------------- /probuster/modules/wordlist/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/modules/wordlist/__init__.py -------------------------------------------------------------------------------- /probuster/modules/wordlist/__pycache__/__init__.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/modules/wordlist/__pycache__/__init__.cpython-311.pyc -------------------------------------------------------------------------------- /probuster/modules/wordlist/__pycache__/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/modules/wordlist/__pycache__/__init__.py -------------------------------------------------------------------------------- /probuster/modules/wordlist/__pycache__/wordlist.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RevoltSecurities/Probuster/b28246084294537ae48aedd58cea2d4b61e4e8d9/probuster/modules/wordlist/__pycache__/wordlist.cpython-311.pyc -------------------------------------------------------------------------------- /probuster/modules/wordlist/wordlist.py: -------------------------------------------------------------------------------- 1 | import os 2 | from colorama import Fore,Back,Style 3 | import random 4 | 5 | red = Fore.RED 6 | 7 | green = Fore.GREEN 8 | 9 | magenta = Fore.MAGENTA 10 | 11 | cyan = Fore.CYAN 12 | 13 | mixed = Fore.RED + Fore.BLUE 14 | 15 | blue = Fore.BLUE 16 | 17 | yellow = Fore.YELLOW 18 | 19 | white = Fore.WHITE 20 | 21 | reset = Style.RESET_ALL 22 | 23 | bold = Style.BRIGHT 24 | 25 | colors = [ green, cyan, blue] 26 | 27 | random_color = random.choice(colors) 28 | 29 | 30 | def common_loader(filename): 31 | 32 | try: 33 | 34 | with open(filename, "r") as data : 35 | 36 | datas = data.read().splitlines() 37 | 38 | return datas 39 | 40 | except FileNotFoundError as e: 41 | 42 | print(f"[{bold}{red}INFO{reset}]: {bold}{white}Pleach check the {filename} exists..{reset}") 43 | 44 | exit() 45 | 46 | except KeyboardInterrupt as e: 47 | 48 | print(f"\n[{bold}{blue}INFO{reset}]: {bold}{white}Probuster exits..{reset}") 49 | 50 | exit() 51 | 52 | except Exception as e: 53 | 54 | pass 55 | 56 | 57 | def default_dns() : 58 | 59 | try: 60 | 61 | with open("dns.txt", "r") as data : 62 | 63 | datas = data.read().splitlines() 64 | 65 | return datas 66 | 67 | except FileNotFoundError as e: 68 | 69 | print(f"[{bold}{red}INFO{reset}]: {bold}{white}Problem in loading inbuilt wordlists please provide a wordlist for DNS Enumeration{reset}") 70 | 71 | exit() 72 | 73 | except KeyboardInterrupt as e: 74 | 75 | print(f"\n[{bold}{blue}INFO{reset}]: {bold}{white}Probuster exits..{reset}") 76 | 77 | exit() 78 | 79 | except Exception as e: 80 | 81 | pass 82 | 83 | 84 | def default_dirb() : 85 | 86 | try: 87 | 88 | with open("dirb.txt", "r") as data : 89 | 90 | datas = data.read().splitlines() 91 | 92 | return datas 93 | 94 | except FileNotFoundError as e: 95 | 96 | print(f"[{bold}{red}INFO{reset}]: {bold}{white}Problem in loading inbuilt wordlists please provide a wordlist for Directory or Files Enumeration{reset}") 97 | 98 | exit() 99 | 100 | except KeyboardInterrupt as e: 101 | 102 | print(f"\n[{bold}{blue}INFO{reset}]: {bold}{white}Probuster exits..{reset}") 103 | 104 | exit() 105 | 106 | except Exception as e: 107 | 108 | pass 109 | 110 | -------------------------------------------------------------------------------- /probuster/probuster.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | """ 3 | The code is a Python script that utilizes the Click library to create a command-line interface for a 4 | tool called Probuster, which includes functionalities for directory enumeration, virtual host 5 | enumeration, DNS enumeration, documentation generation, and updating the tool. 6 | The code provided is a Python script that defines a command-line interface (CLI) using the 7 | Click library for a tool called Probuster. The script includes commands for various functionalities 8 | such as directory enumeration, virtual host enumeration, DNS enumeration, documentation generation, 9 | tool update, and version display and its author: D.Sanjai Kumar @CyberRevoltSecurities. 10 | """ 11 | from colorama import Fore,Style 12 | import click 13 | from bs4 import BeautifulSoup 14 | import time as t 15 | import warnings 16 | import random 17 | import sys 18 | import requests 19 | import asyncio 20 | 21 | warnings.simplefilter('ignore', requests.packages.urllib3.exceptions.InsecureRequestWarning) 22 | 23 | warnings.filterwarnings("ignore") 24 | 25 | red = Fore.RED 26 | 27 | green = Fore.GREEN 28 | 29 | magenta = Fore.MAGENTA 30 | 31 | cyan = Fore.CYAN 32 | 33 | mixed = Fore.RED + Fore.BLUE 34 | 35 | blue = Fore.BLUE 36 | 37 | yellow = Fore.YELLOW 38 | 39 | white = Fore.WHITE 40 | 41 | reset = Style.RESET_ALL 42 | 43 | bold = Style.BRIGHT 44 | 45 | colors = [ green, cyan, blue] 46 | 47 | random_color = random.choice(colors) 48 | 49 | settings = dict(help_option_names=['-h', '--help']) 50 | 51 | 52 | try: 53 | 54 | from .modules.dir.dir import * 55 | 56 | from .modules.dnb.dnb import * 57 | 58 | from .modules.vhost.vhost import * 59 | 60 | from .modules.wordlist.wordlist import * 61 | 62 | from .modules.version.version import * 63 | 64 | from .modules.help.help import * 65 | 66 | from .modules.banner.banner import banner 67 | 68 | except ImportError as e: 69 | 70 | print(f"[{bold}{red}INFO{reset}]: {bold}{white}Import Error occured in Module imports due to: {e}{reset}") 71 | 72 | print(f"[{bold}{blue}INFO{reset}]: {bold}{white}If you are encountering this issue more than a time please report the issues in Probuster Github page.. {reset}") 73 | 74 | exit() 75 | 76 | def doc_file(): 77 | 78 | global file_path 79 | 80 | filename = "probuster_documentation.py" 81 | 82 | path = "/" 83 | 84 | for root,dirs,files in os.walk(path): 85 | 86 | if filename in files: 87 | 88 | file_path = os.path.join(root, filename) 89 | 90 | return file_path 91 | 92 | print(f"[{bold}{red}ALERT{reset}]: Config File not found please kindly install the Probuster with its {filename} file") 93 | 94 | def get_username(): 95 | 96 | try: 97 | 98 | username = os.getlogin() 99 | 100 | except OSError: 101 | 102 | username = os.getenv('USER') or os.getenv('LOGNAME') or os.getenv('USERNAME') or 'Unknown User' 103 | 104 | except Exception as e: 105 | 106 | username = "Unknown User" 107 | 108 | 109 | return username 110 | 111 | def version(): 112 | 113 | latest = check_version() 114 | 115 | version = "v1.0.2" 116 | 117 | if latest == version: 118 | 119 | print(f"[{blue}{bold}Version{reset}]:{bold}{white} Probuster current version {version} ({green}latest{reset}{bold}{white}){reset}") 120 | 121 | else: 122 | 123 | print(f"[{blue}{bold}Version{reset}]: {bold}{white}Probuster current version {version} ({red}outdated{reset}{bold}{white}){reset}") 124 | 125 | 126 | brand = banner() 127 | 128 | username = get_username() 129 | 130 | def hey(ctx, param, value): #Disables the clicks default help and print custom help message for main commands 131 | 132 | if value and not ctx.resilient_parsing: 133 | 134 | if not ctx.invoked_subcommand: 135 | 136 | print(f"{random_color}{brand}{reset}") 137 | 138 | mode_help() 139 | 140 | else: 141 | 142 | ctx.invoke(ctx.command, ['--help']) 143 | 144 | 145 | def validate_match(ctx, param, value): #argsparser nargs="*" converted into in this function to handle users codes of match and includes 146 | 147 | if value is None: 148 | 149 | return 150 | 151 | try: 152 | val = [int(x) for x in value.split(',')] 153 | 154 | return val #returning list so we can compare values 155 | 156 | except Exception as e: 157 | 158 | pass 159 | 160 | print(f"{bold}{white}") 161 | 162 | @click.group(context_settings=settings) 163 | 164 | @click.option("-h", "--help", is_flag=True, is_eager=True, expose_value=False, callback=hey) 165 | 166 | def cli(): 167 | 168 | pass 169 | 170 | @cli.command() 171 | 172 | @click.option("-u", "--url", type=str, help=f"Specify the target domain or ip for Directory/File Enumeration mode") 173 | 174 | @click.option("-c", "--concurrency", type=int, default=500, help="Set Concurrency level for multiple process for Directory or File enumeration (default: 500)") 175 | 176 | @click.option("-w", "--wordlist", type=str, help="Wordlist or hostname for Directory or File enumeration") 177 | 178 | @click.option("-pX", "--proxy", type=str, help="Set proxy to pass your request through proxy (ex: 127.0.0.1:8080)") 179 | 180 | @click.option("-o", "--output", type=str, help="Give a file to save the output for Directory or File enumeration") 181 | 182 | @click.option("-v", "--verbose", is_flag=True, help="Set Verbose to show output (errors)! ") 183 | 184 | @click.option("-t", "--title",is_flag=True, help="Get title of the found Directory or File") 185 | 186 | @click.option("-tO", "--timeout", type=int, help=f"Set timeout for each request (default 10)") 187 | 188 | @click.option("-sV", "--server", is_flag=True, help="Get the server name of the found Directory or File") 189 | 190 | @click.option("-aT", "--application-type", is_flag=True, help="Get the application type of the found Directory or File") 191 | 192 | @click.option("-wC", "--word-count", is_flag=True, help="Get the word count of the found Directory or File") 193 | 194 | @click.option("-nc", "--no-color", is_flag=True, help="Disables the colorization output for found results") 195 | 196 | @click.option("-ar", "--allow-redirect", is_flag=True, help="Enabling it will make probuster to follow redirects") 197 | 198 | @click.option("-mc", "--match", type=str, callback=validate_match, help="Matches the status code given by user for example: -mc 200,302 ") 199 | 200 | @click.option("-ex", "--exclude", type=str, callback=validate_match, help="Excludes the negative codes and gives user desired results for example: -ex 400,500 default(404)") 201 | 202 | @click.option("-h", "--help", is_flag=True) 203 | 204 | def dir(url, concurrency, wordlist, proxy, output, verbose, title, timeout, server, application_type, word_count, no_color, allow_redirect, match, exclude, help): 205 | 206 | click.echo(f"{bold}{random_color}{brand}{reset}") 207 | 208 | version() 209 | 210 | if help: 211 | 212 | dir_mode_help() 213 | 214 | if url: 215 | 216 | if url.startswith(("https://", "http://")): 217 | 218 | url = url if url.endswith("/") else f"{url}/" 219 | 220 | elif url.startswith(("https://", "http://")): 221 | 222 | url = f"http://{url}" if url.endswith("/") else f"https://{url}/" 223 | else: 224 | 225 | click.echo(f"[{bold}{red}INFO{reset}]: {bold}{white}Please provide a --url or -u value with https:// or http:// protocol{reset}") 226 | 227 | exit() 228 | 229 | 230 | if not url: 231 | 232 | click.echo(f"[{bold}{red}INFO{reset}]: {bold}{white}Please provide -u or --url value for Directory or File enumeration{reset}") 233 | 234 | dir_mode_help() 235 | 236 | exit() 237 | 238 | common = "/usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt" 239 | 240 | wordlists = wordlist if wordlist else common 241 | 242 | 243 | 244 | click.echo(f"""{bold}{white} 245 | 246 | ======================================================================================== 247 | [!]User : {username} 248 | 249 | [!]Mode : Directory or File Enumeration 250 | 251 | [!]Target : {url} 252 | 253 | [!]Wordlist : {wordlists} 254 | 255 | [!]Concurrency : {concurrency} 256 | 257 | [!]Time-Out : {timeout} 258 | 259 | ========================================================================================{reset} 260 | """) 261 | 262 | hosts = common_loader(wordlists) 263 | 264 | 265 | 266 | dirb = [] 267 | 268 | for host in hosts: 269 | 270 | dirb.append(f"{url}{host}") 271 | 272 | 273 | 274 | 275 | asyncio.run(dirbust_threader(dirb, concurrency,proxy, output, verbose, title, timeout, server, application_type, word_count, no_color, allow_redirect, match, exclude)) 276 | 277 | 278 | @cli.command() 279 | 280 | @click.option("-u", "--url", type=str, help="Specify the target ip or host for vitrual host enumeration ( Most probably use IP address as the URL argument)") 281 | 282 | @click.option("-c", "--concurrency", type=int, default=500, help="Set Concurrency level for concurrency process for virtual host enumeration (default: 200)") 283 | 284 | @click.option("-w", "--wordlist", type=str, help="Wordlist or hostname for brutforce and find virtual host") 285 | 286 | @click.option("-pX", "--proxy", type=str, help="Set proxy to pass your request through proxy (ex: 127.0.0.1:8080)") 287 | 288 | @click.option("-o", "--output", type=str, help="Give a file to save the output of virtual host enumeration") 289 | 290 | @click.option("-v", "--verbose", is_flag=True, help="Set Verbose to show output (errors)! ") 291 | 292 | @click.option("-t", "--title",is_flag=True, help="Get title of the found virtual host") 293 | 294 | @click.option("-tO", "--timeout", type=int, help="Set timeout for each request (default 10)") 295 | 296 | @click.option("-sV", "--server", is_flag=True, help="Get the server name of the found virtual host") 297 | 298 | @click.option("-aT", "--application-type", is_flag=True, help="Get the server name of the found virtual host") 299 | 300 | @click.option("-wC", "--word-count", is_flag=True, help="Get the word count of the found virtual host") 301 | 302 | @click.option("-nc", "--no-color", is_flag=True, help="Disables the colorization output for found results") 303 | 304 | @click.option("-ar", "--allow-redirect", is_flag=True, help="Enabling it will make probuster to follow redirects") 305 | 306 | @click.option("-mc", "--match", type=str, callback=validate_match, help="Matches the status code given by user for example: -mc 200,302 ") 307 | 308 | @click.option("-ex", "--exclude", type=str, callback=validate_match, help="Excludes the negative codes and gives user desired results for example: -ex 400,500 default(404)") 309 | 310 | @click.option("-h", "--help", is_flag=True) 311 | 312 | 313 | def vhost(url, concurrency, wordlist, proxy, output, verbose, title, timeout, server, application_type, word_count, no_color, allow_redirect, match, exclude, help): 314 | 315 | click.echo(f"{random_color}{brand}{reset}") 316 | 317 | version() 318 | 319 | if help: 320 | 321 | vhost_mode_help() 322 | 323 | if url: 324 | 325 | if url: 326 | 327 | if url.startswith(("https://", "http://")): 328 | 329 | url = url if url.endswith("/") else f"{url}/" 330 | 331 | elif url.startswith(("https://", "http://")): 332 | 333 | url = f"http://{url}" if url.endswith("/") else f"https://{url}/" 334 | else: 335 | 336 | click.echo(f"[{bold}{red}INFO{reset}]: {bold}{white}Please provide a --url or -u value with https:// or http:// protocol{reset}") 337 | 338 | exit() 339 | 340 | 341 | if not url: 342 | 343 | click.echo(f"[{bold}{red}INFO{reset}]: {bold}{white}Please provide -u or --url value for Directory or File enumeration{reset}") 344 | 345 | vhost_mode_help() 346 | 347 | exit() 348 | 349 | if not wordlist: 350 | 351 | click.echo(f"[{bold}{red}INFO{reset}]: {bold}{white}Please provide a wordlist for Virtual enumeration mode{reset}") 352 | exit() 353 | 354 | 355 | 356 | click.echo(f"""{bold}{white} 357 | 358 | ======================================================================================== 359 | [!]User : {username} 360 | 361 | [!]Mode : Virtual Host Enumeration 362 | 363 | [!]Target : {url} 364 | 365 | [!]Wordlist : {wordlist} 366 | 367 | [!]Concurrency : {concurrency} 368 | 369 | [!]Time-Out : {timeout} 370 | 371 | ========================================================================================{reset} 372 | """) 373 | 374 | hosts = common_loader(wordlist) 375 | 376 | if len(hosts) > 0: 377 | 378 | asyncio.run(vhost_threader(hosts, url, concurrency, proxy, output, verbose, title, timeout, server, application_type, word_count, no_color, allow_redirect, match, exclude )) 379 | 380 | else: 381 | 382 | click.echo(f"[{bold}{red}INFO{reset}]: {bold}{white}Please provide a good wordlists for Virtual Hosts Enumeration{reset}") 383 | 384 | exit() 385 | 386 | 387 | @cli.command() 388 | 389 | @click.option("-d", "--domain", type=str, help="Domain name for Dns Brutforcing and find subdomains") 390 | 391 | @click.option("-sip", "--show-ip", is_flag=True, help="Enable --show-ip will show the ip address of the found subdomain") 392 | 393 | @click.option("-c", "--concurrency", type=int, default=500, help="Set Concurrency level for concurrency process for DNS enumeration (default: 500)") 394 | 395 | @click.option("-w", "--wordlist", type=str, help="Wordlist for brutforcing subdomains") 396 | 397 | @click.option("-o", "--output", type=str, help="Give a file to save the output of DNS enumeration") 398 | 399 | @click.option("-v", "--verbose",is_flag=True, help="Set Verbose to show output (errors)!") 400 | 401 | @click.option("-nc", "--no-color", is_flag=True, help="Enable --no-color will print the output without any colors") 402 | 403 | @click.option("-h", "--help", is_flag=True) 404 | 405 | 406 | def dns(domain, show_ip, concurrency, wordlist, output, verbose, no_color, help): 407 | 408 | click.echo(f"{random_color}{brand}{reset}") 409 | 410 | version() 411 | 412 | if help: 413 | 414 | dns_mode_help() 415 | 416 | 417 | asyncio.run(dnb_handler(domain, show_ip, concurrency, wordlist, output, verbose, no_color, username)) 418 | 419 | 420 | @cli.command() 421 | 422 | @click.option("-shd", "--show_doc", is_flag=True, help="Enable it for generating a documentation for probuster") 423 | 424 | @click.option("-h", "--help", is_flag=True) 425 | 426 | 427 | def doc(show_doc, help): 428 | 429 | click.echo(f"{random_color}{brand}{reset}") 430 | 431 | version() 432 | 433 | if help: 434 | 435 | doc_mode_help() 436 | 437 | 438 | print(f"[{bold}{blue}INFO{reset}]: {bold}{white}Hey {username} it will take few minutes to generate documentation, Please wait..{reset}") 439 | 440 | if show_doc: 441 | 442 | stream = doc_file() 443 | 444 | 445 | os.system(f'streamlit run {stream}') 446 | 447 | elif not show_doc: 448 | 449 | stream = doc_file() 450 | 451 | os.system(f'streamlit run {stream}') 452 | 453 | 454 | @cli.command() 455 | 456 | @click.option("-lt", "--latest", is_flag=True) 457 | 458 | @click.option("-h", "--help", is_flag=True) 459 | 460 | 461 | def update(latest, help): 462 | 463 | click.echo(f"{random_color}{brand}{reset}") 464 | 465 | if help: 466 | 467 | update_mode_help() 468 | 469 | 470 | latests = "1.0.2" 471 | 472 | version = check_version() 473 | 474 | if latests == version: 475 | 476 | click.echo(f"[{bold}{white}INFO{reset}]: {bold}{white}Hey {username} Probuster is already in latest version{reset}") 477 | 478 | else: 479 | 480 | click.echo(f"[{bold}{blue}INFO{reset}]: {bold}{white}Updating Probuster latest version from git.{reset}") 481 | 482 | os.system(f"pip install git+https://github.com/sanjai-AK47/Probuster.git") 483 | 484 | click.echo(f"[{bold}{blue}INFO{reset}]: {bold}{white}Hey {username} Probuster is updated successfully , Please check it once manually.{reset}") 485 | 486 | 487 | if __name__ == "__main__": 488 | 489 | cli() 490 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | click>=8.1.7 2 | aiofiles>=23.2.1 3 | aiohttp>=3.8.6 4 | alive_progress>=3.1.4 5 | art>=6.1 6 | beautifulsoup4>=4.11.1 7 | colorama>=0.4.4 8 | httpx>=0.26.0 9 | Requests>=2.31.0 10 | streamlit>=1.29.0 11 | urllib3>=2.1.0 12 | asyncio>=3.4.3 13 | anyio>=4.2.0 14 | h11==0.13.0 15 | aiodnsresolver>=0.0.155 -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup, find_packages 2 | 3 | setup( 4 | name='probuster', 5 | version='1.0.2', 6 | author='D. Sanjai Kumar', 7 | author_email='bughunterz0047@gmail.com', 8 | description=' A Python based Web Application Penetration testing tool for Information Gathering and Content Discovery', 9 | packages=find_packages(), 10 | py_modules=['probuster'], 11 | install_requires=[ 12 | 'alive_progress>=3.1.4', 13 | 'art>=6.1', 14 | 'beautifulsoup4>=4.11.1', 15 | 'colorama>=0.4.4', 16 | 'httpx>=0.26.0', 17 | 'Requests>=2.31.0', 18 | 'rich>=13.7.0', 19 | 'urllib3>=1.26.18', 20 | 'streamlit>=1.29.0', 21 | 'aiofiles>=23.2.1', 22 | 'aiohttp>=3.8.6', 23 | 'asyncio>=3.4.3', 24 | 'h11==0.13.0', 25 | 'anyio>=4.2.0', 26 | 'aiodnsresolver>=0.0.155', 27 | 'click>=8.1.7' 28 | ], 29 | entry_points={ 30 | 'console_scripts': [ 31 | 'probuster = probuster.probuster:cli' 32 | ] 33 | }, 34 | ) --------------------------------------------------------------------------------