strix-agent 0.1.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- strix/__init__.py +0 -0
- strix/agents/StrixAgent/__init__.py +4 -0
- strix/agents/StrixAgent/strix_agent.py +60 -0
- strix/agents/StrixAgent/system_prompt.jinja +504 -0
- strix/agents/__init__.py +10 -0
- strix/agents/base_agent.py +394 -0
- strix/agents/state.py +139 -0
- strix/cli/__init__.py +4 -0
- strix/cli/app.py +1124 -0
- strix/cli/assets/cli.tcss +680 -0
- strix/cli/main.py +542 -0
- strix/cli/tool_components/__init__.py +39 -0
- strix/cli/tool_components/agents_graph_renderer.py +129 -0
- strix/cli/tool_components/base_renderer.py +61 -0
- strix/cli/tool_components/browser_renderer.py +107 -0
- strix/cli/tool_components/file_edit_renderer.py +95 -0
- strix/cli/tool_components/finish_renderer.py +32 -0
- strix/cli/tool_components/notes_renderer.py +108 -0
- strix/cli/tool_components/proxy_renderer.py +255 -0
- strix/cli/tool_components/python_renderer.py +34 -0
- strix/cli/tool_components/registry.py +72 -0
- strix/cli/tool_components/reporting_renderer.py +53 -0
- strix/cli/tool_components/scan_info_renderer.py +58 -0
- strix/cli/tool_components/terminal_renderer.py +99 -0
- strix/cli/tool_components/thinking_renderer.py +29 -0
- strix/cli/tool_components/user_message_renderer.py +43 -0
- strix/cli/tool_components/web_search_renderer.py +28 -0
- strix/cli/tracer.py +308 -0
- strix/llm/__init__.py +14 -0
- strix/llm/config.py +19 -0
- strix/llm/llm.py +310 -0
- strix/llm/memory_compressor.py +206 -0
- strix/llm/request_queue.py +63 -0
- strix/llm/utils.py +84 -0
- strix/prompts/__init__.py +113 -0
- strix/prompts/coordination/root_agent.jinja +41 -0
- strix/prompts/vulnerabilities/authentication_jwt.jinja +129 -0
- strix/prompts/vulnerabilities/business_logic.jinja +143 -0
- strix/prompts/vulnerabilities/csrf.jinja +168 -0
- strix/prompts/vulnerabilities/idor.jinja +164 -0
- strix/prompts/vulnerabilities/race_conditions.jinja +194 -0
- strix/prompts/vulnerabilities/rce.jinja +222 -0
- strix/prompts/vulnerabilities/sql_injection.jinja +216 -0
- strix/prompts/vulnerabilities/ssrf.jinja +168 -0
- strix/prompts/vulnerabilities/xss.jinja +221 -0
- strix/prompts/vulnerabilities/xxe.jinja +276 -0
- strix/runtime/__init__.py +19 -0
- strix/runtime/docker_runtime.py +298 -0
- strix/runtime/runtime.py +25 -0
- strix/runtime/tool_server.py +97 -0
- strix/tools/__init__.py +64 -0
- strix/tools/agents_graph/__init__.py +16 -0
- strix/tools/agents_graph/agents_graph_actions.py +610 -0
- strix/tools/agents_graph/agents_graph_actions_schema.xml +223 -0
- strix/tools/argument_parser.py +120 -0
- strix/tools/browser/__init__.py +4 -0
- strix/tools/browser/browser_actions.py +236 -0
- strix/tools/browser/browser_actions_schema.xml +183 -0
- strix/tools/browser/browser_instance.py +533 -0
- strix/tools/browser/tab_manager.py +342 -0
- strix/tools/executor.py +302 -0
- strix/tools/file_edit/__init__.py +4 -0
- strix/tools/file_edit/file_edit_actions.py +141 -0
- strix/tools/file_edit/file_edit_actions_schema.xml +128 -0
- strix/tools/finish/__init__.py +4 -0
- strix/tools/finish/finish_actions.py +167 -0
- strix/tools/finish/finish_actions_schema.xml +45 -0
- strix/tools/notes/__init__.py +14 -0
- strix/tools/notes/notes_actions.py +191 -0
- strix/tools/notes/notes_actions_schema.xml +150 -0
- strix/tools/proxy/__init__.py +20 -0
- strix/tools/proxy/proxy_actions.py +101 -0
- strix/tools/proxy/proxy_actions_schema.xml +267 -0
- strix/tools/proxy/proxy_manager.py +785 -0
- strix/tools/python/__init__.py +4 -0
- strix/tools/python/python_actions.py +47 -0
- strix/tools/python/python_actions_schema.xml +131 -0
- strix/tools/python/python_instance.py +172 -0
- strix/tools/python/python_manager.py +131 -0
- strix/tools/registry.py +196 -0
- strix/tools/reporting/__init__.py +6 -0
- strix/tools/reporting/reporting_actions.py +63 -0
- strix/tools/reporting/reporting_actions_schema.xml +30 -0
- strix/tools/terminal/__init__.py +4 -0
- strix/tools/terminal/terminal_actions.py +53 -0
- strix/tools/terminal/terminal_actions_schema.xml +114 -0
- strix/tools/terminal/terminal_instance.py +231 -0
- strix/tools/terminal/terminal_manager.py +191 -0
- strix/tools/thinking/__init__.py +4 -0
- strix/tools/thinking/thinking_actions.py +18 -0
- strix/tools/thinking/thinking_actions_schema.xml +52 -0
- strix/tools/web_search/__init__.py +4 -0
- strix/tools/web_search/web_search_actions.py +80 -0
- strix/tools/web_search/web_search_actions_schema.xml +83 -0
- strix_agent-0.1.1.dist-info/LICENSE +201 -0
- strix_agent-0.1.1.dist-info/METADATA +200 -0
- strix_agent-0.1.1.dist-info/RECORD +99 -0
- strix_agent-0.1.1.dist-info/WHEEL +4 -0
- strix_agent-0.1.1.dist-info/entry_points.txt +3 -0
@@ -0,0 +1,150 @@
|
|
1
|
+
<tools>
|
2
|
+
<tool name="create_note">
|
3
|
+
<description>Create a personal note for TODOs, side notes, plans, and organizational purposes during
|
4
|
+
the scan.</description>
|
5
|
+
<details>Use this tool for quick reminders, action items, planning thoughts, and organizational notes
|
6
|
+
rather than formal vulnerability reports or detailed findings. This is your personal notepad
|
7
|
+
for keeping track of tasks, ideas, and things to remember or follow up on.</details>
|
8
|
+
<parameters>
|
9
|
+
<parameter name="title" type="string" required="true">
|
10
|
+
<description>Title of the note</description>
|
11
|
+
</parameter>
|
12
|
+
<parameter name="content" type="string" required="true">
|
13
|
+
<description>Content of the note</description>
|
14
|
+
</parameter>
|
15
|
+
<parameter name="category" type="string" required="false">
|
16
|
+
<description>Category to organize the note (default: "general", "findings", "methodology", "todo", "questions", "plan")</description>
|
17
|
+
</parameter>
|
18
|
+
<parameter name="tags" type="string" required="false">
|
19
|
+
<description>Tags for categorization</description>
|
20
|
+
</parameter>
|
21
|
+
<parameter name="priority" type="string" required="false">
|
22
|
+
<description>Priority level of the note ("low", "normal", "high", "urgent")</description>
|
23
|
+
</parameter>
|
24
|
+
</parameters>
|
25
|
+
<returns type="Dict[str, Any]">
|
26
|
+
<description>Response containing: - note_id: ID of the created note - success: Whether the note was created successfully</description>
|
27
|
+
</returns>
|
28
|
+
<examples>
|
29
|
+
# Create a TODO reminder
|
30
|
+
<function=create_note>
|
31
|
+
<parameter=title>TODO: Check SSL Certificate Details</parameter>
|
32
|
+
<parameter=content>Remember to verify SSL certificate validity and check for weak ciphers
|
33
|
+
on the HTTPS service discovered on port 443. Also check for certificate
|
34
|
+
transparency logs.</parameter>
|
35
|
+
<parameter=category>todo</parameter>
|
36
|
+
<parameter=tags>["ssl", "certificate", "followup"]</parameter>
|
37
|
+
<parameter=priority>normal</parameter>
|
38
|
+
</function>
|
39
|
+
|
40
|
+
# Planning note
|
41
|
+
<function=create_note>
|
42
|
+
<parameter=title>Scan Strategy Planning</parameter>
|
43
|
+
<parameter=content>Plan for next phase: 1) Complete subdomain enumeration 2) Test discovered
|
44
|
+
web apps for OWASP Top 10 3) Check database services for default creds
|
45
|
+
4) Review any custom applications for business logic flaws</parameter>
|
46
|
+
<parameter=category>plan</parameter>
|
47
|
+
<parameter=tags>["planning", "strategy", "next_steps"]</parameter>
|
48
|
+
</function>
|
49
|
+
|
50
|
+
# Side note for later investigation
|
51
|
+
<function=create_note>
|
52
|
+
<parameter=title>Interesting Directory Found</parameter>
|
53
|
+
<parameter=content>Found /backup/ directory that might contain sensitive files. Low priority
|
54
|
+
for now but worth checking if time permits. Directory listing seems
|
55
|
+
disabled.</parameter>
|
56
|
+
<parameter=category>findings</parameter>
|
57
|
+
<parameter=tags>["directory", "backup", "low_priority"]</parameter>
|
58
|
+
<parameter=priority>low</parameter>
|
59
|
+
</function>
|
60
|
+
</examples>
|
61
|
+
</tool>
|
62
|
+
<tool name="delete_note">
|
63
|
+
<description>Delete a note.</description>
|
64
|
+
<parameters>
|
65
|
+
<parameter name="note_id" type="string" required="true">
|
66
|
+
<description>ID of the note to delete</description>
|
67
|
+
</parameter>
|
68
|
+
</parameters>
|
69
|
+
<returns type="Dict[str, Any]">
|
70
|
+
<description>Response containing: - success: Whether the note was deleted successfully</description>
|
71
|
+
</returns>
|
72
|
+
<examples>
|
73
|
+
<function=delete_note>
|
74
|
+
<parameter=note_id>note_123</parameter>
|
75
|
+
</function>
|
76
|
+
</examples>
|
77
|
+
</tool>
|
78
|
+
<tool name="list_notes">
|
79
|
+
<description>List existing notes with optional filtering and search.</description>
|
80
|
+
<parameters>
|
81
|
+
<parameter name="category" type="string" required="false">
|
82
|
+
<description>Filter by category</description>
|
83
|
+
</parameter>
|
84
|
+
<parameter name="tags" type="string" required="false">
|
85
|
+
<description>Filter by tags (returns notes with any of these tags)</description>
|
86
|
+
</parameter>
|
87
|
+
<parameter name="priority" type="string" required="false">
|
88
|
+
<description>Filter by priority level</description>
|
89
|
+
</parameter>
|
90
|
+
<parameter name="search" type="string" required="false">
|
91
|
+
<description>Search query to find in note titles and content</description>
|
92
|
+
</parameter>
|
93
|
+
</parameters>
|
94
|
+
<returns type="Dict[str, Any]">
|
95
|
+
<description>Response containing: - notes: List of matching notes - total_count: Total number of notes found</description>
|
96
|
+
</returns>
|
97
|
+
<examples>
|
98
|
+
# List all findings
|
99
|
+
<function=list_notes>
|
100
|
+
<parameter=category>findings</parameter>
|
101
|
+
</function>
|
102
|
+
|
103
|
+
# List high priority items
|
104
|
+
<function=list_notes>
|
105
|
+
<parameter=priority>high</parameter>
|
106
|
+
</function>
|
107
|
+
|
108
|
+
# Search for SQL injection related notes
|
109
|
+
<function=list_notes>
|
110
|
+
<parameter=search>SQL injection</parameter>
|
111
|
+
</function>
|
112
|
+
|
113
|
+
# Search within a specific category
|
114
|
+
<function=list_notes>
|
115
|
+
<parameter=search>admin</parameter>
|
116
|
+
<parameter=category>findings</parameter>
|
117
|
+
</function>
|
118
|
+
</examples>
|
119
|
+
</tool>
|
120
|
+
<tool name="update_note">
|
121
|
+
<description>Update an existing note.</description>
|
122
|
+
<parameters>
|
123
|
+
<parameter name="note_id" type="string" required="true">
|
124
|
+
<description>ID of the note to update</description>
|
125
|
+
</parameter>
|
126
|
+
<parameter name="title" type="string" required="false">
|
127
|
+
<description>New title for the note</description>
|
128
|
+
</parameter>
|
129
|
+
<parameter name="content" type="string" required="false">
|
130
|
+
<description>New content for the note</description>
|
131
|
+
</parameter>
|
132
|
+
<parameter name="tags" type="string" required="false">
|
133
|
+
<description>New tags for the note</description>
|
134
|
+
</parameter>
|
135
|
+
<parameter name="priority" type="string" required="false">
|
136
|
+
<description>New priority level</description>
|
137
|
+
</parameter>
|
138
|
+
</parameters>
|
139
|
+
<returns type="Dict[str, Any]">
|
140
|
+
<description>Response containing: - success: Whether the note was updated successfully</description>
|
141
|
+
</returns>
|
142
|
+
<examples>
|
143
|
+
<function=update_note>
|
144
|
+
<parameter=note_id>note_123</parameter>
|
145
|
+
<parameter=content>Updated content with new findings...</parameter>
|
146
|
+
<parameter=priority>urgent</parameter>
|
147
|
+
</function>
|
148
|
+
</examples>
|
149
|
+
</tool>
|
150
|
+
</tools>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
from .proxy_actions import (
|
2
|
+
list_requests,
|
3
|
+
list_sitemap,
|
4
|
+
repeat_request,
|
5
|
+
scope_rules,
|
6
|
+
send_request,
|
7
|
+
view_request,
|
8
|
+
view_sitemap_entry,
|
9
|
+
)
|
10
|
+
|
11
|
+
|
12
|
+
__all__ = [
|
13
|
+
"list_requests",
|
14
|
+
"list_sitemap",
|
15
|
+
"repeat_request",
|
16
|
+
"scope_rules",
|
17
|
+
"send_request",
|
18
|
+
"view_request",
|
19
|
+
"view_sitemap_entry",
|
20
|
+
]
|
@@ -0,0 +1,101 @@
|
|
1
|
+
from typing import Any, Literal
|
2
|
+
|
3
|
+
from strix.tools.registry import register_tool
|
4
|
+
|
5
|
+
from .proxy_manager import get_proxy_manager
|
6
|
+
|
7
|
+
|
8
|
+
RequestPart = Literal["request", "response"]
|
9
|
+
|
10
|
+
|
11
|
+
@register_tool
|
12
|
+
def list_requests(
|
13
|
+
httpql_filter: str | None = None,
|
14
|
+
start_page: int = 1,
|
15
|
+
end_page: int = 1,
|
16
|
+
page_size: int = 50,
|
17
|
+
sort_by: Literal[
|
18
|
+
"timestamp",
|
19
|
+
"host",
|
20
|
+
"method",
|
21
|
+
"path",
|
22
|
+
"status_code",
|
23
|
+
"response_time",
|
24
|
+
"response_size",
|
25
|
+
"source",
|
26
|
+
] = "timestamp",
|
27
|
+
sort_order: Literal["asc", "desc"] = "desc",
|
28
|
+
scope_id: str | None = None,
|
29
|
+
) -> dict[str, Any]:
|
30
|
+
manager = get_proxy_manager()
|
31
|
+
return manager.list_requests(
|
32
|
+
httpql_filter, start_page, end_page, page_size, sort_by, sort_order, scope_id
|
33
|
+
)
|
34
|
+
|
35
|
+
|
36
|
+
@register_tool
|
37
|
+
def view_request(
|
38
|
+
request_id: str,
|
39
|
+
part: RequestPart = "request",
|
40
|
+
search_pattern: str | None = None,
|
41
|
+
page: int = 1,
|
42
|
+
page_size: int = 50,
|
43
|
+
) -> dict[str, Any]:
|
44
|
+
manager = get_proxy_manager()
|
45
|
+
return manager.view_request(request_id, part, search_pattern, page, page_size)
|
46
|
+
|
47
|
+
|
48
|
+
@register_tool
|
49
|
+
def send_request(
|
50
|
+
method: str,
|
51
|
+
url: str,
|
52
|
+
headers: dict[str, str] | None = None,
|
53
|
+
body: str = "",
|
54
|
+
timeout: int = 30,
|
55
|
+
) -> dict[str, Any]:
|
56
|
+
if headers is None:
|
57
|
+
headers = {}
|
58
|
+
manager = get_proxy_manager()
|
59
|
+
return manager.send_simple_request(method, url, headers, body, timeout)
|
60
|
+
|
61
|
+
|
62
|
+
@register_tool
|
63
|
+
def repeat_request(
|
64
|
+
request_id: str,
|
65
|
+
modifications: dict[str, Any] | None = None,
|
66
|
+
) -> dict[str, Any]:
|
67
|
+
if modifications is None:
|
68
|
+
modifications = {}
|
69
|
+
manager = get_proxy_manager()
|
70
|
+
return manager.repeat_request(request_id, modifications)
|
71
|
+
|
72
|
+
|
73
|
+
@register_tool
|
74
|
+
def scope_rules(
|
75
|
+
action: Literal["get", "list", "create", "update", "delete"],
|
76
|
+
allowlist: list[str] | None = None,
|
77
|
+
denylist: list[str] | None = None,
|
78
|
+
scope_id: str | None = None,
|
79
|
+
scope_name: str | None = None,
|
80
|
+
) -> dict[str, Any]:
|
81
|
+
manager = get_proxy_manager()
|
82
|
+
return manager.scope_rules(action, allowlist, denylist, scope_id, scope_name)
|
83
|
+
|
84
|
+
|
85
|
+
@register_tool
|
86
|
+
def list_sitemap(
|
87
|
+
scope_id: str | None = None,
|
88
|
+
parent_id: str | None = None,
|
89
|
+
depth: Literal["DIRECT", "ALL"] = "DIRECT",
|
90
|
+
page: int = 1,
|
91
|
+
) -> dict[str, Any]:
|
92
|
+
manager = get_proxy_manager()
|
93
|
+
return manager.list_sitemap(scope_id, parent_id, depth, page)
|
94
|
+
|
95
|
+
|
96
|
+
@register_tool
|
97
|
+
def view_sitemap_entry(
|
98
|
+
entry_id: str,
|
99
|
+
) -> dict[str, Any]:
|
100
|
+
manager = get_proxy_manager()
|
101
|
+
return manager.view_sitemap_entry(entry_id)
|
@@ -0,0 +1,267 @@
|
|
1
|
+
<?xml version="1.0" ?>
|
2
|
+
<tools>
|
3
|
+
<tool name="list_requests">
|
4
|
+
<description>List and filter proxy requests using HTTPQL with pagination.</description>
|
5
|
+
<parameters>
|
6
|
+
<parameter name="httpql_filter" type="string" required="false">
|
7
|
+
<description>HTTPQL filter using Caido's syntax:
|
8
|
+
|
9
|
+
Integer fields (port, code, roundtrip, id) - eq, gt, gte, lt, lte, ne:
|
10
|
+
- resp.code.eq:200, resp.code.gte:400, req.port.eq:443
|
11
|
+
|
12
|
+
Text/byte fields (ext, host, method, path, query, raw) - regex:
|
13
|
+
- req.method.regex:"POST", req.path.regex:"/api/.*", req.host.regex:".*.com"
|
14
|
+
|
15
|
+
Date fields (created_at) - gt, lt with ISO formats:
|
16
|
+
- req.created_at.gt:"2024-01-01T00:00:00Z"
|
17
|
+
|
18
|
+
Special: source:intercept, preset:"name"</description>
|
19
|
+
</parameter>
|
20
|
+
<parameter name="start_page" type="integer" required="false">
|
21
|
+
<description>Starting page (1-based)</description>
|
22
|
+
</parameter>
|
23
|
+
<parameter name="end_page" type="integer" required="false">
|
24
|
+
<description>Ending page (1-based, inclusive)</description>
|
25
|
+
</parameter>
|
26
|
+
<parameter name="page_size" type="integer" required="false">
|
27
|
+
<description>Requests per page</description>
|
28
|
+
</parameter>
|
29
|
+
<parameter name="sort_by" type="string" required="false">
|
30
|
+
<description>Sort field from: "timestamp", "host", "status_code", "response_time", "response_size"</description>
|
31
|
+
</parameter>
|
32
|
+
<parameter name="sort_order" type="string" required="false">
|
33
|
+
<description>Sort direction ("asc" or "desc")</description>
|
34
|
+
</parameter>
|
35
|
+
<parameter name="scope_id" type="string" required="false">
|
36
|
+
<description>Scope ID to filter requests (use scope_rules to manage scopes)</description>
|
37
|
+
</parameter>
|
38
|
+
</parameters>
|
39
|
+
<returns type="Dict[str, Any]">
|
40
|
+
<description>Response containing:
|
41
|
+
- 'requests': Request objects for page range
|
42
|
+
- 'total_count': Total matching requests
|
43
|
+
- 'start_page', 'end_page', 'page_size': Query parameters
|
44
|
+
- 'returned_count': Requests in response</description>
|
45
|
+
</returns>
|
46
|
+
<examples>
|
47
|
+
# POST requests to API with 200 responses
|
48
|
+
<function=list_requests>
|
49
|
+
<parameter=httpql_filter>req.method.eq:"POST" AND req.path.cont:"/api/"</parameter>
|
50
|
+
<parameter=sort_by>response_time</parameter>
|
51
|
+
<parameter=scope_id>scope123</parameter>
|
52
|
+
</function>
|
53
|
+
|
54
|
+
# Requests within specific scope
|
55
|
+
<function=list_requests>
|
56
|
+
<parameter=scope_id>scope123</parameter>
|
57
|
+
<parameter=sort_by>timestamp</parameter>
|
58
|
+
</function>
|
59
|
+
</examples>
|
60
|
+
</tool>
|
61
|
+
|
62
|
+
<tool name="view_request">
|
63
|
+
<description>View request/response data with search and pagination.</description>
|
64
|
+
<parameters>
|
65
|
+
<parameter name="request_id" type="string" required="true">
|
66
|
+
<description>Request ID</description>
|
67
|
+
</parameter>
|
68
|
+
<parameter name="part" type="string" required="false">
|
69
|
+
<description>Which part to return ("request" or "response")</description>
|
70
|
+
</parameter>
|
71
|
+
<parameter name="search_pattern" type="string" required="false">
|
72
|
+
<description>Regex pattern to search content. Common patterns:
|
73
|
+
- API endpoints: r"/api/[a-zA-Z0-9._/-]+"
|
74
|
+
- URLs: r"https?://[^\\s<>"\']+"
|
75
|
+
- Parameters: r'[?&][a-zA-Z0-9_]+=([^&\\s<>"\']+)'
|
76
|
+
- Reflections: input_value in content</description>
|
77
|
+
</parameter>
|
78
|
+
<parameter name="page" type="integer" required="false">
|
79
|
+
<description>Page number for pagination</description>
|
80
|
+
</parameter>
|
81
|
+
<parameter name="page_size" type="integer" required="false">
|
82
|
+
<description>Lines per page</description>
|
83
|
+
</parameter>
|
84
|
+
</parameters>
|
85
|
+
<returns type="Dict[str, Any]">
|
86
|
+
<description>With search_pattern (COMPACT):
|
87
|
+
- 'matches': [{match, before, after, position}] - max 20
|
88
|
+
- 'total_matches': Total found
|
89
|
+
- 'truncated': If limited to 20
|
90
|
+
|
91
|
+
Without search_pattern (PAGINATION):
|
92
|
+
- 'content': Page content
|
93
|
+
- 'page': Current page
|
94
|
+
- 'showing_lines': Range display
|
95
|
+
- 'has_more': More pages available</description>
|
96
|
+
</returns>
|
97
|
+
<examples>
|
98
|
+
# Find API endpoints in response
|
99
|
+
<function=view_request>
|
100
|
+
<parameter=request_id>123</parameter>
|
101
|
+
<parameter=part>response</parameter>
|
102
|
+
<parameter=search_pattern>/api/[a-zA-Z0-9._/-]+</parameter>
|
103
|
+
</function>
|
104
|
+
</examples>
|
105
|
+
</tool>
|
106
|
+
|
107
|
+
<tool name="send_request">
|
108
|
+
<description>Send a simple HTTP request through proxy.</description>
|
109
|
+
<parameters>
|
110
|
+
<parameter name="method" type="string" required="true">
|
111
|
+
<description>HTTP method (GET, POST, etc.)</description>
|
112
|
+
</parameter>
|
113
|
+
<parameter name="url" type="string" required="true">
|
114
|
+
<description>Target URL</description>
|
115
|
+
</parameter>
|
116
|
+
<parameter name="headers" type="dict" required="false">
|
117
|
+
<description>Headers as {"key": "value"}</description>
|
118
|
+
</parameter>
|
119
|
+
<parameter name="body" type="string" required="false">
|
120
|
+
<description>Request body</description>
|
121
|
+
</parameter>
|
122
|
+
<parameter name="timeout" type="integer" required="false">
|
123
|
+
<description>Request timeout</description>
|
124
|
+
</parameter>
|
125
|
+
</parameters>
|
126
|
+
</tool>
|
127
|
+
|
128
|
+
<tool name="repeat_request">
|
129
|
+
<description>Repeat an existing proxy request with modifications for pentesting.
|
130
|
+
|
131
|
+
PROPER WORKFLOW:
|
132
|
+
1. Use browser_action to browse the target application
|
133
|
+
2. Use list_requests() to see captured proxy traffic
|
134
|
+
3. Use repeat_request() to modify and test specific requests
|
135
|
+
|
136
|
+
This mirrors real pentesting: browse → capture → modify → test</description>
|
137
|
+
<parameters>
|
138
|
+
<parameter name="request_id" type="string" required="true">
|
139
|
+
<description>ID of the original request to repeat (from list_requests)</description>
|
140
|
+
</parameter>
|
141
|
+
<parameter name="modifications" type="dict" required="false">
|
142
|
+
<description>Changes to apply to the original request:
|
143
|
+
- "url": New URL or modify existing one
|
144
|
+
- "params": Dict to update query parameters
|
145
|
+
- "headers": Dict to add/update headers
|
146
|
+
- "body": New request body (replaces original)
|
147
|
+
- "cookies": Dict to add/update cookies</description>
|
148
|
+
</parameter>
|
149
|
+
</parameters>
|
150
|
+
<returns type="Dict[str, Any]">
|
151
|
+
<description>Response data with status, headers, body, timing, and request details</description>
|
152
|
+
</returns>
|
153
|
+
<examples>
|
154
|
+
# Modify POST body payload
|
155
|
+
<function=repeat_request>
|
156
|
+
<parameter=request_id>req_789</parameter>
|
157
|
+
<parameter=modifications>{"body": "{\"username\":\"admin\",\"password\":\"admin\"}"}</parameter>
|
158
|
+
</function>
|
159
|
+
</examples>
|
160
|
+
</tool>
|
161
|
+
|
162
|
+
<tool name="scope_rules">
|
163
|
+
<description>Manage proxy scope patterns for domain/file filtering using Caido's scope system.</description>
|
164
|
+
<parameters>
|
165
|
+
<parameter name="action" type="string" required="true">
|
166
|
+
<description>Scope action:
|
167
|
+
- get: Get specific scope by ID or list all if no ID
|
168
|
+
- update: Update existing scope (requires scope_id and scope_name)
|
169
|
+
- list: List all available scopes
|
170
|
+
- create: Create new scope (requires scope_name)
|
171
|
+
- delete: Delete scope (requires scope_id)</description>
|
172
|
+
</parameter>
|
173
|
+
<parameter name="allowlist" type="list" required="false">
|
174
|
+
<description>Domain patterns to include. Examples: ["*.example.com", "api.test.com"]</description>
|
175
|
+
</parameter>
|
176
|
+
<parameter name="denylist" type="list" required="false">
|
177
|
+
<description>Patterns to exclude. Some common extensions:
|
178
|
+
["*.gif", "*.jpg", "*.png", "*.css", "*.js", "*.ico", "*.svg", "*woff*", "*.ttf"]</description>
|
179
|
+
</parameter>
|
180
|
+
<parameter name="scope_id" type="string" required="false">
|
181
|
+
<description>Specific scope ID to operate on (required for get, update, delete)</description>
|
182
|
+
</parameter>
|
183
|
+
<parameter name="scope_name" type="string" required="false">
|
184
|
+
<description>Name for scope (required for create, update)</description>
|
185
|
+
</parameter>
|
186
|
+
</parameters>
|
187
|
+
<returns type="Dict[str, Any]">
|
188
|
+
<description>Depending on action:
|
189
|
+
- get: Single scope object or error
|
190
|
+
- list: {"scopes": [...], "count": N}
|
191
|
+
- create/update: {"scope": {...}, "message": "..."}
|
192
|
+
- delete: {"message": "...", "deletedId": "..."}</description>
|
193
|
+
</returns>
|
194
|
+
<notes>
|
195
|
+
- Empty allowlist = allow all domains
|
196
|
+
- Denylist overrides allowlist
|
197
|
+
- Glob patterns: * (any), ? (single), [abc] (one of), [a-z] (range), [^abc] (none of)
|
198
|
+
- Each scope has unique ID and can be used with list_requests(scopeId=...)
|
199
|
+
</notes>
|
200
|
+
<examples>
|
201
|
+
# Create API-only scope
|
202
|
+
<function=scope_rules>
|
203
|
+
<parameter=action>create</parameter>
|
204
|
+
<parameter=scope_name>API Testing</parameter>
|
205
|
+
<parameter=allowlist>["api.example.com", "*.api.com"]</parameter>
|
206
|
+
<parameter=denylist>["*.gif", "*.jpg", "*.png", "*.css", "*.js"]</parameter>
|
207
|
+
</function>
|
208
|
+
</examples>
|
209
|
+
</tool>
|
210
|
+
|
211
|
+
<tool name="list_sitemap">
|
212
|
+
<description>View hierarchical sitemap of discovered attack surface from proxied traffic.
|
213
|
+
|
214
|
+
Perfect for bug hunters to understand the application structure and identify
|
215
|
+
interesting endpoints, directories, and entry points discovered during testing.</description>
|
216
|
+
<parameters>
|
217
|
+
<parameter name="scope_id" type="string" required="false">
|
218
|
+
<description>Scope ID to filter sitemap entries (use scope_rules to get/create scope IDs)</description>
|
219
|
+
</parameter>
|
220
|
+
<parameter name="parent_id" type="string" required="false">
|
221
|
+
<description>ID of parent entry to expand. If None, returns root domains.</description>
|
222
|
+
</parameter>
|
223
|
+
<parameter name="depth" type="string" required="false">
|
224
|
+
<description>DIRECT: Only immediate children. ALL: All descendants recursively.</description>
|
225
|
+
</parameter>
|
226
|
+
<parameter name="page" type="integer" required="false">
|
227
|
+
<description>Page number for pagination (30 entries per page)</description>
|
228
|
+
</parameter>
|
229
|
+
</parameters>
|
230
|
+
<returns type="Dict[str, Any]">
|
231
|
+
<description>Response containing:
|
232
|
+
- 'entries': List of cleaned sitemap entries
|
233
|
+
- 'page', 'total_pages', 'total_count': Pagination info
|
234
|
+
- 'has_more': Whether more pages available
|
235
|
+
- Each entry: id, kind, label, hasDescendants, request (method/path/status only)</description>
|
236
|
+
</returns>
|
237
|
+
<notes>
|
238
|
+
Entry kinds:
|
239
|
+
- DOMAIN: Root domains (example.com)
|
240
|
+
- DIRECTORY: Path directories (/api/, /admin/)
|
241
|
+
- REQUEST: Individual endpoints
|
242
|
+
- REQUEST_BODY: POST/PUT body variations
|
243
|
+
- REQUEST_QUERY: GET parameter variations
|
244
|
+
|
245
|
+
Check hasDescendants=true to identify entries worth expanding.
|
246
|
+
Use parent_id from any entry to drill down into subdirectories.
|
247
|
+
</notes>
|
248
|
+
</tool>
|
249
|
+
|
250
|
+
<tool name="view_sitemap_entry">
|
251
|
+
<description>Get detailed information about a specific sitemap entry and related requests.
|
252
|
+
|
253
|
+
Perfect for understanding what's been discovered under a specific directory
|
254
|
+
or endpoint, including all related requests and response codes.</description>
|
255
|
+
<parameters>
|
256
|
+
<parameter name="entry_id" type="string" required="true">
|
257
|
+
<description>ID of the sitemap entry to examine</description>
|
258
|
+
</parameter>
|
259
|
+
</parameters>
|
260
|
+
<returns type="Dict[str, Any]">
|
261
|
+
<description>Response containing:
|
262
|
+
- 'entry': Complete entry details including metadata
|
263
|
+
- Entry contains 'requests' with all related HTTP requests
|
264
|
+
- Shows request methods, paths, response codes, timing</description>
|
265
|
+
</returns>
|
266
|
+
</tool>
|
267
|
+
</tools>
|