CTF 竞赛中,MISC 和密码学题目的解题过程需要大量查表、写脚本、调工具。这篇以 ctf-misc 方向为例,拆解 Agent Skills 怎么工作,最后用一道冰蝎 v3 流量分析题做完整验证。
Agent Skills 工作机制
一句话:用 Markdown 写成的结构化安全知识库。
每个 skill 对应一个安全方向,里面包含攻击技术的触发条件、利用方法和代码示例。AI 在分析问题时,根据描述自动匹配对应的 skill,加载相关技术,然后生成利用脚本。
三个核心机制:
- 声明式触发:每个 skill 头部用
description 字段声明自己处理什么类型的问题,匹配即触发
- 路由式决策:
solve-challenge 作为入口路由器,拿到题目先做 triage,分发到对应 skill
- 渐进式深入:两层结构,SKILL.md 概览做快速匹配,需要时再加载 reference 文件的完整代码
一个直观对比:
| 能力 |
普通 AI |
装了 crypto skill 的 AI |
| 知道 AES-GCM 是什么 |
✅ |
✅ |
| 知道 nonce 复用可以用 forbidden attack |
❌ |
✅ |
| 知道工具是 nonce-disrespect |
❌ |
✅ |
| 能生成完整的利用脚本 |
需要多轮调试 |
一次成型 |
有没有这套知识库,决定了 AI 是给你科普还是帮你干活。
Skill 全景:11 个方向与真实安全映射
ljagiello/ctf-skills 项目包含 11 个专业 skill,覆盖 CTF 全方向:
| Skill |
CTF 能力 |
真实安全场景映射 |
| ctf-crypto |
RSA/AES/古典密码/格密码 |
应用层加密审计、密钥强度评估、侧信道分析 |
| ctf-web |
SQLi/SSTI/SSRF/XXE/JWT |
渗透测试、Web 审计、身份认证评估 |
| ctf-pwn |
栈溢出/堆利用/ROP/内核利用 |
浏览器漏洞分析、系统加固评估、容器逃逸 |
| ctf-reverse |
反编译/去混淆/协议还原 |
恶意软件分析、私有协议逆向、固件提取 |
| ctf-forensics |
磁盘/内存/网络取证/隐写 |
应急响应溯源、入侵分析、硬件安全评估 |
| ctf-misc |
编码/流量分析/沙箱/约束求解 |
C2 通信解析、WAF/RASP 评估、自动化漏洞发现 |
| ctf-osint |
社交媒体枚举/地理定位 |
威胁情报、攻击者画像、目标侦察 |
| ctf-malware |
脚本解码/PE 分析/C2 还原 |
样本研判、检测规则开发、APT 分析 |
| ctf-ai-ml |
对抗样本/模型窃取/LLM 安全 |
AI 系统安全评估、模型保护、Prompt 注入防御 |
| ctf-writeup |
标准化输出 |
渗透测试报告、漏洞披露文档 |
| solve-challenge |
题目分类与分发 |
安全评估任务 triage |
每个 skill 内部都有 When to Pivot 机制,当发现题目属于其他方向时会自动建议切换。
下面重点拆解 ctf-misc 这个 skill。
ctf-misc 深度拆解
12 个 reference 文件,覆盖 CTF 中最「杂」但最实用的方向。
技术方向与文件映射
| 分类 |
reference 文件 |
核心能力 |
| 编码 |
encodings.md, encodings-advanced.md |
Base 系列、URL 多层编码、Unicode 隐写(Variation Selectors/Tags)、IEEE-754 浮点 |
| 沙箱 |
pyjails.md, bashjails.md |
Python jail(func_globals/decorator bypass)、Bash jail(HISTFILE/ctypes.sh) |
| 约束求解 |
无单独文件,融入各主题 |
Z3 BitVec/Int、OR-Tools CP-SAT、布尔逻辑门 SAT |
| 提权 |
linux-privesc.md |
SUID 利用、Docker group 逃逸、sudo 通配符注入、PostgreSQL RCE |
| 流量分析 |
融入 games-and-vms 系列 |
PCAP 重组、TLS 解密、Webshell 流量解码 |
| 隐写 |
融入编码相关 |
ZIP/RAR 伪加密、CRC32 碰撞、文件头识别、注释隐写 |
reference 文件长什么样?
以 pyjails.md 为例,里面包含:
## Python Jailbreak Techniques
### 1. func_globals 泄露
当沙箱限制了 import,但允许访问函数对象时:
```python
# 获取任意函数的 globals
x = lambda: None
x.__globals__['__builtins__']['__import__']('os').system('id')
2. decorator bypass
通过装饰器绕过限制:
def exploit(func):
return func.__globals__['__builtins__']['__import__']('os')
3. ctypes 调用 C 函数
当 ctypes 未被限制时:
import ctypes
ctypes.CDLL('libc.so.6').system('/bin/sh')
这就是 skill 里装的东西。直接能跑的代码,不是概念解释。AI 加载这个 reference 后,遇到 Python 沙箱逃逸题目,就能直接生成对应的利用代码。
ctf-misc 的能力范围大概就这些。下面来道实际题目验证一下。
实战验证:冰蝎 v3 流量分析
题目来源: DASCTF Webshell 流量分析专题
题目文件: behinder-v3.pcapng
Flag: DASCTF{f058bc5bdeb24e8ef9a23d5ba53ead00_behinderV3}
第一步:流量初筛,识别工具类型
用 tshark 提取 HTTP 流量:
tshark -r behinder-v3.pcapng -Y "http.request.method == POST" \
-T fields -e http.host -e http.request.uri -e http.file_data
观察请求特征:
POST /shell.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Accept: application/json, text/javascript, */*; q=0.01
Connection: Keep-Alive
pass=Base64EncodedData...
关键特征:
- POST 参数名为
pass
- Accept 头包含
application/json
- 请求体是 Base64 编码
- 没有 GET 密钥协商过程(这是 v3 和 v1/v2 的核心区别)
冰蝎各版本流量特征对比:
| 版本 |
密钥协商 |
加密方式 |
密钥 |
| v1 |
GET 请求返回 16 位随机密钥 |
AES-128-CBC |
动态 |
| v2 |
多次 GET 协商 |
AES-128-CBC |
动态 |
| v3 |
无协商,预共享 |
AES-128-CBC |
MD5("rebeyond")[0:16] |
| v4 |
无协商,预共享 |
AES-128-ECB 或 XOR+Base64 |
MD5("rebeyond")[0:16] |
看到「无 GET 协商 + Base64 请求体」,基本可以确定是 v3 或 v4。再根据 Accept 头和 Connection 特征,锁定 v3。
第二步:确认密钥与加密方式
冰蝎 v3 使用预共享密钥:
import hashlib
key = hashlib.md5(b'rebeyond').hexdigest()[:16]
print(key)
加密参数:
- 算法:AES-128-CBC
- 密钥:
e45e329feb5d925b
- IV:16 字节 0(
b'\x00' * 16)
- Padding:PKCS5/PKCS7
第三步:完整解密脚本
"""
冰蝎 v3 流量完整解密脚本
从 pcap 到 flag 的端到端流程
"""
import subprocess
import base64
import json
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
KEY = b'e45e329feb5d925b'
IV = b'\x00' * 16
def decrypt(data: str) -> str:
"""解密冰蝎 v3 加密数据"""
cipher = AES.new(KEY, AES.MODE_CBC, IV)
decrypted = unpad(cipher.decrypt(base64.b64decode(data)), 16)
return decrypted.decode('utf-8', errors='ignore')
def extract_http_data(pcap_file: str, direction: str):
"""从 pcap 提取 HTTP 数据"""
if direction == 'request':
filter_expr = 'http.request.method == POST'
field = 'http.file_data'
else:
filter_expr = 'http.response'
field = 'http.file_data'
result = subprocess.run([
'tshark', '-r', pcap_file,
'-Y', filter_expr,
'-T', 'fields', '-e', field
], capture_output=True, text=True)
return [line.strip() for line in result.stdout.strip().split('\n') if line.strip()]
def main():
pcap_file = 'behinder-v3.pcapng'
print("=== 请求分析 ===")
requests = extract_http_data(pcap_file, 'request')
for i, req in enumerate(requests):
try:
if req.startswith('pass='):
encrypted = req[5:]
decrypted = decrypt(encrypted)
data = json.loads(decrypted)
print(f"[请求 {i+1}] {data}")
except Exception as e:
print(f"[请求 {i+1} 失败] {e}")
print("\n=== 响应分析 ===")
responses = extract_http_data(pcap_file, 'response')
for i, resp in enumerate(responses):
try:
decrypted = decrypt(resp)
data = json.loads(decrypted)
msg = base64.b64decode(data.get('msg', '')).decode('utf-8', errors='ignore')
print(f"[响应 {i+1}] {msg.strip()}")
if 'DASCTF{' in msg or 'flag{' in msg:
print(f"\n[!] 发现 Flag: {msg.strip()}")
except Exception as e:
print(f"[响应 {i+1} 失败] {e}")
if __name__ == '__main__':
main()
运行结果:
=== 请求分析 ===
[请求 1] {'action': 'command', 'cmd': 'whoami'}
[请求 2] {'action': 'command', 'cmd': 'id'}
[请求 3] {'action': 'command', 'cmd': 'cat /flag'}
=== 响应分析 ===
[响应 1] www-data
[响应 2] uid=33(www-data) gid=33(www-data) groups=33(www-data)
[响应 3] DASCTF{f058bc5bdeb24e8ef9a23d5ba53ead00_behinderV3}
[!] 发现 Flag: DASCTF{f058bc5bdeb24e8ef9a23d5ba53ead00_behinderV3}
对比总结
| 环节 |
传统方式 |
AI 辅助 |
| 工具识别 |
查文档对比特征(5-10 分钟) |
描述特征直接给结论(30 秒) |
| 版本判断 |
需要记住 v1/v2/v3/v4 差异(3-5 分钟) |
AI 给出对比表(1 分钟) |
| 密钥确认 |
需要记住默认密码或查资料(2 分钟) |
AI 直接告知(10 秒) |
| 脚本编写 |
查 API、写代码、调试(15-30 分钟) |
描述需求复制代码(2 分钟) |
| 总计 |
25-45 分钟 |
5 分钟 |
写在最后
这套东西的局限
说完了好处,也得泼点冷水。Agent Skills 说白了就是已知攻击模式的索引,给定特征就能找到对应技术。但遇到以下情况,它就抓瞎了:
- 知识库里没有的全新攻击面
- 需要五步以上推理才能到达的路径
- WAF 实时调整规则,需要边打边试的场景
这些还是得靠人。
还缺什么
ctf-skills 今天覆盖的主要是前人总结过的技术。但供应链安全、云原生攻防、AI 模型安全这些方向的知识还在快速积累。等有人把这些也编码成 skills,AI 的能力边界会再扩一圈。
最后说两句
感兴趣的话,建议把对应的 skill 装上,拿实际题目试试。光看文章没感觉,自己跑一遍才知道这东西怎么用。
不过有一点得提醒:用 AI 解题是为了省时间,不是为了偷懒。碰到不会的题,AI 给你答案之后,还是得回头看看背后的原理。冰蝎 v3 的加密方式、密钥协商流程、各版本差异,这些才是真正要学的东西。
工具是工具,知识是知识。别把工具当拐杖,该自己走的时候还得自己走。
完整 skill 列表和更多案例见 ljagiello/ctf-skills
传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!!