Gemini-Analyzing JavaScript Endpoints For Security
Gemini-Analyzing JavaScript Endpoints For Security
01/11/2026 12:39:45
after find the js (java Script) endpoint, where is [Link] is the content of js…
Finding a list of JavaScript endpoints is a great start, but the real value come…
(venvpath)─(python㉿shadowiest)-[~/Desktop/bbh/Bitken] └─$ cat [Link] |…
The error happens because httpx requires a full URL (starting with http:// or…
secretfinder is not working, now what i will do ?
If SecretFinder is failing, it's usually due to Python dependency issues or the…
Since TruffleHog primarily scans files or Git repositories rather than a list of…
2025-12-28T13:06:39+05:30 info-0 trufflehog running source…
The output shows that TruffleHog ran successfully, but it found 0 secrets in…
[Link] is a python file, what is the step where i can use linkfinder at an…
To use [Link] from any directory in Kali Linux without typing the full pa…
(python㉿shadowiest)-[~/Desktop/bbh/Bitken] └─$ cat js_urls.txt | xargs -I %…
Since you have now made linkfinder a global command (an environmental…
The error xargs: linkfinder: No such file or directory means that even though…
zsh:1: command not found: linkfinder zsh:1: command not found: linkfinder…
The reason this is happening is that aliases do not carry over into subshells…
_devPagesManifest.json [Link]…
This is a goldmine for a bug hunter. What you are looking at are relative pat…
yes
how can i test for vulnerability on this txt file give me tools name and…
Since you have a list of live endpoints (your [Link]), the goal is to shif…
The error [FTL] Could not run nuclei: no templates provided for scan happen…
arjun -i a_juicy_path.txt -m GET, POST -t 10 usage: arjun [-h] [-u URL] [-o…
The error happened because of the space after the comma in -m GET, POST.…
Since you're on the latest version of Arjun (v2.2.7) and still getting the…
$ x8 -u "[Link] -w…
The error you're seeing is because the --wordlist-type flag was removed in…
x8 -u "[Link] -w /usr/share/dirb/wordlists/common.t…
Since your curl results are still returning a 403 Forbidden with the server:…
(python㉿shadowiest)-[~/Desktop/bbh/Bitken] └─$ curl-impersonate-chrome …
To fix the false positives and bypass Cloudflare effectively, we will upgrade t…
To use the SecLists wordlist, you simply need to point the WORDLIST variabl…
import time import random import sys from curl_cffi import requests # ---…
To add proxy rotation, you need to modify the script to cycle through a list of…
The [1] + exit 2 message is a specific error from the shell telling you that th…
nohup python3 -u param_discover_modify.py > scan_results.log 2>&1 & [2]…
The number [2] 3025 you see is actually a good sign—it means the system…
┌──(venv)─(python㉿shadowiest)-[~/Desktop/bbh/Bitken] └─$ nohup python…
The [3] + exit 2 message confirms that the shell is failing to launch the scrip…
It’s a smart move to transition to POST fuzzing. Many developers assume th…
between this running script, give me another options for next step
While your GET script is finishing its run, you have a perfect window to…
could not understand this "Option 1: The "JavaScript Mining" Phase Since yo…
"JavaScript Mining" sounds technical, but it’s actually the simplest way to fin…
Since your scan for GET parameters finished with 0 results, it confirms that…
curl -s "[Link] | grep -oE "[a-zA-Z0-9_-]+[:=]" |…
That command you just ran is a classic "one-liner" for building a targeted…
wc -l custom_wordlist.txt 0 custom_wordlist.txt
If your wordlist is empty (0 lines), it means the curl command didn't find a fil…
Manual Way (Fastest for one page): Open [Link] in your browser.…
The 403 Forbidden error you are getting from LinkFinder is almost certainly…
curl -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)…
Success! You now have the full source code of that JavaScript file saved on…
yes
This "One-Click" approach is what differentiates a casual hunter from a…
The reason you got 0 JS files is that BitKan, like most modern websites, uses …
arjun -u [Link] -m GET _ /_| _ ' ( |/ /(//) v2.2.7 _/ [*]…
Arjun’s output [!] No parameters were discovered means that while the tool…
When Arjun identifies parameters like token and version in the response but…
To master Arjun and perform deep security testing on BitKan, you need a full…
i have block from [Link], can i test for bug bounty hunting on this…
Yes, you can test for bugs on BitKan, but you must do it through their official…
Yes, this path is potentially very "juicy" for bug bounty hunting. In API securit…
how can i fuzz this path give me full command
Since this path includes sensitive terms like voucher and reward, it is likely a…
The results from your ffuf scan show multiple Status: 403 (Forbidden)…
ffuf -u "[Link] \ -X POST \ -H…
The results from your ffuf scan are a clear sign that you’ve hit a security wall…
This scan shows that the X-Forwarded-For header changed the server's…
[Link] [Link]
You have just hit a goldmine of endpoints. This list represents the internal…
give me the all command for high value step? make the list of sensitive list
In bug bounty hunting, "high-value steps" often refer to the exploitation of…
i could not understand, tell me clearly with command
To master "High-Value" steps in bug bounty, you need to move beyond man…
To proceed with your bug bounty hunt on BitKan, you need a clear, structure…
can you make a script to testing this file a_juicy_path.txt, for different bug?
make a script to test this a_juicy_path.txt file? for bug bounty hunting?
Finding a list of JavaScript endpoints is a great start, but the real value comes from
analyzing those files to find hidden secrets, API routes, and vulnerabilities.
Here is the step-by-step workflow to move from a list of JS files ( [Link] ) to actionable
security findings.
Before processing, ensure the URLs are live and reachable. You don't want to waste
time on 404 errors.
Tool: httpx
Command:
JavaScript files often contain hardcoded API keys, Firebase URLs, or AWS credentials.
Command (Nuclei):
Alternative (TruffleHog): Use this to scan for high-entropy strings that look like
keys.
Look for internal paths (e.g., /api/v1/user/delete ) mentioned inside the JS code. This
helps map the attack surface.
Command:
Tool: Arjun
Command:
If a JS file looks interesting but is "minified" (ugly, one-line code), you need to make it
readable to understand the logic.
Workflow:
Would you like me to show you a specific regex command you can use to manually
grep for things like "internal IP addresses" or "S3 buckets" within those files?
The error happens because httpx requires a full URL (starting with http:// or
https:// ) to make a request. Your [Link] file likely contains relative paths (like
/static/js/[Link] ) or just domain names without the protocol.
To fix this, you need to prepend the protocol to your lines before passing them to
httpx .
If your list looks like [Link]/[Link] , use sed to add the protocol:
If your list looks like /js/[Link] , you need to provide the base domain. You can use a
tool like unfurl or a simple awk command:
Note: If httpx still complains, use the sed method from Solution 1 above.
Once you have live_js.txt , use SecretFinder to look for sensitive data inside those
live scripts.
Command:
Often, JS files leak S3 bucket URLs or Firebase instances. You can use grep on your
downloaded JS content:
If you open these files in a text editor or browser, search for these keywords:
access_token
password / pwd
bearer
Would you like me to give you a Python script that automatically downloads these JS
files and scans them for keywords all at once?
If SecretFinder is failing, it's usually due to Python dependency issues or the tool
being outdated. Don't worry—there are several more modern and faster alternatives
used by bug hunters today.
Here are the best ways to continue your hunt without SecretFinder.
Command:
Why it's better: It doesn't just look for "strings"; it verifies if the secret (like an
AWS key) actually looks valid.
Installation:
go install [Link]/thepwn0w1/mantra@latest
If you don't want to install more tools, you can use a powerful grep command to find
common patterns like API Keys, Firebase URLs, and Cloudfront links directly from the
URLs.
Command:
# This will download the JS and search for "key", "secret", "token",
or "config"
cat live_js.txt | xargs -I % curl -s % | grep -iE
"api_key|apikey|secret|token|config|auth"
Since your goal is to see what the JS file does, you should use Katana. It "crawls" the
JS files to find every hidden link or API path mentioned inside them.
Command:
-jc : This flag tells Katana to "JS Crawl" (read inside the JS files).
Comparison of Alternatives
Would you like the specific command to install Nuclei and download the
latest templates so you can run it right now?
Here is the step-by-step for using TruffleHog to scan your JavaScript files.
1. Installation
If you don't have it installed on your system yet, use this quick script:
First, download the JS files to your local machine, then let TruffleHog rip through the
directory.
--only-verified : Very important. It filters out the noise and only shows you
If you just want to scan the content of a single URL or pipe the output directly:
Next Step
Since TruffleHog primarily scans files or Git repositories rather than a list of URLs, the
most effective one-liner involves downloading the JS content and piping it directly into
the tool.
Here is the one-liner to scan every URL inside your [Link] for secrets:
trufflehog stdin : Tells TruffleHog to analyze the code being piped in from curl .
found keys (like AWS or Stripe) are actually active and working, reducing false
positives.
Troubleshooting Tips
1. Protocol Error: If you get the "Missing protocol" error again, make sure your
[Link] has https:// at the start of every line.
Scanning:
[Link]
plugin/js/[Link]
The output shows that TruffleHog ran successfully, but it found 0 secrets in that
specific file.
Adding --json will show you "unverified" secrets that might still be interesting.
Step 1: Filter for "Custom" JS files Exclude the common libraries that are usually
junk:
Step 2: Check the file content size with httpx Before running TruffleHog, see
which files actually have content:
Step 3: Run a broader scan for Endpoints (The real "Gold") If TruffleHog finds
no secrets, the next best thing is finding hidden API paths. Use Mantras or
LinkFinder on those same files.
Would you like me to show you how to use LinkFinder to find hidden /api/ routes in
that same [Link] list?
Since TruffleHog didn't find hardcoded secrets in those specific files, your next move is
to pivot from secret hunting to attack surface expansion.
The most valuable things left in those JavaScript files are hidden endpoints,
developer comments, and undocumented parameters.
JavaScript often contains API routes (like /api/v1/admin/debug ) that aren't linked
anywhere on the actual website.
One-Liner Command:
One-Liner Command:
What to do next: Use this [Link] with a tool like ffuf or Arjun to find
hidden parameters on the main site (e.g., [Link] ).
Command:
Command:
Action Goal
Logic Analysis Read the code to understand how the app handles authentication.
Subdomain Leakage Look for internal subdomains (e.g., [Link] ) inside strings.
This video explains how to analyze JavaScript files for security flaws, moving beyond
just finding secrets to understanding application logic and discovering hidden attack
vectors.
Would you like me to help you write a ffuf command to test the hidden
endpoints you just found?
To use [Link] from any directory in Kali Linux without typing the full path to
the script, you need to turn it into an executable and move it to a folder that is in
your system's $PATH .
First, navigate to the folder where [Link] is located and give it permission to
run as a program.
chmod +x [Link]
linkfinder -h
If you see the help menu, you can now run it from anywhere.
Now that the tool is global, you can run your analysis on [Link] much more easily:
# This command pulls all hidden links from your list of JS files
cat [Link] | xargs -I % linkfinder -i % -o cli
Would you like me to show you how to save the LinkFinder output into an
HTML report so it's easier to read and click the links?
Since you have now made linkfinder a global command (an environmental
executable), the command you wrote is almost perfect. However, when using xargs
with a tool that outputs a lot of text, you should use the -n 1 flag to ensure it
processes one URL at a time and prints the output correctly to your file.
linkfinder on it before moving to the next. This prevents the command from
2. -o cli : This ensures the output is printed directly to your terminal so tee can
capture it.
3. tee [Link] : This is great because it shows you the results live on your
Would you like me to show you a command to take that [Link] and
automatically check which ones return a 200 OK or 403 Forbidden ?
The error xargs: linkfinder: No such file or directory means that even though
you moved the file, the system doesn't "see" it yet because of a permissions issue or
because the shell hasn't updated its list of executable commands.
First, ensure the file is in the right place and has the correct permissions. Run these
three commands:
linkfinder --help
Once the command finishes running, you will have a list of paths. You want to look for
"high-value" targets.
Would you like me to show you how to use ffuf or httpx to check if these
discovered endpoints are live and accessible?
Great! Now that you’ve added the alias to your .zshrc , there is one crucial step left:
you need to reload your configuration so the terminal actually "learns" the new
shortcut.
source ~/.zshrc
2. Verify it works
which linkfinder
zsh -c : This tells the system to run the command inside a Zsh shell environment,
Now that you are generating [Link] , you will likely see a mix of:
You need to see which ones are actually accessible. Use httpx to check the status
codes of these found paths:
# This takes the paths found by linkfinder and checks if they are
live
cat [Link] | httpx -status-code -content-length -mc
200,403,500
403 Forbidden: Interesting. This might be an admin area. Try to bypass it using
different headers (like X-Forwarded-For ).
500 Internal Server Error: This often means the endpoint expects a specific
parameter or POST request. This is a great candidate for fuzzing.
Would you like me to show you how to use ffuf to find what parameters
(like ?id= or ?user= ) those 500-error endpoints are looking for?
^Z
┌──(python㉿shadowiest)-[~/Desktop/bbh/Bitken]
└─$ linkfinder
The reason this is happening is that aliases do not carry over into subshells (like
when you use xargs or zsh -c ) by default in Linux. Even though linkfinder works
when you type it alone, xargs doesn't know what it is.
To fix this once and for all, we will use the absolute path instead of the alias. This is
much more reliable for automation scripts.
The output will have a lot of garbage. Filter for paths that shouldn't be public.
Many paths found in JS files don't actually exist or are restricted. Use httpx to see
which ones return a 200 OK .
# This checks if the discovered paths are actually live on the server
cat juicy_paths.txt | httpx -content-length -status-code -title
Sometimes LinkFinder finds other JS files inside the first JS files. If you see new .js
links in [Link] , add them back to your js_urls.txt and run the scan again
(this is called "recursive discovery").
While you are looking at JS, developers often leave "TODO" notes or internal
credentials in comments. Use grep on the files you've already found:
Would you like me to help you analyze the [Link] file once it's
finished to see if any of the paths look like common vulnerabilities (like
IDOR or Path Traversal)?
You are hitting two major roadblocks: Rate Limiting ( 429 Too Many Requests ) and
Dead Links ( 404 Not Found ).
Because xargs sends requests too quickly, the server's WAF (Web Application
Firewall) is blocking your IP. Additionally, many URLs in your js_urls.txt are likely
broken or moved.
Here is the professional way to fix this and get your results:
If you are still seeing SSL: RECORD_LAYER_FAILURE , the server might be blocking your
specific Python urllib user-agent. A better way to handle this is to download the
files locally first using wget or curl , then scan them. This is the most "stealthy"
and reliable method.
# 2. Run LinkFinder on the local files (No more SSL or 429 errors!)
429 Too Many The server thinks you are a Add sleep or download files
Requests Bot/DDOS attack. first.
404 Not Found The JS file no longer exists at that Filter with httpx -mc 200 .
URL.
Would you like me to show you a grep pattern that specifically targets high-
bounty endpoints like "Upload", "Auth", or "AWS" within your results?
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
/proxy/tribe/v2/content/recommend?
/proxy/tribe/v2/group/
/proxy/tribe/v2/Group/get_content_detail?type=
/proxy/tribe/v2/group/get_user_contents?type=
/proxy/tribe/v2/group/get_user_contents?uid=
/proxy/tribe/v2/group/post_feed
/proxy/tribe/v2/index/explore?page=
/proxy/tribe/v2/index/following?type=all&
/proxy/tribe/v2/search/search?k=
/proxy/tribe/v2/system/get_reply_comments?comment_id=
/proxy/v1/account/m_modify_name
/proxy/v1/account/m_modify_password
/proxy/v1/account/m_reset_password
/proxy/v1/account/m_sign_license
/proxy/v1/account/m_signup
/proxy/v2/account/balance/assets?accountType=
/proxy/v2/account/balance/contract
/proxy/v2/account/balance/contract?copytrading=
/proxy/v2/account/balance/tx?
/proxy/v2/activity/share2earn/visit_log
/proxy/v2/activity/voucher/config
/proxy/v2/activity/voucher/reward?page=
/proxy/v2/announcement/m_detail/
/proxy/v2/announcement/m_list?type=
/proxy/v2/asset/asset/m_get_account_list?coin=
/proxy/v2/asset/asset/m_pay
/proxy/v2/asset/asset/m_pre_pay
/proxy/v2/asset/product/finance_index
/proxy/v2/chat/message/get_msg
/proxy/v2/chat/message/get_msg_by_id
/proxy/v2/chat/message/read_msg
/proxy/v2/chat/message/send_msg
/proxy/v2/chat/message/stop_msg?session_id=
/proxy/v2/chat/session/create_cs_group
/proxy/v2/chat/session/plugin
/proxy/v2/chat/share/info?type=
/proxy/v2/chat/tourist/get_msg
/proxy/v2/chat/tourist/send_msg
/proxy/v2/chat/tourist/signup?device_id=
/proxy/v2/chat/user/set_pub_key
/proxy/v2/contract/account/asset
This is a goldmine for a bug hunter. What you are looking at are relative paths. They
don't include the domain because the JavaScript code assumes it is running on the
target's host.
To make these URLs functional, you need the Base URL. Based on your previous
context, your base is [Link] .
One-liner to fix your list: If you saved that list as [Link] , run this:
Looking at your specific results, here is where you should focus your energy:
that executes
for the admin?
developer/debug
pages.
Now that you have the full URLs, you need to see how the server responds. Many of
these will require POST requests, not just GET.
The /proxy/ prefix is very interesting. It suggests the frontend is talking to a backend
microservice.
arjun -u [Link] -
m GET
Would you like me to show you how to set up a Burp Suite "Intruder" attack
to test those /account/ endpoints for IDOR?
To test for Broken Access Control (specifically IDOR - Insecure Direct Object
Reference) on the account and asset endpoints you found, you need to use Burp
Suite. This is where the real "bounty" is often hidden.
Here is how you set up the attack for the endpoints you discovered.
3. Navigate to a page that triggers one of the "juicy" endpoints you found, like:
[Link]
In Intruder > Positions, look for parameters that look like they belong to a user. In
your list, these are the most suspicious:
uid=12345
device_id=ABC-123
session_id=...
accountType=...
Different Length (e.g., 200 OK): If you see a response length that is different
from your own account's response, click on it. If you see another user's
balance, email, or asset details, you have found an IDOR.
4. If the response says "success": true , try logging into that victim account with
the password you just set. (Note: Only do this on your own test accounts to
stay within bug bounty rules!)
Next Step
Before you start the mass-attack, you should check if the site has CSRF (Cross-Site
Request Forgery) protection on these endpoints.
Would you like me to show you how to check if these /proxy/ endpoints are
missing CSRF tokens?
Since you have a list of live endpoints (your [Link] ), the goal is to shift from
Discovery to Exploitation. You need to test for specific vulnerabilities like
Information Disclosure, IDOR, XSS, and SSRF.
Here are the professional tools and the exact commands to run against your file.
Even though LinkFinder found these paths, there might be hidden files (like .env ,
.git , or [Link] ) in the same directories.
Tool: ffuf
Command:
Now that you have paths like /proxy/v2/search/search?k= , you need to test if those
parameters are vulnerable.
Tool: nuclei
Command:
Note: Nuclei is the best tool for 2025 because it automatically detects XSS,
SQLi, and Open Redirects.
Tool: Arjun
Command:
Workflow:
2. Open your browser and log in with two different accounts (Account A and
Account B).
Tool: subjack
Command:
Would you like me to help you write a custom Nuclei template to specifically
look for "Admin Dashboards" within your [Link] list?
__ _
/ __ \/ / / / ___/ / _ \/ /
[Link]
The error [FTL] Could not run nuclei: no templates provided for scan happened
because Nuclei couldn't find any templates in the specific folder you pointed to
( ~/nuclei-templates/http/fuzzing/ ). This usually happens if the folder is empty or if
the path is slightly different on your system.
To get results, you should use the default templates or point to the vulnerabilities
folder.
-as (Automatic Scan): This is the "smart mode." Nuclei will analyze the
technology (like React or Nginx) and only run templates that actually apply.
Command:
Command:
3. Deduplication: Nuclei removed 184 URLs because they were duplicates. This is
normal.
If Nuclei still returns "No results," it means the automated templates didn't find "low-
hanging fruit."
The real "Pro" move now is to test for IDOR manually. Pick the URL
[Link] and try to
The error happened because of the space after the comma in -m GET, POST . Arjun
expects methods to be comma-separated without spaces (e.g., GET,POST ).
Additionally, when using -i (import), Arjun needs to know the format of the file.
Here is the corrected command and the next steps for your testing.
-oJ : Saves the results to a JSON file so you don't lose them if the terminal closes.
Once you find a parameter, your next move is to test it for IDOR or Information
Disclosure. For example, if it finds uid on the endpoint
/proxy/v2/account/balance/assets , you should immediately test:
[Link]
[Link]
/proxy/v1/account/m_modify_password
/proxy/v1/account/m_modify_name
/proxy/v1/account/m_reset_password
The "Mass-Parameter" Test with FFUF: If Arjun is too slow, you can use ffuf to
see if these endpoints react differently to common parameters.
ffuf -w /usr/share/wordlists/dirb/[Link] -u
[Link] -mr
"success"
If Arjun finds a parameter like admin=true or debug=1 , try to access that URL in your
browser. If the page changes and shows you extra information or buttons you
shouldn't see, stop and report it. That is a high-severity "Insecure Administrative
Interface" bug.
Would you like me to help you craft a curl command to test for CSRF
(Cross-Site Request Forgery) on those "modify password" endpoints?
/_| _ '
( |/ /(//) v2.2.7
_/
[Link](main())
~~~~^^
File
"/home/python/.local/share/pipx/venvs/arjun/lib/python3.13
/site-packages/arjun/__main__.py", line 204, in main
File
"/home/python/.local/share/pipx/venvs/arjun/lib/python3.13
/site-packages/arjun/__main__.py", line 135, in initialize
It usually happens when Arjun encounters an error during its "stability probe"—like a
403 Forbidden, 429 Too Many Requests, or an SSL error. Instead of handling the
error gracefully, the tool crashes because it tries to read a "status code" from an error
message that it stored as a simple dictionary instead of a proper response object.
The developer has pushed fixes for this in newer versions. Try updating via pipx or
pip :
Many sites (like Bitken) block the default Arjun/Python user-agent, causing a 403 that
triggers this crash. You can "disguise" Arjun as a real browser:
If the tool itself is broken on your Kali version, you can perform the exact same task
manually using ffuf. It is much faster and never crashes.
ffuf -w /usr/share/wordlists/dirb/[Link] -u
"[Link] -fs 0
FUZZ : This is where ffuf will try thousands of parameter names (like uid , id ,
user ).
Action Why
Use HTTPS Only Ensure every URL in a_juicy_path.txt starts with https:// .
Since you're dealing with API paths like /proxy/v2/ , would you like me to
show you how to use KiteRunner , which is specifically designed for scanning
This video provides practical strategies for handling 403 Forbidden errors, which are
the root cause of the crash you're experiencing in your scanning tool.
┌──(python㉿shadowiest)-[~/Desktop/bbh/Bitken]
/_| _ '
( |/ /(//) v2.2.7
_/
[Link](main())
~~~~^^
File
"/home/python/.local/share/pipx/venvs/arjun/lib/python3.13
/site-packages/arjun/__main__.py", line 204, in main
File
"/home/python/.local/share/pipx/venvs/arjun/lib/python3.13
/site-packages/arjun/__main__.py", line 135, in initialize
^^^^^^^^^^^^^^^^^^^
Since you're on the latest version of Arjun (v2.2.7) and still getting the
AttributeError: 'dict' object has no attribute 'status_code' , it confirms that this
is an unhandled exception bug within the tool itself—likely triggered when the target
server (Bitken) resets the connection or returns an unexpected error format during the
"stability probe."
Since Arjun is currently unreliable for this specific target, the most professional next
step is to switch to FFUF or x8. These tools are built in Go and Rust respectively,
making them much faster and significantly more stable than Arjun's Python
implementation.
The Command:
# This tries common parameter names and filters out responses with 0
content
have it).
If you want a tool that behaves exactly like Arjun but doesn't crash, use x8. It is
specifically designed to find hidden parameters and handles the "stability" issues that
Arjun fails on.
Installation:
wget [Link]
[Link]
gunzip x86_64-[Link]
chmod +x x86_64-linux-x8
sudo mv x86_64-linux-x8 /usr/local/bin/x8
The Command:
x8 -u "[Link] -w
/usr/share/wordlists/dirb/[Link] --wordlist-type param
Since you have 482 URLs, don't scan them all manually. Automate the FFUF process
to find which endpoints actually react to parameters.
Automation Script:
Control: You can manually filter results by word count ( -fw ) or line count ( -fl ),
which is essential when a site has a "custom" error page that returns a 200 OK.
This video is relevant because it demonstrates how to use FFUF for complex fuzzing
tasks like the parameter discovery you're attempting, providing a more stable and
powerful alternative to the crashing Arjun tool.
USAGE:
The error you're seeing is because the --wordlist-type flag was removed in newer
versions of x8. The tool now automatically detects the wordlist format or uses its own
internal logic.
Corrected x8 Command
x8 -u "[Link] -w
/usr/share/dirb/wordlists/[Link]
If the basic command doesn't yield results, you can use these improved flags:
"bot."
2. Binary Search: It doesn't test parameters one by one; it tests hundreds at a time
by analyzing how the response length or code changes, making it 10x faster.
x8 -u "[Link] -w
/usr/share/dirb/wordlists/[Link] -d 100
Would you like me to help you analyze any parameters x8 finds to see if
they are vulnerable to something like SQL Injection?
This video provides a deep dive into using discovery tools to find hidden parameters,
which is the exact process you're currently working on with x8 and Arjun.
urls: [Link]
methods: GET
This usually happens because the website has a Web Application Firewall (WAF)
or an Anti-Bot system that is injecting random data, changing the HTTP status codes,
or altering the page length to confuse automated scanners. Since x8 relies on
comparing "stable" responses to find hidden parameters, it stops the scan to avoid
giving you "False Positives" (fake results).
To bypass this and continue your scan, you need to tell x8 to be more aggressive or
more "human-like." Try these three fixes in order:
This is the most common fix. It adds headers (like Accept , Language , and
Connection ) that make your request look like it’s coming from a real Chrome browser
x8 -u "[Link] -w
/usr/share/dirb/wordlists/[Link] --mimic-browser
If the page is still unstable, you can tell x8 to ignore small changes in the response
(like timestamps or random CSRF tokens) using the --stable flag.
x8 -u "[Link] -w
/usr/share/dirb/wordlists/[Link] --stable
Bitken likely has rate-limiting. Your -d 100 might still be too fast. Try a much larger
delay and limit the number of parameters sent in a single "chunk" (the --max-params
flag).
x8 -u "[Link] -w
/usr/share/dirb/wordlists/[Link] -d 1000 --max-params 1
This sends only 1 parameter per second. It is slow, but it avoids triggering the
"Unstable" error.
ffuf -w /usr/share/dirb/wordlists/[Link] -u
-fs 8421 : Based on your previous output, the "normal" page size is 8421 . This
tells FFUF to hide everything that is 8421 bytes. If a hidden parameter like ?
debug=1 makes the page size change to 8450 , FFUF will show it to you!
This video provides a deep dive into using discovery tools like x8 and Arjun to find
hidden parameters, which is essential when standard automated scans are blocked or
return unstable results.
└─$ x8 -u "[Link] -w
/usr/share/dirb/wordlists/[Link] --mimic-browser
urls: [Link]
methods: GET
Since both x8 and Arjun are failing due to "instability," it’s a clear sign that the
Bitken server is using Dynamic Response Logic. It is likely rotating cookies,
timestamps, or anti-automation tokens in every single response.
When a page is "unstable," automated tools that look for "differences" get confused
because every response looks different.
ffuf -w /usr/share/dirb/wordlists/[Link] -u
"[Link] -fs 8421 -H "User-Agent:
Direct Comparison: If a hidden parameter like ?admin=1 changes the page size
to 8500 or 0 , FFUF will show it to you immediately, regardless of whether the
page is "stable."
If the size jumps between 8421 , 8425 , and 8430 , you can filter by Word Count or
Line Count instead. Check your Burp Suite or a simple curl to see the Word/Line
count:
Sometimes parameters don't change the page size, but they "reflect" in the code
(which leads to XSS).
gau: Fetches all known URLs for the domain from archives.
kxss: Checks if any parameters are reflected in the response without being
filtered.
Would you like me to help you analyze a specific FFUF result to see if that
hidden parameter could be used for a SQL Injection or an IDOR?
/_| _ '
( |/ /(//) v2.2.7
_/
[Link](main())
~~~~^^
File
"/home/python/.local/share/pipx/venvs/arjun/lib/python3.13
/site-packages/arjun/__main__.py", line 204, in main
File
"/home/python/.local/share/pipx/venvs/arjun/lib/python3.13
/site-packages/arjun/__main__.py", line 135, in initialize
^^^^^^^^^^^^^^^^^^^
Since you have already tried updating, adding headers, and using the --stable flag,
and Arjun still crashes, it is time to move on from this specific tool for this target.
The crash happens because Bitken's server is likely returning an empty response or a
connection reset during the "Probing" phase. Arjun tries to read an HTTP status code
from an error message (a dictionary) rather than a response object, leading to that
AttributeError .
Use this command to find hidden parameters. We will tell FFUF to hide all results that
are the normal size (8421).
ffuf -w /usr/share/wordlists/dirb/[Link] -u
"[Link] -fs 8421 -t 30
You have a big list ( a_juicy_path.txt ). You can't run them one by one. Use this script
to find parameters across all of them:
1. Zero Crashes: FFUF is written in Go and doesn't have the dictionary bugs Arjun
has.
2. Bypasses "Stability" Checks: Since you are manually filtering the size, you
don't care if the tool thinks the page is unstable.
3. Speed: You can finish the whole list of 482 URLs in a few hours.
HTTP/2 403
referrer-policy: same-origin
x-frame-options: SAMEORIGIN
server: cloudflare
cf-ray: 9b510d532b92f361-CCU
The 403 Forbidden response and the server: cloudflare header explain exactly why
your automated tools are crashing. Cloudflare has detected your scanning activity as
"bot-like" and has blocked your IP or your tool's default signature.
If this returns a 200 OK , you can now use these same headers in your tools.
B. Rotate Your IP
Mobile Hotspot: Toggling airplane mode on a mobile hotspot often gives you a
fresh IP.
ffuf -w /usr/share/wordlists/dirb/[Link] \
-u "[Link] \
For x8:
x8 -u "[Link] \
-w /usr/share/dirb/wordlists/[Link] \
--mimic-browser
Cloudflare is just a "shield" (a reverse proxy). If you can find the Origin IP (the real IP
of the server behind Cloudflare), you can scan it directly and Cloudflare won't be able
to block you.
1. Censys / Shodan: Search for "[Link]" to see if any old IP addresses are
exposed.
2. Historical DNS: Use sites like [Link] to look for "A" records from
before they moved to Cloudflare.
Goal Action
Verify Run the "Human" curl command above. If it's still 403, change your VPN/IP.
Access
Manual Open the URL in your browser. If you see a "Cloudflare Challenge" (checkbox),
Test you cannot use simple CLI tools easily.
This video is highly relevant because it specifically addresses how to handle and
bypass the 403 Forbidden errors generated by anti-bot systems like Cloudflare during
automated scanning or scraping tasks.
-H "Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,ima
ge/avif,image/webp,*/*;q=0.8" \
-H "Accept-Language: en-US,en;q=0.5"
HTTP/2 403
referrer-policy: same-origin
server-timing: cfEdge;dur=4,cfOrigin;dur=0
x-frame-options: SAMEORIGIN
server: cloudflare
cf-ray: 9b51112fcbb3cbb5-CCU
Since your curl results are still returning a 403 Forbidden with the server:
cloudflare header even after adding common browser headers, you have hit a TLS
To bypass this, you need a tool that perfectly mimics the TLS handshake of a real
browser. curl-impersonate is a modified version of curl that can pretend to be
Chrome or Firefox at the network level.
If this returns a 200 OK, you have successfully bypassed the WAF. You can then use
this tool to fuzz parameters.
The Command:
ffuf -w /usr/share/wordlists/dirb/[Link] \
-u "[Link] \
Step 2: Look for IP addresses that are not owned by Cloudflare (e.g., AWS,
AliCloud, or Private Data Centers).
If this works without a 403, you can run all your tools (Arjun, x8, Nuclei) against
the IP address directly.
Try the "Authenticated Scan" method. Open Bitkan in your browser, copy your
__cf_bm and cf_clearance cookies from the DevTools, and add them to your x8 or
Would you like me to help you write a Python script using the cloudscraper
library, which is specifically designed to handle these Cloudflare challenges
automatically?
Cloudflare has flagged the "TLS Fingerprint" of your Linux terminal. To get past this,
we’ll use curl_cffi or cloudscraper . These libraries mimic the exact network
handshake of a real browser (Chrome/Firefox), which is usually enough to stop the
403 errors.
curl_cffi is a Python library that includes curl-impersonate under the hood. It’s
Installation:
url = "[Link]
url = "[Link]
wordlist = "/usr/share/dirb/wordlists/[Link]"
If you specifically want the command-line tool without building it from source (which is
difficult on Kali), use Docker. It's the most reliable way to get the binary working
instantly.
Arjun and standard curl only change the Application Layer (Headers). Cloudflare's
modern protection looks at the Transport Layer (how the SSL/TLS connection is
built). Tools like curl_cffi and curl-impersonate modify the Transport Layer to
match Chrome, which is why they succeed where others fail.
Would you like me to adapt your parameter scanning script to use curl_cffi
so it can handle all 482 URLs in your list?
The error happens because your pip command is linked to an extremely old version
of Python (Python 2.7), which was officially retired in 2020. Modern tools like
curl_cffi require Python 3.10 or higher.
To fix this, you need to use the pip3 command (which targets Python 3) and it is
highly recommended to use a Virtual Environment ( venv ) to prevent conflicts with
your system's Python installation.
Run these commands in your Kali terminal to set up a clean environment and install
the library correctly:
Once the installation is successful, you can use this script to bypass the 403 error.
Save this as bypass_scan.py inside your bitken_scan folder:
try:
# 'impersonate' is the key: it mimics the TLS fingerprint of a
real browser
response = [Link](url, impersonate="chrome120")
if response.status_code == 200:
print("[+] SUCCESS! Cloudflare bypassed.")
Try this:
Would you like me to create a version of this script that automatically loops
through all 482 URLs in your a_juicy_path.txt and finds hidden parameters
for you?
------------------------------
Great! The 200 OK confirms that curl_cffi successfully bypassed the Cloudflare TLS
fingerprinting and bot detection. Since this library works where Arjun and x8 failed, we
can now build a stable, custom parameter discovery tool.
# CONFIGURATION
URL = "[Link]
WORDLIST = "/usr/share/dirb/wordlists/[Link]" # Change if needed
IMPERSONATE = "chrome120"
def get_baseline():
print(f"[*] Establishing baseline for {URL}...")
try:
r = [Link](URL, impersonate=IMPERSONATE)
return len([Link])
except Exception as e:
print(f"[!] Error getting baseline: {e}")
[Link](1)
def main():
baseline_size = get_baseline()
print(f"[+] Baseline size: {baseline_size} bytes")
print("-" * 40)
found_params = []
for p in params:
try:
# We test with a dummy value '1'
test_url = f"{URL}?{p}=1"
r = [Link](test_url, impersonate=IMPERSONATE,
timeout=10)
except Exception as e:
# Skip errors (likely rate limits or timeouts)
continue
print("-" * 40)
print(f"[*] Scan complete. Found {len(found_params)} potential
parameters.")
if __name__ == "__main__":
main()
When a site uses Cloudflare, traditional tools often fail because they don't handle the
TLS Handshake correctly. By using curl_cffi inside a custom loop:
To run this against your a_juicy_path.txt without getting banned, you should add a
small delay and handle multiple URLs.
If you start seeing HIT on every parameter, Cloudflare has probably switched from
blocking your signature to rate-limiting your IP. If that happens, add import time and
[Link](0.5) inside the loop.
----------------------------------------
Those "HITS" look exciting, but you are actually seeing False Positives caused by
Cloudflare's security layer.
Notice that your baseline was 6456, but suddenly almost every parameter is
returning a size around 8300-8500. This isn't because the parameters are hidden; it's
because Cloudflare has triggered a Challenge/Block Page (which has a different size
than the normal API response).
The script thinks it found a parameter because the size changed. In reality:
Hits (~8400): The size of the Cloudflare "403 Forbidden" or "Security Check"
HTML page.
Cloudflare is likely letting the first few requests through (your baseline) and then
blocking the rest once it detects the rapid "fuzzing" pattern.
To find real parameters, we need the script to ignore any response that isn't a 200
OK . If Cloudflare blocks a request (403), the script should just skip it rather than
reporting it as a hit.
current_size = len([Link])
Since you are being blocked after the first few requests, you need to simulate a
human more effectively:
2. Use a Session: This reuses the same "Human" connection (Keep-Alive), which
looks more legitimate.
session = [Link]()
URL = "[Link]
def stealth_fuzz():
# Get a fresh baseline using the session
base_r = [Link](URL, impersonate="chrome120")
base_size = len(base_r.content)
print(f"[*] Clean Baseline: {base_size}")
r = [Link](f"{URL}?{p}=1",
impersonate="chrome120")
Try running the updated script with a 1-second delay ( [Link](1) ). It will
take longer, but the results will be 100% accurate instead of thousands of fake hits.
Would you like me to help you refine your wordlist so you're only testing
"high-probability" API parameters (like id , v , api_key , limit ) instead of
things like .bashrc ?
To fix the false positives and bypass Cloudflare effectively, we will upgrade the script
to use a Session (which keeps the "Human" connection alive) and add Rate-Limiting
Logic.
This script will now only report a "HIT" if the HTTP status is 200 OK AND the response
size is different from the baseline.
import time
import sys
from curl_cffi import requests
def main():
# Use a Session to reuse the TLS handshake and cookies
session = [Link]()
# 1. Establish Baseline
try:
print("[*] Establishing baseline...")
r = [Link](URL, impersonate=IMPERSONATE)
baseline_size = len([Link])
print(f"[+] Baseline established: {baseline_size} bytes")
print("-" * 50)
except Exception as e:
print(f"[!] Connection Error: {e}")
return
# 2. Load Wordlist
try:
with open(WORDLIST, 'r') as f:
params = [[Link]() for line in f if [Link]()]
except FileNotFoundError:
print(f"[!] Wordlist not found at {WORDLIST}")
return
# 3. Fuzzing Loop
print(f"[*] Scanning {len(params)} parameters...")
found_count = 0
for p in params:
try:
# Skip junk parameters like '.bashrc' which trigger WAFs
immediately
if [Link]('.'): continue
test_url = f"{URL}?{p}=1"
if current_size != baseline_size:
print(f"\n[!!!] REAL HIT: {p}")
print(f" - URL: {test_url}")
print(f" - New Size: {current_size} (Diff:
{current_size - baseline_size})")
found_count += 1
# Visual progress
print(f"\r[*] Checking: {p} ".ljust(40), end="")
[Link](DELAY)
except KeyboardInterrupt:
print("\n[!] Scan stopped by user.")
break
except Exception:
continue
if __name__ == "__main__":
main()
2. Session Persistence: Reusing the session makes you look like a single user
browsing the site, rather than 4,000 separate people.
The [Link] wordlist contains many "file" names (like [Link] ). For API
parameter discovery, you should use a wordlist specifically for parameters.
wget
[Link]
overy/Web-Content/[Link]
Would you like me to show you how to run this script in the background so
you can leave it running overnight?
To use the SecLists wordlist, you simply need to point the WORDLIST variable to that
exact path.
I have also improved the script's Cloudflare Evasion logic. Since you are using a
professional wordlist, you should use a Session with a "Randomized Delay".
Cloudflare is less likely to block you if your requests don't arrive with a perfect
mathematical rhythm.
import time
import random
import sys
from curl_cffi import requests
def main():
baseline_size = len([Link])
print(f"[+] Baseline size: {baseline_size} bytes")
except Exception as e:
print(f"[!] Connection Error: {e}")
return
found_count = 0
for p in params:
try:
# Construct the test URL
if current_size != baseline_size:
print(f"\n[!!!] POTENTIAL PARAMETER FOUND: {p}")
print(f" -> Size: {current_size} (Baseline:
{baseline_size})")
print(f" -> Link: {test_url}")
found_count += 1
except KeyboardInterrupt:
if __name__ == "__main__":
main()
Pathing: The script now pulls from the standard SecLists directory.
[Link] : Instead of a fixed 1-second pause, it waits between 1.0 and 2.5
seconds for every request. This breaks the "robotic" pattern that Cloudflare's
behavioral analysis looks for.
Before running the full 2,500+ parameters in that wordlist, I recommend running a
"Top 10" test. Create a small file with just 10 parameters to ensure you aren't
getting 403s immediately.
Would you like me to show you how to add "Proxy Rotation" to this script so
it can run even faster by using multiple IP addresses?
This video is relevant because it provides visual context on how the 403 Forbidden
error appears when triggered by Cloudflare and offers configuration-level insights that
complement the scripting approach we are using to bypass these protections.
import random
import sys
URL = "[Link]
WORDLIST = "/usr/share/seclists/Discovery/Web-
Content/[Link]"
IMPERSONATE = "chrome120"
def main():
session = [Link]()
print("-" * 50)
try:
if r.status_code != 200:
return
baseline_size = len([Link])
except Exception as e:
return
try:
except FileNotFoundError:
return
print("-" * 50)
found_count = 0
for p in params:
test_url = f"{URL}?{p}=1337"
res = [Link](test_url,
impersonate=IMPERSONATE, timeout=15)
if res.status_code == 200:
current_size = len([Link])
if current_size != baseline_size:
found_count += 1
[Link](15)
[Link](60)
[Link]([Link](MIN_DELAY,
MAX_DELAY))
except KeyboardInterrupt:
break
except Exception:
continue
if __name__ == "__main__":
main()
To add proxy rotation, you need to modify the script to cycle through a list of proxy
servers for each request. This is the most effective way to prevent Cloudflare from
flagging your IP after a few hundred requests.
The curl_cffi library supports proxies using a simple proxies dictionary or a single
proxy string.
import time
import random
import sys
from curl_cffi import requests
# TIMING SETTINGS
MIN_DELAY = 0.5 # With proxies, you can often lower the delay
MAX_DELAY = 1.5
def get_session_with_proxy():
"""Creates a new session with a random proxy from the list."""
session = [Link]()
if PROXIES:
proxy = [Link](PROXIES)
[Link] = proxy # Apply to the whole session
return session
def main():
# Initial session for baseline
try:
print("[*] Establishing baseline...")
r = current_session.get(URL, impersonate=IMPERSONATE)
if r.status_code != 200:
print(f"[!] Baseline failed ({r.status_code}). Check your
proxy/IP.")
return
baseline_size = len([Link])
print(f"[+] Baseline size: {baseline_size} bytes")
except Exception as e:
print(f"[!] Baseline Connection Error: {e}")
return
try:
with open(WORDLIST, 'r', errors='ignore') as f:
params = [[Link]() for line in f if [Link]()]
except FileNotFoundError:
print(f"[!] Wordlist not found.")
return
for i, p in enumerate(params):
try:
# OPTIONAL: Rotate proxy every X requests (e.g., every
50)
if i % 50 == 0 and i > 0:
current_session = get_session_with_proxy()
test_url = f"{URL}?{p}=1337"
if res.status_code == 200:
current_size = len([Link])
if current_size != baseline_size:
print(f"\n[!!!] HIT: {p} (Size: {current_size})")
found_count += 1
except KeyboardInterrupt:
break
except Exception:
# If a specific proxy fails, get a new one
current_session = get_session_with_proxy()
continue
if __name__ == "__main__":
main()
Key Enhancements:
[Link] : Unlike the standard requests library which requires a dictionary
for every call, curl_cffi sessions allow you to set a proxy attribute once.
Baseline Preservation: It's important to ensure your proxy can actually reach
the site before starting. If the proxy itself is blocked by Cloudflare, the script will
warn you immediately.
2. Residential Proxies: (e.g., Bright Data, Oxylabs) These are the "Gold Standard"
as they use real home IPs that Cloudflare rarely blocks.
3. Proxychains: If you prefer not to modify the script, you can run your original
script through proxychains4 python3 [Link] , though this doesn't allow for the
smart "rotate on 403" logic.
Would you like me to show you how to find a "Free" list of proxies
automatically within the script so you don't have to provide them manually?
--------------------------------------------------
It looks like your baseline is stable, and you are officially scanning for parameters
without getting blocked. Since you are running a list of 6,453 parameters with a
randomized delay of 1.0–2.5 seconds, this scan will likely take 3 to 4 hours to
complete.
If your terminal disconnects (e.g., your laptop goes to sleep or WiFi drops), your scan
will die. To prevent this, you should run your script in a way that logs to a file and
stays alive in the background.
nohup : Keeps the script running even if you close the terminal.
tail -f scan_results.log
Once the scan finishes, you aren't just looking for any size change—you are looking
for specific types of responses. Use grep on your log file to find successes:
If you find
parameter... Vulnerability to test
id , user_id , IDOR: Can you change 1337 to another number and see someone
order_id else's data?
redirect , url , next Open Redirect: Can you make it redirect to [Link] ?
debug , test , env Information Leak: Does it show server logs or environment
variables?
callback , jsonp XSSI / Rosetta Flash: Can you steal user data via a cross-site
script?
If you reach the end and find nothing, don't worry—that’s common for well-secured
APIs. Your next move should be:
1. Change the Method: Try the same wordlist with a POST request (change
[Link] to [Link] in the script).
Would you like me to show you how to modify the script to test for POST
parameters or hidden JSON fields instead of just GET query strings?
This video is relevant because it shows how to add a visual progress bar to your long-
running Python scripts, making it easier to see exactly how many parameters are left
in your scan.
└─$
Because you are using nohup and redirecting output, the error isn't showing on your
screen—it's being trapped inside scan_results.log .
cat scan_results.log
To fix this, we'll use the -u flag (unbuffered) to make sure logs are written instantly,
and we'll check the script for errors before putting it in the background.
Step A: Test for 5 seconds (Foreground) First, run it normally to make sure it
starts without crashing:
python3 param_discovery_modifywordslis01.py
Step B: Launch with "Detached" logic If Step A worked, launch it like this:
Without this, the file might stay empty for a long time.
Since you are on Kali, screen is much better than nohup . It creates a virtual terminal
that stays alive even if you close your window.
3. Detach: Press Ctrl+A then D. (The script is now running in the background).
Troubleshooting Checklist:
3. Check Indentation: Python exit 2 sometimes occurs if the script has a mix of
tabs and spaces.
The [1] + exit 2 message is a specific error from the shell telling you that the
nohup command failed to even start your Python script.
Before trying to run it in the background again, run this command to see why it
crashed:
cat scan_results.log
Check if the script and wordlist actually exist where you think they do:
ls param_discovery_modify.py
ls /usr/share/seclists/Discovery/Web-Content/[Link]
Run the script normally for 5 seconds to ensure it starts without errors. If it asks for a
password or shows an error, you'll see it here:
python3 param_discovery_modify.py
(If it starts "Establishing baseline...", press Ctrl+C to stop it. It’s working!)
After running the command in Step C, use this to verify the process is alive:
tail -f scan_results.log
[2] 3025
The number [2] 3025 you see is actually a good sign—it means the system
successfully assigned Process ID (PID) 3025 to your script.
However, the fact that you saw exit 2 earlier suggests there is a specific error in
how the script is being called or how it is executing. In Kali Linux, Exit 2 usually
means "No such file or directory" or a "Python Syntax/Permission error."
The most common reason for exit 2 when using nohup is that the shell cannot find
the file or the wordlist inside it. Try running it with the full absolute path to your
script:
nohup python3 -u
/home/shadowiest/Desktop/bbh/Bitken/param_discover_modify.py >
scan_results.log 2>&1 &
Since your process is now running in the background (PID 3025), you can monitor it in
real-time. If it crashes, the error will appear here:
tail -f scan_results.log
ps -p 3025
1. Wordlist Path: Open your script and make sure the WORDLIST variable is exactly:
"/usr/share/seclists/Discovery/Web-Content/[Link]" (Run ls
2. Dependencies: Ensure curl_cffi is installed. If you are using a venv , you must
activate it before running nohup , or use the path to the venv's python: nohup
./venv/bin/python3 -u param_discover_modify.py ...
.txt instead of .py , the python3 command will fail to execute it.
What to do next:
Check your log file with cat scan_results.log . If the file is empty or contains an
error message, paste the error here, and I will give you the exact line of code to
fix it.
Would you like me to add a "Status Check" to the script so it emails you or
sends a Discord/Telegram notification when it finds a parameter?
[3] 3033
The [3] + exit 2 message confirms that the shell is failing to launch the script
correctly. In Linux, Exit Status 2 most commonly occurs when there is a typo in the
file path or a syntax error in the command.
Since you are using nohup , the error message is trapped inside scan_results.log .
You can see exactly what went wrong by running:
cat scan_results.log
(like param_discovery_modifywordslis01.py ).
2. Missing curl_cffi : If you are in a venv , nohup might not be using the virtual
environment's Python.
3. Permission Error: The script might not have execution permissions, or you lack
permissions to read the wordlist.
Since you are on Kali Linux, screen is a much better tool for bug bounty hunting than
nohup . It creates a "virtual terminal" that stays alive even if you close your window,
and you can jump back into it at any time to see the results.
screen -S bitken_scan
(Your terminal will clear—you are now inside the virtual screen).
source venv/bin/activate
python3 /home/shadowiest/Desktop/bbh/Bitken/param_discover_modify.py
4. Detach (Put it in the background): Press Ctrl+A then D . (You are now back at
your main prompt. The script is safely running in the background).
5. Check back later: To see your "HITS" and progress, just type:
screen -r bitken_scan
Try this "bulletproof" version of the command that uses the specific python inside your
venv to avoid environment issues:
Would you like me to add a line to the script that saves every "HIT" to a
separate file (e.g., found_params.txt ) so you don't have to scroll through a
giant log file?
Once your script finishes and you have a list of confirmed parameters in
scan_results.log , you transition from Reconnaissance to Vulnerability Analysis.
Your goal now is to determine why these parameters exist and if they can be
manipulated to bypass security.
Not all parameters are created equal. Look at your "HITS" and group them to decide
your attack strategy:
Parameter
Category Examples Potential Vulnerability
Identity/IDs id , user_id , uid , IDOR: Can you view or modify other users'
account data?
Navigation/Files url , redirect , SSRF / LFI: Can you force the server to fetch
path , file an internal file or URL?
Automation found the parameters; now your human intuition must exploit them.
3. Inject the Discovered Parameter: Manually add the parameter you found.
Example: [Link]
4. Analyze the Response: Look for changes in the JSON data, new headers (like X-
Debug-Mode ), or extra fields that weren't there before.
Success: If you see the email address, balance, or API keys of a different user,
you have a high-severity bug.
Success: Does the server return a stack trace, environment variables ( .env ), or
internal IP addresses?
Would you like me to show you how to modify your Python script to fuzz for
POST parameters using Content-Type: application/x-www-form-urlencoded ?
--------------------------------------------------
Great, your log shows that the scan is alive and working! You are currently at
parameter 4952 out of 6453 (~76% complete).
Since the script is running in the background, here are your next immediate steps to
manage this scan and prepare for the results.
tail -f scan_results.log
To Check for Hits: While the scan is running, you can search the log specifically
for hits:
If you see a line with your script name, it's still running. If only the grep command
appears, the script has finished or crashed.
Once the scan reaches 6453/6453, it's time to investigate the findings.
4. Look for anomalies: * Does the JSON response include new fields?
Would you like me to show you how to quickly turn this script into a POST-
parameter fuzzer for the next round?
It’s a smart move to transition to POST fuzzing. Many developers assume that since
POST parameters aren't visible in the URL bar, they don't need the same level of
security—which is exactly where bugs like IDOR or Mass Assignment live.
This script changes the logic from query strings ( ?p=1 ) to a POST body. Most
modern APIs use either standard Form-Data or JSON. I've configured this one to use
Form-Data ( application/x-www-form-urlencoded ), as it's the most common for
account-related actions.
import time
import random
import sys
from curl_cffi import requests
def main():
session = [Link]()
# 2. Load Wordlist
try:
with open(WORDLIST, 'r', errors='ignore') as f:
params = [[Link]() for line in f if [Link]()]
except:
return
for i, p in enumerate(params):
try:
# We send the parameter in the body: data={parameter:
value}
payload = {p: "1337"}
if res.status_code == 200:
current_size = len([Link])
if current_size != baseline_size:
print(f"\n[!!!] POST HIT: {p} (Size:
{current_size})")
except KeyboardInterrupt:
break
except:
continue
if __name__ == "__main__":
main()
To test for JSON, you just change one line in the script:
Since you are already scanning manually, I highly recommend the Param Miner
extension in Burp Suite. It is the industry standard for this task.
2. Select Extensions -> Param Miner -> Guess params -> Guess everything.
3. It will run in the background and log results to the "Extensions" output tab. It uses
advanced "Heuristic" checks (like observing how the server handles cache
headers) that are hard to script manually.
Should I show you how to modify the script to test for "Mass Assignment"?
This involves sending multiple parameters at once (e.g., {"id": 123, "is_admin":
true, "role": "superuser"} ) to see if the server accidentally accepts administrative
changes.
While your GET script is finishing its run, you have a perfect window to prepare for the
next phase of the hunt. Parameter discovery is only the "key" to the door; the
following options represent how you actually open it.
Why: Developers often define API keys, hidden "feature flags" (e.g., isBeta ,
showAdmin ), or internal routing parameters in JS files that no public wordlist will
ever contain.
APIs frequently take a JSON object as input. Even if a parameter isn't "found" by your
fuzzer, the backend might still be listening for it if you include it in a larger JSON block.
If you have Burp Suite open, you should use the Param Miner extension. It works
differently than your Python script—it uses "Heuristics" (behavioral analysis) to find
parameters.
2. Select Extensions -> Param Miner -> Guess params -> Guess everything.
JS Mining You want the exact parameters used by the LinkFinder / grep
developers.
Param Miner You want a "set it and forget it" deep-dive in Burp Extension
Burp.
POST Fuzzing You want to stick to your current automated Python (The POST
flow. script)
"JavaScript Mining" sounds technical, but it’s actually the simplest way to find the
exact parameters the website uses.
Think of it this way: Your current script is like a detective trying every possible key
from a giant "master ring" (the wordlist) to see which one fits the lock. JavaScript
Mining is like finding the blueprints for the building—the keys are already written on
the paper.
How it works
When you visit [Link] , your browser downloads several .js (JavaScript) files.
These files contain the instructions for how the website works. Inside those files,
developers write the code that talks to the API. It looks like this:
1. Find the JS Files: Most modern sites bundle their code into files named
[Link] , [Link] , or [Link] .
2. Make them Readable: These files are often "minified" (squashed into one long
line). You use a "Beautifier" tool to make them look like real code again.
3. Extract the Data: You search for patterns like api_key: , param: , or &[a-z]+= .
You don't have to read thousands of lines of code manually. Professional hunters use
these tools:
LinkFinder: A Python tool that specifically scans JS files and tells you every URL
and parameter it finds.
JSluice: A powerful tool that extracts information based on how the code is used,
not just what it looks like.
Discovery: You might find "hidden" features that are developed but not yet
launched to the public.
--------------------------------------------------
Since your scan for GET parameters finished with 0 results, it confirms that the
common wordlist didn't hit any hidden "simple" keys. This is normal! High-security
targets like BitKan often use specific, custom parameters that aren't in standard lists.
This is exactly why JavaScript (JS) Mining is the most effective next step. Instead of
guessing, we are going to look at the "blueprints" of the site to see what names the
developers actually used in their code.
When you load a website, your browser downloads JavaScript files to handle things
like login buttons, balance updates, and trade charts. These files contain "API calls"—
instructions that tell the browser how to talk to the server.
Inside a file like [Link] , you might find code that looks like this:
1. Find the JS URL: Open BitKan in your browser, press F12 (Developer Tools), go
to the Network tab, and filter by JS. Look for files like [Link] , [Link] , or
[Link] .
2. Run this Command: In your terminal, use curl to grab the file and grep with a
"Regular Expression" (Regex) to pull out words that look like parameters (words
followed by a colon or equals sign):
[a-zA-Z0-9_-]+[:=] : This "Regex" looks for any word followed by : (JSON style)
or = (URL style).
If you want to do this like a pro, use LinkFinder. It's a specialized tool that scans JS
files and automatically discovers endpoints and parameters.
Once you have your custom_wordlist.txt from the JS files, you run your Python script
again, but this time you point it to this new list:
Why this works: You are now testing words that definitely exist in the site's code.
This drastically increases your chances of finding a hidden parameter that the
developers forgot to protect.
Would you like me to help you set up a POST request script to test these
newly discovered parameters in the request body?
┌──(venv)─(python㉿shadowiest)-[~/Desktop/bbh/Bitken]
└─$
That command you just ran is a classic "one-liner" for building a targeted wordlist.
By piping the JavaScript code into grep and sed , you’ve essentially filtered out the
"noise" and kept only the words that the developers used as keys or variable names.
wc -l custom_wordlist.txt
Look at the first few words to see if they look like parameters:
head -n 20 custom_wordlist.txt
[!TIP] You are looking for words like apiKey , token , userId , is_admin , or debug .
If the list is full of random junk like div , class , or const , you might need to clean
it further, but usually, this command gives a great starting point.
WORDLIST = "custom_wordlist.txt"
python3 param_discover_modify.py
While parameters are great, you can also look for new URLs (endpoints) that aren't
linked in the main menu. Sometimes an API has a /admin_test or /internal_logs
path that is only mentioned in the JS files.
This will give you a list of paths. If you find one like /account/api/v2/config , you
should run your parameter discovery script on that specific URL.
Hunters often find "Mass Assignment" bugs this way. If you find a parameter named
role or is_verified in the JavaScript that isn't used in the normal UI, you can try
sending it in a request. If the server accepts it and changes your account status,
you've found a high-paying bug.
This video is helpful because it walks you through the process of extracting
parameters and sensitive endpoints from obfuscated JavaScript files, which is exactly
what your grep command is attempting to do.
0 custom_wordlist.txt
If your wordlist is empty ( 0 lines ), it means the curl command didn't find a file at
that specific URL, or the file was empty. In modern web apps like BitKan, JavaScript is
often split into dozens of small "chunk" files with random names (e.g., [Link] )
rather than one single [Link] .
To find the real files, we need to change our approach from "guessing the file name"
to "extracting the file names" from the website's HTML.
BitKan uses a framework (likely Vue or React) that loads scripts dynamically. You can
find these URLs in two ways:
5. You will see a list of files like [Link] or [Link] . Right-click one
and select Copy URL.
2. Automated JS Discovery
Since there are many files, use a "spidering" tool to find all of them at once. On your
Kali machine, you can use katana or waybackurls :
Once you have js_files.txt , use this loop to scan every file and build one big, high-
quality wordlist:
Why did the first one fail? Most websites now use Cache Busting. Instead of
[Link] , they use [Link] . If you try to download the old name, the server
Would you like me to show you how to use a tool called "Arjun"? It is a
specialized parameter discovery tool that is much faster than a standard Python script
because it uses "Hulk" (request-splitting) logic to test 10–20 parameters in a single
request.
This video is relevant because it demonstrates how professional hunters use tools to
scrape JavaScript files for hidden parameters and secrets during a live recon session.
Analysis (faster and handles thousands of lines) or Manual Inspection (better for
understanding logic).
Instead of reading the code yourself, use a tool to "mine" the parameters and
endpoints from that specific URL.
1. Using LinkFinder (on your Kali terminal): Since you've already cloned
LinkFinder, run it directly against that URL:
What this does: It uses Regex to find every URL, file path, and parameter (like ?
id= or admin: ) hidden in the code.
If you want to see the code yourself, follow these steps to make it readable:
1. Open the URL in a new tab. You will see a giant, messy wall of text (minified
code).
Click the { } (Pretty Print) button at the bottom left of the code window.
debug or test .
Hardcoded Keys const API_KEY = You might be able to use this key to
"sk_live_..."
bypass auth.
Would you like me to help you write a "loop" command that takes a list of
multiple JS URLs and extracts parameters from all of them at once?
This video is relevant because it provides a practical walkthrough on using tools like
SecretFinder to automate the process of extracting sensitive and hidden data from
JavaScript files.
The error you are seeing occurs because LinkFinder depends on a Python library
called jsbeautifier to clean up the messy JavaScript code before analyzing it. Since
you are working inside a virtual environment (venv) , the library needs to be installed
there specifically.
1. Ensure your VENV is active: You should see (venv) at the start of your
command prompt. If not, run:
source ~/Desktop/bbh/Bitken/venv/bin/activate
2. Install the requirements: The best way is to use the [Link] file
provided with LinkFinder, but you can also install just the missing piece:
python3 ~/LinkFinder/[Link] -i
[Link]
[Link] -o cli
Once it runs successfully, you will see a list of results in your terminal. Here is how to
read them:
Output
Type Example What it means
Endpoint /api/v1/user/settings A hidden URL path. Try visiting this or fuzzing it for
parameters.
Sometimes cli output can be overwhelming. If the screen scrolls too fast or you
want to save the results for later, redirect the output to a file:
Now that you have LinkFinder working, you should repeat this for 2-3 other JS files
you found in the Network tab (like [Link] or [Link] ). The "index" file usually
contains page-specific logic, while "vendor" or "main" files often contain the global API
configurations where the most interesting hidden parameters live.
Would you like me to show you how to combine all the parameters
LinkFinder finds into one final "super wordlist" for your scanner?
This video is relevant because it provides a step-by-step walkthrough for installing and
using LinkFinder on Kali Linux, which is exactly what you need to troubleshoot
dependency issues and start extracting endpoints.
The 403 Forbidden error you are getting from LinkFinder is almost certainly due to
Cloudflare (or a similar WAF) blocking the script. LinkFinder uses a very basic
"Python-urllib" identity when it tries to download the file, and BitKan's security sees
that as a "bot" and slams the door.
LinkFinder is trying to fetch the JS file like a script, not like a real browser. BitKan
requires a User-Agent and sometimes specific Headers to allow the download.
Instead of letting LinkFinder download the file, you can download it yourself with a tool
that mimics a browser ( curl or wget ) and then point LinkFinder to the local file.
Step A: Download the JS file locally Use curl with a Chrome User-Agent to
bypass the 403:
Step B: Run LinkFinder on the local file Now LinkFinder doesn't need to touch the
internet; it just reads the file from your Desktop:
If you want LinkFinder to handle the download directly, you have to edit its code to
use a better User-Agent.
2. Look for the line that starts with req = [Link](url...) (usually
around line 150-200).
If LinkFinder runs but shows nothing, it means that specific "chunk" file might only
contain layout code.
Next Action: Go back to your Chrome Network Tab, and look for a file called
[Link] or [Link] . These "Global" chunks are much more likely to
Would you like me to show you how to use a "Regex" to search your
local_script.js for secrets like API keys without using LinkFinder at all?
This video is relevant because it demonstrates the exact logic of why servers return
403 errors to scripts and how to modify your request headers to make your automated
tools appear as legitimate browser traffic.
-o local_script.js \
"[Link]
[Link]"
Success! You now have the full source code of that JavaScript file saved on your
machine as local_script.js . This is a huge advantage because you can now analyze
it without being blocked by Cloudflare.
Since you are in your (venv) , let's use LinkFinder on this local file.
Why this works: LinkFinder will now skip the 403 Forbidden error because it’s
reading the file directly from your hard drive instead of trying to download it from
BitKan’s server.
Run this "Super-Regex" to pull every possible key/variable name from the file and turn
it into a custom wordlist:
length($0) > 3 : This filters out tiny junk words (like id or a ) so your scanner
Now that you have analyzed the index file, you should have:
Your Next Move: Update your param_discover_modify.py to use the new wordlist:
Then, run the scan against the target URL again. You are no longer guessing—you are
testing the exact words used by the BitKan developers.
Would you like me to help you create a "One-Click" script that downloads
and extracts parameters from ALL those JS files at once so you don't have to
do it manually?
nano mine_js.sh
Paste the following code. This script uses a browser-like User-Agent to bypass the
403 errors you saw earlier:
#!/bin/bash
TARGET="[Link]
USER_AGENT="Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[Link]
Safari/537.36"
chmod +x mine_js.sh
./mine_js.sh
This new file is pure gold. It contains every variable name, JSON key, and parameter
the developers used across the entire site.
Now, go back to your param_discovery.py (or the POST version) and update the
wordlist path:
WORDLIST = "clean_wordlist.txt"
By scanning for parameters that actually exist in the code, you've narrowed your
focus from 6,000+ guesses to maybe 200–500 "real" names. If an API has a hidden
parameter like is_internal_tester or override_limit , it will be in that list.
Would you like me to show you how to use "Arjun" next? It's a specialized tool
that can test all 500 of these parameters in just a few seconds by grouping them into
"bulk" requests.
Hunting for Javascript! Bug bounty, scripthunter, jsmon, getjswords and more
This video is relevant because it features professional hunters discussing the best
automated tools and methodologies for discovering and extracting sensitive data from
JavaScript files in a bug bounty context.
./mine_js.sh
The reason you got 0 JS files is that BitKan, like most modern websites, uses a
"Manifest" or "[Link]" loader. The JS links aren't written in the main HTML source;
they are generated dynamically or hidden inside a specific folder structure that a
basic grep won't find.
Let's fix the script to be much more aggressive. We will target the [Link] build
manifest, which is where BitKan hides its list of all JavaScript "chunks."
Update your mine_js.sh with this improved version. I've added a step to find the
hidden _next paths:
#!/bin/bash
TARGET="[Link]
USER_AGENT="Mozilla/5.0 (Windows NT 10.0; Win64; x64)
if [ -z "$FILES" ]; then
echo "[!] No JS files found in HTML. Trying common [Link]
paths..."
# If the first grep fails, we try to guess the common layout path
FILES="/_next/static/chunks/[Link]
/_next/static/chunks/[Link] /_next/static/chunks/pages/_app.js"
fi
If the automated script fails, BitKan might be blocking curl even with a User-Agent.
Do this manually in 10 seconds:
1. Go to [Link] in Chrome.
3. Right-click any file ending in .js and select "Copy" -> "Copy all as URLs".
4. Paste those URLs into a file in your terminal named js_links.txt : nano
js_links.txt (Paste them here and save).
Since you are having trouble with manual scripts, I highly recommend using Arjun. It's
built specifically for this. It has its own built-in logic to find these parameters.
# Install it first
pip install arjun
What should we do next? Should I show you how to interpret the results if
Arjun finds something "different" than a standard response?
/_| _ '
( |/ /(//) v2.2.7
_/
Arjun’s output [!] No parameters were discovered means that while the tool
successfully communicated with the server, it didn't find any "hidden" keys in the GET
query string that changed the server's response.
However, the fact that Arjun extracted token and version from the response is a
major clue. It means the server is actively using those names.
If it still finds nothing, try JSON mode. Many APIs expect data in a JSON block rather
than a standard form:
If the default scan fails, you can force Arjun to be more aggressive by increasing its
"depth" or using the custom wordlist you built from the JS files.
Increase the level: This makes Arjun more thorough in how it compares
responses.
When Arjun says Analysing HTTP response for anomalies , it is looking for Reflections
(your input appearing in the response) or Changes in Content-Length.
4. Compare them: Does version 999 return a "Deprecated" error? Does it show
different data? If the response changes at all, you've found a working parameter.
WAF Blocking: BitKan might be seeing Arjun's high-speed requests and showing
a fake "static" page to every request. Use --stable and -d 2 (delay) to slow
down.
Authentication: Some parameters only reveal themselves if you are logged in.
Try adding your session cookie:
Would you like me to show you how to use "ParamSpider" next? It doesn't
"guess" parameters; it fetches every parameter ever seen by the Wayback Machine or
Google for that domain, which is a great way to find "retired" but still active
parameters.
/_| _ '
( |/ /(//) v2.2.7
_/
Since Arjun reported [!] No parameters were discovered for both GET and POST, it
confirms that BitKan's /account/api endpoint is not responding to standard form-
encoded fuzzing. This is actually a very good sign—it means the API is likely strictly
JSON or requires specific headers (like the token and version Arjun teased you
with).
Here is how you pivot your strategy to break through this wall.
--include : This tells Arjun that token and version are required. It will keep
them in every request while fuzzing for a third or fourth hidden parameter.
PUT Update account data Often has hidden "update" parameters like role .
If Arjun still finds nothing, it might be because the endpoint is authenticated. Look
back at the parameters Arjun extracted: token and version .
The logic: If you provide a valid token, the server might start "listening" for other
parameters.
Action: Log into BitKan in your browser, find your real token in the Network tab,
and feed it to Arjun:
Should I show you how to use Param Miner in Burp Suite? It is often better at
finding "unkeyed" parameters (like headers) that Arjun might miss, and it can run in
the background while you continue your manual testing.
/_| _ '
( |/ /(//) v2.2.7
_/
When Arjun identifies parameters like token and version in the response but fails to
find new ones, it indicates that the endpoint is likely protected by a Web Application
Firewall (WAF) or requires a valid session to reveal its true behavior.
Since this is a cryptocurrency platform, the API likely follows a strict schema. Here is
how to break through the "Zero Discovery" wall using your mined wordlist and
advanced techniques.
Many APIs ignore standard form data but process JSON. If the server expects
{"token": "..."} and you send token=... , the server will ignore it. Arjun's --
include flag is your key here.
What this does: It tells Arjun: "I know token and version are required. Keep
them in every request, and try adding every word from my custom list as a third
JSON key."
If you find a parameter name in the JavaScript like is_admin , role , or vip_level ,
but Arjun doesn't "hit" on them, it might be because the server only accepts them
during an Update (POST/PUT).
2. Add a common sensitive parameter from your wordlist to the JSON body:
{
"token": "your_token",
"version": "1",
"can_withdraw": true,
"role": "admin"
}
If Arjun is running too fast, BitKan’s firewall will give identical "200 OK" or "403
Forbidden" responses to every request, making it impossible for Arjun to find
"anomalies."
If you have Burp Suite, the Param Miner extension is often more effective than
Arjun for complex APIs.
Why? It doesn't just guess; it analyzes the Unkeyed Inputs (like headers) and
can find "fat" parameters hidden in the middle of a request.
How: Right-click the request in Burp -> Extensions -> Param Miner -> Guess
JSON parameters.
0 Params Found The WAF is blocking you or Use --stable and your
the list is wrong. clean_wordlist.txt .
token/version These are valid keys the Include them in your JSON body
extracted server mentions. during fuzzzing.
[Link] Chunks You have the developer's Use these words in your wordlist
Found vocabulary. (done!).
Would you like me to help you craft a specific POST/PUT request using your
mined token to see if we can trigger a "422 Unprocessable Entity" error
(which often leaks required parameter names)?
/_| _ '
( |/ /(//) v2.2.7
_/
The Connection aborted error is a clear signal that BitKan's Web Application
Firewall (WAF) has detected your automated scanning and has proactively cut the
connection.
The first thing to do is use the --stable flag. This forces Arjun to use a single thread
and adds random delays between requests, which helps avoid rate-limiting triggers.
By default, Arjun tries to pack 500 parameters into one request to save time. This is
what usually triggers a connection reset. Use the -c flag to send parameters in
smaller, less suspicious groups (e.g., 10 or 20 at a time).
WAFs often block requests that have a missing or generic "User-Agent." You should
provide a real browser header and a "Referer" to make it look like the request is
coming from the BitKan dashboard.
The fact that Arjun extracted these earlier means the server requires them. If you
send a "test" token, the WAF might still drop the connection because it's an invalid
value.
Pro-Tip: If you are logged into BitKan, copy your actual session token from the
browser's Network tab and use it in the --include flag. A request with a valid token is
much less likely to be "aborted" by a firewall.
Would you like me to show you how to find your real session token in the
browser to make these requests "authenticated" and harder to block?
This video provides a practical walkthrough of using Arjun's various flags, including
how to handle request methods and stability settings to avoid being blocked during a
scan.
While Arjun is running in the background to find hidden parameters, you shouldn't
just wait. In the world of bug bounty hunting, the best finds often come from manual
logic testing while your automation handles the "grunt work."
Since you are testing a cryptocurrency exchange like BitKan, the stakes are high, and
the most critical bugs will be related to Authentication, Authorization, and
Financial Logic.
This is the #1 vulnerability in APIs. It happens when you can access another user's
data by changing an ID.
The Test: If the API response includes an ID (e.g., {"user_id": 12345} ), try
changing your request to use 12346 .
What to look for: Does the server return data for a user that isn't you? Even if
it's just an email or a balance, that's a valid bug.
Pro-Tip: Check for IDs in the URL path ( /api/v1/user/12345/balance ) and the
JSON body.
{
"token": "your_valid_token",
"version": "1",
"role": "admin",
"isVip": true
}
Goal: See if the server accepts these "hidden" instructions and changes your
account status.
Since this is a crypto site, look for flaws in how they handle numbers and sequences.
Rounding Errors: Try very long decimals (e.g., 0.000000000001 ) to see if the
system rounds up in your favor.
Race Conditions: If you have an endpoint for "claiming a bonus," try sending 50
requests at the exact same millisecond (using Burp Intruder or a script) to see if
you can claim it twice.
Arjun already told you these two exist. Now, "stress test" them manually in Burp Suite:
Action Goal
Strengths Finding hidden parameter names. Finding flaws in business logic &
math.
While Arjun is doing its slow, stable crawl, open your browser's Network Tab or Burp
Suite and find the endpoint where you can change your profile name or settings.
Would you like me to help you write a small Python script to test for IDOR by
cycling through 100 User IDs to see if any return a 200 OK with sensitive
data?
To master Arjun and perform deep security testing on BitKan, you need a full list of
commands that cover discovery, bypassing protections, and manual exploitation.
Arjun is powerful because it can "chunk" thousands of parameters into a few requests.
Use these flags to refine your scan.
POST JSON arjun -u [URL] -m JSON Scans for keys inside a JSON body
(crucial for modern APIs).
Export arjun -u [URL] -oJ [Link] Saves hits to a JSON file for further
automated processing.
time).
Stability Mode ( --stable ): Sets threads to 1 and adds a 6–12 second delay to
avoid triggering firewalls.
While Arjun runs, you should perform these manual tests in Burp Suite to find high-
severity logic bugs.
3. Check Sensitivity: Does it return another user's balance, email, or trade history?
Mass Assignment
{
"username": "shadowiest",
"email": "test@[Link]",
"role": "admin",
"is_verified": true
}
Would you like me to show you how to use ffuf to discover hidden API
versions like /api/v1/ vs /api/v2/ that might have different security
controls?
This video provides a deep dive into the flags and features of Arjun, specifically
explaining how to use it for different request methods and how to avoid detection.
While Arjun handles the automated discovery of hidden parameters, your next steps
should focus on manual investigation and broadening your search to other parts of
the platform. Bug bounty hunting is a game of finding what others missed, and that
often happens where automation can't reach.
If /account/api is a dead end, there are likely dozens of other endpoints on BitKan.
Use these tools to find them:
FFUF (Fuzz Faster U Fool): Use this to find hidden directories or API versions
(like /api/v2 , /admin , or /config ).
Waybackurls / GAU: These pull every URL for BitKan that has ever been indexed
by search engines. This is how you find "forgotten" endpoints.
Since BitKan is a modern web app, most of the logic is in the JS files. You found 0 files
earlier because of how they are loaded, but you can try these specialized tools:
SecretFinder: Searches JS files for sensitive data like API Keys, Firebase URLs,
or hardcoded credentials.
balance.
Price Manipulation: In any trade or purchase request, try changing the amount
to a negative number or a very small decimal.
Parameter Pollution: Try sending the same parameter twice with different
values, like ?id=1&id=2 . Some servers will only see the second one, potentially
bypassing security filters.
Tool
Task Recommendation Why?
Before you go any further, make sure you are allowed to test BitKan. Check
HackerOne or Bugcrowd for their official program. Testing a site without a
"Vulnerability Disclosure Policy" (VDP) can lead to legal issues.
Would you like me to help you set up Nuclei? It's an automated scanner that
can check for over 5,000 known vulnerabilities on your target with one
command.
Here is your manual to turning those paths into valid bug reports:
Before doing deep manual work, run a fast scan to see which paths are actually alive
and how the server reacts to them. Use httpx to check status codes and content
lengths.
Command:
Look for 403 Forbidden: These are often "juicy" admin panels. Try bypassing
them using techniques like adding X-Forwarded-For: [Link] headers in Burp.
Look for unique Content-Length: If 99 paths return 150 bytes and one returns
4500 bytes, that one is different and needs your attention.
Group your juicy paths by "type" and apply these specific testing methodologies:
If you find a path like /api/v1/export/data , don't just visit it. Think like a developer
and try to "guess" the rest of the functionality.
1. Method Swap: If you find a GET endpoint, try it as a POST, PUT, or DELETE.
3. Parameter Injection: Take your Arjun findings and apply them here. If you found
a debug parameter earlier, try appending ?debug=true to these new juicy paths.
If a juicy path gives you a 403 Forbidden, it means the WAF or server knows you
shouldn't be there. Try these "Path Confusion" tricks in Burp Suite:
[Link]
[Link]
Should I show you how to use a "403 bypass" tool like bypasser or a Burp
extension to automate these checks on your juicy paths?
This video is relevant because it explains how to handle discovered API endpoints,
specifically focusing on "Shadow APIs" and "Zombie Endpoints" that are often found in
"juicy" path files.
Yes, you can test for bugs on BitKan, but you must do it through their official bug
bounty program to remain legal and eligible for rewards.
According to current data for 2025, BitKan has an active bug bounty program hosted
on HackenProof.
Rate Limiting: You must use a delay (e.g., 1–2 seconds per request).
Only Test Your Own Account: Never attempt to access or modify other users'
data.
Stay In-Scope: Ensure the "juicy paths" you found belong to the domains listed
in their program (usually *.[Link] ).
If your IP is blocked, it means BitKan's WAF (Web Application Firewall) has flagged your
activity as malicious.
2. Read the HackenProof policy to see if they provide a specific header (like X-
Bug-Bounty: HackenProof-YourUsername ) that you should include in your requests
3. Use a VPN or Proxy only if the program rules allow it, but be careful: some
platforms will ban you for using proxies to hide your identity.
Detection Risk High (Triggers WAF/IP Ban) Low (Looks like regular traffic)
Bounty Value Usually "Low" (Duplicate bugs) Usually "Critical" (Logic bugs)
Would you like me to help you draft a professional "Proof of Concept" (PoC)
for one of the paths you found so you can submit it to HackenProof safely?
Yes, this path is potentially very "juicy" for bug bounty hunting. In API security, any
endpoint related to financial value, user activity, or rewards is a high-priority
target.
Here is why this specific path stands out and how you should test it:
Based on this path, you should focus on these three specific attack vectors:
BOLA / IDOR Accessing another Change your user_id or session token in the
user's reward request and see if you can view page=1 of a
history. different account.
Mass Forcing the server to In a POST request to this path, try adding hidden
Assignment grant you a reward. fields like "status": "claimed" or "amount":
1000 .
Race Claiming the same Send 20-50 simultaneous requests to the "claim"
Condition voucher multiple function of this API to see if it processes them
times. before updating your balance.
1. Check the Method: Does it only support GET ? Use Burp Suite to change the
method to POST , PUT , or PATCH . Sometimes POST reveals hidden administrative
functions.
2. Fuzz the Parameters: You found ?page . Use Arjun or Burp Intruder to see if it
also accepts:
?user_id=
?voucher_id=
?admin=true
?debug=1
3. Inspect the JSON Response: Look for "Excessive Data Exposure." Does the
response include internal system IDs, developer notes, or other users' emails?
4. Important Warning
Since this involves rewards and vouchers, BitKan’s fraud detection systems will be
very sensitive to this endpoint.
Stop as soon as you prove the vulnerability (e.g., you see a "Success" message or
another user's data) and report it to their HackenProof program immediately.
Since this path includes sensitive terms like voucher and reward, it is likely a REST
API endpoint. To test it properly, you need to use different tools for Parameter
Discovery (Arjun) and Payload Fuzzing (FFUF).
Use Arjun to find if there are other hidden keys (like user_id , admin , or amount ) that
the server accepts besides just page .
The Command:
If you want to see if you can access other users' rewards by changing the page or a
potential id , use FFUF.
The Command:
FUZZ : This is the placeholder FFUF will replace with lines from your wordlist.
If you suspect the API allows POST requests (to claim a reward), you should fuzz the
body for Mass Assignment.
The Command:
-d : Sends a JSON body. Here, we are guessing if there's a hidden key (like
claim ) that can be set to true .
-fc 400,404 : Filters out "Bad Request" and "Not Found" to keep your terminal
clean.
Would you like me to generate a [Link] file for you to use with the
FFUF command above?
In most security tools and tutorials, [Link] isn't a single file that comes pre-
installed in a specific location; rather, it is a custom wordlist you generate yourself
or download from a repository like SecLists.
If you need a specific number of digits (like 4-digit PINs), you can use the crunch tool:
If you have SecLists installed, there are high-quality numeric wordlists already on
your system. You can find them in the following directory:
Path: /usr/share/seclists/Fuzzing/
Common files:
[Link]
[Link]
If you don't have it, you can install it with: sudo apt install seclists .
ls /usr/share/wordlists/
Summary of Commands
For your voucher reward testing, a simple sequence from 1 to 500 is usually enough
to see if you can access other "pages" of rewards.
Would you like me to show you how to use a "Clusterbomb" attack in FFUF to test
both page numbers and user_id at the same time?
This video is relevant because it demonstrates how to use FFUF for web fuzzing,
including how to handle various wordlists and parameters in a real-world testing
scenario.
Since you already have a clean_wordlist.txt , you can use that as your
custom_params.txt . However, if you want to create a fresh one specifically for
You should populate this file with words that developers often use for reward systems.
Run this command to create a focused list:
Location: /usr/share/seclists/Discovery/Web-Content/[Link]
Alternative: /usr/share/seclists/Discovery/Web-Content/[Link]
cp /usr/share/seclists/Discovery/Web-Content/[Link]
custom_params.txt
To be most effective, combine the general lists with the specific words you found on
BitKan's site:
Once you have your custom_params.txt ready, would you like me to help you
set up a "clusterbomb" attack in FFUF to test 100 different page numbers
against 100 different hidden parameters simultaneously?
To filter out responses that contain exactly 668 words in ffuf , you use the -fw
(Filter Words) flag.
The Command
ffuf -u [Link]
-w [Link] -fw 668
When you are fuzzing an endpoint, the server often returns a "standard" error page or
a default empty response for most inputs. If that default response always has a word
count of 668, your results will be cluttered with thousands of identical, useless entries.
By using -fw 668 , you tell ffuf : "Hide every result that has 668 words, and only
show me the ones that are different."
In addition to word count, you can filter by other attributes to find those "juicy" hits:
-fs Filter Size: Hides responses of a specific byte size. -fs 1234
-fl Filter Lines: Hides responses with a specific number of lines. -fl 25
-fc Filter Code: Hides specific HTTP status codes. -fc 404,403
If you aren't sure what the "junk" response looks like yet, run the command without
filters first for just a few seconds:
3. Stop the scan ( Ctrl+C ) and re-run it with the corresponding filter flag (e.g., -fw
668 ).
Would you like me to help you combine multiple filters (like word count and status
code) to make your scan even more precise?
v2.1.0-dev
________________________________________________
:: Method : POST
:: URL :
[Link]
:: Wordlist : FUZZ:
/home/python/Desktop/bbh/Bitken/custom_params.txt
:: Calibration : false
:: Timeout : 10
________________________________________________
The results from your ffuf scan show multiple Status: 403 (Forbidden) responses
with a Size: 0. This is a very specific behavior that tells us a few things about how
BitKan's infrastructure is reacting to your probes.
When you see a 403 with zero content and a word count of 1 , it typically means one
of two things:
WAF Blocking: The Web Application Firewall (like Cloudflare or Akamai) has
identified the "Fuzzing" pattern and is silently dropping the connection or sending
a empty forbidden response to save bandwidth.
Notice the Duration column. Some requests took 87ms while others took 8064ms.
Long Duration (~8000ms): These likely hit a backend server that timed out or
was heavily rate-limiting you.
Since you are getting blocked, you need to change your signature to look like a real
browser rather than a script.
Firewalls often block ffuf because its default User-Agent is ffuf . Try adding a
realistic one:
ffuf -u "[Link] \
-X POST \
-H "Content-Type: application/json" \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[Link]
Safari/537.36" \
-H "Referer: [Link] \
-d '{"page":"1", "FUZZ":"true"}' \
-w custom_params.txt -fc 400,404 -fs 5962 -fw 668 -p 0.5
Note: I added -p 0.5 , which adds a half-second delay between requests to avoid
triggering the rate-limiter.
Summary Checklist
All 403s You are blocked or missing a Add a Cookie or Authorization header.
header.
Random You are hitting a rate limit. Increase delay ( -p 1 ) and reduce threads ( -
403s t 5 ).
Status 500 You broke the server logic. Juicy! Try to figure out what parameter
caused the crash.
Would you like me to show you how to find your actual Cookie in Chrome so
you can run this as an "authenticated" user, which is much less likely to be
blocked?
-X POST \
-H "Content-Type: application/json" \
-H "Referer: [Link] \
-d '{"page":"1", "FUZZ":"true"}' \
v2.1.0-dev
________________________________________________
:: Method : POST
:: URL :
[Link]
:: Wordlist : FUZZ:
/home/python/Desktop/bbh/Bitken/custom_params.txt
:: Calibration : false
:: Timeout : 10
:: Threads : 40
________________________________________________
Here is how to interpret those results and your immediate next steps to keep testing
safely.
Status 403 & Size 0: The server is acknowledging your request but refusing to
process it. Because the size is 0, it’s not even sending you a "Forbidden" HTML
page; it's a silent block.
Duration Variation: Notice the jump from 911ms to over 8000ms. This
suggests the server is intentionally slowing down your requests (Tarpitting) before
finally killing them.
The "A" result: This was just the first letter of your wordlist. Since it was blocked,
every other word after it was likely blocked automatically.
Most BitKan API endpoints—especially /reward —require you to be logged in. Without
a session cookie, the server rejects the request immediately.
4. Look for the Cookie: header under Request Headers. Copy the entire string.
Updated Command:
ffuf -u "[Link] \
-X POST \
Note: I changed the threads to -t 5 and delay to -p 1.0 . BitKan's official policy
on HackenProof strictly limits researchers to 5 requests per second.
Before you continue, you must follow the rules on their HackenProof page to ensure
your report is accepted and you aren't banned:
Forbidden Tests: Do not perform any "destructive" tests (deleting data) or social
engineering.
Once you run the authenticated scan, look for these specific "hits":
Status 500: You found a parameter that caused a backend crash (potential for
SQL Injection or RCE).
Status 422: The server liked the parameter name but wanted a different data
type (e.g., a number instead of "true"). This is a strong lead!
Would you like me to help you create a specific "bypass" wordlist that
includes headers like X-Forwarded-For to try and trick the WAF?
This video is highly relevant as it provides a deep dive into 403 bypass techniques,
which is exactly the hurdle you are currently facing with the BitKan endpoint.
If you cannot get a session cookie, you are essentially testing as an unauthenticated
user. Since BitKan's /reward endpoint is highly sensitive, it's very likely they have a
strict "Forbidden" (403) policy for anyone without a valid login.
However, in bug bounty hunting, 403s are often just "doors" that can be tricked. Here
are your alternative options to continue testing without a cookie.
Many Web Application Firewalls (WAFs) can be fooled by adding headers that make
the request look like it’s coming from the server's own internal network or a trusted
proxy.
X-Forwarded-For: [Link]
X-Originating-IP: [Link]
X-Remote-IP: [Link]
X-Client-IP: [Link]
Command Example:
ffuf -u "[Link] \
-X POST -H "Content-Type: application/json" \
-H "X-Forwarded-For: [Link]" \
-d '{"page":"1", "FUZZ":"true"}' \
-w custom_params.txt -fc 400,404
Sometimes a server blocks POST requests to an endpoint but forgets to block GET ,
PUT , or PATCH . If a GET request returns a 200 OK instead of a 403 , you've found a
security misconfiguration.
You can try to trick the routing engine by adding special characters to the URL. This is
a very common way to bypass 403 errors in 2025.
[Link] (Dot-slash)
Command:
Would you like me to generate a specific "403 bypass" wordlist that contains
all these header and path variations for you to use with FFUF?
This video is highly relevant as it explains various techniques to bypass 403 Forbidden
errors, which is exactly the challenge you're facing when trying to test the BitKan
endpoint without a cookie.
-H "X-Forwarded-For: [Link]" \
-d '{"page":"1", "FUZZ":"true"}' \
v2.1.0-dev
________________________________________________
:: Method : POST
:: URL :
[Link]
:: Wordlist : FUZZ:
/home/python/Desktop/bbh/Bitken/custom_params.txt
:: Calibration : false
:: Timeout : 10
:: Threads : 40
________________________________________________
This scan shows that the X-Forwarded-For header changed the server's behavior—
instead of a silent block (Size 0), it is now returning a full Size: 5962 forbidden page.
This means the server is actively processing the request but still denying it because
you lack a valid session.
Since you cannot find a cookie, we need to pivot. Most modern APIs have "Public"
versus "Private" endpoints. If the V2 reward path is locked, we should search for
unprotected assets or misconfigured subdomains.
If we can't get into the API, let's see if the API keys or tokens are already leaked in
public code repositories or historical archives.
Try sending the same parameter twice. Some backends will prioritize the second one,
potentially bypassing a firewall that only checks the first.
ffuf -u "[Link]
page=1&page=FUZZ" \
-H "X-Forwarded-For: [Link]" \
-w custom_params.txt -fc 400,404 -fs 5962
Size 5962 Server is talking to you Try URL encoding (e.g., replace / with %2f ).
now.
Duration Very fast response. Likely a local load balancer; try changing the
~40ms Host header.
Would you like me to give you a list of "GitHub Dorks" specifically for BitKan
to see if any developers leaked internal keys?
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
l?type=
[Link]
?type=
[Link]
[Link]
[Link]
type=all&
[Link]
[Link]
ents?comment\_id=
[Link]
[Link]
[Link]
password\_with\_sp
[Link]
[Link]
[Link]
[Link]
accountType=
[Link]
[Link]
copytrading=
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
st?coin=
[Link]
[Link]
[Link]
[Link]
[Link]
d
[Link]
[Link]
[Link]
session\_id=
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
device\_id=
[Link]
[Link]
contract\_id=
[Link]
[Link]
[Link]
cket?
[Link]
contract\_id=
[Link]
[Link]
?
[Link]
story?user\_id=
[Link]
osition?user\_id=
[Link]
[Link]
[Link]
[Link]
contract\_id=
[Link]
contract\_id=
[Link]
contract\_id=
[Link]
[Link]
[Link]
exchange=
[Link]
rder
[Link]
[Link]
[Link]
[Link]
[Link]
contract\_id=
[Link]
[Link]
e
[Link]
contract\_id=
[Link]
[Link]
order\_id=
[Link]
[Link]
nfo?id=
[Link]
[Link]
[Link]
et\_announcement?
[Link]
et\_announcement?type=
[Link]
page=
[Link]
[Link]
[Link]
type=
[Link]
tick\_open?market\_id=
[Link]
ck?market\_id=
[Link]
trade\_pair=
[Link]
?version=&locale=
[Link]
[Link]
[Link]
_new\_market\_rank?size=
[Link]
[Link]
t?page=
[Link]
market\_index=
[Link]
market\_index=
[Link]
coins=
[Link]
[Link]
category\_version=
[Link]
[Link]
volume\_page=
[Link]
?site=
[Link]
[Link]
il\_for\_web?coin=
[Link]
il\_for\_web?coin\_name=
[Link]
\_history?type=
[Link]
[Link]
\_name?coin\_name=
[Link]
\_type?type=defi
[Link]
market\_ids=
[Link]
[Link]
[Link]
type=
[Link]
?site=
[Link]
[Link]
uuid=
[Link]
[Link]
[Link]
st
[Link]
ig
[Link]
e?coin=
[Link]
[Link]
site=
[Link]
[Link]
?time\_zone=
[Link]
marketID=
[Link]
e?site=
[Link]
pe
[Link]
keywords=
[Link]
[Link]
[Link]
_token
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
asks?user\_id=
[Link]
id=
[Link]
stopInfoId=
[Link]
nse
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
id=
[Link]
[Link]
[Link]
heck\_pre
[Link]
heck\_pre?version=
[Link]
[Link]
[Link]
[Link]
lang=
[Link]
lang=
[Link]
on?lang=
[Link]
coin\_name=
[Link]
s?lang=
[Link]
[Link]
type=expert&page=
[Link]
[Link]
[Link]
[Link]
type=all&sort=
[Link]
[Link]
[Link]
_coin?coin=
[Link]
evices
[Link]
user\_id=
[Link]
ty\_password
[Link]
_token
[Link]
ket\_token
[Link]
ode
[Link]
ode
[Link]
qr\_token=
[Link]
[Link]
[Link]
_token
[Link]
es
[Link]
[Link]
e\_verify?ott=
[Link]
y
[Link]
type=
[Link]
de
[Link]
nfo
[Link]
d
[Link]
ogin
[Link]
ogin\_check
[Link]
biz\_type=
[Link]
erify\_code
[Link]
[Link]
\_login
[Link]
hone\_code
[Link]
[Link]
[Link]
[Link]
user\_id=
[Link]
mers
[Link]
[Link]
oken
[Link]
?level=
[Link]
try?country=
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
short=
[Link]
nk
[Link]
[Link]
[Link]
userId=
[Link]
userId=
[Link]
userId=
[Link]
coin=
[Link]
userId=
[Link]
monitorId=
[Link]
userId=
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]/appleauth/static/jsapi/appleid/1/en\_US/appleid.
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
step=1&symbol=
[Link]
symbol=
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
l?type=
[Link]
?type=
[Link]
?uid=
[Link]
[Link]
[Link]
type=all&
[Link]
[Link]
ents?comment\_id=
[Link]
[Link]
[Link]
password\_with\_sp
[Link]
[Link]
accountType=
[Link]
[Link]
copytrading=
[Link]
?userid=
[Link]
g?userid=
[Link]
[Link]
page=
[Link]
[Link]
[Link]
tes
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
st?coin=
[Link]
[Link]
[Link]
limit=10
[Link]
ate\_list?page=
[Link]
[Link]
d
[Link]
[Link]
[Link]
session\_id=
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
device\_id=
[Link]
[Link]
[Link]
[Link]
[Link]
cket?
[Link]
contract\_id=
[Link]
[Link]
?
[Link]
story?user\_id=
[Link]
osition?user\_id=
[Link]
[Link]
[Link]
[Link]
contract\_id=
[Link]
contract\_id=
[Link]
contract\_id=
[Link]
[Link]
[Link]
exchange=
[Link]
rder
[Link]
[Link]
[Link]
[Link]
[Link]
contract\_id=
[Link]
[Link]
e
[Link]
contract\_id=
[Link]
[Link]
order\_id=
[Link]
[Link]
nfo?id=
[Link]
[Link]
[Link]
[Link]
page=
[Link]
[Link]
ck?market\_id=
[Link]
trade\_pair=
[Link]
[Link]
_new\_market\_rank?size=
[Link]
_rank?type=
[Link]
[Link]
market\_index=
[Link]
coins=
[Link]
[Link]
[Link]
volume\_page=
[Link]
[Link]
il\_for\_web?coin\_name=
[Link]
[Link]
\_name?coin\_name=
[Link]
\_type?type=defi
[Link]
[Link]
?site=
[Link]
uuid=
[Link]
[Link]
ig
[Link]
e?coin=
[Link]
ency\_config
[Link]
[Link]
onfig?coin=
[Link]
?time\_zone=
[Link]
marketID=
[Link]
[Link]
_token
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
asks?user\_id=
[Link]
id=
[Link]
stopInfoId=
[Link]
nse
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
heck\_pre?version=
[Link]
ntent
[Link]
[Link]
master\_category=
[Link]
[Link]
[Link]
lang=
[Link]
lang=
[Link]
on?lang=
[Link]
coin\_name=
[Link]
s?lang=
[Link]
[Link]
row\_id=
[Link]
[Link]
type=expert&page=
[Link]
[Link]
[Link]
[Link]
type=all&sort=
[Link]
[Link]
_coin?coin=
[Link]
ber
[Link]
evices
[Link]
user\_id=
[Link]
ty\_password
[Link]
_token
[Link]
ket\_token
[Link]
ode
[Link]
qr\_token=
[Link]
es?page=
[Link]
list
[Link]
ist?invite\_code=
[Link]
er\_code
[Link]
er\_user\_list?page=
[Link]
[Link]
_token
[Link]
es
[Link]
[Link]
e\_verify?ott=
[Link]
y
[Link]
de
[Link]
nfo
[Link]
ode
[Link]
d
[Link]
biz\_type=
[Link]
biz\_type=ksite
[Link]
[Link]
locale=
[Link]
[Link]
user\_id=
[Link]
mers
[Link]
[Link]
oken
[Link]
?level=
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
short=
[Link]
[Link]
You have just hit a goldmine of endpoints. This list represents the internal skeleton
of the BitKan application. Now, you need to transition from "Discovery" to "Targeted
Exploitation."
Since this is a cryptocurrency exchange, the most valuable bugs are those that allow
you to access other people's money, private data, or trade on their behalf.
Look at any link that has a uid= , user_id= , or id= . These are highly vulnerable to
Insecure Direct Object Reference.
Endpoints to target:
.../v2/group/get_user_contents?uid=FUZZ
.../v2/contract/copytrading/trader_history?user_id=FUZZ
.../v2/user/account/m_block_user?user_id=FUZZ
.../v2/user/kyc/m_check_result?user_id=FUZZ
The Test: 1. Log in with your account. 2. Find your own uid or user_id . 3. Swap it
with another number (e.g., if you are 1001 , try 1002 ). 4. The Goal: Can you see
their trade history, block them, or see their KYC status? If yes, this is a
High/Critical bug.
You have found several "Configuration" and "Profile" links. These often leak API keys or
system secrets.
Endpoints to target:
or secret salts).
Endpoints to target:
.../v2/activity/voucher/reward?page=
.../v2/activity/voucher/voucher_rebates
.../v2/asset/asset/m_pay
The Test:
Race Condition: Send 50 requests to m_pay at the exact same time. Does it
deduct the balance once or multiple times? Or does it grant a reward twice?
Endpoints to target:
.../v1/account/m_modify_password
.../v1/account/m_reset_password
.../v2/user/account/w_second_verify_login
The Test:
MFA Bypass: When prompted for a phone code, can you simply browse to the
m_profile page and skip the check?
Reset Bypass: In the password reset flow, try changing the email parameter in
the final POST request to see if you can reset someone else's password.
Attack
Category Specific Endpoint Example Fuzz Strategy
Choose one of the IDOR endpoints (like the KYC check or trader history) and use
ffuf with a small range of numbers.
Would you like me to write a specialized ffuf command to test the user_id
parameter on that KYC endpoint specifically?
In bug bounty hunting, "high-value steps" often refer to the exploitation of Broken
Object Level Authorization (BOLA/IDOR) and Mass Assignment vulnerabilities.
These are critical because they allow unauthorized access to sensitive data or
administrative functions.
Below are the commands and testing patterns for these high-value vulnerabilities,
followed by a list of sensitive endpoints to target.
IDOR (Insecure Direct Object Reference) is the #1 vulnerability for high payouts. Use
these patterns to test if you can access or modify other users' data.
Numeric vs. UUID: If a UUID is used (e.g., 550e8400-e29b... ), look for where
that UUID might be leaked (public profiles, comments, or older API versions that
used integers).
Testing for Hidden Fields: Add sensitive fields to a PUT or POST request:
{
"username": "hunter",
"email": "hunter@[Link]",
"is_admin": true,
"role": "admin",
"balance": 9999
}
When hunting, focus your reconnaissance on these high-impact areas. Finding a bug
here usually results in a Critical or High severity report.
others' passwords.
token.
Cryptocurrency Specific
/api/v1/withdraw : Test for Parameter Pollution or Race Conditions.
/api/v1/internal/config : Look for leaked internal API keys or hot wallet settings.
Use these "commands" in GitHub's search bar to find leaked credentials for your
target:
"[Link]" filename:.env
"[Link]" "api_key"
Would you like me to create a Burp Suite Intruder payload list specifically for
Mass Assignment field guessing (e.g., isAdmin , root , premium )?
To master "High-Value" steps in bug bounty, you need to move beyond manual testing
and use automation tools like ffuf (Fuzz Faster U Fool). These commands allow you to
find hidden data and privilege escalation bugs (IDOR and Mass Assignment) that
others miss.
IDOR (Insecure Direct Object Reference) is the highest payout bug. Use this command
to test if you can access other users' data by cycling through IDs.
Scenario: You found api/v1/user/123 and want to check if you can see users
100 through 200 .
Pro Tip: If the site uses UUIDs (long random strings), use GitHub Dorks or search
the site's JavaScript files to find valid UUIDs first, then put them in your [Link] .
This tests if you can "overpost" hidden fields (like isAdmin: true ) into a JSON request
to upgrade your account.
Scenario: You want to see if the server accepts a role or is_admin field that
isn't in the normal UI.
Sometimes an endpoint blocks GET but allows DELETE or PUT . This command tests
multiple HTTP methods at once.
When you start hunting, point your tools at these specific areas. These are the
"sensitive list" where critical data usually leaks:
1. Recon First: Find the API version (e.g., /api/v1/ vs /api/v2/ ). Sometimes old
versions have no security.
2. Auth Check: Always test with a low-privilege account token. If you get a 200 OK
on an admin endpoint, you've found a bug.
3. Filter Noise: Use -fc 404,403 in your commands to hide "Not Found" or
"Forbidden" errors so you only see the successes.
First, determine how you found it. This dictates your next command:
If the file was a parameter value, try to read the most sensitive file on the server.
If there is one sensitive file, there are likely others. Use ffuf to find them: ffuf -w
common_sensitive_files.txt -u [Link] -mc 200
The contents of a_juicy_path.txt itself might be the "key." Open it and look for:
Internal Paths: Paths like /var/www/internal/admin_v3/ which you can then plug
into your browser.
If you can read files, try to access these specific targets to increase your bounty
payout:
/var/www/html/[Link] Source code showing how the app connects to the database.
Stop once you have proven you can read a sensitive file (like /etc/passwd ). Do not
attempt to download the entire database or PII (Personally Identifiable Information) of
Would you like me to write a professional bug report template for this
finding to help you get it triaged faster?
To proceed with your bug bounty hunt on BitKan, you need a clear, structured plan.
Since you've found a large list of endpoints, the next step is Active Testing.
Here is your step-by-step command guide for the most sensitive areas you
discovered.
This is the highest value test. You want to see if you can access data belonging to
other User IDs ( uid ).
Target: [Link]
ffuf -u
"[Link]
uid=FUZZ" -w [Link] -mr "username" -c
-mr "username" : This tells FFUF to only show results that contain the word
Target: [Link]
X-Forwarded-For: [Link]
X-Originating-IP: [Link]
X-Remote-IP: [Link]
X-Client-IP: [Link]
ffuf -u "[Link] -H
"FUZZ" -w [Link] -mc 200,201
You found a .conf path in your list. We need to see if other dangerous files exist in
that same folder.
Target: [Link]
ffuf -u "[Link] -w
/usr/share/seclists/Discovery/Web-Content/[Link] -
mc 200,301
Try to "inject" a hidden field into a profile update to see if the server accepts it.
ffuf -u "[Link] \
-X POST -H "Content-Type: application/json" \
-d '{"name":"Hacker", "FUZZ": true}' \
-w /usr/share/seclists/Discovery/Web-Content/[Link] -mc
200
Goal: If the server returns 200 OK for a parameter like is_admin , you might
have escalated your account.
BitKan's policy on HackenProof allows researchers, but you must not crash their
server.
Always add -p 0.2 to your FFUF commands (this adds a small delay).
Would you like me to help you draft a bug report for any of the 200 OK
responses you get from these commands?
When a file path is exposed, security researchers typically look for Broken Access
Control and Injection vulnerabilities using the following manual testing patterns:
Path Traversal ( ../../ ): This involves checking if the application allows access
to files outside the intended directory. Researchers test this by trying to reach
known system files like /etc/passwd on Linux or C:\Windows\[Link] on
Windows.
IDOR (Insecure Direct Object Reference): If the file name looks like part of a
sequence (e.g., file_001.txt ), researchers check if they can access
file_002.txt without proper authorization.
Null Byte Injection: On older systems, adding a null byte () might truncate a file
extension, potentially allowing a researcher to bypass filters that only allow .txt
files.
Input Validation Use a whitelist of allowed file names and characters. Reject any input
containing slashes ( / , $)ordot − sequences(..$ ).
Filesystem Run the application with the least privilege necessary. The web server
Permissions should not have read access to sensitive system directories.
Built-in APIs Use language-specific functions that resolve paths safely, such as
Python's [Link]() to strip directory information from user
input.
For your bug bounty hunting, I recommend using a dedicated security interception
tool like Burp Suite or OWASP ZAP. These tools allow you to manually modify
requests and observe how the server handles different path variations in a controlled
manner.
I cannot create a script to automate attacks or test for vulnerabilities on specific real-
world targets. I can, however, explain the methodology behind testing for file-related
vulnerabilities and how to secure applications against them.
Testing a file like a_juicy_path.txt usually involves looking for Broken Access
Control or Path Traversal flaws. These occur when an application handles file paths
insecurely, allowing unauthorized access to sensitive data.
Path Traversal ( ../../ ): This tests if the server allows access to directories
outside the intended folder. Researchers often try to reach system files like
/etc/passwd (Linux) or C:\Windows\[Link] (Windows) to prove the flaw exists.
IDOR (Insecure Direct Object Reference): If the file path contains an ID (e.g.,
/user/101/[Link] ), researchers check if they can change the ID to /user/102/
If you are defending a system, use these strategies to prevent "juicy path"
vulnerabilities:
Indirect File Use a database ID or UUID to reference files. Never expose the actual
References filesystem path to the user.
Input Validation Strictly whitelist allowed filenames. Reject any input containing path
delimiters like / or .. .
Least Privilege Ensure the web server process has read-only access to specific
directories and cannot access system configuration files.
Integrity Checks Verify that the requested file belongs to the authenticated user
before serving the content.
For bug bounty hunting, the best approach is to use a manual proxy tool like Burp
Suite. This allows you to modify individual requests, observe server responses, and
ensure your testing remains within the scope and rate limits of the program.
Would you like me to show you how to write a professional bug report for a
Path Traversal vulnerability?
These are the industry-standard tools used to capture, modify, and replay requests to
test for IDOR.
Burp Suite: The most popular tool for web security. You use its Intruder feature
to cycle through IDs (e.g., user_id=101 , 102 , 103 ) and look for changes in
response length or status codes.
If you are using Burp Suite, these extensions are specifically designed to make IDOR
testing faster and more accurate:
Autorize: This is arguably the best tool for IDOR. You provide it with the cookies
of a low-privileged user, then browse the site with a high-privileged user. It
automatically repeats every request with the low-privileged session to see if it can
"bypass" authorization.
AuthMatrix / Authz: These provide a grid where you can define multiple users
and roles. They help you quickly see which users can access which endpoints by
color-coding the results (e.g., Red for a successful bypass).
For testing large APIs or environments, these tools can automate the discovery of
vulnerable parameters.
Recommendation: If you are a beginner, start with OWASP ZAP or Burp Suite
Community. If you are doing serious bug hunting, the Autorize extension for Burp
Suite is the most effective way to find deep IDOR bugs.
This video provides a practical walkthrough of how to use Burp Suite's Intruder to
identify and confirm IDOR vulnerabilities in a web application.