GPT_Vuln-analyzer
这是一个概念验证应用程序,展示了如何使用AI生成准确的漏洞分析结果,并进一步利用已经非常有用的ChatGPT,使用openai-api、python-nmap、dnsresolver python模块以及使用customtkinter和tkinter进行GUI版本的代码。该项目也有CLI和GUI接口,能够进行网络漏洞分析、DNS枚举以及子域名枚举。
要求
- Python 3.10或以上
- requirements.txt文件中提到的所有软件包
- OpenAI API
- Bard API (MakerSuite Palm)
- Runpod无服务器端点
- IPGeolocation API
- Docker
- Wireshark和tshark(都添加到路径中)
用法软件包
导入软件包
cd package && pip3/pip install .
简单导入任意三个包然后按需定义变量
from GVA.scanner import NetworkScanner
from GVA.dns_recon import DNSRecon
from GVA.geo import geo_ip_recon
from GVA.jwt import JWTAnalyzer
from GVA.menus import Menus
from GVA.packet_analysis import PacketAnalysis
from GVA.ai_models import NMAP_AI_MODEL
from GVA.ai_models import DNS_AI_MODEL
from GVA.ai_models import JWT_AI_MODEL
from GVA.assets import Assets
from GVA.subdomain import sub_enum
from GVA import gui
# 定义的组件
dns_enum = DNSRecon()
geo_ip = geo_ip_recon()
p_ai_models = NMAP_AI_MODEL()
dns_ai_models = DNS_AI_MODEL()
port_scanner = NetworkScanner()
jwt_analizer = JWTAnalyzer()
sub_recon = sub_enum()
asset_codes = Assets()
packet_analysis = PacketAnalysis()
# 如果没有指示请保持为空,激活后菜单将要求填写
lkey = "LLAMA API KEY"
lendpoint = "LLAMA ENDPOINT"
keyset = "AI API KEY"
output_loc = "OUTPUT LOCATION FOR PCAP"
threads = 200 # 默认值为200,可以增加
target_ip_hostname_or_token = "TARGET IP, HOSTNAME OR TOKEN"
profile_num = "PROFILE FOR NMAP SCAN"
ai_set = "AI OF CHOICE"
akey_set = "OPENAI API KEY"
bkey_set = "BARD API KEY"
ai_set_args = "" # 保持为空
llamakey = "LLAMA RUNPOD API KEY"
llamaendpoint = "LLAMA RUNPOD ENDPOINT"
Menus(
lamma_key=lkey,
llama_api_endpoint=lendpoint,
initial_keyset=keyset,
threads=threads,
output_loc=output_loc,
target=target_ip_hostname,
profile_num=profile_num,
ai_set=ai_set,
openai_akey_set=akey_set,
bard_key_set=bkey_set,
ai_set_args=ai_set_args,
llama_runpod_key=llamakey,
llama_endpoint=llamaendpoint
)
gui.application()
package和gui中的passcracker更新仍在进行中。
用法CLI
- 首先,将代码中的“OPENAI_API_KEY”、“GEOIP_API_KEY”和“BARD_API_KEY”部分替换为
.env
文件中的OpenAI API密钥和IPGeolocation API密钥 - 对于
llama-api
选项或特定的llama runpod无服务器端点部署选项,需要输入来自runpod的无服务器端点ID
以及你的RUNPOD API KEY
GEOIP_API_KEY = ''
OPENAI_API_KEY = ''
BARD_API_KEY = ''
RUNPOD_ENDPOINT_ID = ''
RUNPOD_API_KEY = ''
- 其次,安装软件包
pip3 install -r requirements.txt
或
pip install -r requirements.txt
- 运行代码 python3 gpt_vuln.py
# 常规帮助菜单
python gpt_vuln.py --help
# 丰富的帮助菜单
python gpt_vuln.py --r help
# 指定目标和攻击类型
python gpt_vuln.py --target <IP/hostname/token> --attack dns/nmap/jwt
# 指定目标和nmap的配置
python gpt_vuln.py --target <IP/hostname/token> --attack nmap --profile <1-13>
(默认:1)
# 指定DNS目标无需配置文件
python gpt_vuln.py --target <IP/hostname/token> --attack dns
# 指定子域名枚举目标,不使用配置文件,使用默认列表文件
python gpt_vuln.py --target <HOSTNAME> --attack sub
# 指定子域名枚举目标,使用自定义列表文件,不使用配置文件
python gpt_vuln.py --target <HOSTNAME> --attack sub --sub_list <文件路径>
# 指定目标进行地理位置查找
python gpt_vuln.py --target <IP> --attack geo
# 指定用于数据包分析的PCAP文件
python gpt_vuln.py --target <PCAP FILE> --attack pcap --output <输出文件位置> --thread 线程数 <默认:200>
# 指定用于nmap的AI
python gpt_vuln.py --target <IP> --attack nmap --profile <1-5> --ai llama / llama-api / bard / openai <默认>
# 指定用于DNS的AI
python gpt_vuln.py --target <IP> --attack dns --ai llama / llama-api / bard / openai <默认>
# 指定用于JWT分析的AI
python gpt_vuln.py --target <token> --attack jwt --ai llama / llama-api / bard / openai <默认>
# 密码破解器
python gpt_vuln.py --password_hash <HASH> --wordlist_file <文件位置> --algorithm <算法从帮助菜单中选择> --parallel --complexity
# 交互式逐步CLI界面
python gpt_vuln.py --menu True
CLI界面选项
________________________
| GVA 使用中... |
========================
\
\
^__^
(oo)\_______
(__)\ )\/\
||----w |
|| ||
┏━━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃ 选项 ┃ 工具 ┃
┡━━━━━━━━━╇━━━━━━━━━━━━━━━━┩
│ 1 │ Nmap 枚举 │
│ 2 │ DNS 枚举 │
│ 3 │ 子域名枚举 │
│ 4 │ GEO-IP 枚举 │
| 5 | JWT 分析 |
| 6 | PCAP 分析 |
| 6 | 哈希破解 |
│ q │ 退出 │
└─────────┴────────────────┘
请输入你的选择:
CLI界面有一些须知事项。
- API密钥必须手动提供。
.env
文件中定义的密钥与args选项一起使用- 过程相似,但更有条理。
我对Bard的看法
它和Openai GPT3.5一样,但速度更快。它可以以两倍速度生成相同答案。
支持的操作系统
预览 | 代码 | 名称 | 工作状态 | OpenAI 状态 | Bard 状态 | LLama2 状态 |
---|---|---|---|---|---|---|
LIN | GNU/Linux | ✅ | ✅ | ✅ | ❌ [未测试] | |
WIN | Windows | ✅ | ✅ | ✅ | ✅ |
理解代码
配置文件:
参数 | 返回数据 | 描述 | Nmap 命令 |
---|---|---|---|
p1 | json | 有效扫描 | -Pn -sV -T4 -O -F |
p2 | json | 简单扫描 | -Pn -T4 -A -v |
p3 | json | 低功耗扫描 | -Pn -sS -sU -T4 -A -v |
p4 | json | 部分强度扫描 | -Pn -p- -T4 -A -v |
p5 | json | 完全强度扫描 | -Pn -sS -sU -T4 -A -PE -PP -PY -g 53 --script=vuln |
p6 | json | 全面服务版本检测 | -Pn -sV -p- -A |
p7 | json | 带操作系统检测的侵略性扫描 | -Pn -sS -sV -O -T4 -A |
p8 | json | 常见漏洞脚本扫描 | -Pn -sC |
p9 | json | 强度扫描,所有TCP端口 | -Pn -p 1-65535 -T4 -A -v |
p10 | json | UDP 扫描 | -Pn -sU -T4 |
p11 | json | 最常用端口的服务版本检测 | -Pn -sV --top-ports 100 |
p12 | json | 使用NSE脚本进行漏洞发现的侵略性扫描 | -Pn -sS -sV -T4 --script=default,discovery,vuln |
p13 | json | 常见端口的快速扫描 | -Pn -F |
配置文件是nmap子进程将执行的扫描类型。Ip或目标将通过argparse提供。首先运行的是自定义nmap扫描,它拥有所有扫描继续的关键参数。接下来,从由nmap驱动的巨大数据中提取扫描数据。"scan"对象在"tcp"下有一个按端口标签的子数据列表。一旦提取了数据,数据就通过提示发送到openai API的Davinci模型。提示特别要求输出JSON格式的数据也以特定方式使用。
要发送到openai API的请求的整个结构是在程序的completion部分中设计的。
class NetworkScanner():
profile_arguments = {
1: '-Pn -sV -T4 -O -F',
2: '-Pn -T4 -A -v',
3: '-Pn -sS -sU -T4 -A -v',
4: '-Pn -p- -T4 -A -v',
5: '-Pn -sS -sU -T4 -A -PE -PP -PY -g 53 --script=vuln',
6: '-Pn -sV -p- -A',
7: '-Pn -sS -sV -O -T4 -A',
8: '-Pn -sC',
9: '-Pn -p 1-65535 -T4 -A -v',
10: '-Pn -sU -T4',
11: '-Pn -sV --top-ports 100',
12: '-Pn -sS -sV -T4 --script=default,discovery,vuln',
13: '-Pn -F'
}
def scanner(self, ip: Optional[str], profile: int, akey: Optional[str],
bkey: Optional[str], lkey, lendpoint, AI: str) -> str:
nm.scan(ip, arguments=self.profile_arguments.get(profile))
json_data = nm.analyse_nmap_xml_scan()
analyze = json_data["scan"]
尝试:
ai_methods = {
'openai': lambda: AIModels.GPT_AI(akey, analyze),
'bard': lambda: AIModels.BardAI(bkey, analyze),
'llama': lambda: AIModels.Llama_AI(analyze, "local", lkey, lendpoint),
'llama-api': lambda: AIModels.Llama_AI(analyze, "runpod", lkey, lendpoint)
}
if AI in ai_methods and (akey or bkey):
response = ai_methods[AI]()
else:
raise ValueError("Invalid AI type or missing keys")
except KeyboardInterrupt:
print("Bye")
quit()
return str(response)
正则表达式
我们使用正则表达式从自定义提示中提取重要信息,这样可以减少不需要的数据量。
AI代码定义了输出格式,并命令AI遵循一些预定的规则以提高准确性。 正则表达式提取代码进行提取,进一步的主函数将它们排列成表格。
使用 Bard AI
要使用 Bard AI,您必须注册 MakerSuit Palm API 获取开发者访问权限,并从那里生成您的API密钥。有关链接和工作原理,您可以使用此视频 MakerSuit。
一旦获得API,只需将其添加到.env
文件中,您就可以开始了。
旧的 LLama2 实现
使用 LLama2 是目前最好的离线和免费的选择之一。它目前正在改进中,我正在研究一个可以更好地将网络安全角度纳入AI的提示。非常感谢 @thisserand 和他的 llama2_local 仓库以及他的 YouTube 视频 YT_Video。它们都是很好的资源。坦率地说,llama2 代码 95% 是他的,我只是复制了代码并添加了一个Flask API功能。
离线和代码外的AI准确性很高,与 openai 和 bard 相当,但在代码中,由于提示等原因,它面临一些问题。我会尝试修复它。速度取决于你的系统以及GPU和CPU的配置。当前使用的是 TheBloke/Llama-2-7B-Chat-GGML
模型,可以通过 portscanner
和 dnsrecon
文件进行更改。
目前,llama代码和扫描是不同处理的。经过一些测试,我发现llama需要一些训练才能按我预期的方式工作,所以需要一些时间。任何此方面的建议可以添加到此仓库的讨论中 Discussions Link。目前,输出不会是所有数据的分列表,而是AI发现的漏洞或问题的解释。
模型使用的提示如下:
[INST] <<SYS>> {user_instruction}<</SYS>> NMAP 数据需要分析:{user_message} [/INST]
说明如下:
对提供的NMAP扫描信息进行NMAP扫描分析。NMAP输出必须按照提供的输出格式返回,并且数据必须在渗透测试报告中准确。
数据必须遵循以下规则:
1) NMAP扫描必须从渗透测试者的视角进行
2) 最终输出必须按照给定的格式最简化
3) 最终输出必须保持最小化
4) 如果扫描中未找到数值,则只注明空字符串
5) 分析所有数据,即使是最小的数据
6) 完全分析提供的数据,并使用输出格式给出确认答案
7) 提到在提供的输出格式中发现的所有数据,以便可以使用正则表达式
8) 避免不必要的解释
9) 根据CVE或开放服务的性质计算关键分数
10) 操作系统信息必须包含目标使用的操作系统
11) 开放端口必须包括数据中列出的所有开放端口[tcp],并通过检查其状态值进行验证。你不能忽略任何一个开放端口
12) 可以通过推测服务性质或分析发现的CVE来确定脆弱服务
输出格式:
critical score:
- 给出关键程度的信息
"os information":
- 列出操作系统信息
"open ports and services":
- 列出开放端口
- 列出开放端口的服务
"vulnerable service":
- 基于CVE或端口开放的性质列出脆弱服务
"found cve":
- 列出发现的CVE并列出主要问题。
使用指令集和提示提供的数据,llama AI生成其输出。
最建议的用法是创建llama的无服务器端点部署,您可以参考本教程 tutorial 以获得更好的使用体验。
Llama2 Ollama
最新更新使用ollama Docker镜像来实现本地化的llama系统,这提高了输出的准确性,可能是由于更好的配置等原因。我不会详细介绍这个,但我会研究代码的GPU集成部分,以便我们可以增加处理能力并提高其效率。感谢@andr6发起讨论,如果有更好理解这种实现的人欢迎改进和创建PR。
输出
JWT 输出:
GVA 报告 - JWT
┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 变量 ┃ 结果 ┃
┡━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ 使用的算法 │ HS256 │
│ 头部 │ eyJhbGciOiAiSFMyNTYiLCAidHlwIjogIkpXVCJ9 │
│ 载荷 │ eyJzdWIiOiAiMTIzNDU2Nzg5MCIsICJuYW1lIjogIkpvaG4gRG9lIiwgImlhdCI6IDE1MTYyMzkwMjJ9 │
│ 签名 │ │
│ 可能的攻击 │ 没有识别到 │
│ 脆弱的端点 │ 无法在没有附加信息的情况下确定 │
└─────────────────────┴──────────────────────────────────────────────────────────────────────────────────┘
Nmap 输出:
OpenAI 和 Bard:
┏━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 元素 ┃ 结果 ┃
┡━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ critical score │ 高 │
│ os information │ Microsoft Windows 11 21H2 │
│ open ports │ 80, 22, 445, 902, 912 │
│ open services │ http, ssh, microsoft-ds, vmware-auth, vmware-auth │
│ vulnerable service │ OpenSSH │
│ found cve │ CVE-2023-28531 │
└────────────────────┴─────────────────────────────────────────────────────┘
LLama2
╭───────────────────────────────────────────── The GVA LLama2 ──────────────────────────────────────────────╮
│ │
│ 基于提供的NMAP数据,我对目标系统的开放端口和服务、漏洞和操作系统信息进行了详细分析。以下是我的发现: │
│ 关键分数: │
│ 此目标系统的关键分数为7(满分10分)。系统有多个开放端口,可能会被利用,包括端口80(HTTP)、端口135(RPC)和端口445 (Microsoft DS)。虽然这些端口不一定是脆弱的,但它们表明系统正在运行可能被攻击者瞄准的服务。另外,系统在端口80上运行的是过时版本的 Microsoft IIS ,这可能是一个潜在的漏洞。 │
│ 操作系统信息: │
│ 目标系统正在运行 Microsoft Windows 10 1607。 │
│ 开放端口和服务: │
│ 目标系统有以下开放端口: │
│ • 端口 80:HTTP (Microsoft IIS httpd) │
│ • 端口 135:RPC (Microsoft Windows RPC) │
│ • 端口 445:Microsoft DS │
│ • 端口 8000:Splunkd httpd 所有这些端口目前是开放的且状态为 "open"。 │
│ 脆弱服务:基于NMAP 数据中发现的CVE,这些服务存在几个潜在漏洞。这些包括: │
│ • CVE-2019-1489:Microsoft IIS 中的权限提升漏洞,攻击者可能会利用此漏洞控制系统。这个漏洞与端口80上运行的过时版本 Microsoft IIS 相关。 │
│ • CVE-2017-0143:Microsoft Windows RPC 中的远程代码执行漏洞,攻击者可能利用此漏洞在目标系统上执行任意代码。这个漏洞与端口135上运行的过时版本 Microsoft Windows RPC 相关。 │
│ • CVE-2020-1362:Microsoft DS 中的远程代码执行漏洞,攻击者可能利用此漏洞在目标系统上执行任意代码。这个漏洞与端口445上运行的过时版本 Microsoft DS 相关。 │
│ 找到的CVE: │
│ │
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────╯
DNS 输出:
目标是 jainuniversity.ac.in
┏━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 元素 ┃ 结果 ┃
┡━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ A │ 172.67.147.95", "104.21.41.132 │
│ AAA │ │
│ NS │ mia.ns.cloudflare.com.","paul.ns.cloudflare.com. │
│ MX │ 30 aspmx5.googlemail.com.","30 aspmx4.googlemail.com.","20 alt2.aspmx.l.google.com.","30 │
│ │ aspmx3.googlemail.com.","30 aspmx2.googlemail.com.","20 alt1.aspmx.l.google.com.","10 aspmx.l.google.com. │
│ PTR │ │
│ SOA │ mia.ns.cloudflare.com. dns.cloudflare.com. 2309618668 10000 2400 604800 3600 │
│ TXT │ atlassian-sending-domain-verification=5b358ce4-5ad3-404d-b4b4-005bf933603b","include:_spf.atlassian.net │
└──────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
地理位置输出:
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 标识符 ┃ 数据 ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ ip │ █████████████ │
│ continent_code │ AS │
│ continent_name │ Asia │
│ country_code2 │ IN │
│ country_code3 │ IND │
│ country_name │ India │
│ country_capital │ New Delhi │
│ state_prov │ Haryana │
│ state_code │ IN-HR │
│ district │ │
│ city │ Gurugram │
│ zipcode │ 122003 │
│ latitude │ 28.44324 │
│ longitude │ 77.05501 │
│ is_eu │ False │
│ calling_code │ +91 │
│ country_tld │ .in │
│ languages │ en-IN,hi,bn,te,mr,ta,ur,gu,kn,ml,or,pa,as,bh,sat,ks,ne,sd,kok,doi,mni,… │
│ country_flag │ https://ipgeolocation.io/static/flags/in_64.png │
│ geoname_id │ 9148991 │
│ isp │ Bharti Airtel Limited │
│ connection_type │ │
│ organization │ Bharti Airtel Limited │
│ currency.code │ INR │
│ currency.name │ Indian Rupee │
│ currency.symbol │ ₹ │
│ time_zone.name │ Asia/Kolkata │
│ time_zone.offset │ 5.5 │
│ time_zone.current_time │ 2023-07-11 17:08:35.057+0530 │
│ time_zone.current_time_unix │ 1689075515.057 │
│ time_zone.is_dst │ False │
│ time_zone.dst_savings │ 0 │
└─────────────────────────────┴─────────────────────────────────────────────────────────────────────────┘
PCAP 输出
收集 Json 数据
提取 IP 详细信息...
提取 DNS 详细信息...
提取 EAPOL 详细信息...
提取 TCP STREAMS 详细信息...
TCP 流需要一些时间...
总数据流组合: 252
进行中的工作数量: 250
已完成
GVA 报告 PCAP
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 标识符 ┃ 数据 ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ PacketAnalysis.Services │ ['49943', '49958', '49934', '49944', '49931', '443', '49957'] │
│ PacketAnalysis.TCP Streams │ ['1', '4', '5', '2', '0', '3'] │
│ PacketAnalysis.Sources Address │ ['█████████████', '1.1.1.1', '█████████████', '█████████████', '█████████████', '█████████████'] │
│ PacketAnalysis.Destination Address │ ['█████████████', '1.1.1.1', '█████████████', '█████████████', '█████████████', '█████████████'] │
│ PacketAnalysis.DNS Resolved │ [] │
│ PacketAnalysis.DNS Query │ ['oneclient.sfx.ms'] │
│ PacketAnalysis.DNS Response │ ['oneclient.sfx.ms.edgekey.net', 'e9659.dspg.akamaiedge.net', 'oneclient.sfx.ms'] │
│ PacketAnalysis.EAPOL Data │ [] │
│ PacketAnalysis. Total Streams Data │ 126 │
└────────────────────────────────────┴────────────────────────────────────────────────────────────────────────────────────────────────────┘
密码破解输出
________________________
| GVA 正在使用... |
========================
\
\
^__^
(oo)\_______
(__)\ )\/\
||----w |
|| ||
破解中... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00
╭────────────────────────────────────────────── The GVA Password Cracker ──────────────────────────────────────────────╮ │ │ │ │
│ 密码破解成功! 密码: legion │
│ │
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
使用 GUI
GUI 使用 customtkinter 来运行代码。界面简单直观,唯一需要记住的是:
- 使用 DNS 攻击时不指定配置文件
python GVA_gui.py
初始窗口
NMAP 窗口
DNS 窗口
GEOIP 窗口
PCAP 窗口
子域名窗口
JWT 窗口