首页
社区
课程
招聘
[原创]Agent Skills:让 AI 拥有安全攻防知识库
发表于: 5天前 836

[原创]Agent Skills:让 AI 拥有安全攻防知识库

5天前
836

CTF 竞赛中,MISC 和密码学题目的解题过程需要大量查表、写脚本、调工具。这篇以 ctf-misc 方向为例,拆解 Agent Skills 怎么工作,最后用一道冰蝎 v3 流量分析题做完整验证。

Agent Skills 工作机制

一句话:用 Markdown 写成的结构化安全知识库。

每个 skill 对应一个安全方向,里面包含攻击技术的触发条件、利用方法和代码示例。AI 在分析问题时,根据描述自动匹配对应的 skill,加载相关技术,然后生成利用脚本。

三个核心机制:

  1. 声明式触发:每个 skill 头部用 description 字段声明自己处理什么类型的问题,匹配即触发
  2. 路由式决策solve-challenge 作为入口路由器,拿到题目先做 triage,分发到对应 skill
  3. 渐进式深入:两层结构,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期)!

上传的附件:
收藏
免费 0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回