diff --git a/skills/api-security/SKILL.md b/skills/api-security/SKILL.md new file mode 100755 index 0000000..15eea63 --- /dev/null +++ b/skills/api-security/SKILL.md @@ -0,0 +1,132 @@ +--- +name: api-security +description: "Invoke this skill when the task is authorized offensive testing of a REST, GraphQL, WebSocket, or SOAP API beyond recon: authentication and authorization flaws (BOLA, IDOR, BFLA), JWT and OAuth weaknesses, GraphQL-specific abuse, input validation, business logic, rate-limit trust confusion, and excessive data exposure." +--- + +# API Security Testing (REST, GraphQL, WebSocket, SOAP) + +This is the hunting counterpart of api-recon. api-recon maps the API surface and stops; this skill attacks the mapped surface under an authorized engagement. The standing finding quality gates and the adversarial gate in your system prompt apply throughout, and an access-control finding only exists once a second account or role has proven the boundary is real. + +Attribution: adapted from the `api-security` playbook of [zhaoxuya520/reverse-skill](https://github.com/zhaoxuya520/reverse-skill) (MIT License). + +## Boundaries + +- Rate-limit and load tests only within the engagement's written impact budget. Most bounty programs forbid denial of service outright; volume that degrades the service for other users is out of bounds. Race-condition tests use a handful of concurrent requests, never load tools. +- Do not exfiltrate real user data to prove a BOLA. One record you are authorized to touch, or your own second account, is sufficient evidence. +- Destructive payloads (deletion, mass assignment on write endpoints) only against accounts and resources created for the test. +- Every confirmed finding needs a replayable artifact: the exact request, the exact response, and the authorization context that produced it. + +## Phase checklists + +### Phase 1: discovery (handoff from api-recon) + +- Spec sources: `/swagger.json`, `/openapi.json`, `/api-docs`, `/graphql`, JS bundles, robots.txt. +- Undocumented path brute force: ffuf or kiterunner with API wordlists. +- GraphQL introspection, three tiers: the full introspection query; a trimmed query if the full one is blocked; minimal `__schema { types { name } }` as the last probe. + +### Phase 2: authentication + +JWT (jwt_tool or manual): + +- [ ] `alg: none`: header rewritten, signature stripped. +- [ ] key confusion: RS256 public key accepted as an HS256 secret. +- [ ] weak HMAC secret: dictionary attack (`jwt_tool -C -d wordlist.txt`). +- [ ] expired or tampered claims: `exp`, `iat`, `sub`, `role`. +- [ ] `kid` injection: path traversal inside the key id. + +OAuth 2.0: + +- [ ] `redirect_uri` manipulation leading to authorization-code theft. +- [ ] missing `state` (CSRF on the authorization flow). +- [ ] token leakage via `Referer` or platform logs. +- [ ] missing PKCE on public clients. + +GraphQL auth: + +- [ ] mutation reachable through GET (CSRF). +- [ ] batched queries bypassing per-operation authorization. + +### Phase 3: authorization (BOLA / IDOR / BFLA) + +BOLA, object level: + +- [ ] enumerate numeric ids: `/user/1` to `/user/2`. +- [ ] enumerate UUIDs harvested from other responses. +- [ ] substitute usernames or emails in paths and bodies. +- [ ] two-session replay: user A's session requesting user B's objects (Burp Autorize or a manual response diff). + +BFLA, function level: + +- [ ] standard user calling admin endpoints. +- [ ] HTTP method swap: GET to PUT, PATCH, DELETE. +- [ ] version downgrade: `/v2/admin` to `/v1/admin`. +- [ ] batch-operation injection: append an admin id to the bulk body. + +### Phase 4: GraphQL-specific + +- [ ] introspection exposing schema details it should hide. +- [ ] alias overload (dozens of aliases in one query) and batched queries as compute amplification, within the impact budget. +- [ ] field-suggestion error messages leaking schema names. +- [ ] GraphiQL or a playground exposed unauthenticated. +- [ ] deep nesting as a resource-exhaustion vector, within the impact budget. +- [ ] trace or debug mode returning metadata. + +### Phase 5: REST input validation + +- [ ] HTTP method swap on every endpoint. +- [ ] Content-Type tampering: JSON to XML to multipart (XXE where XML is accepted). +- [ ] NoSQL operator injection: `{"username": {"$gt": ""}}`. +- [ ] SSRF through URL-taking parameters (webhooks, avatar imports, fetchers). +- [ ] HTTP parameter pollution: `?role=user&role=admin`. +- [ ] mass assignment: `is_admin: true` added to request bodies. + +### Phase 6: business logic and differential testing + +- [ ] diff v1 against v2 of the same API: status-code changes, removed fields, latency regressions. +- [ ] role matrix: admin, user, readonly through the same workflow. +- [ ] coupon, credit, and price manipulation on test accounts. +- [ ] TOCTOU races with a few concurrent requests. + +### Phase 7: WebSocket + +- [ ] endpoint discovery (upgrade handshakes). +- [ ] message injection, prototype pollution through frames. +- [ ] oversized-message handling. +- [ ] type confusion in frame payloads. +- [ ] cross-site WebSocket hijacking (CSWH). + +### Phase 8: rate-limit trust confusion + +- [ ] header spoofing: `X-Forwarded-For`, `X-Real-IP`, reported as a trust-boundary finding, never scaled into volume. +- [ ] path variants: `/api/`, `/api`, `/Api/`, `/API/` bypassing a path-keyed limiter. +- [ ] the finding is the bypass mechanism itself; do not demonstrate it under load. + +### Phase 9: data exposure + +- [ ] response fields beyond what the UI renders (diff the API response against the page). +- [ ] pagination enumeration: `?page=1&limit=10000`. +- [ ] error messages leaking stack traces, internal paths, or SQL. +- [ ] GraphQL nested traversal reaching unauthorized data. +- [ ] spec files exposing internal endpoints. + +### Phase 10: regression handoff + +- [ ] persist every confirmed finding as a replayable request (curl command or HAR artifact) so retests and the reporter can re-verify. +- [ ] mark which findings are safe to re-run and which are one-shot (nonce or state dependent). + +## Tools + +| Tool | Use | Notes | +|---|---|---| +| curl + jq | request replay and diffing | always available | +| jwt_tool | JWT attack automation | pip-installable; verify before use | +| ffuf, kiterunner | endpoint brute force | verify container availability | +| Burp Autorize, AuthMatrix | two-session authorization diffing | only where a Burp instance exists | + +The upstream playbook also names Vespasian, Entropy, Escape DAST, FireTail, and api.sh; treat those as references until verified in this environment, and prefer the manual checklists over unverified tooling. + +## Completion self-check + +- [ ] every executed phase produced artifacts (requests, responses, diffs) in the work dir. +- [ ] each access-control finding was confirmed with a second session or role. +- [ ] nothing in the report relies on a tool or output you did not actually run. diff --git a/skills/edr-bypass-re/SKILL.md b/skills/edr-bypass-re/SKILL.md new file mode 100755 index 0000000..333d2a8 --- /dev/null +++ b/skills/edr-bypass-re/SKILL.md @@ -0,0 +1,100 @@ +--- +name: edr-bypass-re +description: "Invoke this skill for authorized adversary-simulation work that must understand and evaluate endpoint defense telemetry: mapping what an EDR or AV actually monitors (user-mode hooks, kernel callbacks, ETW providers, AMSI), surveying installed hooks from memory, and evaluating countermeasure combinations in an isolated lab, mapped to MITRE ATT&CK T1562." +--- + +# EDR Bypass RE (defense telemetry analysis for authorized adversary simulation) + +Reverse the defender's implementation first, then reason about countermeasures. This skill covers the RE half (what the EDR monitors and how its components are built) and the evaluation half (which countermeasure classes defeat which telemetry, verified in an isolated lab). It maps to MITRE ATT&CK T1562 (Impair Defenses), T1562.001 and T1562.006, with T1055 and T1027 adjacent. + +Attribution: adapted from the `edr-bypass-re` playbook of [zhaoxuya520/reverse-skill](https://github.com/zhaoxuya520/reverse-skill) (MIT License). + +## Boundaries (read first) + +- Authorized environments only: your own lab machines and VMs, or hosts covered by written engagement scope (SoW, test contract, program scope statement). Nothing here may ever be applied to an unowned or out-of-scope system. +- The deliverable is measurement and a report: which telemetry sources detected which technique, at what stage, with what fidelity. Findings go to the engagement's responsible-disclosure channel. +- ARTEX tasks run in a Linux container. Every step here needs an authorized Windows lab VM reachable from the task environment; if none is provisioned, report the gap and stop. Never simulate observations you did not make. +- Report placeholders only: `{target_ip}`, `{hostname}`, `{user}`. Anonymize before anything leaves the lab. + +## Applicable task types + +1. Purple-team and detection-gap assessment: measure what the deployed EDR actually catches. +2. Product security evaluation: test your own endpoint product against known technique classes. +3. CTF or exercise scenarios requiring execution on hardened hosts, within the exercise rules. + +Not applicable: evasion against systems outside written authorization; building mass-distributed malware; any engagement where the objective is intrusion rather than measurement. + +## The four telemetry surfaces and the countermeasure classes + +```text +EDR monitoring surface countermeasure class (lab evaluation) +────────────────────── ───────────────────────────────────── +user-mode ntdll inline hooks ◄─► fresh ntdll copy from disk (unhook) + direct or indirect syscall stubs with + dynamically resolved SSNs + hardware-breakpoint redirection + +kernel callbacks (process, ►─► call-stack spoofing; routing through +thread, image, registry) legitimate trigger chains instead of + direct invocation + +ETW telemetry (Threat- ◄─► EtwEventWrite patching; provider +Intelligence and others) teardown via NtTraceControl + +AMSI scanning (amsi.dll) ◄─► AmsiScanBuffer patching; hardware- + breakpoint redirection; loading a + clean amsi.dll copy +``` + +Working knowledge: + +- An EDR is not a black box. Its user-mode DLLs and providers can be loaded into IDA or Ghidra and read like any other binary; rea can assist with static structure on host-side copies. +- Countermeasure classes must be combined: each surface needs its own answer, and ordering matters. Silencing telemetry before unhooking avoids the unhook alert arriving first. +- Modern EDRs treat ETW plus kernel callbacks as the primary battlefield; user-mode unhooking alone is a dated answer. + +## Workflow + +**Step 1: identify the defenses on the lab host.** + +```powershell +Get-Service | Where-Object {$_.Name -match 'CSAgent|SentinelAgent|elasticendpoint|esets|ekrn|MsMpEng|wdsvc|cyserver|sysmon|aswbidsagent'} +fltmc filters +``` + +Kernel-callback enumeration needs kernel debugging (windbg) or a driver-inspection tool. Record every callback class you can observe; the inventory is the baseline artifact. + +**Step 2: survey user-mode hooks.** Dump the in-memory `ntdll.dll` `.text` section from a process carrying the EDR's injected DLL, diff it against the on-disk `C:\Windows\System32\ntdll.dll`, and treat every divergence as a hook site. `pe-sieve64.exe /pid /shellc 3 /modules 3 /dir hooks_dump` automates the sweep. The dump is the artifact; the report cites hook offsets. + +**Step 3: select the countermeasure combination to evaluate.** + +| Telemetry surface | Countermeasure class under test | +|---|---| +| ntdll inline hooks | indirect syscall with dynamic SSN resolution | +| ETW-TI provider | EtwEventWrite head patch | +| AMSI (PowerShell, .NET) | AmsiScanBuffer patch or HWBP redirection | +| kernel callbacks | call-stack spoofing via legitimate gadgets | +| Sysmon ProcessCreate | PPID spoofing plus unbacked memory | + +**Step 4: implement in the test harness.** Reference implementations for each technique class are public: SysWhispers3 for syscall stub generation, the Hell's Gate and Halo's Gate writeups for dynamic SSN resolution, Ekko for sleep-time memory obfuscation. Cite the exact references used, and never paste unvetted code into the lab host. + +**Step 5: verify in the isolated lab.** Stand up the target EDR trial (Defender is the default baseline) with Sysmon in an isolated VM, run the harness, and record every alert source that fires: AMSI, ETW-TI, Sysmon events 1/7/8/10, the EDR console. Negative results are results; telemetry that catches the technique belongs in the report. + +**Step 6: write the evaluation.** Map every observed detection to MITRE ATT&CK (T1562.001, T1562.006, T1055, T1027) and hand the detection-gap list to the engagement owner. + +## Tools + +| Tool | Use | Install | +|---|---|---| +| pe-sieve | in-memory hook and injection survey | github.com/hasherezade/pe-sieve | +| SysWhispers3 | syscall stub generation | git clone plus python | +| API Monitor | dynamic API observation | manual download | +| windbg plus IDA or Ghidra | static analysis of EDR DLLs and drivers | manual | +| Sysmon | lab telemetry baseline | official download | + +Verify availability in the lab environment before promising a step, and report gaps instead of improvising downloads from unverified sources. + +## Completion self-check + +- [ ] every technique run in the lab has a recorded observation (alert fired or did not fire) with the telemetry source named. +- [ ] the report contains placeholders only, never real hostnames or IPs. +- [ ] nothing was executed outside the authorized lab VMs. diff --git a/skills/patch-diff/SKILL.md b/skills/patch-diff/SKILL.md new file mode 100755 index 0000000..5c88e71 --- /dev/null +++ b/skills/patch-diff/SKILL.md @@ -0,0 +1,110 @@ +--- +name: patch-diff +description: "Invoke this skill when the task is recovering a vulnerability from a vendor fix: a CVE with a patch but no public PoC, Patch Tuesday triage, a distribution backport gap, or a closed-source security patch that needs root-cause analysis. Diff the patched and unpatched builds, infer the bug class from the added guards, and verify with a PoC that crashes only the unpatched build." +--- + +# Patch Diff (N-day recovery from vendor fixes) + +Under an **authorized** engagement, recover a vulnerability from the fix that closed it: obtain the before and after builds, align symbols, diff the binaries, read the added checks to infer the bug class, then prove the bug with a PoC that reproduces on the unpatched build and runs clean on the patched one. The standing finding quality gates and the adversarial gate in your system prompt apply throughout: a crash you cannot reproduce on demand is a hypothesis, not a finding. + +Attribution: adapted from the `patch-diff-exploit` playbook of [zhaoxuya520/reverse-skill](https://github.com/zhaoxuya520/reverse-skill) (MIT License). + +## Boundaries and authorization + +| Allowed | Prohibited | +|---|---| +| Diffing and testing builds in your own lab, on machines covered by written engagement scope, or inside CTF and benchmark ranges | Running a recovered PoC against systems you do not own, even when a program covers the underlying bug | +| Writing PoCs that demonstrate the bug (crash, hang, memory-corruption evidence) | Turning a PoC into a deliverable payload | +| Publishing or reporting with `{target}`, `{host}`, `{user}` placeholders | Publishing unredacted hostnames, IPs, or usernames | + +If the environment lacks a tool a step needs (see Environment notes), report the gap and stop. Never simulate diff output or fabricate crash evidence. + +## When to use + +1. **Known CVE, no public PoC.** The advisory names the component and bug class but ships only the fix. +2. **Patch Tuesday triage.** Rank the month's kernel and driver fixes by likely exploitability before committing to deep analysis. +3. **Backport gap.** The mainline fix is merged but a distribution, LTS branch, or OEM kernel has not picked it up. +4. **Closed-source security patches.** Drivers, engines, virtualization components where the advisory is the only documentation. + +## Core method + +```text +patched build (after) unpatched build (before) + │ │ + └───────── binary diff ─────────┘ + │ + function-level diff (matched / unmatched / changed) + │ + focus on functions with moderate match scores (0.5 to 0.95) + │ + read the new guards: bounds checks, locks, zeroing, refcounts + │ + infer the bug class: OOB, race, UAF, info leak, int overflow + │ + PoC on the unpatched build + │ + verify: unpatched crashes, patched runs clean → bug confirmed +``` + +Patch pattern to bug class lookup: + +| New guard in the patched build | Likely bug class | +|---|---| +| `if (a + b < a)`, `__builtin_add_overflow` | integer overflow | +| `KeAcquireSpinLock`, `mutex_lock` | race condition (TOCTOU, double free) | +| `if (idx >= MAX)`, `if (len > buf_size)` | out-of-bounds read or write | +| `RtlZeroMemory`, `memset(struct, 0, ...)` | uninitialized memory info leak | +| `InterlockedDecrement` plus refcount check | UAF, reference-count bug | +| `ProbeForRead` / `ProbeForWrite` | unvalidated user-mode pointer | +| `SeAccessCheck`, capability checks | missing permission check | +| removed or tightened IOCTL codes | attack-surface reduction (study the old path) | + +## Workflow + +**Step 1: obtain before and after builds.** + +- Windows: Microsoft Update Catalog for the MSU packages of two builds (last unpatched, first patched); unpack with `expand.exe pkg.msu -F:* out\`, then the inner `.cab`; extract `ntoskrnl.exe`, `win32kfull.sys`, and the affected drivers. +- Linux: `apt download linux-image-` for both builds, `dpkg-deb -x` each; restore the vmlinux ELF from `boot/vmlinuz` with extract-vmlinux; fetch the matching dbgsym package. +- Third-party software: vendor archives for the N-1 and N installers. + +Record sha256 for every artifact; the report cites hashes, not filenames. + +**Step 2: align symbols.** + +- Windows: `symchk /v module.dll /s SRV*c:\sym*https://msdl.microsoft.com/download/symbols`. +- Linux: vmlinux plus `System.map` or dbgsym for both builds. + +**Step 3: diff.** + +- Preferred in this environment: `ghidriff old_build new_build -o out/` (Ghidra headless, pip-installable, markdown report). +- BinDiff or Diaphora only where an IDA/Ghidra toolchain with exports already exists. + +**Step 4: locate the change.** Filter to functions with similarity roughly 0.5 to 0.95: identical functions are noise, completely different ones are usually new or renamed. Read the added conditions, loop bounds, and deleted blocks (a deletion is also a clue). Judge by control flow and data flow, not token-level diffs; patches carry unrelated cleanup and renames. + +**Step 5: write and verify the PoC.** + +- Integer overflow: boundary values (`INT_MAX-1`, `0xFFFFFFFF`). +- Race: concurrent threads hammering the open/close plus ioctl path. +- UAF: spray, free, reuse. +- OOB: length or index just past the guard. + +Run the same harness against the patched build and confirm the clean result; an untested patched build proves nothing, since the crash could be environmental. + +## Warnings + +- **A patch can shrink the attack surface instead of fixing the bug.** The original flaw may still be reachable from another path; treat the fix as a lead, not ground truth. +- **Mitigations are not fixes.** CFG/XFG instrumentation such as `_guard_xfg_dispatch_icall_fptr` is hardening, not a root-cause fix. +- **Compiler churn is diff noise.** Compare builds from the same toolchain; never diff across major compiler versions. +- **Anonymize before anything leaves the lab.** + +## Environment notes for this platform + +- The rea MCP server (`mcp__rea__*`) opens files read-only on the host and never executes targets. Use it for structure, strings, and symbol questions on either build; files must live under the shared data mount and rea takes host-side paths. +- `ghidriff` needs Java plus a Ghidra install. Verify availability before promising a diff; if no diff toolchain exists, say so and stop. +- PoC execution belongs in an authorized lab VM, never in the task container. + +## Completion self-check + +- [ ] every workflow step was executed, not just read +- [ ] the diff, the inferred bug class, and the PoC artifacts are in the work dir with hashes +- [ ] the patched build was actually tested and its clean result recorded