├── 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 | 
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 |
--------------------------------------------------------------------------------