secagent
README.md
# SecAgent ð
> åºäº **MCP (Model Context Protocol)** çèªäž»å®å
šè¯äŒ° Agent ââ æçå®ç Kali å®å
šå·¥å
·å°è£
æ MCP ServerïŒè®© LLM **æŸåŒè§å**ãå¹¶/äž²è¡è°çšå·¥å
·ãåå±è®°å¿åç°ãæ å° MITRE ATT&CKãèªåšçææ¥åã
>
> **å®å
šäŒå
**ïŒäŸµå
¥åŒæäœé»è®€éèŠäººå·¥æ¹åïŒå·¥å
·è°çšå
šçšå®¡è®¡ïŒæ¯æç®æ çœååäžç§çœè®¿é®ç®¡æ§ã
[](https://www.python.org/)
[](https://modelcontextprotocol.io/)
[](https://github.com/RicardoMLu777/secagent/actions/workflows/tests.yml)
[](LICENSE)
> [!WARNING]
> **ä»
éæææµè¯ã** SecAgent äŒæ§è¡çå®çç«¯å£æ«æãç®åœçç Žäž SQL 泚å
¥æ£æµã请åªåšèªæèµäº§ãææä¹Šé¢ææçç®æ ææ¬å°é¶åºäžäœ¿çšãæªæææ«æåšå€æ°åžæ³èŸåºå±äºè¿æ³è¡äžºãè¯Šè§ææ« [Disclaimer](#disclaimer)ã
---
## æææŒç€º
ç»äžäžªç®æ ïŒAgent èªå·±è§åãèªå·±å³å®æ¯äžæ¥åä»ä¹ïŒ
```bash
$ python secagent.py --target 192.168.1.10 --report out/report.md --policy allow
```
> è¿éçš `--policy allow` æ¯å 䞺æŒç€ºç¯å¢æ¯æç¡®ææçæ¬å°é¶åºãé»è®€æš¡åŒæ¯ `ask`ïŒäŒå¯¹æ¯äžæ¥äŸµå
¥åŒæäœåŒ¹åºäººå·¥ç¡®è®€ââè§äžæ¹[å®å
šæš¡å](#å®å
šæš¡å)ã
```
âââââââââââââââââââââââââââââââ plan âââââââââââââââââââââââââââââââ®
â Plan for 192.168.1.10: â
â â 1. Probe the target to confirm it is live (http_probe) â
â â 2. Inspect HTTP security headers (check_security_headers) â
â â 3. Review robots.txt for hidden paths (check_robots) â
â â 4. Enumerate sensitive directories (ffuf_dirs) [intrusive] â
â â 5. Port/service scan (nmap_scan) [intrusive] â
â â 6. Consolidate into a risk assessment â
â°âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ¯
step 1 · reasoning
â nmap_server__nmap_scan {"target": "192.168.1.10"}
â 22/tcp open ssh OpenSSH 8.2p1 / 80/tcp open http nginx 1.18.0
step 2 · reasoning
running 3 tool calls in parallel â å¹¶è¡æ§è¡
â httpx_server__http_probe {"url": "http://192.168.1.10"}
â httpx_server__check_security_headers {"url": "http://192.168.1.10"}
â httpx_server__check_robots {"url": "http://192.168.1.10"}
â status 200, server nginx/1.18.0
â missing: content-security-policy, x-frame-options (4/6)
â interesting: /admin, /backup
step 3 · reasoning
â ffuf_server__ffuf_dirs {"url": "http://192.168.1.10/FUZZ"}
â 7 hits: /admin (301), /backup.zip (200), ...
ATT&CK: T1046, T1592, T1083
report written: out/report.md
```
çæçæ¥åå
å« **æ§è¡è®¡å / ATT&CK æ å° / é
çœ®åŒ±ç¹ / Agent ç»è®º**ïŒ
```markdown
# SecAgent Assessment Report
**Steps used:** 5 **Tool calls:** 11
## Summary
- Open ports: 22, 80
- Services: ssh, nginx 1.18.0
- Missing security headers: content-security-policy, x-frame-options
## Plan execution
| # | Task | Status | Intrusive |
|---|------|--------|-----------|
| 1 | Probe the target | done | no |
...
## MITRE ATT&CK techniques observed
| ID | Technique | Tactic |
|----|-----------|--------|
| T1046 | Network Service Discovery | Discovery |
| T1592 | Gather Victim Host Information | Reconnaissance |
| T1083 | File and Directory Discovery | Discovery |
## Configuration weaknesses
- **content-security-policy** â No CSP: reflected XSS has no browser-level mitigation.
## Agent report
### Findings
...
```
---
## æ¶æ
```
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â SecAgent â
â â
â ââââââââââââââââ ââââââââââââââââââââââââââââ â
â â Planner âââââââââ¶â ReAct Execution Loop â â
â â â â â â
â â 1. plan() â â think â call â observe â â
â â 2. revise() âââââ3âââââ (parallel tool calls) â â
â ââââââââââââââââ steps ââââââââââââââ¬ââââââââââââââ â
â â â
â âââââââââââââââŽââââââââââââââ â
â â Tiered Memory â â
â â raw observations + â â
â â distilled findings â â
â âââââââââââââââââââââââââââââ â
â â â
â âââââââââââââââŽââââââââââââââ â
â â Policy Gate â â
â â deny / ask / allow â â
â âââââââââââââââ¬ââââââââââââââ â
â âââââââââââââââŽââââââââââââââ â
â â ATT&CK Mapper + Report â â
â â + SQLite History â â
â âââââââââââââââââââââââââââââ â
ââââââââââââââââââââââââââââ¬ââââââââââââââââââââââââââââââââ
â MCP protocol (stdio)
ââââââââââââââ¬âââââââââŽââââââââ¬âââââââââââââ
⌠⌠⌠âŒ
ââââââââââââ ââââââââââââ âââââââââââââ ââââââââââââ
â nmap â â httpx â â sqlmap â â ffuf â
â 2 tools â â 3 tools â â 3 tools â â 1 tool â
ââââââ¬ââââââ ââââââ¬ââââââ âââââââ¬ââââââ ââââââ¬ââââââ
⌠⌠⌠âŒ
nmap httpx+re sqlmap ffuf
```
### æš¡åè莣
| æš¡å | æä»¶ | è莣 |
|------|------|------|
| **Planner** | `agent/planner.py` | Plan-and-ExecuteïŒäžæ¬¡æ§åè§£ç®æ + æ¯ 3 æ¥éè§å |
| **ReAct Core** | `agent/core.py` | æšçâè°çšå·¥å
·âè§å¯åŸªç¯ïŒæ¯æå¹¶è¡å·¥å
·è°çš |
| **MCP Manager** | `agent/mcp_client.py` | MCP Server çåœåšæãå·¥å
·åç°ãåœå空éŽé犻 |
| **Memory** | `agent/memory.py` | åå±è®°å¿ïŒåå§è§å¯ïŒæé¢ç®ïŒ+ ç»æååç° |
| **ATT&CK Mapper** | `agent/attack_map.py` | åç° â MITRE ATT&CK ææ¯ ID + é
眮匱ç¹è¯Žæ |
| **Policy** | `agent/policy.py` | å·¥å
·å级ãç®æ çœååã人工æ¹åéšæ§ |
| **Store** | `agent/store.py` | SQLite æä¹
å + 忬¡æ«æå¯¹æ¯ |
| **Retry** | `agent/retry.py` | ç¬æ¶éè¯¯ææ°éé¿éè¯ |
| **Report** | `agent/report.py` | æž²æ Markdown / JSON æ¥å |
---
## å®å
šæš¡å
èªäž» Agent æ§è¡çå®çæ»å»å·¥å
·ïŒæå€§çé£é©æ¯å®èªå·±å³å®å»åä»ä¹ãSecAgent çšäžå±çºŠæè§£å³è¿äžªé®é¢ã
### 1. å·¥å
·å级 â 䟵å
¥åŒæäœé»è®€éèŠäººå·¥æ¹å
```python
PASSIVE_TOOLS = {"http_probe", "check_security_headers", "check_robots"}
INTRUSIVE_TOOLS = {"nmap_scan", "nmap_vuln_scan", "sqlmap_scan",
"sqlmap_dump", "ffuf_dirs", ...}
```
```bash
$ python secagent.py --target 192.168.1.10 --policy ask
step 2 · reasoning
â sqlmap_server__sqlmap_scan {"url": "http://192.168.1.10/news.php?id=1"}
âââââââââââââââââââââ â approval required âââââââââââââââââââââ®
â sqlmap_scan â
â {"url": "http://192.168.1.10/news.php?id=1"} â
â â
â 'sqlmap_scan' sends intrusive traffic and needs approval â
â°ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ¯
Allow this action? [y/N]
```
äžç§æš¡åŒïŒ
| æš¡åŒ | 被åšå·¥å
· | 䟵å
¥å·¥å
· | éçšåºæ¯ |
|------|---------|---------|---------|
| `passive` | â
èªåšæŸè¡ | â äžåŸæç» | ç产ç¯å¢çåªè¯»äŸŠå¯ |
| `ask`ïŒé»è®€ïŒ | â
èªåšæŸè¡ | â ïž åŒ¹çªç人工确讀 | åžžè§æžéæµè¯ |
| `allow` | â
| â
| æç¡®ææçé¶åº / çº¢éæŒç» |
**æªé
眮æ¹å人æ¶é»è®€æç»**ïŒfail closedïŒââè¿æ¯å»æçïŒé¿å
"é
眮æŒäº"åæ"å
šæŸè¡"ã
被æç»çè°çšäŒä»¥ç»æå JSON åéŠç»æš¡åïŒå¹¶éäžæåŒïŒ
```json
{
"blocked": true,
"tool": "sqlmap_server__sqlmap_scan",
"reason": "'sqlmap_scan' sends intrusive traffic and needs approval",
"guidance": "This action was blocked by the engagement policy. Do not retry it."
}
```
æš¡åæ¿å°è¿äžªäžäŒæ»åŸªç¯éè¯ïŒèæ¯èœ¬åè¢«åšææ®µæåšæ¥åé诎æéèŠææã
### 2. ç®æ ç®¡æ§ â çœåå + ç§çœä¿æ€
```bash
# åªå
讞æå®ååïŒè¶çäžåŸæç»
python secagent.py --target x --scope 'example\.com' --scope 'testsite\.org'
# çŠæ¢è®¿é®åç¯/å
çœå°åïŒé² SSRF åŒç误æäœïŒ
python secagent.py --target x --deny-private
# 圻åºçŠçšæäžªå·¥å
·
python secagent.py --target x --deny-tools sqlmap_dump ffuf_dirs
```
`--scope` æ **hostname å
šå¹é
**ïŒäžæ¯åäž²å¹é
ïŒ`example\.com` äžäŒæŸè¡ `example.com.attacker.net` æ `evilexample.com`ãèŠæŸè¡ååéæŸåŒååº `--scope '.*\.example\.com'`ã
`--deny-private` æŠæª `127.0.0.0/8`ã`10.0.0.0/8`ã`172.16.0.0/12`ã`192.168.0.0/16`ã`169.254.0.0/16` äž `::1`ãå€æäŸæ®æ¯ IP åé¢éïŒå æ€ `10.example.com` è¿ç±»ååäžäŒè¢«è¯¯äŒ€ãè¿æ¡è§ååšæ«å
çœæ¶èŠæ³šæå
³æã
### 3. å
šéŸè·¯å®¡è®¡
æ¯æ¬¡å·¥å
·è°çšéœè®°åœå³çäžçç±ïŒ
```bash
$ python secagent.py --target x --policy ask --json | jq '.tool_audit'
[
{"step": 1, "tool": "httpx_server__http_probe",
"decision": "allow", "reason": "passive reconnaissance"},
{"step": 2, "tool": "sqlmap_server__sqlmap_scan",
"decision": "ask-denied",
"reason": "'sqlmap_scan' sends intrusive traffic and needs approval..."}
]
```
审计æ¥å¿åæ¶èœåºïŒå¯ä»¥å溯"è¿æ¬¡è¯äŒ°å°åºè·è¿ä»ä¹ãè°æ¹ç"ã
---
## å¿«éåŒå§
### ç¯å¢èŠæ±
- Python 3.11+
- LinuxïŒnmap / sqlmap / ffuf éèŠïŒçŒºå€±çå·¥å
·äŒè¢«èªåšè·³è¿ïŒ
- äžäžª OpenAI å
Œå®¹ç LLM API
```bash
sudo apt install nmap sqlmap ffuf
```
### å®è£
```bash
git clone https://github.com/RicardoMLu777/secagent.git
cd secagent
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
```
### çš Docker è·ïŒäžæ³è£
å·¥å
·éŸæ¶çšè¿äžªïŒ
éåéå·²ç»åžŠå¥œ nmap / sqlmap / ffufïŒå®¿äž»æºäžéèŠä»»äœå®å
šå·¥å
·ïŒ
```bash
docker build -t secagent .
# LinuxïŒ--network host è®©æ«æèœå°èŸŸäœ çé¶åºçœæ®µ
docker run --rm --network host --env-file .env secagent --target 192.168.1.10
# æ³çäžä»œæ¥ååºæ¥
docker run --rm --network host --env-file .env -v "$PWD/out:/app/out" \
secagent --target 192.168.1.10 --report out/report.md
```
éåå
以é root çšæ·è¿è¡ã`--deny-private` é»è®€**å
³é**ïŒæ«å
çœé¶åºäžçšé¢å€å€çã
### é
眮
```bash
cp .env.example .env
# çŒèŸ .envïŒå¡«å
¥ DEEPSEEK_API_KEY
```
å
Œå®¹ä»»æ OpenAI å议端ç¹ïŒ
```bash
SECAGENT_BASE_URL=https://api.deepseek.com/v1 # DeepSeek
SECAGENT_BASE_URL=https://api.openai.com/v1 # OpenAI
SECAGENT_BASE_URL=http://localhost:11434/v1 # Ollama æ¬å°
```
### è¿è¡
```bash
# ç»ç®æ ïŒèªåšè§å
python secagent.py --target 192.168.1.10
# èªç¶è¯èšç®æ
python secagent.py "审计 example.com çå®å
šå€Žé
çœ®åææè·¯åŸ"
# èŸåºæ¥åæä»¶
python secagent.py --target example.com --report out/example.md
# å 蜜å
šéš MCP Server
python secagent.py --target x --all-servers
# å
³éè§å/å¹¶è¡ïŒå¯¹æ¯å®éªçšïŒ
python secagent.py --target x --no-planner --no-parallel
# JSON èŸåºïŒäŸ¿äºéæå° CIïŒ
python secagent.py --target x --json
```
---
## MCP å·¥å
·æž
å
### `nmap_server.py`
| å·¥å
· | 诎æ | ATT&CK |
|------|------|--------|
| `nmap_scan` | ç«¯å£æ«æ + æå¡çæ¬è¯å« | T1046 |
| `nmap_vuln_scan` | NSE æŒæŽèæ¬æ«æ | T1595 |
### `httpx_server.py`
| å·¥å
· | 诎æ | ATT&CK |
|------|------|--------|
| `http_probe` | ç¶æç ãååºå€Žãæ é¢ãææ¯æçº¹ | T1592 |
| `check_security_headers` | 6 䞪å
³é®å®å
šå€ŽçŒºå€±å®¡è®¡ | â |
| `check_robots` | robots.txt è§£æïŒæ è®°ææè·¯åŸ | T1590 |
### `sqlmap_server.py`
| å·¥å
· | 诎æ | ATT&CK |
|------|------|--------|
| `sqlmap_scan` | SQL 泚å
¥æ£æµ | T1190 |
| `sqlmap_tables` | æäžŸæ°æ®åºè¡š | â |
| `sqlmap_dump` | 富åºè¡šæ°æ®ïŒéæŸåŒæå®åºè¡šïŒ | T1213 |
### `ffuf_server.py`
| å·¥å
· | 诎æ | ATT&CK |
|------|------|--------|
| `ffuf_dirs` | ç®åœ/æä»¶çç ŽïŒèªåžŠè¿·äœ åå
žïŒ | T1083 |
---
## 讟计èŠç¹
### 1. æŸåŒè§å vs 纯 ReAct
纯 ReAct çé®é¢ïŒæš¡å蟹æ³èŸ¹åïŒå®¹æåšç»èéæèœ¬ãSecAgent ææäž€é¶æ®µïŒ
```python
# é¶æ®µäžïŒæ å·¥å
·ç¯å¢äžç纯è§åïŒæš¡åäžäŒå¿äžäœçŽæ¥åŒç«ïŒ
plan = planner.plan(objective, available_tools)
# é¶æ®µäºïŒåžŠè®¡åæ§è¡
result = await agent.run(objective, plan=plan)
# é¶æ®µäžïŒæ¯ 3 æ¥è®© planner 倿 žïŒå¯ continue / revise / done
action, plan = planner.revise(objective, plan, findings_so_far)
```
è§åè°çš**äžæå·¥å
·**ïŒè¿æ¯å
³é®ââæš¡ååªèœæè `åä»ä¹`ïŒäžèœçŽæ¥ `å`ã
### 2. å¹¶è¡å·¥å
·è°çš
æš¡åäžèœ®è¿åå€äžª tool_calls æ¶ïŒçš `asyncio.gather` å¹¶åæ§è¡ïŒ
```python
if self.parallel and len(parsed) > 1:
results = await asyncio.gather(
*(mcp.call(tc.function.name, args) for tc, args in parsed),
return_exceptions=True,
)
```
æ äŸèµçè°çšïŒhttp_probe + check_headers + check_robotsïŒäžèœ®æå®ïŒå®æµç 40%+ æ¶éŽã
### 3. åå±è®°å¿
倧倿° Agent æå
šéšå·¥å
·èŸåºå¡è¿ contextïŒåŸå¿«å°±çäºïŒ
```python
# 第äžå±ïŒåå§è§å¯ïŒæé¿åºŠé¢ç®ïŒè¶
é¿æªæïŒ
observations = [Observation(step=1, tool="nmap_scan", result="...")]
# 第äºå±ïŒç»æåäºå®ïŒçšæ£åä»åå§èŸåºæœåïŒ
findings = {
"open_ports": {"22", "80"},
"services": {"ssh", "nginx 1.18.0"},
"missing_headers": {"content-security-policy"},
"interesting_paths": {"/admin", "/backup"},
"flags": set(),
}
```
æ¯èœ®åªæ³šå
¥ **æèŠ + æè¿ 2 æ¡è§å¯**ïŒèéå
šéåå²ã
### 4. å·¥å
·åœå空éŽ
å€äžª Server å¯èœæååå·¥å
·ïŒç»äžå åçŒïŒ
```
nmap_server__nmap_scan
httpx_server__http_probe
```
### 5. å®å
šå åº
- ææç³»ç»åœä»€çš **list 圢åŒ**è°çšïŒäžç» shellïŒïŒå¹¶åšåæ°å±é¢è¿æ»€å
å笊ïŒ
```python
if re.search(r"[;&|`$><\n]", target):
return "error: invalid characters in target"
```
- `sqlmap_dump` çåºå/衚å/ååå
šéšæ£åçœååæ ¡éª
- System prompt æç¡® Rules of EngagementïŒåªå¯¹ææç®æ æäœãäŒå
é䟵å
¥ãäžäŒªé èŸåº
---
## åå²äžå¯¹æ¯
æ¯æ¬¡è¯äŒ°èªåšèœåºïŒSQLiteïŒé»è®€ `~/.secagent/engagements.db`ïŒïŒå¯ä»¥å溯å对æ¯åäžäžªç®æ ç忬¡æ«æã
```bash
# æ¥çåå²
$ python secagent.py history --target example.com
Engagement history
ââââââ³âââââââââââââ³ââââââââââââââââââââââ³ââââââââ³ââââââââ³âââââââââââââââââââââ
â ID â Target â Started â Steps â Calls â Flags â
â¡âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ©
â 7 â example.comâ 2026-09-17T14:20:11 â 6 â 14 â flag{new_finding} â
â 3 â example.comâ 2026-09-10T09:02:44 â 5 â 11 â - â
ââââââŽâââââââââââââŽââââââââââââââââââââââŽââââââââŽââââââââŽâââââââââââââââââââââ
# 对æ¯äž€æ¬¡æ«æ
$ python secagent.py diff 3 7
example.com #3 (2026-09-10T09:02:44) â #7 (2026-09-17T14:20:11)
+ ports: 8080
- headers: x-frame-options
+ flags: flag{new_finding}
= services: no change (4)
# ææè¯äŒ°è¿çç®æ
$ python secagent.py targets
```
对æ¯ç»ŽåºŠïŒåŒæŸç«¯å£ãæå¡çæ¬ã猺倱çå®å
šå€Žãææè·¯åŸãFlagã
å
³ææä¹
åçš `--no-store`ïŒææå®åºè·¯åŸ `--db /path/to.db`ã
---
## 容é
å·¥å
·è°çšéå°çœç»æåšãè¶
æ¶ã5xx æ¶èªåšéè¯ïŒææ°éé¿ + æåšïŒïŒæå€ 3 次ïŒ
```python
TRANSIENT_MARKERS = (
"timeout", "connection refused", "connection reset",
"502 bad gateway", "503 service unavailable", "rate limit", ...
)
```
åªæ**ç¬æ¶é误**æéè¯ââéå°"ç®æ äžå¯èŸŸ"è¿ç±»ç¡®å®æ§å€±èŽ¥çŽæ¥è¿åïŒäžåæ è°çåŸ
ãéè¯è¿çšäŒæå° `â» retry 1` 让䜿çšè
çå°ã
è°æŽæ¬¡æ°ïŒ`retry_attempts=5`ïŒæé åæ°ïŒã
---
## CI
æšéå° `main` èªåšè§Šå GitHub ActionsïŒ
```yaml
matrix: python 3.11 / 3.12 / 3.13
- pytest tests/ # åå
æµè¯
lint:
- ruff check . # E/F/W è§å
- compileall # åèç çŒè¯æ£æ¥
```
CI æŸç»æå°è¿äžäžªç bugïŒ`ffuf_server.py` é `ext` åéååéïŒåºäžº `exts`ïŒïŒéææ£æ¥çŽæ¥æŽé²ãè¿å°±æ¯æ lint æŸè¿ CI çä»·åŒã
---
## æ©å±æ°ç MCP Server
åš `mcp_servers/` äžææš¡æ¿æ°å»ºå³å¯ïŒè¿è¡æ¶äŒèªåšåç°ïŒ
```python
from mcp.server import Server
from mcp.server.stdio import stdio_server
from mcp.types import TextContent, Tool
app = Server("myserver")
@app.list_tools()
async def list_tools() -> list[Tool]:
return [Tool(
name="my_tool",
description="What this tool does",
inputSchema={"type": "object", "properties": {...}, "required": [...]},
)]
@app.call_tool()
async def call_tool(name: str, arguments: dict) -> list[TextContent]:
return [TextContent(type="text", text=json.dumps(result))]
async def main():
async with stdio_server() as (r, w):
await app.run(r, w, app.create_initialization_options())
```
```bash
python secagent.py --target X --servers nmap_server.py myserver.py
```
**æšèæ©å±æ¹å**ïŒ`nuclei_server.py`ã`nikto_server.py`ã`gobuster_server.py`ã`hydra_server.py`
---
## 项ç®ç»æ
```
secagent/
âââ agent/
â âââ __init__.py
â âââ core.py # ReAct äž»åŸªç¯ + å¹¶è¡æ§è¡
â âââ planner.py # Plan-and-Execute è§åå±
â âââ mcp_client.py # MCP Server çåœåšæäžå·¥å
·åç°
â âââ memory.py # åå±è®°å¿ïŒåå§è§å¯ + ç»æååç°
â âââ attack_map.py # åç° â MITRE ATT&CK æ å°
â âââ policy.py # å·¥å
·å级ãçœååã审æ¹éšæ§
â âââ store.py # SQLite æä¹
åäžå次对æ¯
â âââ retry.py # ç¬æ¶éè¯¯ææ°éé¿
â âââ report.py # Markdown / JSON æ¥åæž²æ
âââ mcp_servers/
â âââ nmap_server.py # ç«¯å£æ«æ / NSE
â âââ httpx_server.py # HTTP æ¢æµ / å®å
šå€Ž / robots
â âââ sqlmap_server.py # 泚å
¥æ£æµ / åºè¡šæäžŸ / 富åº
â âââ ffuf_server.py # ç®åœçç Ž
âââ tests/ # åå
æµè¯
âââ .github/workflows/tests.yml
âââ secagent.py # CLI å
¥å£
âââ requirements.txt
âââ .env.example
âââ Dockerfile
âââ LICENSE
âââ README.md
```
---
## å®å
šä¿®å€è®°åœ
è®°åœæ¬é¡¹ç®èªå·±è¢«å®¡è®¡åºæ¥çé®é¢åä¿®å€æ¹åŒã
### `--scope` çœååå¯è¢«ç»è¿ïŒå·²ä¿®å€ïŒ
æ©æå®ç°çš `re.search(pattern, target)` 对æŽäžªç®æ å笊䞲ååäž²å¹é
ïŒ`--scope 'example\.com'` äŒæŸè¡ä»¥äžç®æ ïŒ
| ç®æ | 䞺ä»ä¹èœç»è¿ |
|---|---|
| `http://example.com.attacker.net` | ææååäœäžºæ»å»è
ååçåçŒåºç° |
| `http://evilexample.com` | ææååäœäžºåäž²åºç° |
| `http://example.com@attacker.net` | `@` 忝 userinfoïŒçå® host æ¯ `attacker.net` |
| `https://attacker.net/?next=example.com` | åäž²åºç°åš query é |
ç°åšæ¹äžºå
`urlsplit` æå hostnameïŒå `re.fullmatch` å
šå¹é
ïŒååœæµè¯è§ `tests/test_policy_scope.py`ã
åäžæ¬¡å®¡è®¡è¿åç° `--deny-private` çšå笊䞲æ£å倿ïŒäŒæ `10.example.com`ã`notlocalhost.com` 误å€äžºç§çœå°åïŒå·²æ¹çš `ipaddress` 倿 IP åé¢éã
> æè®ïŒ**æ ¡éªç¹ééäœçœ®ïŒæ¯äžåæ ¡éªæŽå±é©**ââå®ç»äœ çæ¯èåçå®å
šæã
---
## å·²ç¥å±é
è¯å®è®°åœèŸ¹çïŒäžåè¿åºŠæ¿è¯ºã
1. **äžè§£æ DNS** ââ `--deny-private` åªå€æ IP åé¢éãè¥æäžªååè§£æå° `192.168.x.x`ïŒDNS rebinding äžç±»ææ³ïŒïŒåç¬Šäž²å±æŠäžäœãæ£ç¡®åæ³æ¯åšå»ºç«è¿æ¥å对解æç»æåæ ¡éªäžæ¬¡ïŒåœåæªå®ç°ã
2. **å·¥å
·èŸåºè§£æäŸèµæ£å** ââ `memory.py` ä»åå§èŸåºäžæœå端å£ãæå¡ãè·¯åŸçäºå®ãå·¥å
·çæ¬å级æ¹åèŸåºæ ŒåŒæ¶æœåå¯èœå€±èŽ¥ïŒé级çç¥æ¯ä¿çåå§è§å¯ãæŸåŒç»æååæ®µïŒäžäžææ§è¡ã
3. **æªå¯¹æ prompt injection** ââ åŠæè¢«æ«æç®æ è¿åç banner æé¡µé¢å
容éåµå
¥äºæä»€ïŒæš¡åçè§åå¯èœè¢«æ±¡æãç®åäŸèµ policy å±å
åºïŒè¶çç®æ äŒè¢«æç»ïŒïŒäœæ²¡æèŸå
¥äŸ§çé犻äžååã
4. **åæºåè¿çš** ââ æ²¡æä»»å¡éåãæ²¡æå¹¶åç®æ é犻ãå®äœæ¯å次ææè¯äŒ°çèŸ
å©å·¥å
·ïŒäžæ¯æ«æå¹³å°ã
5. **è§å莚éåæš¡åèœå圱å** ââ æ¢çšå°æš¡åæ¶è®¡åå¯èœè¿äºä¿å®æéå€ã`--no-planner` å¯ä»¥éå纯 ReAct å对æ¯å®éªã
---
## åç»è®¡å
- [ ] è§£æå IP æ ¡éªïŒå µäœ DNS rebinding è·¯åŸ
- [ ] ç®æ ååºå
å®¹äžæä»€äžäžæé犻ïŒå prompt injection 鲿€
- [ ] æ°å¢ `nuclei_server.py`ïŒæš¡æ¿åæŒæŽæ£æµïŒ
- [ ] æ¥åæ¯æ SARIF èŸåºïŒäŸ¿äºæ¥å
¥ CI
- [ ] éäžä»œæ¬å°é¶åºïŒDVWA / OWASP Juice ShopïŒç端å°ç«¯å€ç°æå
---
## Disclaimer
æ¬é¡¹ç®ä»
çšäº**è·åŸæç¡®ææçå®å
šæµè¯**ãæåŠäžå®å
šç ç©¶ã
䜿çšè
须确ä¿ïŒ
- å¯¹ç®æ æ¥ææææïŒæææä¹Šé¢çæžéæµè¯ææïŒ
- éµå®æåšå°æ³åŸæ³è§ââåšäžåœå¢å
ïŒæªç»ææå¯¹è®¡ç®æºä¿¡æ¯ç³»ç»è¿è¡æ«æãæ¢æµæè·åæ°æ®ïŒå¯èœè¿åãäžå人æ°å
±ååœçœç»å®å
šæ³ãåãåæ³ã第äºçŸå
«åäºæ¡ïŒ
- äžå°æ¬å·¥å
·çšäºä»»äœæªææç®æ ã
å·¥å
·å
眮ç审æ¹éšæ§ãç®æ çœååäžç§çœç®¡æ§æ¯**éäœè¯¯æäœé£é©ç讟计**ïŒäžææäœ¿çšææçæ¿ä»£ãäœè
äžå¯¹ä»»äœæ»¥çšè¡äžºåç±æ€äº§ççåææ¿æ
莣任ã
åšæ¬å°é¶åºç»ä¹ ïŒæ°žè¿æ¯æ£ç¡®çç¬¬äžæ¥ã
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues