AIGC标识 从零搭建本地 AI 安全测试平台(二):Ubuntu 26.04 + Ollama + Qwen3:14B + Nmap 实战

本文是上一篇《Ubuntu 26.04 Docker 四大漏洞靶场部署实战》的续篇,记录 AI 分析主机部署、SSH 隧道、自动化扫描和本地大模型报告生成的过程。仅针对自建授权实验环境。

一、目标与整体架构

传统扫描工具负责获取事实证据,本地大模型负责分析和生成报告。先实现最小闭环:HTTP/Nmap 采集 → JSON 证据 → Ollama/Qwen3:14B 分析 → Markdown 报告。

组件 A:AI 分析主机 B:漏洞靶场主机
系统 Ubuntu 26.04.1 Ubuntu 26.04.1
主机 javen03-ub2604 yj2-Ubuntu2
地址 A 主机局域网 IP 192.168.18.237
配置 i7-1165G7、约 30 GiB 内存、CPU 推理 Docker 运行四套靶场
软件 Ollama、Qwen3:14B、Python、Nmap Juice Shop、DVWA、WebGoat、crAPI

B 主机的靶场服务绑定 127.0.0.1,不直接开放给局域网。A 主机通过 SSH 本地端口转发访问。B 主机的 443/8443 等原有服务不受本实验影响。

A:Ubuntu + Python/Nmap + Ollama/Qwen3:14B
                  |
              SSH 隧道
                  |
B:Ubuntu + Docker(仅本地回环端口)
    ├── Juice Shop  127.0.0.1:3000
    ├── DVWA        127.0.0.1:8081
    ├── WebGoat     127.0.0.1:8082
    └── crAPI       127.0.0.1:8888

二、A 主机部署 Ollama

2.1 安装服务

curl -fsSL https://ollama.com/install.sh | sh
ollama --version
systemctl status ollama --no-pager

如果服务未运行:

sudo systemctl enable --now ollama
ss -lntp | grep 11434

默认本地 API 监听 127.0.0.1:11434。不要为了方便将未经认证的 Ollama API 直接暴露到公网。

2.2 下载千问模型

ollama pull qwen3:14b
ollama list
ollama run qwen3:14b '请简要介绍 OWASP Top 10。'

本次使用 i7-1165G7 CPU 推理,无独立 GPU。14B 模型可以运行,但首次加载及长报告生成可能需要数分钟。ollama run 测试完成后无需一直保持交互窗口,Python Agent 会通过 Ollama API 自动加载模型。

2.3 验证 API

curl --noproxy '*' http://127.0.0.1:11434/api/tags

应能看到已安装模型列表。如果访问失败,先检查 systemd 服务和 11434 监听状态。

三、安装 Python 和 Nmap

sudo apt update
sudo apt install -y python3 python3-venv nmap curl openssh-client
python3 --version
nmap --version
mkdir -p ~/ai-pentest
cd ~/ai-pentest
python3 -m venv .venv
source .venv/bin/activate

本次实际环境为 Python 3.14.4、Nmap 7.98。V1/V2 扫描器主要使用 Python 标准库,虚拟环境便于后续扩展依赖。

四、建立 A → B 的 SSH 隧道

4.1 映射关系

靶场 B 端口 A 本地端口
Juice Shop 3000 13000
DVWA 8081 18081
WebGoat 8082 18082
crAPI 8888 18888

4.2 手动启动

在 A 主机运行:

ssh -o ExitOnForwardFailure=yes -N \
  -L 127.0.0.1:13000:127.0.0.1:3000 \
  -L 127.0.0.1:18081:127.0.0.1:8081 \
  -L 127.0.0.1:18082:127.0.0.1:8082 \
  -L 127.0.0.1:18888:127.0.0.1:8888 \
  yj2@192.168.18.237

命令保持运行是正常现象。另开终端验证:

ss -lntp | grep -E ':(13000|18081|18082|18888)\b'
curl --noproxy '*' -o /dev/null -s -w 'Juice Shop: %{http_code}\n' http://127.0.0.1:13000/
curl --noproxy '*' -o /dev/null -s -w 'DVWA: %{http_code}\n' http://127.0.0.1:18081/
curl --noproxy '*' -o /dev/null -s -w 'WebGoat: %{http_code}\n' http://127.0.0.1:18082/WebGoat
curl --noproxy '*' -o /dev/null -s -w 'crAPI: %{http_code}\n' http://127.0.0.1:18888/

根据靶场行为,200 或合理的 302 跳转均可能正常。

4.3 可选:systemd 用户服务自动维护隧道

首先确认免密 SSH 登录。已有密钥时不要覆盖:

ls -l ~/.ssh/id_ed25519.pub
# 没有密钥时才运行:ssh-keygen -t ed25519
ssh-copy-id yj2@192.168.18.237
ssh -o BatchMode=yes yj2@192.168.18.237 'echo SSH_OK'

在 ~/.config/systemd/user/ai-pentest-tunnel.service 中写入:

[Unit]
Description=AI Pentest SSH Tunnel
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=/usr/bin/ssh -N -T -o BatchMode=yes -o ExitOnForwardFailure=yes -o ServerAliveInterval=15 -o ServerAliveCountMax=3 -L 127.0.0.1:13000:127.0.0.1:3000 -L 127.0.0.1:18081:127.0.0.1:8081 -L 127.0.0.1:18082:127.0.0.1:8082 -L 127.0.0.1:18888:127.0.0.1:8888 yj2@192.168.18.237
Restart=always
RestartSec=10

[Install]
WantedBy=default.target

退出手动隧道后启动:

systemctl --user daemon-reload
systemctl --user enable --now ai-pentest-tunnel.service
systemctl --user status ai-pentest-tunnel.service --no-pager

如需未登录时也运行用户服务,可在验证成功后执行 sudo loginctl enable-linger javen03。本次尚未完成断线重连和重启后的全面验收,故此部分属于可选增强。

五、V1:最小可运行扫描与 AI 分析

项目结构:

ai-pentest-v1/
├── scanner.py
├── agent.py
├── README.md
└── reports/
    ├── scan-latest.json
    └── report-latest.md

scanner.py 访问四个固定的本地 SSH 转发地址,采集 HTTP 状态和 Nmap 服务识别结果并保存 JSON;agent.py 调用 Ollama 的 qwen3:14b 生成 Markdown 分析报告。

cd ~/ai-pentest/ai-pentest-v1
python3 scanner.py
python3 agent.py
less reports/report-latest.md

本次 V1 的实际扫描输出:

Juice Shop: HTTP 200; nmap exit 0
DVWA: HTTP 200; nmap exit 0
WebGoat: HTTP 200; nmap exit 0
crAPI: HTTP 200; nmap exit 0

注意:nmap exit 0 只代表命令正常结束,不代表端口开放或存在漏洞。应进一步读取 Nmap 结果中的 open、closed、filtered 状态。

六、V2:增强 HTTP 安全证据采集

V2 在 V1 基础上增加 scanner_v2.py、agent_v2.py,主要采集:

类别 内容
HTTP 状态码、标题、响应头、重定向链
安全响应头 CSP、HSTS、X-Frame-Options、X-Content-Type-Options、Referrer-Policy 等
Cookie Secure、HttpOnly、SameSite
CORS 测试 Origin、OPTIONS 预检响应
服务识别 Nmap TCP 端口和版本信息
证据保存 reports/scan-v2-latest.json
AI 报告 reports/report-v2-latest.md

运行方式:

cd ~/ai-pentest/ai-pentest-v2
python3 scanner_v2.py
python3 -m json.tool reports/scan-v2-latest.json
python3 agent_v2.py
less reports/report-v2-latest.md

agent_v2.py 通过本地 Ollama API 调用模型,无需先手动运行 ollama run。建议保持 Ollama 服务常驻、靶场 SSH 隧道正常。

6.1 如何解读 AI 结果

V2 的目标是形成证据驱动的风险线索,而不是自动确认漏洞。例如:

  • Access-Control-Allow-Origin: * 是可观察到的响应头,但不单独证明敏感信息跨域泄露。
  • 缺少 CSP、HSTS 等安全响应头,需要结合协议、页面用途、威胁模型判断风险。
  • Server 版本披露通常是信息收集线索,不等于已证实存在可利用漏洞。

报告应明确区分“事实”“推测”“待验证事项”和“修复建议”,并能回溯到原始 JSON 证据。

七、故障排查记录

7.1 四个靶场同时 Connection refused

V2 曾出现:

Juice Shop: HTTP <urlopen error [Errno 111] Connection refused>
DVWA: HTTP <urlopen error [Errno 111] Connection refused>
WebGoat: HTTP <urlopen error [Errno 111] Connection refused>
crAPI: HTTP <urlopen error [Errno 111] Connection refused>

四个目标同时失败时,先检查共同依赖的 SSH 隧道:

ss -lntp | grep -E ':(13000|18081|18082|18888)\b'

若无监听,重新建立 SSH 隧道,再执行 scanner_v2.py。不要一开始就重启 B 主机的 Docker 或清空防火墙规则,以免影响其他服务。

7.2 模型速度较慢

CPU 推理 14B 模型需要一定时间,特别是上下文较长时。建议原始 HTML 保存在本地文件,只将关键响应头、Nmap 结果和短证据摘要送入模型;控制上下文长度、生成 token 数量,避免不必要的内存与交换分区压力。

7.3 WebGoat 容器显示 unhealthy

曾发现健康检查命令依赖容器内不存在的 curl,而 WebGoat 实际 HTTP /WebGoat 可访问。健康检查失败不必然代表应用不可用,需要同时检查健康检查日志和真实 HTTP 响应。

八、安全边界与当前局限

  1. 固定授权目标范围,扫描器不得擅自扩展到互联网目标。
  2. V2 的重定向跟随逻辑仍需进一步增加严格的本地目标白名单校验。
  3. Docker 的出口限制已做部分验证,但不能据此宣称 IPv4/IPv6、容器到宿主机、重启持久化等隔离均已全面审计。
  4. 当前未接入 ZAP、认证扫描、漏洞利用或业务逻辑验证,不能将 AI 报告视为确认漏洞清单。
  5. 网页响应内容属于不可信输入,后续应防止页面文本对 AI Agent 发出越权指令。

九、下一步计划

  • V2.1:修复跨范围重定向、缩减模型输入、结构化风险项、关联证据编号。
  • V3:接入 OWASP ZAP 被动扫描和 SQLite 历史数据库。
  • V4:实现任务编排、审批机制、授权范围检查、扫描差异分析。

规划中的 Agent 工作流:

授权目标 → 范围校验 → HTTP/Nmap/ZAP 采集
                      ↓
                 JSON/SQLite 证据
                      ↓
                Qwen3 本地分析
                      ↓
              人工复核与报告输出

十、总结

本次已基本完成:Ubuntu 26.04 部署 Ollama、Qwen3:14B CPU 推理、SSH 隧道访问四套 Docker 靶场、Python/Nmap 扫描、JSON 证据保存和 AI Markdown 报告生成。

从 V1 到 V2 的变化,是从简单端口/HTTP 状态检测,升级到较丰富的 Web 安全响应证据采集。系统仍处于实验阶段,后续重点不是盲目增加扫描命令,而是提升证据可信度、授权控制、稳定性和可复现性。

免责声明:本文仅用于自建授权靶场的技术研究与安全测试。任何测试均应在明确授权的目标和网络范围内进行。

posted @ 2026-11-05 19:17  javen_xiao  阅读(4)  评论(0)    收藏  举报