从前面的文章中,大家有没有注意到一个细节,即在分析代码的过程中我大量地使用了GPT来参与,这大大地节约了时间,加快了分析进程,速度快且准。ChatGPT迭代神速,据说5.0都要出来了,真是无敌般存在。在此之前,我都是深信GPT是神,但昨天的一次寻问,我觉得它像人。事情是这样的,昨晚我让它针对加密容器的卡方检验或信息熵阀给出代码,随着一行行的闪烁叠堆输出,高兴且惊讶。中午抽时间进行了印证,经确认我发现它是在乱写乱给答案,就像我们考试时即使不会也不要空着。之后用了几个不同的GPT,加上仔细调试,更加确认了GPT这点。现在,我对它的认识就是:当这个题目是没有答案时,它就会乱写,是不是像人而不像神。
好了,进入主题。
不记得哪天在哪个群里看到人们在讨论CVE检索的问题,推荐个“CVE收集器”,https://github.com/password123456/cve-collector。
文件就2个文件,一个main.py,一个requirement.txt;
我们利用GPT来分析下main.py,注释夹在其中:
def main():
//在 main()
函数中,它执行以下操作:
home_path = f'{os.getcwd()}'
//使用 os.getcwd()
将 home_path
变量设置为当前工作目录。
feed_db = f'{home_path}/feeds.db'
//通过将 home_path
与 /feeds.db
进行连接,将 feed_db
变量设置为一个路径。
cvss_min_score = 6
//将 cvss_min_score
变量设置为 6。
feed_url = f'https://www.cvedetails.com/vulnerability-search.php?f=1&cvssscoremin={cvss_min_score}&page=1'
//通过将基础 URL https://www.cvedetails.com/vulnerability-search.php?f=1&cvssscoremin=
与 cvss_min_score
和 page=1
进行连接,将 feed_url
变量设置为一个 URL。
latest_cve_entries = fetch_latest_cve_entries(feed_db, feed_url)
//使用 fetch_latest_cve_entries()
函数调用 latest_cve_entries
并将 feed_db
和 feed_url
作为参数传递,并将结果赋值给 latest_cve_entries
变量。
if latest_cve_entries:
//检查 latest_cve_entries
是否不为空(真值)。
cve_details = retrieve_cve_details(feed_db, latest_cve_entries)
//如果 latest_cve_entries
不为空,则使用 retrieve_cve_details()
函数调用 latest_cve_entries
并将 feed_db
作为参数传递,并将结果赋值给 cve_details
变量。
if cve_details:
//检查 cve_details
是否不为空(真值)。
cve_details = f'*{datetime.now()}*\n\n{cve_details}'
//如果 cve_details
不为空,则将当前日期时间和 cve_details
追加到一个字符串中,并将结果赋值给 cve_details
变量。
print(f'{cve_details}')
//打印出来
## Send the result to webhook. ##
//(注释掉的)将结果发送到一个 webhook。
else:
print(f'{Bcolors.Blue}>>> [OK] ({datetime.now()}) No NEW CVE{Bcolors.Endc}')
//如果 cve_details
为空,则打印一条消息说明没有新的 CVE。
==============
整个代码的总况,如下:
你的Python脚本看起来是一个用于检索和处理CVE(通用漏洞与漏洞)信息的工具。以下是脚本的一些主要功能和结构:
元数据:你在脚本顶部包含了一些元数据,如作者、版本、日期等,以及一些颜色代码,这些颜色代码似乎是用于终端输出的。
函数定义:你定义了一些函数,包括计算SHA-1哈希值的函数(sha1_hash),检查CVE ID年份是否有效的函数(is_valid_cve_id_year),以及检查CVE信息是否存在于数据库中的函数(feeds_exists_in_db),还有一些用于从CVE源获取最新信息的函数(fetch_latest_cve_entries和retrieve_cve_details)。
主函数:main 函数是脚本的入口点。它设置了一些参数,如CVE的最小CVSS分数和CVE源的URL,然后调用其他函数来获取和处理CVE信息。
异常处理:在脚本中有一些异常处理的代码块,以捕获可能发生的错误并进行处理。
执行入口:最后,通过 __name__ == '__main__' 的检查,确保脚本在作为主程序运行时才会执行。
注意:脚本的功能需要从cvedetails.com网站获取CVE信息,以及通过一个数据库(feed_db)来跟踪已经处理过的CVE条目。
==============
其中的几个函数:
retrieve_cve_details
函数用于获取一组常见漏洞和曝光(CVE)条目的详细信息。以下是它的工作原理:
它检查feed_db
文件是否存在。如果存在,将mode
变量设置为'a'
(追加模式),否则设置为'w'
(写入模式)。
它使用用户代理字符串设置headers
变量。
它初始化一些变量(n
,cve_content_result
)以跟踪条目数量和结果字符串。
它以指定的模式打开feed_db
文件。
它遍历cve_entries
列表中的每个cve_link
。
它使用指定的headers向cve_link
URL发送GET请求。
如果响应状态码为200,它使用BeautifulSoup解析响应正文以提取必要的信息。
它处理可能在HTML解析过程中发生的异常,并打印错误消息。
如果成功解析所有必要数据字段,它格式化数据并将其写入feed_db
文件。
它将格式化的内容追加到cve_content_result
字符串。
如果在GET请求过程中发生错误,它打印错误消息并退出程序。
最后,它返回包含CVE条目详细信息的格式化字符串cve_content_result
。
请注意,这段代码依赖于os
、requests
、time
、sys
、BeautifulSoup
和datetime
等外部库。
===
这是一个fetch_latest_cve_entries
函数的示例代码。它用于从指定的feed_url
获取最新的CVE条目,并返回一个包含这些条目链接的列表。
以下是该函数的工作原理:
它使用指定的feed_url
和用户代理字符串设置请求的headers
。
它使用requests
库发送GET请求到feed_url
。
如果响应状态码为200,它使用BeautifulSoup
库解析响应的正文,并查找具有特定CSS类和数据属性的div
元素。
如果找不到匹配的div
元素,它打印错误消息并退出程序。
对于每个找到的cve_info_div
元素,它尝试从中提取CVE ID、发布日期和链接。
如果在提取过程中发生AttributeError
异常,它打印错误消息并退出程序。
如果其中一个提取的字段为空,它打印错误消息并退出程序。
它检查CVE ID的年份是否有效,如果无效,则跳过该条目。
如果指定的feed_db
文件存在,它根据哈希值检查条目是否已存在于数据库中。如果不存在,则将该条目链接添加到最新的CVE条目列表中。
如果feed_db
文件不存在,它直接将该条目链接添加到最新的CVE条目列表中。
如果响应状态码不是200,它打印错误消息并退出程序。
最后,它返回包含最新CVE条目链接的列表newest_cve_entries
。
请注意,这段代码依赖于requests
、sys
、os
和BeautifulSoup
等外部库。此外,还涉及到其他未提及的函数和变量,如Bcolors
、is_valid_cve_id_year
、sha1_hash
和feeds_exists_in_db
等。如果您需要更多上下文信息,请提供相关的代码部分。
===
这是一个feeds_exists_in_db
函数的示例代码。它用于检查给定的feed_db
文件中是否存在具有指定哈希值和ID的条目。
以下是该函数的工作原理:
它首先检查feed_db
文件是否存在。如果存在,将mode
变量设置为'r'
(读取模式),否则设置为'w'
(写入模式)。
它初始化一个变量n
以跟踪条目数量。
使用指定的mode
打开feed_db
文件。
对于文件中的每一行,它检查该行是否非空,并逐行处理。
对于非空行,它增加n
的计数,并从该行中提取哈希值和ID。
如果提取的ID与指定的_id_to_check
相等,则返回True
。
否则,如果提取的哈希值与指定的_hash_to_check
相等,则返回True
。
如果没有找到匹配的条目,则返回False
。
如果在处理过程中发生任何异常,它打印错误消息。
请注意,这段代码依赖于os
、sys
和Bcolors
等外部库。此外,还涉及到其他未提及的变量和函数,如Bcolors
等。
===
好了,GPT分析得非常清晰了,太省事了。有了GPT,我们人类的代码阅读能力将大幅提升。
截个图,看下运行后的结果图,结果放在feeds.db中:
收集CVE信息的方法分为不同的阶段。它们主要分为两种
(1)漏洞分析和风险评估完成后的CVE信息检索方法。
此方法涉及在所有进程完成后收集 CVE 信息。
当然,有几天的时间滞后(速度较慢)。
(2)在CVE信息被列为漏洞的阶段检索CVE信息的方法。
这是指在分配 CVE ID 并公开披露漏洞后立即进入的阶段。
在这个阶段,可能只有关于漏洞的基本信息,或者可能没有对CVSS评分进行评估,可能缺少参考文档等必要内容。