当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 -peuid=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,转载需注明出处。

Logo

为武汉地区的开发者提供学习、交流和合作的平台。社区聚集了众多技术爱好者和专业人士,涵盖了多个领域,包括人工智能、大数据、云计算、区块链等。社区定期举办技术分享、培训和活动,为开发者提供更多的学习和交流机会。

更多推荐