-
-
[原创]Agent Skills:让 AI 拥有安全攻防知识库
-
发表于: 5天前 836
-
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 流量:
# 提取所有 POST 请求
tshark -r behinder-v3.pcapng -Y "http.request.method == POST" \
-T fields -e http.host -e http.request.uri -e http.file_data
# 输出示例:
# 192.168.1.100 /shell.php pass=Base64EncodedData...
观察请求特征:
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) # e45e329feb5d925b
加密参数:
- 算法:AES-128-CBC
- 密钥:
e45e329feb5d925b - IV:16 字节 0(
b'\x00' * 16) - Padding:PKCS5/PKCS7
第三步:完整解密脚本
#!/usr/bin/env python3
"""
冰蝎 v3 流量完整解密脚本
从 pcap 到 flag 的端到端流程
"""
import subprocess
import base64
import json
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
# 冰蝎 v3 默认密钥
KEY = b'e45e329feb5d925b' # MD5("rebeyond")[0:16]
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:
# 请求格式:pass=<base64加密的JSON>
if req.startswith('pass='):
encrypted = req[5:] # 去掉 "pass="
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)
# 响应格式:{"status": "base64(成功/失败)", "msg": "base64(结果)"}
msg = base64.b64decode(data.get('msg', '')).decode('utf-8', errors='ignore')
print(f"[响应 {i+1}] {msg.strip()}")
# 检查是否包含 flag
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
[招生]科锐逆向工程师培训(2026年7月3日实地,远程教学同时开班, 第56期)!
赞赏
- [原创]Agent Skills:让 AI 拥有安全攻防知识库 834
- [原创]angr/pyvex模块学习 9484
- [原创] Valgrind VEX IR 10132
- [原创]内存映射文件-进程间共享数据 12202
- [求助]C#反编译字符串出现乱码如何解决 4486