EndpointScanner: Website Endpoint Scanner and Rate Limit Tester (Version 7.5)
Source code at: EndpointScanner Repository
The dev branch hosts new features that may not be the full update, main branch will only contain stable updates to install.
Note: endpoints and paths in this documentation mean the same thing.
A fast automated website reconnaissance tool for red teaming in cybersecurity that extracts paths, endpoints, files, subdomains, and even external links from modern websites. Automated IDOR and broken access control vulnerability testing through replacing variables with 1 in endpoints/paths. Has a built in rate limit tester that can test on any endpoint with 4 HTTP methods, and can bypass simple WAFs/captchas and SPAs.
Navigation
- Benchmark against popular tools
- How it works
- All flags
- Installation
- Example Commands
- Release Notes
- Legal Disclaimer
Feel free to contact me at sphericalflower@gmail.com to ask for help on how to use the tool or to leave feedback.
How it works
- Uses curl_cffi to bypass simple captchas via TLS/JA3 fingerperint impersonation
- Uses playwright-stealth browser instead of usual Playwright to remove giveaways in the browser. (more details about playwright near the bottom of the README)
- Scans extra map files like
robots.txtandsitemap.xmlfor more paths - Uses a fake path to test which are real paths and which are shells. (websites like SPAs give a lot of trouble to current tools)
- Scrapes all JavaScript, HTML and XML files to find paths in the website.
- Has a hardcoded set of paths that should never exist in a website to test. (e.g. .env.local, .git/config)
- Differentiates paths by website endpoints, assets, redirects etc.
- Replaces {example} variables in paths with a custom string to be able to test the paths, and can also test for broken access control.
- Checks server uptime and prints out JS Stack of the website (these are extra details, a flag is needed to show the extra details.)
- Has a rate limit tester by sending
nnumber requests to a certain endpoint with 4 HTTP methods, custom headers, body, variable in request body.
Tool flags
All passable flags for the tool:
| Flag | Short Form | Description |
|---|---|---|
target |
NIL |
URL |
--ratelimit |
-r |
Number of requests to send during the rate limit test. Default is 100. |
--ratelimit-type |
-rt |
HTTP Method to use for the rate limit test. Defaults to GET. |
--ratelimit-body |
-rb |
Payload data to send in request to use for POST, PATCH and PUT requests. If the custom payload contains double quotes, please use single quotes instead of double quotes to pass this flag. |
--ratelimit-var |
-rv |
Variable in payload data (e.g. {X}) to use. |
--force |
NIL |
Mandatory flag to pass if doing a rate limit test with over 2500 requests using a non-GET HTTP method. Has no short form flag. |
--testpath |
-t |
Endpoint to test for rate limiting. |
--show-404s |
-s |
Show endpoints tested that returned a 404 or an SPA shell. |
--disable-structure-files |
-ds |
Disable scanning of site structure files (robots, sitemaps, manifests, etc.) |
--show-media |
-m |
Include assets/media like images and fonts and videos in scan results |
--show-prog |
-sp |
Print endpoints to the terminal one by one in real-time as they are found. Warning: Progress will show duplicate paths if endpoints are defined multiple times in the code. Use the flag -nd to remove duplicates from progress. Results will not contain duplicates. |
--output-file |
-o |
Save formatted results directly to a local text file. |
--disable-og |
-do |
Disable code from showing the original endpoint with variables. Keeps output tidier. Will NOT remove original tag from progress if the --show-prog flag is present. |
--tidy |
-ti |
Script will not show where it got extra endpoints from, and will not show if it is a client side route and requires login, or react shell. Will also not show if an endpoint is a potential service. |
--tidy-all |
-ta |
Flags --disable-og and --tidy combined. |
--extra-details |
-ed |
Print out extra info that may not be directly related to the endpoints |
--only-original |
-oo |
Only show the original version of the flag instead of it being replaced with a 1. Will also affect show prog. |
--show-source |
-ss |
Print the source of each endpoint during progress, like printing out which file it found the endpoint from. |
--scan-timeout |
-st |
Stop scan completely after given number of minutes and print/save any results found in that time window. Will leave unsorted endpoints in a section labelled 'UNSORTED', and will leave out sensitive endpoints. Will NOT interrupt rate limiting test. |
--sort-output |
-so |
Sort out endpoints. |
--ratelimit-header |
-rh |
Custom headers. Must be seperated by a pipe(|), or newlines. Example use: Cookies: {ExampleCookie: example} | Accept: application/json, text/plain, */*. If the custom header contains double quotes, please use single quotes instead of double quotes to pass this flag. |
--no-duplicate-prog |
-nd |
If --show-progress is passed, duplicate endpoints in progress will not be shown. |
--local |
-l |
Necessary flag if the site being tested on is a local site like a localhost or 127.0.0.1:port. |
--no-detect-captcha |
-ndc |
Flag to disable captcha detection function, in case it returns false positives and did not actually get blocked but thinks it did. |
--external-script-loader |
-esl |
Add external domains used for loading script files into the website itself so that their code files will also be scanned for endpoints. |
--all-esl-protocol |
-aep |
Flag to automatically add https/http to every single external script loader that is not defined at the start. Does nothing if -esl is not passed. |
--extra-header |
-eH |
Add extra headers you want for the website like cookies or authorization etc. Also applies to rate limit test even if -orlt is passed. |
--no-headless |
-nh |
Playwright browser used will not be headless, serves as a debug function. |
--disable-sensitive-endpoint |
-dse |
Flag to disable testing sensitive endpoints, allowing the tool to send less requests. |
--still-show-invalid |
-ssi |
Show endpoints that were flagged as invalid. |
--only-ratelimit-test |
-orlt |
Make the scanner only test for rate limiting. |
--ratelimit-await-time |
-rat |
Adjust rate limiting test await time for small or extremely large request quantities. Default is 50. Time is in seconds. |
--pipeable |
-p |
Make the tool pipeable by automatically passing other arguments. |
--path-sub |
-ps |
Change the default path normalization replacement from 1 to a custom string. |
--only-sub |
-os |
Make the tool only output subdomains. |
--only-external |
-ox |
Make the tool only output external links. |
--only-endpoints |
-oe |
Make the tool only output endpoints. Does not include assets, services/apis. |
--depth |
-de |
How deep the recursive scanning for both js and xml files can go. Defaults to infinite. |
--parse-zip |
-pz |
Allow the tool to expand .zip and .gz files (e.g. sitemap.xml.gz) and scrape from them. |
--no-auto-input |
-nai |
Disable automatic input after a set amount of time. |
--filter-out-more |
-fm |
Filter out more unhelpful results like w3.org or schema.org |
--no-headless-browser |
-nhb |
Script will not use the headless browser at all, and use a request instead to get the html body. |
--auto-input-time |
-ait |
Customise amount of time taken for automatic input if you don't answer in seconds. Default 90 seconds. |
Installation
You can install EndpointScanner via PyPI.
Installation via PyPI (or pip)
Main Package
You MUST have python 3.9 or above to use this tool! To install the official endpointscanner Python package:
Command for MacOS/Linux:
pip install endpointscanner
Command for Windows Command Prompt:
pip install endpointscanner
Playwright Installation
After that, install chromium on playwright (playwright will be installed when you install endpointscanner):
Command for MacOS/Linux:
playwright install chromium
Command for Windows Command Prompt:
py -m playwright install chromium
Example Commands
Example command to run to scan a site (show inaccessible endpoints, show assets, show progress as it finds endpoints, and show files that it got endpoints from):
endpointscanner https://example.com -s -m -sp -ss
Example command to run to test a site (Assuming you are testing 5000 requests and creating 5k accounts)
endpointscanner example.com -r 5000 -t /signup -rt POST -rb '{"username":"ExampleUser{X}", "pass":"ExamplePassword"}' -rv '{X}' --force -rh 'POST /signup HTTP/2
Host: example.com
Cookie: clearedcaptcha=true
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:151.0) Gecko/20100101 Firefox/151.0
Accept: application/json, text/plain, */*
Accept-Language: en-US,en;q=0.9
Prefer: safe
Accept-Encoding: gzip, deflate, br
Content-Type: application/json
Content-Length: 60
Origin: https://example.com
Referer: https://example.com/
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
Priority: u=0
Te: trailers'
Example command to only show the original endpoint without adjusting the variable and output to a file:
endpointscanner example.com -oo -o examplescan.txt
Release notes
New features in update 7.5
-rat/--ratelimit-await-timeflag, as th default is 50s and for a PoC with 50-100 requests 50 seconds is way too long.-p/--pipeableflag to make the output of the tool pipeable into other automated payload testing tools. (E.g. sqlmap)-ps/--path-subflag to change the automated path normalization from replacing variables to 1 to any custom string. Defaults to 1.- Merged
asset-manifest.json,web-manifest.json,manifest.jsoninto one loop. - added
-de/--depthflag - Made the sitemap loop (which previous only scanned
.xmlfiles) be able to scan.xml, .txt, .rss, .atomfiles.- Able to scan
.gzand.zipfiles if the flag-pz/--parse-zipis passed. (Detects based off the file extension)
- Able to scan
- Added endpoints to the
SENSITIVE_ENDPOINTset like actuator endpoints and swagger ui - Added automatic input where if you don't answer input questions after a set time (default 90 seconds) (e.g. an input where you must say if you want to sort endpoints or not). Can be disabled via the
-nai/--no-auto-inputflag. - Fixed a bug in the rate-limiting tester where the rate limit testing function would crash if the number of requests was too high by using a queue.
- Replace
/*paths in robots.txt with '1' as * means everything, showing you the original path. This will also be affected by the -ps and -oo flag. - Added a section to the sorted endpoints which are 'protected endpoints', for endpoints that return 401/403 or other status codes showing it exists but is protected.
- Let the scanner scan
.mjsand.cjsfiles besides just.js - Allow text files for the -esl flag
- Changed the
-orflag to the-edflag, now you have to pass-edfor the extra details, instead of extra details being shown by default (for example, JS Stack detected). Things like found path count will still be shown. - Added
-nhb/--no-headless-browserflag to completely disable the headless browser and use a simple GET request instead. - Added
-fmflag,--filter-more. Will filter stuff likewww.w3.orgif passed as results likehttp://www.w3.org/2000/svgare present in almost all websites. - Added
-orltflag to only perform a rate-limiting test. - Changed scraper to scrape all
hrefandsrcattributes instead of only looking for code/image files. - Allow user to add an entire domain, or only one file as an external script loader (e.g.
examplegiganticcdn.com/example.js) - Moved structure file scraping into
mapfiles.py - Moved code file scraping into
scrapefiles.py - Moved path sorting into
filtersort.py - Optimised sorting endpoints
- Added
-oe/--only-endpoints,-ox/--only-externaland-os/--only-subflag to only print endpoints, external links, and subdomains respectively - Rate limit tester now uses curl_cffi instead of httpx
Bug Fixes/Code improvements
- Fixed regex problems in the map file check for:
openid-configurationasset-manifest.jsonweb-manifest.jsonmanifest.jsonsw.jsservice-worker.js
- Changed previous
-nhbflag from showing browser UI to-nh/-no-headlessto be more clear - Fixed an issue where the scraping would find data MIME types (e.g. application/x-javascript) and mistake them for real endpoints
- Fixed a scope bug in the tool
- Improve regex.
- Remove a function removing trailing slashes in paths, as some are directories.
- Added
-o clifor people who don't realise it prints to CLI by default. - Changed
-dto-dsflag
Plans for next version and the future
Version 7.6:
- Fixing a URL parameter problem in the tool
- Further improving regex
- Scanning
openapi.jsonfor paths - properly checking sensitive endpoints
Future plans (May be added in the future version):
none right now
Weaknesses
- On Server-Side Rendered websites like PHP websites, there are literally no frontend code files for EndpointScanner to scan hence it will fail on those types of websites. (Keep in mind EndpointScanner is still top-tier when it comes to the modern web)
- If there is a login page, the script will either show that all of the pages require login, or label all of them as 403 (if sorting is enabled).
- If there are shells (e.g. React SPA shells) in the page, it may give false positives for sensitive endpoints. If you see sensitive endpoints in the scan, they may not actually be exposed on the website if the website has a shell. (E.g. .gitignore, .env.local). This will be fixed in update 7.5.1
ai assisted code btw
Legal Disclaimer
Note that this tool is strictly meant for authorised testing and security research. Running this script on websites where you are not permitted to do so can result in legal action. The author of this script assumes no responsibility for any misuse or legal consequences from running this script. Ensure you have received permission from the owner of the target website before performing tests or scans on their website.
Metadata
Release files for endpointscanner 7.5.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| endpointscanner-7.5.0.tar.gz | 48.5 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| endpointscanner-7.5.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 94.4 kB
Release files / endpointscanner-7.5.0.tar.gz
| Download URL | endpointscanner-7.5.0.tar.gz |
|---|---|
| Size | 48.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
87966c6d36be527b2177916837c356180250dd438ceeae0269c2b2795a92cfb5
|
|
BLAKE2b-256 checksum How to use checksums |
910e152e210d298bfa2f41b57b47aea94f54e9bb51fc6e49f0ebfde7be5762ff
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.13
|
Release files / endpointscanner-7.5.0-py3-none-any.whl
| Download URL | endpointscanner-7.5.0-py3-none-any.whl |
|---|---|
| Size | 45.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0b928b6e7eff13d02d632d2a3a626682872b384921f59fcca882beca1f4f226e
|
|
BLAKE2b-256 checksum How to use checksums |
fc7767c5e8ded983303355e99be37f704debad2b87e0877883fd97fe0d8d1806
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.13
|
Security for endpointscanner 7.5.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.