├── requirements.txt ├── screenshot.jpg ├── .github ├── ISSUE_TEMPLATE │ └── feature_request.md └── workflows │ └── python-publish.yml ├── LICENSE ├── README.md ├── main.py ├── directory.txt └── update.py /requirements.txt: -------------------------------------------------------------------------------- 1 | requests 2 | rich 3 | -------------------------------------------------------------------------------- /screenshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tausifzaman/AdminDirectoryFinder/HEAD/screenshot.jpg -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Tausif Zaman 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 |
2 | 3 | # AdminDirectoryFinder 4 | 5 |

6 |   7 |   8 |   9 | 10 |

11 |

12 | Admin Directory Finder is a tool designed to scan and identify directories under admin paths, such as admin/dashboard.php. It helps in security testing by detecting hidden or sensitive admin panels within a web application. Ideal for penetration testers and developers to ensure proper access control and security measures.

13 | 14 | ## Language 15 |
16 |
17 |
18 | 19 | ## Menu 20 | ![AdminDirectoryFinder](https://raw.githubusercontent.com/tausifzaman/AdminDirectoryFinder/refs/heads/main/screenshot.jpg) 21 | 22 | 23 | ## One Line Code 24 | ``` 25 | git clone https://github.com/tausifzaman/AdminDirectoryFinder.git && cd AdminDirectoryFinder && pip install -r requirements.txt && python3 main.py 26 | ``` 27 | ### Install Line Individually 28 | ``` 29 | git clone https://github.com/tausifzaman/AdminDirectoryFinder.git 30 | ``` 31 | ``` 32 | cd AdminDirectoryFinder 33 | ``` 34 | ``` 35 | pip install -r requirements.txt 36 | ``` 37 | ``` 38 | python3 main.py 39 | ``` 40 | -------------------------------------------------------------------------------- /.github/workflows/python-publish.yml: -------------------------------------------------------------------------------- 1 | # This workflow will upload a Python Package to PyPI when a release is created 2 | # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python#publishing-to-package-registries 3 | 4 | # This workflow uses actions that are not certified by GitHub. 5 | # They are provided by a third-party and are governed by 6 | # separate terms of service, privacy policy, and support 7 | # documentation. 8 | 9 | name: Upload Python Package 10 | 11 | on: 12 | release: 13 | types: [published] 14 | 15 | permissions: 16 | contents: read 17 | 18 | jobs: 19 | release-build: 20 | runs-on: ubuntu-latest 21 | 22 | steps: 23 | - uses: actions/checkout@v4 24 | 25 | - uses: actions/setup-python@v5 26 | with: 27 | python-version: "3.x" 28 | 29 | - name: Build release distributions 30 | run: | 31 | # NOTE: put your own distribution build steps here. 32 | python -m pip install build 33 | python -m build 34 | 35 | - name: Upload distributions 36 | uses: actions/upload-artifact@v4 37 | with: 38 | name: release-dists 39 | path: dist/ 40 | 41 | pypi-publish: 42 | runs-on: ubuntu-latest 43 | needs: 44 | - release-build 45 | permissions: 46 | # IMPORTANT: this permission is mandatory for trusted publishing 47 | id-token: write 48 | 49 | # Dedicated environments with protections for publishing are strongly recommended. 50 | # For more information, see: https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment#deployment-protection-rules 51 | environment: 52 | name: pypi 53 | # OPTIONAL: uncomment and update to include your PyPI project URL in the deployment status: 54 | # url: https://pypi.org/p/YOURPROJECT 55 | # 56 | # ALTERNATIVE: if your GitHub Release name is the PyPI project version string 57 | # ALTERNATIVE: exactly, uncomment the following line instead: 58 | # url: https://pypi.org/project/YOURPROJECT/${{ github.event.release.name }} 59 | 60 | steps: 61 | - name: Retrieve release distributions 62 | uses: actions/download-artifact@v4 63 | with: 64 | name: release-dists 65 | path: dist/ 66 | 67 | - name: Publish release distributions to PyPI 68 | uses: pypa/gh-action-pypi-publish@release/v1 69 | with: 70 | packages-dir: dist/ 71 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import os 3 | import threading 4 | from queue import Queue 5 | from rich.console import Console 6 | from rich.panel import Panel 7 | from rich.progress import Progress, BarColumn, TextColumn 8 | from time import sleep 9 | os.system("clear" if os.name == "posix" else "cls") 10 | 11 | console = Console() 12 | 13 | logo = """ 14 | _ _ ____ _ _____ _ _ 15 | / \ __| | _ \(_)_ __| ___(_)_ __ __| | ___ _ __ 16 | / _ \ / _` | | | | | '__| |_ | | '_ \ / _` |/ _ \ '__| 17 | / ___ \ (_| | |_| | | | | _| | | | | | (_| | __/ | 18 | /_/ \_\__,_|____/|_|_| |_| |_|_| |_|\__,_|\___|_| V.1.0 19 | Advanced Multi-URL Admin Directory Finder 20 | 21 | Instagram @_tausif_zaman""" 22 | 23 | console.print(Panel.fit(logo, style="bold cyan", title="[bold yellow]Tausif's Tool")) 24 | 25 | while True: 26 | user_input = console.input("[bold cyan]Enter URLs (comma-separated for multiple domain) : [/]").strip() 27 | 28 | if not user_input: 29 | console.print("[red]Error: Please enter at least one valid URL.[/]") 30 | continue 31 | 32 | urls = [url.strip().rstrip("/") for url in user_input.split(",") if url.strip()] 33 | 34 | urls = [("http://" + url) if not url.startswith("http") else url for url in urls] 35 | 36 | if urls: 37 | break 38 | 39 | dir_file = "directory.txt" 40 | if not os.path.exists(dir_file): 41 | console.print("[bold red]Error: directory.txt not found![/]") 42 | exit() 43 | 44 | with open(dir_file, "r") as f: 45 | directories = [line.strip().lstrip("/") for line in f.readlines() if line.strip()] 46 | 47 | total_dirs = len(directories) 48 | console.print(f"\n[bold green]Total Directories to Scan:[/] {total_dirs} per URL\n") 49 | 50 | num_threads = 10 51 | queue = Queue() 52 | 53 | with Progress( 54 | TextColumn("[bold yellow]{task.percentage:>3.0f}%[/]"), 55 | BarColumn(), 56 | TextColumn("[cyan]{task.completed}/{task.total} Scanned[/]"), 57 | console=console 58 | ) as progress: 59 | 60 | task = progress.add_task("Scanning", total=total_dirs * len(urls)) 61 | 62 | def scan_directory(): 63 | while not queue.empty(): 64 | target_url, directory = queue.get() 65 | full_url = f"{target_url}/{directory}" 66 | 67 | try: 68 | response = requests.get(full_url, timeout=5, allow_redirects=False) 69 | status_code = response.status_code 70 | 71 | if status_code in [301, 302]: 72 | console.print(f"[bold green][{status_code}][/] {full_url}") 73 | elif status_code == 200: 74 | console.print(f"[bold white][{status_code}][/] {full_url}") 75 | elif status_code != 404: 76 | console.print(f"[bold red][{status_code}][/] {full_url}") 77 | 78 | except requests.exceptions.RequestException: 79 | console.print(f"[bold red][ERROR][/] Failed to connect: {full_url}") 80 | 81 | progress.update(task, advance=1) 82 | sleep(0.1) 83 | queue.task_done() 84 | 85 | for url in urls: 86 | for directory in directories: 87 | queue.put((url, directory)) 88 | 89 | threads = [] 90 | for _ in range(num_threads): 91 | t = threading.Thread(target=scan_directory) 92 | t.start() 93 | threads.append(t) 94 | 95 | for t in threads: 96 | t.join() 97 | 98 | console.print("\n[bold green]Scanning Complete![/]") 99 | -------------------------------------------------------------------------------- /directory.txt: -------------------------------------------------------------------------------- 1 | dashboard.php 2 | index.php 3 | login.php 4 | logout.php 5 | settings.php 6 | config.php 7 | users.php 8 | user.php 9 | add_user.php 10 | edit_user.php 11 | delete_user.php 12 | roles.php 13 | posts.php 14 | add_post.php 15 | edit_post.php 16 | categories.php 17 | media.php 18 | logs.php 19 | error_log.php 20 | activity_log.php 21 | firewall.php 22 | ban_list.php 23 | backup.php 24 | update.php 25 | maintenance.php 26 | transactions.php 27 | orders.php 28 | invoice.php 29 | api.php 30 | webhooks.php 31 | integrations.php 32 | analytics.php 33 | notifications.php 34 | support.php 35 | controlpanel.php 36 | cp.php 37 | account.php 38 | banner.php 39 | addproduct.php 40 | user.php 41 | addpage.php 42 | gallery.php 43 | image.php 44 | adminuser.php 45 | productadd.php 46 | addadmin.php 47 | menu.php 48 | home.php 49 | add_admin.php 50 | addnews.php 51 | addpost.php 52 | addforum.php 53 | addgame.php 54 | addblog.php 55 | admin_detail.php 56 | loginpage.php 57 | admin_area.php 58 | loginl.php 59 | index1.php 60 | add_Products.php 61 | showbook.php 62 | selectitem.php 63 | news.php 64 | addfile.php 65 | addarticle.php 66 | addfile.php 67 | upload.php 68 | addstql.php 69 | addshow.php 70 | addmember.php 71 | addinfo.php 72 | addcat.php 73 | productshow.php 74 | addjob.php 75 | addp1c.php 76 | viewproduct.php 77 | addaccount.php 78 | mannge.php 79 | addcontact.php 80 | viewmanages.php 81 | addschool.php 82 | addproject.php 83 | addsale.php 84 | addcompany.php 85 | payment.php 86 | emp.php 87 | addmovie.php 88 | addpassword.php 89 | addemployee.php 90 | addcart.php 91 | admin.php 92 | admincp.php 93 | settings.php 94 | addstate.php 95 | addcountry.php 96 | addmedia.php 97 | addcode.php 98 | addlinks.php 99 | addcity.php 100 | product_add.php 101 | additem.php 102 | addstore.php 103 | Dashboard.php 104 | home.php 105 | travelclass.php 106 | developer.php 107 | bookings.php 108 | transactions.php 109 | 110 | dashboard.aspx 111 | index.aspx 112 | login.aspx 113 | logout.aspx 114 | settings.aspx 115 | config.aspx 116 | users.aspx 117 | user.aspx 118 | add_user.aspx 119 | edit_user.aspx 120 | delete_user.aspx 121 | roles.aspx 122 | posts.aspx 123 | add_post.aspx 124 | edit_post.aspx 125 | categories.aspx 126 | media.aspx 127 | logs.aspx 128 | error_log.aspx 129 | activity_log.aspx 130 | firewall.aspx 131 | ban_list.aspx 132 | backup.aspx 133 | update.aspx 134 | maintenance.aspx 135 | transactions.aspx 136 | orders.aspx 137 | invoice.aspx 138 | api.aspx 139 | webhooks.aspx 140 | integrations.aspx 141 | analytics.aspx 142 | notifications.aspx 143 | support.aspx 144 | controlpanel.aspx 145 | account.aspx 146 | banner.aspx 147 | addproduct.aspx 148 | user.aspx 149 | addpage.aspx 150 | gallery.aspx 151 | image.aspx 152 | adminuser.aspx 153 | productadd.aspx 154 | addadmin.aspx 155 | menu.aspx 156 | home.aspx 157 | add_admin.aspx 158 | addnews.aspx 159 | addpost.aspx 160 | addforum.aspx 161 | addgame.aspx 162 | addblog.aspx 163 | admin_detail.aspx 164 | loginpage.aspx 165 | admin_area.aspx 166 | loginl.aspx 167 | index1.aspx 168 | add_Products.aspx 169 | showbook.aspx 170 | selectitem.aspx 171 | news.aspx 172 | addfile.aspx 173 | addarticle.aspx 174 | addfile.aspx 175 | upload.aspx 176 | addstql.aspx 177 | addshow.aspx 178 | addmember.aspx 179 | addinfo.aspx 180 | addcat.aspx 181 | cp.aspx 182 | productshow.aspx 183 | addjob.aspx 184 | addp1c.aspx 185 | viewproduct.aspx 186 | addaccount.aspx 187 | mannge.aspx 188 | addcontact.aspx 189 | viewmanages.aspx 190 | addschool.aspx 191 | addproject.aspx 192 | addsale.aspx 193 | addcompany.aspx 194 | payment.aspx 195 | emp.aspx 196 | addmovie.aspx 197 | addpassword.aspx 198 | addemployee.aspx 199 | addcart.aspx 200 | admin.aspx 201 | admincp.aspx 202 | settings.aspx 203 | addstate.aspx 204 | addcountry.aspx 205 | addmedia.aspx 206 | addcode.aspx 207 | addlinks.aspx 208 | addcity.aspx 209 | product_add.aspx 210 | additem.aspx 211 | addstore.aspx 212 | 213 | 214 | assets/ 215 | includes/ 216 | modules/ 217 | templates/ 218 | uploads/ 219 | backups/ 220 | logs/ 221 | temp/ 222 | ajax/ 223 | js/ 224 | 225 | 226 | -------------------------------------------------------------------------------- /update.py: -------------------------------------------------------------------------------- 1 | import os 2 | import requests 3 | import hashlib 4 | os.system("clear" if os.name == "posix" else "cls") 5 | 6 | REPO_URL = "https://raw.githubusercontent.com/tausifzaman/AdminDirectoryFinder/refs/heads/main/" 7 | GITHUB_DIR = "https://github.com/tausifzaman/AdminDirectoryFinder" 8 | 9 | FILES = [ 10 | "main.py", 11 | "directory.txt", 12 | "README.md", 13 | "LICENSE", 14 | "update.py" 15 | ] 16 | 17 | LOGO = r""" 18 | / |/ | .-~/ 19 | T\ Y I |/ / _ 20 | /T | \I | I Y.-~/ 21 | I l /I T\ | | l | T / 22 | T\ | \ Y l /T | \I l \ ` l Y 23 | __ | \l \l \I l __l l \ ` _. | 24 | \ ~-l `\ `\ \ \ ~\ \ `. .-~ | 25 | \ ~-. "-. ` \ ^._ ^. "-. / \ | 26 | .--~-._ ~- ` _ ~-_.-"-." ._ /._ ." ./ 27 | >--. ~-. ._ ~>-" "\ 7 7 ] 28 | ^.___~"--._ ~-{ .-~ . `\ Y . / | 29 | <__ ~"-. ~ /_/ \ \I Y : | 30 | ^-.__ ~(_/ \ >._: | l______ 31 | ^--.,___.-~" /_/ ! `-.~"--l_ / ~"-. 32 | (_/ . ~( /' "~"--,Y -=b-. _) 33 | (_/ . \ : / l c"~o \ 34 | \ / `. . .^ \_.-~"~--. ) 35 | (_/ . ` / / ! )/ 36 | / / _. '. .': / ' 37 | ~(_/ . / _ ` .-<_ 38 | /_/ . ' .-~" `. / \ \ ,z=. 39 | ~( / ' : | K "-.~-.______// 40 | "-,. l I/ \_ __{--->._(==. 41 | //( \ < ~"~" // 42 | /' /\ \ \ ,v=. (( 43 | .^. / /\ " }__ //===- ` 44 | / / ' ' "-.,__ {---(==- 45 | .^ ' : T ~" ll instagram : @_tausif_zaman 46 | / . . . : | :! \ github.com/tausifzaman 47 | (_/ / | | j-" ~^ 48 | ~-<_(_.^-~" 49 | """ 50 | 51 | def sha256_file(filepath): 52 | if not os.path.exists(filepath): 53 | return None 54 | with open(filepath, "rb") as f: 55 | return hashlib.sha256(f.read()).hexdigest() 56 | 57 | def sha256_url(url): 58 | try: 59 | r = requests.get(url) 60 | if r.status_code == 200: 61 | return hashlib.sha256(r.content).hexdigest(), r.content 62 | except: 63 | return None, None 64 | return None, None 65 | 66 | def main(): 67 | print("\033[93m" + LOGO + "\033[0m") # Yellow color 68 | 69 | updated_files = [] 70 | 71 | for file in FILES: 72 | local_hash = sha256_file(file) 73 | remote_hash, _ = sha256_url(REPO_URL + file) 74 | 75 | if remote_hash is None: 76 | print(f"[-] Could not fetch remote hash for {file}") 77 | continue 78 | 79 | if local_hash != remote_hash: 80 | status = "Added" if local_hash is None else "Updated" 81 | updated_files.append((file, status)) 82 | 83 | if not updated_files: 84 | print("[✓] All files are up to date.") 85 | return 86 | 87 | print("\n[!] Updates available for the following files:") 88 | for file, status in updated_files: 89 | print(f" - {file} [{status}]") 90 | 91 | choice = input("\n[?] Do you want to update these files? (y/n): ").strip().lower() 92 | if choice != "y": 93 | print("[-] Update cancelled by user.") 94 | return 95 | 96 | for file, _ in updated_files: 97 | try: 98 | res = requests.get(REPO_URL + file) 99 | if res.status_code == 200: 100 | with open(file, "wb") as f: 101 | f.write(res.content) 102 | print(f"[+] {file} updated successfully.") 103 | else: 104 | print(f"[-] Failed to download {file}") 105 | except Exception as e: 106 | print(f"[-] Error updating {file}: {e}") 107 | 108 | print("\n[✓] All selected files updated successfully.") 109 | 110 | if __name__ == "__main__": 111 | main() 112 | --------------------------------------------------------------------------------