渗透测试/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 update
sudo apt install hexstrike-ai -y

安装完成后检查:

1
2
which hexstrike_server
which hexstrike_mcp

检查

启动hexstrike-server:

1
hexstrike_server --port 8888   #这里官方默认开启端口是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 ssh
sudo 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
# 请把 `kali_ip` 替换成你的 Kali IP,把 `username` 替换成你的 Kali 用户名。

测试:

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齿轮菜单打开配置文件
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 #非必须

保存
powershell打开

在 Codex 中确认 MCP Server 是否可用

在 VSCode 里 ctrl+shift+p 输入 Developer: Reload Window
然后打开 Codex 插件面板,选择MCP服务器能看到
codex中hexstrike服务器

接下来启动hexstrike_mcp服务器
ctrl+shite+p 选择 MCP: list servers
打开hexstrike服务
hexstrike_mcp

之后可以直接在Codex cli中对话检查:
List available MCP tools.
成功展示1
2

全自动化搭建完成

接下来需要做的就很简单了——提供提示词,这里以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 pipefail

show_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

  1. 题目名称如果包含空格,请使用引号包起来
  2. 题目名称不能包含 /,因为 / 在 Linux 路径中是目录分隔符
  3. -c 表示创建后自动把 ~/CTF/current 指向当前题目
  4. ./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/current
ls -lah /home/meng/CTF/current
ls -lah /home/meng/CTF/current/attachments
curl http://127.0.0.1:8888/health

相关资料