Wooyun Legacy
tanweai/wooyun-legacy
WooYun business logic vulnerability methodology — 22,132 real cases across 6 domains (authentication bypass, authorization bypass, payment tampering, information disclosure, logic flaws…
Recovers a client-side request signature or anti-bot token just far enough to replay blocked requests in bug bounty testing, starting from a captured packet.
$ npx skills add awarexone/Agentic-Bug-Hunter --skill client-reverse -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install awarexone/Agentic-Bug-Hunter client-reverse --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/awarexone/Agentic-Bug-Hunter.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/client-reverse .claude/skills/client-reverse && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "client-reverse" agent skill from https://github.com/awarexone/Agentic-Bug-Hunter/tree/main/skills/client-reverse into .claude/skills/client-reverse/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "client-reverse", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/awarexone/Agentic-Bug-Hunter/tree/main/skills/client-reverseType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add awarexone/Agentic-Bug-Hunter --skill client-reverse -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install awarexone/Agentic-Bug-Hunter client-reverse --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/awarexone/Agentic-Bug-Hunter.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/client-reverse .agents/skills/client-reverse && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "client-reverse" agent skill from https://github.com/awarexone/Agentic-Bug-Hunter/tree/main/skills/client-reverse into .agents/skills/client-reverse/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "client-reverse", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add awarexone/Agentic-Bug-Hunter --skill client-reverse -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install awarexone/Agentic-Bug-Hunter client-reverse --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/awarexone/Agentic-Bug-Hunter.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/client-reverse .cursor/skills/client-reverse && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "client-reverse" agent skill from https://github.com/awarexone/Agentic-Bug-Hunter/tree/main/skills/client-reverse into .cursor/skills/client-reverse/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "client-reverse", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/awarexone/Agentic-Bug-Hunter.git --path skills/client-reverse--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add awarexone/Agentic-Bug-Hunter --skill client-reverse -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install awarexone/Agentic-Bug-Hunter client-reverse --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/awarexone/Agentic-Bug-Hunter.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/client-reverse .gemini/skills/client-reverse && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "client-reverse" agent skill from https://github.com/awarexone/Agentic-Bug-Hunter/tree/main/skills/client-reverse into .gemini/skills/client-reverse/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "client-reverse", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install awarexone/Agentic-Bug-Hunter client-reverseInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add awarexone/Agentic-Bug-Hunter --skill client-reverse -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/awarexone/Agentic-Bug-Hunter.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/client-reverse .github/skills/client-reverse && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "client-reverse" agent skill from https://github.com/awarexone/Agentic-Bug-Hunter/tree/main/skills/client-reverse into .github/skills/client-reverse/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "client-reverse", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add awarexone/Agentic-Bug-Hunter --skill client-reverse -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install awarexone/Agentic-Bug-Hunter client-reverse --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/awarexone/Agentic-Bug-Hunter.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/client-reverse .opencode/skills/client-reverse && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "client-reverse" agent skill from https://github.com/awarexone/Agentic-Bug-Hunter/tree/main/skills/client-reverse into .opencode/skills/client-reverse/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "client-reverse", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
client-reverseRecovers a client-side request signature or anti-bot token just far enough to replay blocked requests in bug bounty testing, starting from a captured packet.
The skill applies when a request works in the browser but fails in Burp Repeater with a signature or bot error because the client computes a field such as sign, token, nonce or an X-Sensor header. It insists on a packet-first order: capture the real request through a proxy or DevTools, replay it unchanged, and only reverse the signer if that replay fails, since many such requests turn out to be replayable as they are.
When reversing is needed it follows a staged path from locate through recover, runtime, validation and replay. The agent traces backward from the field that holds the signature to the writer, builder, entry point and source, separates inputs you can change, such as timestamp, nonce, device id and body, from constants like a secret key, and hooks fetch or XHR in DevTools. A reference file covers browser JavaScript signing, and the notes touch on webpack, wasm and JSVMP obfuscation.
The stated goal is access, not the signature itself: reversing the signer is not reported as a finding, and the value comes from testing the protected API behind it for IDOR, broken authorization and business logic flaws.
5 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit cd58a40. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
wgetFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use wget, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Client Request Signature Reversal loads about 4.7k tokens when it runs, and up to ~6.4k if it reads all its reference files. Until then it costs about 225 tokens; SKILL.md has 1,744 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from awarexone/Agentic-Bug-Hunter at commit cd58a40, republished under its MIT licence (© awarexone). 1,744 words, ~4,736 tokens.
.claude/skills/client-reverse/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.You hit a request you cannot replay. Burp Repeater returns 401 invalid signature or 403 bot detected even though the browser/app does it fine. There is a sign, sig, X-Signature, _token, nonce, X-Acf-Sensor-Data, or encrypted body the client computes. This skill recovers just enough of that signer to reproduce the request outside the client.
Why a bug bounty hunter cares: the signature is not the bug. The signature is the lock on the door. Behind it is an API the program assumed only their own client would ever reach — so that API is often under-tested for IDOR, BOLA, mass assignment, and business logic. Reversing the signer is the cost of admission; the payout comes from what you fuzz once you're inside. Never report "I reversed your sign algorithm" as a finding on its own — that is N/A. Report the IDOR/auth bug you reached through it.
Reverse engineering is a blocker-resolution step, not the default entrypoint. Capture the real request first. Prove whether it already replays. Only reverse the signer if replay actually fails.
Most hunters waste hours decompiling JS for a "signature" that turns out to be replayable as-is, or gated by a timestamp that's valid for 5 minutes. Run this gate before opening DevTools Sources:
1. Capture the real request (Burp/mitmproxy proxy, or DevTools → Network → Copy as cURL)
2. Replay it UNCHANGED (paste cURL into terminal, or Burp Repeater)
→ 200 / works? → IT'S NOT SIGNED. Skip all reversing. Go fuzz it.
3. Replay it again 5 min later → still 200? → no freshness check (replay window is wide/infinite)
4. Mutate ONE non-signed field (e.g. change an `id` in the body, keep sign as-is)
→ 200? → the sign does NOT cover that field → tamper freely, no reversing needed
→ 401? → the sign covers it → NOW you reverse (continue to STAGES below)Steps 2–4 alone kill ~half of "I need to reverse this" assumptions. A signature that omits the payload or endpoint, or never expires, is itself the bug — see the CoinMate pattern in Real Paid Examples.
Pick the stage from engineering state, not from clue words. "I see the word sign" does not mean you're in recover. You are in locate until you can point at the exact line that writes the signature.
intake → evidence → locate → recover → runtime → validation → replay| Stage | Enter when... | Goal | Exit when... |
|---|---|---|---|
| locate | the signing function / write boundary is unproven | find where the sign field is written and what feeds it | you can point at writer ← builder ← entry ← source |
| recover | boundary is real but the code is obfuscated/opaque | de-shell only the layer blocking you (webpack/wasm/JSVMP) | you have a readable or callable signer contract |
| runtime | code is clear but browser-exec ≠ your-exec diverge | find the first divergence (missing object/state/anti-debug) | local run reproduces browser sign output |
| validation | remaining work is equivalence proof | match checkpoints, not just final output | sign(input) == observed for fresh inputs |
| replay | sign reproduces outside the client | Burp/Python baseline request you can fuzz | a stable request you can mutate for IDOR/auth |
Carry a one-line handoff between stages. Do not promote a guess to a fact:
--- Stage Handoff ---
From: locate To: recover
Proven: sign written at app.min.js:1, line ~4021; inputs = ts, nonce, JSON body, deviceId
Open: builder is inside webpack module 5f3 behind a string-table — need to de-shell that one module
Invalid: assumption that deviceId was constant (it rotates per session)You know the output (the sign value on the wire). Walk backward to the source. Keep each layer distinct:
writer <- builder <- entry <- sourcesign into the body/header/query/cookie/WS frameHMAC, MD5, AES, sort-then-concat, JSON.stringify orderingDate.now(), crypto.getRandomValues, user input# 1. XHR/fetch breakpoint — break the moment the signed request fires
DevTools → Sources → XHR/fetch Breakpoints → + → paste the endpoint path (e.g. /api/order)
trigger the action → execution pauses inside the request stack
→ walk UP the Call Stack panel: the frame that mutates headers/body is your writer
# 2. Search the bundle for the field name (catches the writer fast)
DevTools → Sources → Ctrl+Shift+F (search all loaded scripts)
search: "sign" "X-Signature" ".sign =" "headers[" "signature"
click {} (pretty-print) on the minified file so line numbers are stable
# 3. DOM/event breakpoint when a click triggers it
DevTools → Elements → right-click the button → Break on → subtree/attribute modifications| Sink (where sign lands) | First place to prove |
|---|---|
| request body field | final JSON.stringify / submit / fetch(body=...) |
| request header | the headers[...] = or setRequestHeader call |
| JS-set cookie | the document.cookie = setter |
| WebSocket frame | the final envelope object right before ws.send(...) |
anti-bot blob (X-Sensor-Data, _px) | the SDK init() and the getter that returns the blob |
Do NOT broad-deobfuscate before the boundary is real. Keyword hits are not proof — many bundles ship sign strings that never run.
Enter only after the boundary is proven and the only remaining blocker is that the code is unreadable. Reduce the single layer in your way — never the whole bundle.
| Shell you hit | What it means | Minimal move |
|---|---|---|
| webpack bootstrap | modules wrapped in __webpack_require__ | break inside the target module, read the local closure — don't unpack the whole bundle |
| string-array obfuscation | _0x4a2b[12] lookups | in console, print the decoder array; or set a breakpoint and read decoded values live |
worker / postMessage bridge | sign runs in a Web Worker | breakpoint the worker script; treat postMessage payload as the contract |
| wasm loader | sign math compiled to wasm | hook the JS↔wasm boundary; capture inputs/outputs rather than decompiling wasm |
| JSVMP (custom bytecode VM) | a dispatcher loop interpreting bytes | do not reverse the VM — go runtime: hook inputs+output and treat sign as a black box |
The black-box shortcut beats decompilation 90% of the time. You almost never need to understand the HMAC math. You need the input tuple and a way to call the function. Capture
sign(input) → outputpairs at runtime; if you can call the page's own signer, you never have to reimplement it.
// REUSE — if the signer is a reachable function, just call it from the console.
// Works when the page exposes it or you grab a reference at a breakpoint.
window.__sign = signFn; // assign at a breakpoint inside the builder
window.__sign({id: 999, ts: Date.now()})// → get a valid sig for ANY payload you want
// HOOK to log every real sign(input)->output the app produces (no reimplementation):
(function(){
const orig = CryptoSigner.prototype.sign; // adapt to the real object/method
CryptoSigner.prototype.sign = function(...a){
const out = orig.apply(this, a);
console.log('SIGN', JSON.stringify(a), '=>', out); // copy pairs for offline replay
return out;
};
})();For every input to the signer, classify it. This is the whole game — it tells you what you can mutate and whether you even need the secret.
| Input | Type | Attacker-mutable? | Implication |
|---|---|---|---|
timestamp / ts | per-request | yes (you set it) | fine — regenerate per replay; check the validity window |
nonce / requestId | per-request random | yes | fine — generate fresh; check if server enforces uniqueness (replay protection) |
deviceId / uuid | per-session | yes (one value, reusable) | grab once, pin it — usually constant for your session |
| request body / path | per-request | yes | the prize — if sign covers it, you mutate body + re-sign to fuzz IDOR/mass-assignment |
secret key / appSecret | constant, baked in | no (you extract it) | if it's in the JS bundle / APK, extraction = full forge ability for any request |
DECISION:
secret is in the client (hardcoded in JS or APK strings)
→ you can re-sign ANY request offline → full replay, fuzz everything
secret is server-side only, but you can call the page's signer function
→ you can sign any payload while the page is open → replay via headless browser bridge
secret is server-side AND signer is uncallable (heavy anti-debug)
→ you may only replay UNCHANGED requests
→ then test: does the sign omit the path/body? (CoinMate pattern) → forge anyway
→ does it never expire? → replay-window bug, report thatHunt the bundle for a baked secret before doing anything clever:
# Pull the JS and grep for the secret feeding the signer
wget -q -r -l1 -A '*.js' -P /tmp/js/ "https://target.com" 2>/dev/null
grep -rnoE "appSecret|secretKey|signKey|HMAC|hmac|['\"][A-Za-z0-9+/]{24,}={0,2}['\"]" /tmp/js/ | head
# Cross-reference with /secrets-hunt --js-bundle for entropy-scored hitsIf you reimplemented the signer in Python, prove equivalence on a fresh input before trusting it. Compare checkpoints, not just the final byte:
import hmac, hashlib, json, time
def sign(body: dict, ts: str, nonce: str, secret: bytes) -> str:
# Reproduce the EXACT canonicalization the JS does — order, separators, encoding.
# Get these by reading the builder, NOT by guessing.
payload = json.dumps(body, separators=(',', ':'), sort_keys=False) # JS JSON.stringify keeps INSERTION order, not sorted — set sort_keys=True ONLY if the builder explicitly sorts keys
msg = f"{ts}{nonce}{payload}".encode() # match JS concat order!
return hmac.new(secret, msg, hashlib.sha256).hexdigest()
# VALIDATE: feed an input you captured from the browser, compare to the observed sig.
# checkpoints that must each match: canonical body string → message tuple → final digest
assert sign(captured_body, captured_ts, captured_nonce, SECRET) == observed_sigThe two killers are almost always (a) JSON key ordering / separator whitespace, and (b) concatenation order of the input fields. If your digest is wrong, diff the pre-hash message string against the one the app builds (log it at a breakpoint), not the output hash.
You are ready only when you can answer all five:
[ ] where is the signed field written?
[ ] which inputs are constants (secret, deviceId) vs per-request (ts, nonce, body)?
[ ] which inputs come from upstream responses / cookies / storage / page lifecycle?
[ ] does request ORDER or session STATE matter (does a prior call seed the nonce)?
[ ] which fields can I mutate and still produce a valid sign?Then drive it from Python so you can fuzz at scale:
import requests, time, uuid
SECRET = b"extracted_from_bundle" # or call the page's signer via a headless bridge
DEVICE = "pinned-session-device-id"
def signed_request(body):
ts = str(int(time.time()*1000))
nonce = uuid.uuid4().hex
sig = sign(body, ts, nonce, SECRET) # your validated signer from Stage 4
return requests.post("https://target.com/api/order",
json=body,
headers={"X-Timestamp": ts, "X-Nonce": nonce, "X-Signature": sig,
"X-Device-Id": DEVICE})
# NOW the bug hunt begins — mutate the body to reach the protected logic:
for victim_id in range(1000, 1100): # IDOR sweep behind the signature
r = signed_request({"orderId": victim_id})
if r.status_code == 200 and "not authorized" not in r.text:
print(f"IDOR: read order {victim_id}", r.json())Bridge option when the secret is server-side: keep a headless browser open, expose the page's own
sign()via a tiny local HTTP shim, and have your Python fuzzer call out to it per request. You never reimplement crypto — the app signs for you.
Same spine, harder shell. These ship an SDK that emits an opaque sensor blob (X-Acf-Sensor-Data, _px, datadome cookie). Two realistic paths for a bounty hunter:
Full reversal of Akamai v3 sensor-data (PRNG-shuffled, file-hash + cookie-hash seeded) or PerimeterX's compiled SDK is a week-long research effort — out of scope for a single bounty. If the anti-bot itself is misconfigured (token never expires, token from
accountAvalidatesaccountB's requests, the protected endpoint is also reachable on a sibling host with no anti-bot), report that — it's a real finding without reversing anything. See the Stack→sibling-host idea inweb2-recon.
| Finding | Verdict |
|---|---|
| "I reversed your client signing algorithm" | N/A — not a vuln by itself |
| Signed request replays unchanged forever (no timestamp/nonce freshness) | Low/Medium — replay-attack window; report it |
| Sign omits endpoint/payload → forge requests without the secret (CoinMate pattern) | Medium/High — request forgery |
| Secret key hardcoded in JS bundle / APK → forge any request | Medium alone; High/Critical chained to the API you unlock |
| Reached a protected API via reversed sign → IDOR / BOLA / mass assignment found there | High/Critical — the real prize; report the downstream bug |
| One user's anti-bot token validates another user's request | Medium — broken token binding |
The deliverable is almost never the signing weakness. It is the access-control or business-logic bug on the endpoint the signature was guarding. Reach it, then run the IDOR / Broken Auth / Mass Assignment / Business Logic playbooks from
web2-vuln-classes.
| Need | Tool |
|---|---|
| capture the real request | Burp Suite proxy, or mitmproxy, or DevTools Network → Copy as cURL |
| break on the signed request | Chrome DevTools → Sources → XHR/fetch Breakpoints |
| read minified code | DevTools {} pretty-print + Ctrl+Shift+F global search |
| hook fetch/XHR / log sign() | DevTools console snippet (Object.defineProperty / method override) |
| grep bundle for the secret | wget -r -A '*.js' + grep, or /secrets-hunt --js-bundle |
| find hidden endpoints in JS | LinkFinder / jsluice (see web2-recon) |
| replay + fuzz at scale | Python requests (Stage 5 template) |
| mint anti-bot tokens | Selenium / Playwright headless bridge |
| mobile app variant (signer in APK) | apktool + jadx (static), objection / frida CLI (runtime hook) — same locate→recover→runtime→replay spine, packet-first |
Mobile note: for an authorized Android app, the packet-first rule still wins — drive the app, watch Burp/mitmproxy, and only
jadx/fridathe APK when the packet is encrypted or unreplayable. Decompiling first is the rookie move.
Cross-reference: once you're through the signature, run IDOR, Broken Auth / Access Control, Mass Assignment, and Business Logic from
web2-vuln-classes; useweb2-reconfor hidden-endpoint and sibling-host discovery; validate with the 7-Question Gate before reporting.
See references/browser-js-signing.md for the full browser-JS staging detail, the boundary model, and handoff-card discipline.
© awarexone, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file (references) in skills/client-reverse of awarexone/Agentic-Bug-Hunter.
Open the folder on GitHubat commit cd58a40
Client Request Signature Reversal next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Client Request Signature Reversal this skillawarexone/Agentic-Bug-Hunter | 5.3k | — | ~4.7k | Automated safety check: Pass | MIT | |
| Wooyun Legacytanweai/wooyun-legacy | 1.8k | — | ~1.9k | Automated safety check: Pass | Custom licence | |
| Bug Bounty Campaign DriverEncod3d-Sec/TORCH | 329 | 1 repos | ~1.8k | Automated safety check: Pass | MIT | |
| Performing iOS App Security Assessmentmukul975/Anthropic-Cybersecurity-Skills | 34k | — | ~3k | Automated safety check: Pass | Apache-2.0 | |
| Strix Code Vulnerability Scanusestrix/strix | 67k | — | ~1.1k | Automated safety check: Pass | Apache-2.0 | |
| Code Audit3stoneBrother/code-audit | 893 | 1 repos | ~2.7k | Automated safety check: Pass | None |
tanweai/wooyun-legacy
WooYun business logic vulnerability methodology — 22,132 real cases across 6 domains (authentication bypass, authorization bypass, payment tampering, information disclosure, logic flaws…
Encod3d-Sec/TORCH
Runs a bug-bounty engagement through a script that tracks the current pass, builds a board of rows from recon and prints the next required action each turn.
mukul975/Anthropic-Cybersecurity-Skills
Performs comprehensive iOS application security assessments using Frida for dynamic instrumentation, Objection for runtime exploration, SSL pinning bypass for traffic interception, keychain…
usestrix/strix
Runs a Strix white-box security review that reads the source, then exploits what it finds in a sandbox so each reported issue has a proof-of-concept.
3stoneBrother/code-audit
Professional code security audit skill covering 55+ vulnerability types.
usestrix/strix
Triages findings from a Strix pentest by severity, fixes each root cause with a minimal change, and re-runs Strix to confirm the exploit no longer works.
awarexone/Agentic-Bug-Hunter
Guides smart contract audits and bounty target selection with ten DeFi bug classes, kill signals, a Foundry PoC template and grep patterns.
awarexone/Agentic-Bug-Hunter
Orchestrates a bug bounty session with a 5-phase workflow and a critical-thinking framework covering developer psychology, anomaly detection and What-If experiments.
awarexone/Agentic-Bug-Hunter
Screens EVM and Solana meme coins for rug pull signs such as hidden mint, honeypot logic and fee tricks, starting with fast kill signals before any code review.
awarexone/Agentic-Bug-Hunter
Screens a vulnerability finding with a seven-question gate and pre-submission checks before any report is written, so weak or out-of-scope findings are dropped early.
awarexone/Agentic-Bug-Hunter
Guides writing bug bounty reports for HackerOne, Bugcrowd, Intigriti and Immunefi: impact-first titles, proven claims, CVSS 3.1 scoring and a pre-submit checklist.
awarexone/Agentic-Bug-Hunter
Web2 recon pipeline — subdomain enumeration (subfinder, Chaos API, assetfinder), live host discovery (dnsx, httpx), URL crawling (katana, waybackurls, gau), directory fuzzing (ffuf), JS analysis…
Works with
Categories
Recovers a client-side request signature or anti-bot token just far enough to replay blocked requests in bug bounty testing, starting from a captured packet. The skill applies when a request works in the browser but fails in Burp Repeater with a signature or bot error because the client computes a field such as sign, token, nonce or an X-Sensor header. It insists on a packet-first order: capture the real request through a proxy or DevTools, replay it unchanged, and only reverse the signer if that replay fails, since many such requests turn out to be replayable as they are.
Client Request Signature Reversal fits situations like: replaying a request in Burp or mitmproxy that fails with an invalid signature; finding where a web client computes a sign, nonce or token field; deciding whether a signed request actually needs reversing at all; reaching an API behind anti-bot checks to test for IDOR.
Run `npx skills add awarexone/Agentic-Bug-Hunter --skill client-reverse -a claude-code`. Or copy the skill folder (skills/client-reverse in awarexone/Agentic-Bug-Hunter) into .claude/skills/client-reverse in your project. Claude Code loads it when a task matches its description.
Run `npx skills add awarexone/Agentic-Bug-Hunter --skill client-reverse -a codex`. Or copy the skill folder (skills/client-reverse in awarexone/Agentic-Bug-Hunter) into .agents/skills/client-reverse in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add awarexone/Agentic-Bug-Hunter --skill client-reverse -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/client-reverse, .gemini/skills/client-reverse, .github/skills/client-reverse and .opencode/skills/client-reverse in your project.
Going by SKILL.md and its folder, Client Request Signature Reversal needs the command-line tools its instructions call (wget). Our summary lists: An intercepting proxy such as Burp or mitmproxy; Browser DevTools access to the target web client.
SKILL.md contains no URLs. Its commands use wget, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Client Request Signature Reversal is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.7k tokens (SKILL.md is roughly 19k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 1.7k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Client Request Signature Reversal: Wooyun Legacy (tanweai/wooyun-legacy, 1.8k stars), Bug Bounty Campaign Driver (Encod3d-Sec/TORCH, 329 stars), Performing iOS App Security Assessment (mukul975/Anthropic-Cybersecurity-Skills, 34k stars) and Strix Code Vulnerability Scan (usestrix/strix, 67k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
awarexone (a GitHub organization) maintains it in awarexone/Agentic-Bug-Hunter, which has 5,282 GitHub stars. The repository holds 10 skills in this directory. The repository was last updated on October 5, 2026.
Source: awarexone/Agentic-Bug-Hunter on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.