记第二届腾讯云智能渗透挑战赛
前言
最近打了第二届腾讯云智能渗透挑战赛
我们写的agent第一天非常猛,最强的时候冲到了第四,第一天结束后是第五
可惜设计时没怎么考虑多点渗透和域渗透,因此后面几天较为乏力,最终只拿到了第19名的名次
开源链接如下,仅保留了核心部分,删除了比赛定制功能(比赛API等)
ENOCH-lyn/tencent_pentration_tool: 第二届腾讯智能渗透挑战赛参赛作品
设计
Tips:以下内容均是面向单节点渗透,也就是类似于黑盒web题
运行流程
agent自主运作时容易产生幻觉,并且这种幻觉会随着时间不断自我印证,最终将方向完全带偏
因此,在设计时,我们选择了限制agent的ReAct次数,在达到一定次数后,触发一次记忆压缩
记忆压缩期间,agent会总结目前当前轮次的发现,误区,凭证以及下一步应该尝试的方向,并用json格式表示。记忆压缩基本只保留几百字节的重点信息,这确保了下一轮不至于完全被上一轮的错误方向带偏
并且,为了防止agent记忆也产生污染,特别设计了一套规则,当记忆的findings字段连续3轮没有变动时,代表agent卡住了,这时候会有记忆清洗机制负责将所有不是基本信息的信息全部清除,包括已经发现的漏洞(可能是AI幻觉导致)
因此agent大概的工作流程便是:第一轮ReAct循环N次 -> 记忆压缩 -> 第二轮ReAct循环N次 -> ...... -> 多轮无发现,触发记忆清洗 -> 第X轮ReAct循环N次 -> ......
另外如果轮次调太大超过了规定的上下文长度,则会调用一个小模型进行上下文压缩,但不是json格式,压缩力度也比较小
专家agent
虽然架构是单agent结构,但是考虑到单一模型在安全方面可能存在短板,因此加了一个专家建议agent
该agent仅用于当主agent卡住时进行提问,并提供相应建议。并且配置了与主agent不同的模型,用于尽可能模型的短板,用不同的模型在同一个问题上提供不同的思路来进行相互补全
实测专家agent确实能提供原模型没想到的思路,但是也有时候也会误导原agent,这点或许可以通过增加专家agent的上下文来弥补
工具
本着越少工具越能激发AI的潜力的原则,主要工具就两个,一个执行python代码,另一个执行命令
为了防止AI每次执行命令会污染环境,因此每个任务开始时都会分配一个tmp目录,用于执行命令,并且也会在系统提示词里告诉AI
命令通过docker exec传递,python代码则通过base64传递到沙箱,避免AI在转义方面反复试错
另外测试时发现AI幻觉会将本地执行的命令结果错认为是远端的执行结果,因此每次执行命令都会提示一次,结果是本地沙箱执行结果
知识库
知识库主要选择了hacktricks,PayloadAllTheThings,HowToHunt等开源项目,将其进行整理并压缩成zip
然后添加一个知识库层,进行精准关键词检索,并挑选出最匹配的前N个返回给AI
另外针对CVE进行优化,比赛时维护了一个CVE库,里面有各种常见CVE以及POC,方便AI直接通过产品名+版本进行检索
沙箱
选用的是kali沙箱,装了基础的工具,并将工具列表等写在系统提示词中,方便AI调用
然后命令执行有超时,有截断,避免上下文太长
最后
整个agent针对第一二赛区,也就是单点渗透进行设计,在减少幻觉,控制上下文方面优化还行,因此第一天无论是做题速度还是准确度,都很不错,一路打到第五
可惜对于多点渗透,并没有进行优化,其独特的记忆机制在长时间大渗透任务上反而会导致agent上下文丢失,线索被清洗等。因此最后也是遗憾离场了
或许如果是去年的题目形式,没有复杂的多点渗透,那这套agent或许会很猛吧
这次比赛经验确实是很让人印象深刻,我几乎翘了这一周全部的课程,每天在工位上坐接近12小时,一边监控比赛情况一边优化架构。学长也每天优化,甚至有一晚几乎没睡。
下一步则可以朝着多节点渗透做优化,例如加入渗透拓扑图,攻击链路图等,以及专门针对多节点做记忆相关的管理。还有复盘log的时候发现其实部分工具并不适配靶场,例如有个工具libc不兼容无法在靶机上运行等。