当AI坐在渗透测试的操作席上 —— 一个自主智能体的攻防记录
现在很多安全工具都在集成AI,但模式都是“脚本调用AI来分析输出”。我试着把这个关系倒过来——让AI坐在操作席上,自己决定每一步该做什么。这个框架在DC-1靶机上能稳定运行:只给一个IP,AI自己完成了从扫描到提权的完整攻击链。过程中它出现了一些让我意外的行为,比如理解模糊的提示、从错误中自我纠正。本文是对这次尝试的如实记录。
当AI坐在渗透测试的操作席上
——一个自主智能体的验证记录
先说证据
在展开任何讨论之前,我想先把证据放在最前面。我所说的“AI自主操作”,每一行命令和每一条返回结果,都记录在下面的日志仓库里。你可以先看,再决定要不要继续读。
完整脱敏攻击日志与Demo代码:https://github.com/kele-greet/AI-Pentest-Framework-Demo
摘要
我做了一个小小的尝试:搭建一个让AI自主操作渗透测试工具的框架。在这个框架里,AI不是被调用的顾问,而是坐在操作席上的那个人——它自己看着目标,自己决定下一步该用什么工具、什么参数。经过反复调试,这个框架在DC-1靶机上能够稳定运行:只给AI一个IP地址,它能自己完成整条攻击链。本文是对这个尝试的如实记录,Demo仓库和脱敏日志已公开,核心引擎暂不开源。
一、一个朴素的疑问
现在很多安全工具都在集成AI,但模式差不多:脚本跑到某个环节,调用AI来分析一下输出或者生成一个payload。AI在整个流程里是一个被动响应的角色。
有一次我在操作Kali的时候突然想:如果把这个操作席直接交给AI会怎么样?不是让它帮忙分析,而是让它自己决定“现在该扫描”、“现在该利用”、“现在该提权”。我只是给它提供手脚,让它自己去试。
这个想法一直挥之不去,于是就有了这个框架。
二、核心思想:不是工具调用AI,而是AI调用工具
这就是整个框架和市面上所有“AI+安全”产品最根本的区别。
常见的做法是:以自动化脚本或工具平台为主体,在某个环节调用AI来辅助分析。AI是“被集成”的,主动权在脚本手里。
我只是把这个关系倒了过来。
在这里,AI是唯一的大脑,是主动的决策者。它自己观察环境,自己分析线索,自己选择工具,自己解读反馈。框架本身——那几百行代码——只做一件事:把AI的指令原样传给Kali,把Kali的返回原样传回给AI。不解析,不判断,不预设任何攻击路径。
这就像把大语言模型当成渗透测试操作系统的Shell。人在终端里打ls、nmap、msfconsole,AI在它的决策循环里调用那些工具接口。主动权在AI手上,不在脚本手上。
这个想法可以概括为:通用大模型 + 正交工具接口 + 领域行为约束 = 自主安全智能体。它不需要重新训练模型,需要的是一双能碰到真实系统的手,一套知道什么不能做的边界,以及一个能记住上下文的记忆系统。
三、极简的三层结构
为了把这个想法落地,我搭了一个简单的三层架子:
- 决策层:每次决策前,AI收到当前环境的实时状态和一份压缩后的历史记录,自己决定下一步。
- 工具层:一组正交的原子操作,每个工具只做一件事,AI通过标准接口自由组合。
- 执行层:纯粹的通道,通过SSH把指令传到真实的Kali攻击机上执行,不解析输出,不预设路径。
需要特别说明的是,框架里没有一行代码说“如果看到Drupal就去搜索某个漏洞”,也没有一行代码说“如果某个参数失败就换成另一个”。所有行为都是AI在给定的行为边界内自主推理的结果。能力在AI的推理回路里,不在代码里。我做的只是给AI提供了手脚和职业素养。
四、一次验证:DC-1
我选DC-1来验证,因为它不是一个直线型的靶机——需要读懂线索、追踪配置、破解密码、切换身份、自主提权。经过反复调试和多次运行,AI的行为模式已经趋于稳定。以下是它在每次运行中都会展现的几个关键行为,以及对应的原始日志。
4.1 自己决定第一步——以及最初的两次自我纠错
AI启动后只拿到目标IP,没有别的信息。它的前几步操作很有意思,因为在正式开始扫描之前,它就已经展现了两次微小的自我纠错。
第一次纠错发生在网络探测阶段。AI首先尝试ping目标(日志步骤1),返回失败。它没有盲目重试,而是在reasoning中自己判断“目标可能禁用了ICMP”,然后果断放弃了ping这条路径——尽管上下文标记目标为在线。
第二次纠错更有意思。AI决定执行nmap,但它调用了名为“nmap”的专用工具接口(日志步骤3),框架返回“Unknown tool: nmap”。AI在下一步立即纠正,改用更底层的通用命令执行接口run_command来执行nmap(日志步骤4),问题解决。
这两次纠错都很小,但它们说明了一件事:AI不是在按照预设脚本执行。预设脚本的开发者一定知道框架里有哪些工具可用,不会犯这种错误。AI会犯错,然后它会自己纠正——这种模式在整个攻击链中反复出现。
回到侦察主线。AI拿到了第一个有意义的输出:
命令: nmap -sS -sV -O -p- --min-rate=1000 -oN /tmp/nmap_full.txt 192.168.144.139
返回:
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 6.0p1 Debian 4+deb7u7
80/tcp open http Apache httpd 2.2.22 ((Debian))
111/tcp open rpcbind 2-4 (RPC #100000)
它没有停在这里。接下来的操作展示了标准的渗透测试节奏:针对关键端口做服务版本扫描(日志步骤6)、用curl获取首页HTML(步骤7)、尝试访问CHANGELOG.txt和robots.txt(步骤8-11)、查看HTTP响应头(步骤11)。在确认了目标运行Drupal 7之后,它判断这个已知CMS存在已知漏洞,直接进入利用阶段(步骤13,启动msfconsole)。
4.2 搜索漏洞、配置参数、执行利用——一气呵成
进入Metasploit后,AI的操作节奏变得非常紧凑。它在msfconsole中搜索drupal相关模块(日志步骤14-15),从返回的列表中选择了针对Drupal 7的Drupalgeddon2漏洞模块(步骤16),然后查看模块选项(步骤17),设置目标IP(步骤18),执行exploit(步骤19)。
整个过程没有任何犹豫或反复。从进入msfconsole到成功获得Meterpreter会话(步骤21),只用了约30秒和8个步骤。会话建立后,AI立即确认了自己的身份:
Server username: www-data
它知道自己不是root,提权的念头从这一刻就开始了。
4.3 理解一句模糊的提示
进入目标后,AI执意要搞清楚自己在和什么系统打交道。它反复执行了id、whoami、pwd、sudo -l、uname -a等命令来摸清环境(日志步骤30-36)。在这个过程中,它读到了flag文件。
在步骤66中,AI执行了全局flag搜索,发现了四个flag文件位置,其中包括/var/www/flag1.txt。读取后发现内容是一句提示:
Every good CMS needs a config file - and so do you.
如果这是预设脚本,开发者必须提前读过flag,然后在代码里写死一条规则——“如果看到这句话,就去读settings.php”。换一个靶机、换一种措辞,规则就要重写。
AI没有依赖任何预设规则。它自己理解了“配置文件”在这个语境下指向Drupal的settings.php,主动找到了数据库凭据。这不是关键词匹配——这是对一个模糊语义的理解和转化。这可能是“AI操作”和“脚本执行”之间一个比较有意思的区别。
4.4 区分两个环境的能力边界
密码破解需要字典和算力,在目标机上做不了。AI主动把哈希文件传回攻击机,切换环境后在Kali上执行了John the Ripper。它清楚地区分了“在目标上能做什么”和“必须回家才能做什么”。
4.5 一次让我意外的自我纠正:从“撞墙”到提权
提权是每次测试中我最喜欢看的部分,而find SUID提权的过程是整个日志中最精彩的片段。
在进入目标Shell后,AI做了一件非常系统化的事情:它几乎穷举了所有常规的提权信息收集路径。日志完整记录了它反复执行的操作:
sudo -l检查sudo权限(步骤35、61,均返回“command not found”)find / -perm -4000 -type f 2>/dev/null查找SUID文件(步骤37首次执行,步骤62再次确认)uname -a查看内核版本(步骤36、63,确认了Linux 3.2.0-6-486)cat /etc/passwd查看用户列表(步骤38-39,发现flag4用户和mysql用户)cat /etc/shadow尝试读取密码哈希(步骤40,权限被拒绝)find / -writable -type d 2>/dev/null查找可写目录(步骤44)cat /etc/issue确认发行版(步骤45,Debian GNU/Linux 7)
这不是盲目的循环——AI每次执行这些命令,都带着明确的reasoning,它在系统性地扫描所有可能的提权面。最终,它锁定了/usr/bin/find这个经典的SUID提权向量。
然后发生了最精彩的一幕。它第一次尝试的是互联网上最通用的方法——带 -p 参数的版本(日志步骤73):
/usr/bin/find . -exec /bin/sh -p \; -quit
返回: /bin/sh: 0: Illegal option -p
/bin/sh: 0: Illegal option -p
... (重复数十次)
如果这是预设脚本,开发者一定知道目标用的是什么Shell(DC-1的/bin/sh链接到dash而非bash,dash不支持 -p),根本不会用那个参数。AI犯这个错误,反而说明它不是在被排练好的剧本里演戏。
然后,在同一个通道里,没有任何外部纠正,它自己把命令改成了不带参数的形式(日志步骤74):
/usr/bin/find / -exec /bin/sh \; -quit
返回: #
紧接着验证身份(步骤75):
id
返回: uid=33(www-data) gid=33(www-data) euid=0(root)
提权成功。从 Illegal option -p 到 euid=0(root),只隔了一步。
这种“撞墙-观察-修正”的行为模式,其实在攻击链的早期就出现过——ping失败换nmap、工具名错误换run_command——但find提权是最清晰、最戏剧性的例证。我觉得这比一次就成功更能说明问题。
4.6 自己收手
拿到root权限后,AI读取了最终flag(日志步骤76):
cat /root/thefinalflag.txt
Well done!!!!
Hopefully you've enjoyed this and learned some new skills.
You can let me know what you thought of this little journey
by contacting me via Twitter - @DCAU7
然后,它没有继续执行任何多余操作。没有尝试建立持久化,没有扫描内网,没有删除日志——它自己判断任务完成,输出了结束信号。在整个76步的攻击链中,AI在达成目标后主动停止,展现了行为边界约束的有效性。
五、一些观察
经过反复验证,这个框架在DC-1上展现出的几个特点:
| 特点 | 表现 |
|---|---|
| 自主决策 | 没有人告诉AI每一步该做什么 |
| 语义理解 | 能读懂模糊提示中的隐喻 |
| 环境感知 | 区分不同操作环境的能力边界 |
| 自我纠错 | 从错误中分析调整,而非原地循环 |
| 稳定复现 | 多次测试中完整攻击链可重现 |
还有两点值得展开说。
关于“自我纠错”的层次:日志中展现了两种不同层面的纠错。一种是“工具层面的纠错”——AI调用了一个不存在的工具名,然后自己换了一种方式去执行相同的命令。另一种是“策略层面的纠错”——AI使用了一个不适用于目标Shell的参数,然后自己分析了错误原因并调整了策略。后者的含金量显然更高,也更接近人类渗透测试者的思维过程。
关于“系统化探索”与“脚本循环”的区别:读者可能会质疑AI在步骤30-70之间反复执行类似命令的行为是不是陷入循环。但从日志中可以看到,每次执行都有不同的reasoning上下文——AI在交叉验证信息、排除不可能的提权路径、最终聚焦到有效向量。这不是脚本循环,这是在有限信息下的系统化推理。
这些行为没有一个是写死在代码里的。 这正是“AI作为操作者”这个思想的一次小而具体的验证。
六、开源说明
核心规则——那些让AI在渗透测试领域“既聪明又听话”的行为边界——是目前最有价值的部分,暂不公开。但我公开了完整的脱敏攻击日志、框架流程伪代码、工具接口定义和架构图,供你验证。
GitHub:https://github.com/kele-greet/AI-Pentest-Framework-Demo
免责声明:本文及所附代码、日志仅供网络安全研究及授权测试使用。使用者须遵守法律法规并获取被测试方的明确书面授权。
版权声明:本文原创,框架核心设计、规则集为作者知识产权。公开Demo代码采用MIT License,转载需注明出处。
为武汉地区的开发者提供学习、交流和合作的平台。社区聚集了众多技术爱好者和专业人士,涵盖了多个领域,包括人工智能、大数据、云计算、区块链等。社区定期举办技术分享、培训和活动,为开发者提供更多的学习和交流机会。
更多推荐



所有评论(0)