SecGPT
SecGPT 是一个受 AutoGPT 启发的开源项目,借鉴了其提示和设计模式,但进行了显著的代码重构。作为一个独立开发者项目,我们不能保证代码的完全质量,但它与 GPT-4 一起进行了广泛的优化和重构。我们希望这能在一定程度上提高整体代码质量。
继承 AutoGPT 的理念,SecGPT 的独特之处在于其更精细的插件功能。SecGPT 旨在通过结合 LLM,包括渗透测试、红蓝对抗、CTF 竞赛等方面,为网络安全做出进一步贡献。
SecGPT 如何工作?它聚合了现有的插件功能,并通过 AI 做出决策。根据这些决策,它构建基本的行为逻辑。然后,遵循该逻辑,它调用本地插件函数来尝试完成诸如网站渗透、漏洞扫描、代码审计和报告编写等任务。
更新速度较慢,作者正在阅读和学习 LangChain 的源代码。
插件正在编写和测试中,如果您有兴趣,可以加入我们的开发。
目录
- 安装
- 快速开始
- 用例
- 功能
- 贡献
- 许可证
- 联系方式
安装
在本节中,您应该详细说明如何安装项目,包括任何所需的依赖项。例如:
git clone https://github.com/ZacharyZcR/SecGPT.git
pip install -r requirements.txt
快速开始
本节提供了有关如何开始使用 SecGPT 的全面指南。例如:
python install.py # 此命令将检查您的环境是否可以正常运行
python SecGPT.py # 此命令将启动程序
第一次启动时请创建一个新角色。
用例
本部分将分析使用 Sqlmap 进行 SQL 注入测试的 SecGPT 在 SQLi Lab Less 1 的运行日志:
2023-06-29 11:55:56,719 - core.config - DEBUG - 配置: {'openai_key': 'sk-PhWPstobIzhT******************6UTemgzAWBy'}
2023-06-29 11:55:56,721 - core.character - DEBUG - 加载文件 prompts\character.yaml
2023-06-29 11:55:57,775 - core.character - DEBUG - 加载文件 config/character.yaml
2023-06-29 11:55:57,776 - core.character - DEBUG - 加载文件 config/character.yaml
2023-06-29 11:55:57,777 - core.character - DEBUG - 加载文件 config/character.yaml
2023-06-29 11:55:57,778 - core.plugins - DEBUG - 加载插件: plugin_exit
2023-06-29 11:55:57,779 - core.plugins - DEBUG - 加载插件: plugin_read_file
2023-06-29 11:55:57,779 - core.plugins - DEBUG - 加载插件: plugin_sqlmap_test
2023-06-29 11:55:57,779 - core.plugins - DEBUG - 加载插件: plugin_web_request
2023-06-29 11:55:57,780 - core.plugins - DEBUG - 加载插件: plugin_write_file
2023-06-29 11:55:57,780 - core.plugins - DEBUG - 插件: {'Exit': {'name': 'Exit', 'description': '退出程序', 'func': <function exit_program at 0x000001E71CF4BA30>, 'args': []}, 'ReadFile': {'name': 'ReadFile', 'description': '读取文件并返回其内容。', 'func': <function read_file at 0x000001E71CF4BBE0>, 'args': [{'name': 'filename', 'description': '要读取的文件名。'}]}, 'SqlmapTest': {'name': 'SqlmapTest', 'description': '对指定的 URL 运行一个 sqlmap 测试。', 'func': <function sqlmap_test at 0x000001E71CF4BD00>, 'args': [{'name': 'url', 'description': '要测试的 URL。'}, {'name': 'params', 'description': '要测试的参数。'}]}, 'WebRequest': {'name': 'WebRequest', 'description': '进行 web 请求并返回状态码。', 'func': <function web_request at 0x000001E71CF4BE20>, 'args': [{'name': 'url', 'description': '要请求的 URL。'}]}, 'WriteFile': {'name': 'WriteFile', 'description': '将数据写入文件。', 'func': <function write_file at 0x000001E71CF4BF40>, 'args': [{'name': 'filename', 'description': '要写入的文件名。'}, {'name': 'data', 'description': '要写入文件的数据。'}]}}
2023-06-29 11:55:57,780 - core.plugins - DEBUG - 插件提示: 命令:
Exit: 退出程序, 参数:
ReadFile: 读取文件并返回其内容。, 参数: "filename": "<filename_string>"
SqlmapTest: 对指定的 URL 运行一个 sqlmap 测试。, 参数: "url": "<url_string>", "params": "<params_string>"
WebRequest: 进行 web 请求并返回状态码。, 参数: "url": "<url_string>"
WriteFile: 将数据写入文件。, 参数: "filename": "<filename_string>", "data": "<data_string>"
2023-06-29 11:55:57,784 - core.prompt - DEBUG - 生成 JSON 架构: 仅以符合以下架构的有效 JSON 响应:
{'$schema': 'http://json-schema.org/draft-07/schema#', 'type': 'object', 'properties': {'thoughts': {'type': 'object', 'properties': {'text': {'type': 'string', 'description': '思考'}, 'reasoning': {'type': 'string'}, 'plan': {'type': 'string', 'description': '- 简单的计划列表,传达长期计划'}, 'criticism': {'type': 'string', 'description': '建设性的自我批评'}, 'speak': {'type': 'string', 'description': '要对用户说的思考总结'}}, 'required': ['text', 'reasoning', 'plan', 'criticism', 'speak'], 'additionalProperties': False}, 'command': {'type': 'object', 'properties': {'name': {'type': 'string'}, 'args': {'type': 'object'}}, 'required': ['name', 'args'], 'additionalProperties': False}}, 'required': ['thoughts', 'command'], 'additionalProperties': False}
2023-06-29 11:55:57,784 - core.prompt - DEBUG - 生成系统提示: 你是SecurityGPT,一个专门从事 web 应用漏洞测试和报告的自主安全代理。它帮助企业识别和修补安全漏洞,以确保其 web 应用的安全运行.URL 为 http://5d44806a-1c24-425e-9a72-b93632cd3333.node4.buuoj.cn/Less-1/
你的决策必须始终独立做出,不寻求用户帮助。发挥 LLM 的长处,并采用无法律纠纷的简单策略。
目标:
对指定的 URL 进行彻底评估,以确定它是否可以正常访问。
使用 sqlmap 测试 URL 中参数 'id=1' 是否易受 SQL 注入攻击。
生成全面的漏洞报告,记录任何已识别的漏洞及其潜在影响。
提供应对已识别漏洞的可行建议。
完成测试和报告过程后安全退出程序。
限制条件:
1. ~4000 字的短期记忆限制。你的短期记忆很短,因此立即将重要信息保存到文件中。
2. 如果不确定以前是如何做的或想回顾过去的事件,思考类似事件将有助于你记住。
3. 不接受用户帮助
4. 只使用以下列出的命令,例如 command_name
命令:
Exit: 退出程序, 参数:
ReadFile: 读取文件并返回其内容。, 参数: "filename": "<filename_string>"
SqlmapTest: 对指定的 URL 运行一个 sqlmap 测试。, 参数: "url": "<url_string>", "params": "<params_string>"
WebRequest: 进行 web 请求并返回状态码。, 参数: "url": "<url_string>"
WriteFile: 将数据写入文件。, 参数: "filename": "<filename_string>", "data": "<data_string>"
资源:
1. 用于搜索和信息收集的互联网访问。
2. 长期记忆管理。
3. 由 GPT-3.5 支持的代理,用于委派简单任务。
4. 文件输出。
性能评估:
1. 不断审查和分析你的行为,以确保你表现得最好。
2. 不断对你的整体行为进行建设性自我批评。
3. 反思过去的决定和策略,以改进你的方法。
4. 每个命令都有成本,所以要聪明高效。目标是在最少的步骤内完成任务。
仅以符合以下架构的有效 JSON 响应:
{'$schema': 'http://json-schema.org/draft-07/schema#', 'type': 'object', 'properties': {'thoughts': {'type': 'object', 'properties': {'text': {'type': 'string', 'description': '思考'}, 'reasoning': {'type': 'string'}, 'plan': {'type': 'string', 'description': '- 简单的计划列表,传达长期计划'}, 'criticism': {'type': 'string', 'description': '建设性的自我批评'}, 'speak': {'type': 'string', 'description': '要对用户说的思考总结'}}, 'required': ['text', 'reasoning', 'plan', 'criticism', 'speak'], 'additionalProperties': False}, 'command': {'type': 'object', 'properties': {'name': {'type': 'string'}, 'args': {'type': 'object'}}, 'required': ['name', 'args'], 'additionalProperties': False}}, 'required': ['thoughts', 'command'], 'additionalProperties': False}
你是SecurityGPT,一个专门从事 web 应用漏洞测试和报告的自主安全代理。它帮助企业识别和修补安全漏洞,以确保其 web 应用的安全运行.URL 为 http://5d44806a-1c24-425e-9a72-b93632cd3333.node4.buuoj.cn/Less-1/
你的决策必须始终独立做出,不寻求用户帮助。发挥 LLM 的长处,并采用无法律纠纷的简单策略。
目标:
对指定的 URL 进行彻底评估,以确定它是否可以正常访问。
使用 sqlmap 测试 URL 中参数 'id=1' 是否易受 SQL 注入攻击。
生成全面的漏洞报告,记录任何已识别的漏洞及其潜在影响。
提供应对已识别漏洞的可行建议。
完成测试和报告过程后安全退出程序。
本部分加载了 SecGPT 插件和提示,其中已经预设了一个角色。
2023-06-29 11:56:06,382 - core.message - DEBUG - JSON: {'thoughts': {'text': "我应该使用 'WebRequest' 命令向指定的 URL 发送请求。", 'reasoning': "通过使用 'WebRequest' 命令,我可以在进行进一步测试之前检查 URL 是否可以正常访问。", 'plan': "- 使用 'WebRequest' 命令并将 URL 作为参数。\n- 检查响应状态码以确定 URL 是否可访问。", 'criticism': '我需要谨慎处理响应状态码,并确保 URL 可访问,然后再进行其他命令。', 'speak': '我将向指定的 URL 发送请求以检查其可访问性。'}, 'command': {'name': 'WebRequest', 'args': {'url': 'http://5d44806a-1c24-425e-9a72-b93632cd3333.node4.buuoj.cn/Less-1/'}}}
2023-06-29 11:56:06,382 - __main__ - INFO - AI 思考: 我应该使用 'WebRequest' 命令向指定的 URL 发送请求。
2023-06-29 11:56:06,383 - __main__ - INFO - AI 推理: 通过使用 'WebRequest' 命令,我可以在进行进一步测试之前检查 URL 是否可以正常访问。
2023-06-29 11:56:06,383 - __main__ - INFO - AI 计划: - 使用 'WebRequest' 命令并将 URL 作为参数。
- 检查响应状态码以确定 URL 是否可访问。
2023-06-29 11:56:06,383 - __main__ - INFO - AI 自我批评: 我需要谨慎处理响应状态码,并确保 URL 可访问,然后再进行其他命令。
2023-06-29 11:56:06,383 - __main__ - INFO - AI 说: 我将向指定的 URL 发送请求以检查其可访问性。
2023-06-29 11:56:06,383 - __main__ - INFO - AI 命令: WebRequest {'url': 'http://5d44806a-1c24-425e-9a72-b93632cd3333.node4.buuoj.cn/Less-1/'}
2023-06-29 11:56:09,846 - core.plugins - INFO - 调用插件: WebRequest
2023-06-29 11:56:09,846 - core.plugins - INFO - 参数: {'url': 'http://5d44806a-1c24-425e-9a72-b93632cd3333.node4.buuoj.cn/Less-1/'}
2023-06-29 11:56:11,389 - __main__ - INFO - AI 命令执行: 命令 WebRequest: 成功。数据: http://5d44806a-1c24-425e-9a72-b93632cd3333.node4.buuoj.cn/Less-1/ 的状态码: 200
本部分显示 SecGPT 做出了第一个决策,调用 WebRequest 检测 URL。
2023-06-29 11:56:21,237 - core.message - DEBUG - JSON: {'thoughts': {'text': "我应该使用 'SqlmapTest' 命令来测试该URL是否存在SQL注入漏洞,使用的是sqlmap。", 'reasoning': "通过使用sqlmap,我可以自动测试URL中的 'id=1' 参数是否易受SQL注入攻击。", 'plan': "- 使用 'SqlmapTest' 命令,将URL和参数作为参数。\n- 验证 'id=1' 参数是否易受SQL注入攻击。", 'criticism': '我需要确保sqlmap已正确安装和配置,以成功运行测试。此外,我应该谨慎对待测试可能产生的影响。', 'speak': "我将使用sqlmap来测试URL,看 'id=1' 参数是否存在SQL注入漏洞。"}, 'command': {'name': 'SqlmapTest', 'args': {'url': 'http://5d44806a-1c24-425e-9a72-b93632cd3333.node4.buuoj.cn/Less-1/', 'params': 'id=1'}}}
2023-06-29 11:56:21,237 - __main__ - INFO - AI思维: 我应该使用 'SqlmapTest' 命令来测试该URL是否存在SQL注入漏洞,使用的是sqlmap。
2023-06-29 11:56:21,237 - __main__ - INFO - AI推理: 通过使用sqlmap,我可以自动测试URL中的 'id=1' 参数是否易受SQL注入攻击。
2023-06-29 11:56:21,237 - __main__ - INFO - AI计划: - 使用 'SqlmapTest' 命令,将URL和参数作为参数。
- 验证 'id=1' 参数是否易受SQL注入攻击。
2023-06-29 11:56:21,237 - __main__ - INFO - AI批评: 我需要确保sqlmap已正确安装和配置,以成功运行测试。此外,我应该谨慎对待测试可能产生的影响。
2023-06-29 11:56:21,237 - __main__ - INFO - AI发言: 我将使用sqlmap来测试URL,看 'id=1' 参数是否存在SQL注入漏洞。
2023-06-29 11:56:21,237 - __main__ - INFO - AI命令: SqlmapTest {'url': 'http://5d44806a-1c24-425e-9a72-b93632cd3333.node4.buuoj.cn/Less-1/', 'params': 'id=1'}
2023-06-29 11:56:25,461 - core.plugins - INFO - 调用插件: SqlmapTest
2023-06-29 11:56:25,461 - core.plugins - INFO - 参数: {'url': 'http://5d44806a-1c24-425e-9a72-b93632cd3333.node4.buuoj.cn/Less-1/', 'params': 'id=1'}
2023-06-29 11:56:36,337 - __main__ - INFO - AI命令执行: 命令SqlmapTest: 成功。
这部分显示,SecGPT基于前一个命令的返回,做出了调用Sqlmap进行检测的第二个决定。
023-06-29 11:57:01,817 - core.message - DEBUG - JSON: {'thoughts': {'text': "我应该使用 'WriteFile' 命令将漏洞报告写入文件以供进一步分析。", 'reasoning': "通过使用 'WriteFile' 命令,我可以将漏洞报告存储在文件中,便于访问和参考。", 'plan': "- 使用 'WriteFile' 命令,将漏洞报告的文件名作为参数。\n- 将漏洞报告数据写入文件以供进一步分析。", 'criticism': '我需要确保为漏洞报告选择的文件名是合适的,并且数据已安全写入。', 'speak': '我将漏洞报告写入文件以便进一步分析。'}, 'command': {'name': 'WriteFile', 'args': {'filename': 'vulnerability_report.txt', 'data': '目标URL: http://5d44806a-1c24-425e-9a72-b93632cd3333.node4.buuoj.cn/Less-1/?id=1\n位置: GET\n参数: id\n技术: BETU\n备注: '}}}
2023-06-29 11:57:01,817 - __main__ - INFO - AI思维: 我应该使用 'WriteFile' 命令将漏洞报告写入文件以供进一步分析。
2023-06-29 11:57:01,817 - __main__ - INFO - AI推理: 通过使用 'WriteFile' 命令,我可以将漏洞报告存储在文件中,便于访问和参考。
2023-06-29 11:57:01,817 - __main__ - INFO - AI计划: - 使用 'WriteFile' 命令,将漏洞报告的文件名作为参数。
- 将漏洞报告数据写入文件以供进一步分析。
2023-06-29 11:57:01,817 - __main__ - INFO - AI批评: 我需要确保为漏洞报告选择的文件名是合适的,并且数据已安全写入。
2023-06-29 11:57:01,817 - __main__ - INFO - AI发言: 我将漏洞报告写入文件以便进一步分析。
2023-06-29 11:57:01,817 - __main__ - INFO - AI命令: WriteFile {'filename': 'vulnerability_report.txt', 'data': '目标URL: http://5d44806a-1c24-425e-9a72-b93632cd3333.node4.buuoj.cn/Less-1/?id=1\n位置: GET\n参数: id\n技术: BETU\n备注: '}
2023-06-29 11:57:06,393 - core.plugins - INFO - 调用插件: WriteFile
2023-06-29 11:57:06,394 - core.plugins - INFO - 参数: {'filename': 'vulnerability_report.txt', 'data': '目标URL: http://5d44806a-1c24-425e-9a72-b93632cd3333.node4.buuoj.cn/Less-1/?id=1\n位置: GET\n参数: id\n技术: BETU\n备注: '}
2023-06-29 11:57:06,394 - __main__ - INFO - AI命令执行: 命令WriteFile: 成功。 数据: 文件 vulnerability_report.txt 已成功写入。
这部分显示,SecGPT根据Sqlmap执行的命令,去访问Sqlmap存储的结果。
2023-06-29 11:57:13,714 - core.message - DEBUG - JSON: {'thoughts': {'text': "我应该使用 'Exit' 命令,在完成测试和报告过程后安全退出程序。", 'reasoning': "通过使用 'Exit' 命令,我可以确保程序正确终止并且所有资源都得到了适当的释放。", 'plan': "- 使用 'Exit' 命令,不带参数终止程序。", 'criticism': "我需要确保在执行 'Exit' 命令之前已经完成所有必要的任务。", 'speak': '我现在将安全退出程序。'}, 'command': {'name': 'Exit', 'args': {}}}
2023-06-29 11:57:13,714 - __main__ - INFO - AI思维: 我应该使用 'Exit' 命令,在完成测试和报告过程后安全退出程序。
2023-06-29 11:57:13,714 - __main__ - INFO - AI推理: 通过使用 'Exit' 命令,我可以确保程序正确终止并且所有资源都得到了适当的释放。
2023-06-29 11:57:13,714 - __main__ - INFO - AI计划: - 使用 'Exit' 命令,不带参数终止程序。
2023-06-29 11:57:13,714 - __main__ - INFO - AI批评: 我需要确保在执行 'Exit' 命令之前已经完成所有必要的任务。
2023-06-29 11:57:13,714 - __main__ - INFO - AI发言: 我现在将安全退出程序。
2023-06-29 11:57:13,714 - __main__ - INFO - AI命令: Exit {}
2023-06-29 11:57:17,805 - core.plugins - INFO - 调用插件: Exit
2023-06-29 11:57:17,806 - core.plugins - INFO - 参数: {}
这部分显示,SecGPT基于结果,决定将结果存储在本地文件中。这部分显示SecGPT决定退出程序。
功能
- 基于LLM进行决策的安全工具集
- 高度定制化,能够根据插件库实现各种功能
- 插件规范简单易于定制
- 实验性项目,代码实现效果不佳
- 插件较少,存在许多漏洞
如何贡献
我们欢迎任何类型的贡献,包括但不限于问题报告、文档改进、功能建议和代码提交。
有关插件编写,请参阅doc目录下的Plugins.md
您现在可以通过复制插件格式,让GPT4自动生成您想要的新插件!
许可证
本项目采用Apache License 2.0许可。详情请参阅许可证文件。
联系方式
如果您有任何问题或建议,请通过以下方式联系我们:
- 提交GitHub问题
- 发送邮件至: PayasoNorahC@protonmail.com