渗透测试/CTF 半自动化流程 本教程是使用hexstrike + vscode copilot/codex,目的是实现渗透测试/CTF 自动化
本文仅用于授权的 CTF、靶场和自有实验环境,不适用于未授权目标。 这套流程的是“让 AI 代替人工执行重复性分析步骤”,不是无约束地自动攻击真实目标。
写这篇博客的原因 首先是我个人在学习了解了一些AI方面相关的知识后,平时使用的办法通常是将需求告知codex,然后等codex将详细步骤发给我再执行。但是在学完了MCP服务后,开始萌生了能不能直接通过提示词让codex调用我本地虚拟机的kali来执行一些重复性任务?
关于MCP 我在写这篇博客的时候对MCP的认识还是相当浅薄的,也很希望阅读到这篇文章的大家能指出哪里的不足和错误。
首先介绍MCP: MCP是一套可以让AI调用外部工具的标准协议(Model Context Protocol 又称模型上下文协议)。 MCP统一了AI和外部工具/数据之间的连接方式,换句话说就是MCP实现了AI端和程序之间的交互。这里MCP服务端可以让AI知道: Resources: 可供AI读取的资源 Prompts: 预设好的提示词模板来实现工作流 Tools: AI能够调用的工具/函数(这里我对函数的理解来自2026的CS50课程,里面说 函数在程序中就是一个动词或者动作来完成某一特定任务)
在MCP中有四部分: 用户 ↓ MCP Host:运行 AI 的一端,例如 Codex / IDE 插件 / CLI ↓ MCP Client:Host 内部负责和 MCP Server 通信的部分 ↓ MCP Server:对外暴露能力的服务 ↓ Tools:Server 提供给 Host 使用的内容
在我的这个场景里: Codex 作为 Host,通过 MCP Client 连接 HexStrike 这个 MCP Server,再由 HexStrike 暴露 Kali 里的各种工具能力
以上就是我对MCP的理解,之后有更深入的理解也会更新。
关于codex 这里的codex属于AI端,也就是MCP Host/Agent 的部分,可以把它类比成人类的大脑,你用的模型越优秀,你的实际解决问题能力也就越强(这里我个人觉得chatgpt,manus,calude 更好用些)
hexstrike HexStrike AI 是一款革命性的 AI 驱动攻击性安全框架,结合了专业安全工具与自主 AI 代理 ,提供全面的安全测试能力。 当然这只是hexstrike官网上这样描述的,不过我觉得这个描述有些夸大了,来看github上的描述: HexStrike AI MCP 代理是一款先进的 MCP 服务器,允许 AI 代理(Claude、GPT、Copilot 等)自主运行 150+ 网络安全工具,用于自动化渗透测试、漏洞发现、漏洞悬赏自动化和安全研究。无缝连接大型语言模型与现实世界的攻击性安全能力。
实际上hexstrike就是一个MCP server, 它的作用就是把很多kali安全工具封装成了MCP tools,从而实现了AI HOST 能自主调用工具来完成研究。
最明显的一点就是看他仓库代码,并没有特别多的文件,只有 hexstrike_mcp.py,hexstrike_server.py,这两个运行文件。其次是requirements.txt
那么接下来我们要思考的就很简单了,如何配置hexstrike-ai 并实现 codex 与之交互从而达成渗透测试全自动呢? 这里官方有给出copilot配置的视频,所以这里我就不再演示,仅演示codex如何配置https://www.youtube.com/watch?v=pSoftCagCm8 # 官方安装教程视频链接
部署kali并安装hexstrike 为了节约空间,同时网上关于如何部署kali的教程已经非常多也非常详细了,这里就不再演示,接下来直接从安装hexstrike开始。
安装 hexstrike并启动server 我这里使用的是已经封装好的 hexstrike-ai 安装方式。 如果你使用的是官方仓库 README,请以官方安装步骤为准;不同安装方式下,可执行文件名和启动方式可能不同。
如果你按官方 README 安装 这里补官方源码安装路径,例如:
git clone python venv pip install -r requirements.txt python3 启动 hexstrike_server 这里因为之后想让直接调用kali的工具,这里直接在kali中执行
1 2 sudo apt updatesudo apt install hexstrike-ai -y
安装完成后检查:
1 2 which hexstrike_serverwhich hexstrike_mcp
启动hexstrike-server:
1 hexstrike_server --port 8888
另开一个终端检查:
1 curl http://127.0.0.1:8888/health
如果返回信息中存在status:healthy 即为成功
请注意上面开启hexstrike_server的终端不要关闭!
Kali开启SSH 由于vscode运行在windows上,而hexstrike和工具都在kali里,所以需要通过远程执行通道来让windows能安全进入kali并启动hexstrike_mcp --server http://127.0.0.1:8888
不安全的办法 也可以直接让windows访问kali的8888端口,这需要kali先执行hexstrike_server --host 0.0.0.0 --port 8888 然后windows访问http://Kali-IP:8888 但是这样会把hexstrike_server暴露在网络中,可能会被恶意利用,非常不建议这样使用!
kali启动SSH
1 2 sudo systemctl enable --now sshsudo systemctl status ssh
windows配置免密SSH登录kali 在windows powershell中执行:
1 ssh-keygen -t ed25519 -f $env:USERPROFILE \.ssh\kali_hexstrike
把公钥传到kali:
1 type $env:USERPROFILE \.ssh\kali_hexstrike.pub | ssh username@Kali_IP "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"
测试免密登录:
1 ssh -i $env:USERPROFILE\.ssh\kali_hexstrike username@kali_IP "echo ok"
windows写入SSH配置 1 notepad $env :USERPROFILE\.ssh\config
写入:
1 2 3 4 5 6 Host kali-hexstrike HostName kali_ip User username IdentityFile C:\Users\你的Windows用户名\.ssh\kali_hexstrike StrictHostKeyChecking accept-new
测试:
1 ssh kali-hexstrike "echo ok"
返回 ok 即表示免密连接成功。
配置codex的mcp 我的工作流是: 用户 ↓ Windows VSCode Codex 插件 ↓ Codex 读取 C:\Users\username.codex\config.toml ↓ 通过 SSH 连接 Kali ↓ 启动 Kali 里的 hexstrike_mcp ↓ hexstrike_mcp 连接 http://127.0.0.1:8888 ↓ hexstrike_server 调用 Kali 工具 ↓ 结果返回给 Codex ↓ Codex 根据结果继续分析
OpenAI 官方文档有说明,Codex 的 CLI 和 VSCode IDE 插件共享 ~/.codex/config.toml 所以接下来从vscode齿轮菜单打开配置文件
也可以通过powershell,执行:
1 notepad $env :USERPROFILE\.codex\config.toml
写入这一段:1 2 3 4 5 6 7 8 9 10 11 12 13 [mcp_servers.hexstrike] command = "C:\\Windows\\System32\\OpenSSH\\ssh.exe" args = [ "-T" , "-o" , "BatchMode=yes" , "kali-hexstrike" , "hexstrike_mcp" , "--server" , "http://127.0.0.1:8888" , "--timeout" , "300" ] startup_timeout_sec = 60 tool_timeout_sec = 300 enabled = true
保存
在 Codex 中确认 MCP Server 是否可用 在 VSCode 里 ctrl+shift+p 输入 Developer: Reload Window 然后打开 Codex 插件面板,选择MCP服务器能看到
接下来启动hexstrike_mcp服务器ctrl+shite+p 选择 MCP: list servers 打开hexstrike服务
之后可以直接在Codex cli中对话检查:List available MCP tools.
全自动化搭建完成 接下来需要做的就很简单了——提供提示词,这里以ctf为例: 首先我在kali创建了一个名为CTF的文件夹 mkdir -p ~/CTF 为了方便写了一个便于管理的脚本 new_ctf.sh:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 #!/usr/bin/env bash set -euo pipefailshow_help () { echo "用法:" echo " $0 -p <比赛/平台目录> -t <题目类型> -n <题目名称> [-c]" echo echo "参数:" echo " -p 比赛或平台目录,例如 iscc、nssctf、buuctf" echo " -t 题目类型,只允许 misc/web/pwn/re/mobile" echo " -n 题目名称,例如 " who am i" " echo " -c 创建后将 ~/CTF/current 指向该题目目录" echo echo "示例:" echo " $0 -p iscc -t misc -n \"who am i\" -c" echo " $0 -p iscc -t web -n ez_login -c" } BASE_DIR="${HOME} /CTF" PLATFORM="" TYPE="" NAME="" SET_CURRENT=false while getopts ":p:t:n:ch" opt; do case "$opt " in p) PLATFORM="$OPTARG " ;; t) TYPE="$OPTARG " ;; n) NAME="$OPTARG " ;; c) SET_CURRENT=true ;; h) show_help exit 0 ;; \?) echo "[-] 未知参数: -$OPTARG " show_help exit 1 ;; :) echo "[-] 参数 -$OPTARG 需要值" show_help exit 1 ;; esac done if [[ -z "$PLATFORM " || -z "$TYPE " || -z "$NAME " ]]; then echo "[-] 缺少必要参数" show_help exit 1 fi case "$TYPE " in misc|web|pwn|re|mobile) ;; *) echo "[-] 题目类型不合法: $TYPE " echo "[-] 只允许: misc/web/pwn/re/mobile" exit 1 ;; esac if [[ "$NAME " == *"/" * ]]; then echo "[-] 题目名称不能包含 /" exit 1 fi mkdir -p "$BASE_DIR " TARGET_DIR="$BASE_DIR /$PLATFORM /$TYPE /$NAME " CURRENT_LINK="$BASE_DIR /current" mkdir -p "$TARGET_DIR " /{attachments,notes,output,scripts,tmp}README_FILE="$TARGET_DIR /README.md" if [[ ! -f "$README_FILE " ]]; then cat > "$README_FILE " <<EOF # $NAME ## 基本信息 - 平台/比赛:$PLATFORM - 题目类型:$TYPE - 题目名称:$NAME - 状态:未完成 ## 目录说明 ### attachments/ 用于存放题目原始附件。 例如: - zip 压缩包 - 图片 - 音频 - pcap 流量包 - ELF/EXE 二进制文件 - 题目给出的其他原始文件 原则:原始附件不要随意修改或覆盖。 ### notes/ 用于存放解题笔记。 例如: - 分析过程 - 关键命令 - 思路记录 - flag 获取过程 - 失败尝试记录 ### output/ 用于存放工具生成的结果和中间文件。 例如: - binwalk 解包结果 - foremost 提取结果 - 脚本输出 - 解码后的图片、音频、文本 - 扫描结果 ### scripts/ 用于存放自己写的解题脚本。 例如: - Python 脚本 - Bash 脚本 - 解码脚本 - 爆破脚本 - 数据处理脚本 ### tmp/ 用于存放临时文件。 例如: - 临时测试文件 - 临时转换结果 - 可删除的中间文件 ## 解题记录 ### 初始观察 ### 分析过程 ### 关键命令 ### 最终 Flag \`\`\` flag{} \`\`\` EOF fi if $SET_CURRENT ; then if [[ -e "$CURRENT_LINK " && ! -L "$CURRENT_LINK " ]]; then echo "[-] $CURRENT_LINK 已存在且不是软链接,请手动处理后再试" exit 1 fi ln -sfn "$TARGET_DIR " "$CURRENT_LINK " fi echo "[+] 创建成功:" echo " $TARGET_DIR " echo echo "[+] 已生成目录:" echo " attachments/ 原始附件" echo " notes/ 解题笔记" echo " output/ 输出结果" echo " scripts/ 解题脚本" echo " tmp/ 临时文件" echo " README.md 题目说明" if $SET_CURRENT ; then echo echo "[+] 当前题已切换:" echo " $CURRENT_LINK -> $(readlink -f "$CURRENT_LINK " ) " fi echo echo "[+] 进入目录:" echo " cd \"$TARGET_DIR \""
使用方式
1 ./new_ctf.sh -p 平台名 -t 题目类型 -n 题目名称 -c
题目名称如果包含空格,请使用引号包起来 题目名称不能包含 /,因为 / 在 Linux 路径中是目录分隔符 -c 表示创建后自动把 ~/CTF/current 指向当前题目./CTF/current 是一个软链接,会指向当前正在分析的题目目录。 这样在提示词里就不需要每次手动替换真实题目路径。提示词: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 这是一个已授权的 CTF / misc 题目,请使用当前已启用的 HexStrike MCP server 与 Kali 中可用工具,对题目附件进行持续分析,目标是找到最终 flag,并产出一份只保留成功解题思路的 WP。 ==================== 一、当前环境 ==================== 当前 CTF 总目录: /home/meng/CTF/ 当前题目工作目录: /home/meng/CTF/current/ 注意: `/home/meng/CTF/current` 是当前正在分析题目的软链接,真实目录位于: /home/meng/CTF/<比赛名>/<题型>/<题目名>/ 你在 `/home/meng/CTF/current/` 下创建、修改、保存的文件,最终都会落到该题目的真实目录中。 本题目标: 1. 找到最终 flag 2. 生成一份只包含成功解题思路的 WP 3. 持续保存分析进度,便于中断后继续 flag 格式: 如果最终无法确认唯一 flag,请将所有疑似 flag 按可能性从高到低排序,写入: - /home/meng/CTF/current/notes/wp.md - /home/meng/CTF/current/notes/task_state.md ==================== 二、连接与工具规则 ==================== 1. SSH 与 MCP server 已经配置完成,不要询问 SSH 用户名、密码或连接方式。 2. 不要手动执行 ssh。 3. 直接使用当前已启用的 HexStrike MCP server 暴露出的具体工具能力。 4. 不要寻找一个叫“hexstrike”的单独工具;HexStrike 是 MCP server 名称,不是具体工具名。 5. 如果不确定当前有哪些 MCP 工具可用,先列出可用 MCP tools,再选择合适工具继续分析。 6. 优先使用 MCP 暴露出的能力;如果 MCP 中没有合适工具,再使用 Kali 中现有命令行工具。 7. 如果需要当前 Kali 中没有安装的新工具,必须先告诉我: - 工具名 - 用途 - 安装命令 - 为什么需要它 等我确认后再安装。 ==================== 三、目录与文件规则 ==================== 所有操作必须限制在: /home/meng/CTF/ 禁止在 `/home/meng/CTF/` 之外创建、修改、删除任何文件。 当前题目目录: /home/meng/CTF/current/ 原始附件目录: /home/meng/CTF/current/attachments/ 脚本目录: /home/meng/CTF/current/scripts/ 输出目录: /home/meng/CTF/current/output/ 临时目录: /home/meng/CTF/current/tmp/ 笔记目录: /home/meng/CTF/current/notes/ 最终 WP: /home/meng/CTF/current/notes/wp.md 进度记录: /home/meng/CTF/current/notes/task_state.md 必须遵守: 1. 不允许删除、覆盖、修改 `attachments/` 中的原始附件。 2. 自己编写的脚本只能写入 `scripts/`。 3. 脚本输出与工具中间结果只能写入 `output/` 或 `tmp/`。 4. 不要在 Windows 本地目录中分析文件。 5. 不要使用 `F:\`、`C:\`、桌面、下载目录、`/tmp`、家目录根目录等路径。 6. 所有路径尽量使用 `/home/meng/CTF/current/...` 的绝对路径,不依赖相对路径。 ==================== 四、断点续做与进度保存 ==================== 为了防止 token 不足、额度不足、网络波动、工具异常或会话中断,请持续保存进度。 在以下时机必须更新: /home/meng/CTF/current/notes/task_state.md 更新时机: 1. 获得关键中间结果后 2. 即将因为异常、中断、额度或 token 限制停止时 task_state.md 至少包含: 1. 已分析过的文件 2. 已调用过的工具 3. 已执行过的关键命令 4. 已编写过的脚本路径 5. 已生成的关键输出文件 6. 发现的有效线索 7. 已排除的方向 8. 当前最可能的下一步 9. 当前疑似 flag 候选 10. 如果中途停止,下一位接手者该从哪里继续 如果即将中断,不要只在聊天里说明,必须先把当前进度写入 `task_state.md`。 ==================== 五、分析流程要求 ==================== 请按 CTF 解题工作流持续推进,目标是找到 `` 格式 flag。 第一阶段:环境确认 先执行并确认: - `pwd ` - `readlink -f /home/meng/CTF/current` - `find /home/meng/CTF/current -maxdepth 2 -print ` - `ls -lah /home/meng/CTF/current/attachments/` 第二阶段:初始分析 识别附件类型: - `file /home/meng/CTF/current/attachments/*` 然后根据文件类型选择合适工具继续分析。优先考虑但不限于以下方向: - file - strings - exiftool - binwalk - foremost - steghide - xxd / hexdump - tshark - ffmpeg / sox - unzip / zipinfo - john / hashcat - python3 - grep / sed / awk 第三阶段:深入分析 如果发现以下线索,必须继续深入验证: 1. 压缩包、伪加密、嵌套文件 2. 图片隐写、EXIF、LSB、附加数据 3. 音频隐写、频谱、波形、摩斯、DTMF、BFSK、反相、左右声道差异 4. 流量包、HTTP、DNS、TCP 流 5. 编码、Base64、Base32、Hex、ROT、凯撒、栅栏、培根、摩斯 6. 哈希、密码、弱口令、字典爆破 7. 二进制、字符串、壳、调试信息 8. 题目描述中的关键词提示,例如顺序、镜像、循环、广播、校区、图片、音频等 第四阶段:脚本辅助 如果需要写脚本: 1. 脚本必须保存到 `/home/meng/CTF/current/scripts/` 2. 文件名要表达用途,例如: - solve_audio.py - extract_bits.py - decode_morse.py 3. 输出必须写入 `output/` 或 `tmp/` 4. 不要写死 Windows 路径 5. 写脚本前先说明目的,执行后根据结果继续推进 第五阶段:flag 验证 找到疑似 flag 后,必须验证其是否符合格式要求 如果存在多个疑似 flag,请按可能性从高到低排序,并说明排序理由。 ==================== 六、WP 与归档要求 ==================== 最终 WP 必须写入: /home/meng/CTF/current/notes/wp.md WP 只保留成功解题思路,不要写成长篇失败流水账。 wp.md 至少包含: 1. 题目名称 2. 题目类型 3. 附件列表 4. 成功解题思路 5. 关键工具与命令 6. 关键脚本说明 7. 关键中间结果 8. 最终 flag 9. 简短总结 失败尝试如果对理解题目很重要,可以简短提一句;详细失败记录写入: /home/meng/CTF/current/notes/task_state.md ==================== 七、清理规则 ==================== 解题完成后,请整理当前题目目录。 必须保留: 1. attachments/ 中的原始附件 2. 成功解题用到的脚本 3. 成功解题相关的关键输出文件 4. wp.md 5. task_state.md 可以清理: 1. 明确无用的临时文件 2. 重复生成的中间文件 3. 失败尝试产生的大量无意义输出 4. tmp/ 中不再需要的文件 清理要求: 1. 不允许删除 attachments/ 中的任何文件 2. 不允许删除 wp.md 3. 不允许删除 task_state.md 4. 不确定是否有用的文件不要删除,可以保留并在 task_state.md 中说明 5. 清理前先列出准备删除的文件清单 6. 只删除 `/home/meng/CTF/current/tmp/` 和 `/home/meng/CTF/current/output/` 中明确无用的文件 ==================== 八、禁止事项 ==================== 1. 不要访问非题目目标 2. 不要攻击公网真实目标 3. 不要删除、覆盖、修改原始附件 4. 不要在 `/home/meng/CTF/` 之外写入文件 5. 不要把脚本写到 `/tmp`、桌面、下载目录、家目录根目录或 Windows 本地目录 6. 不要进行与本题无关的扫描、爆破或破坏性操作 7. 不要只给泛泛思路,要基于工具结果持续推进 8. 不要在没有保存 `task_state.md` 的情况下结束分析 ==================== 九、执行要求 ==================== 从现在开始直接进入分析流程。 请先完成以下事项: 1. 确认 `/home/meng/CTF/current` 的真实路径 2. 列出当前题目目录结构 3. 识别 `attachments/` 中附件类型 4. 选择并调用合适的 MCP 工具或 Kali 工具开始分析 5. 每完成一个阶段就更新 `notes/task_state.md` 6. 找到 flag 后生成 `notes/wp.md` 7. 最后只清理明确无用的临时文件,保留附件、脚本、关键输出、WP 与进度记录 注意: 每一步先简要说明目的,再执行工具或命令;不要停留在泛泛建议层面,要根据每一次返回结果继续推进。
开题前需保证:
1 2 3 4 readlink -f /home/meng/CTF/currentls -lah /home/meng/CTF/currentls -lah /home/meng/CTF/current/attachmentscurl http://127.0.0.1:8888/health
相关资料