简单的CVE收集器
2023-11-21 22:22:24 Author: MicroPest(查看原文) 阅读量:11 收藏

      从前面的文章中,大家有没有注意到一个细节,即在分析代码的过程中我大量地使用了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(通用漏洞与漏洞)信息的工具。以下是脚本的一些主要功能和结构:

  1. 元数据:你在脚本顶部包含了一些元数据,如作者、版本、日期等,以及一些颜色代码,这些颜色代码似乎是用于终端输出的。

  2. 函数定义:你定义了一些函数,包括计算SHA-1哈希值的函数(sha1_hash),检查CVE ID年份是否有效的函数(is_valid_cve_id_year),以及检查CVE信息是否存在于数据库中的函数(feeds_exists_in_db),还有一些用于从CVE源获取最新信息的函数(fetch_latest_cve_entries和retrieve_cve_details)。

  3. 主函数:main 函数是脚本的入口点。它设置了一些参数,如CVE的最小CVSS分数和CVE源的URL,然后调用其他函数来获取和处理CVE信息。

  4. 异常处理:在脚本中有一些异常处理的代码块,以捕获可能发生的错误并进行处理。

  5. 执行入口:最后,通过 __name__ == '__main__' 的检查,确保脚本在作为主程序运行时才会执行。

注意:脚本的功能需要从cvedetails.com网站获取CVE信息,以及通过一个数据库(feed_db)来跟踪已经处理过的CVE条目。

==============

其中的几个函数:

retrieve_cve_details函数用于获取一组常见漏洞和曝光(CVE)条目的详细信息。以下是它的工作原理:

  1. 它检查feed_db文件是否存在。如果存在,将mode变量设置为'a'(追加模式),否则设置为'w'(写入模式)。

  2. 它使用用户代理字符串设置headers变量。

  3. 它初始化一些变量(ncve_content_result)以跟踪条目数量和结果字符串。

  4. 它以指定的模式打开feed_db文件。

  5. 它遍历cve_entries列表中的每个cve_link

  6. 它使用指定的headers向cve_link URL发送GET请求。

  7. 如果响应状态码为200,它使用BeautifulSoup解析响应正文以提取必要的信息。

  8. 它处理可能在HTML解析过程中发生的异常,并打印错误消息。

  9. 如果成功解析所有必要数据字段,它格式化数据并将其写入feed_db文件。

  10. 它将格式化的内容追加到cve_content_result字符串。

  11. 如果在GET请求过程中发生错误,它打印错误消息并退出程序。

  12. 最后,它返回包含CVE条目详细信息的格式化字符串cve_content_result

请注意,这段代码依赖于osrequeststimesysBeautifulSoupdatetime等外部库。

===

这是一个fetch_latest_cve_entries函数的示例代码。它用于从指定的feed_url获取最新的CVE条目,并返回一个包含这些条目链接的列表。

以下是该函数的工作原理:

  1. 它使用指定的feed_url和用户代理字符串设置请求的headers

  2. 它使用requests库发送GET请求到feed_url

  3. 如果响应状态码为200,它使用BeautifulSoup库解析响应的正文,并查找具有特定CSS类和数据属性的div元素。

  4. 如果找不到匹配的div元素,它打印错误消息并退出程序。

  5. 对于每个找到的cve_info_div元素,它尝试从中提取CVE ID、发布日期和链接。

  6. 如果在提取过程中发生AttributeError异常,它打印错误消息并退出程序。

  7. 如果其中一个提取的字段为空,它打印错误消息并退出程序。

  8. 它检查CVE ID的年份是否有效,如果无效,则跳过该条目。

  9. 如果指定的feed_db文件存在,它根据哈希值检查条目是否已存在于数据库中。如果不存在,则将该条目链接添加到最新的CVE条目列表中。

  10. 如果feed_db文件不存在,它直接将该条目链接添加到最新的CVE条目列表中。

  11. 如果响应状态码不是200,它打印错误消息并退出程序。

  12. 最后,它返回包含最新CVE条目链接的列表newest_cve_entries

请注意,这段代码依赖于requestssysosBeautifulSoup等外部库。此外,还涉及到其他未提及的函数和变量,如Bcolorsis_valid_cve_id_yearsha1_hashfeeds_exists_in_db等。如果您需要更多上下文信息,请提供相关的代码部分。

===

这是一个feeds_exists_in_db函数的示例代码。它用于检查给定的feed_db文件中是否存在具有指定哈希值和ID的条目。

以下是该函数的工作原理:

  1. 它首先检查feed_db文件是否存在。如果存在,将mode变量设置为'r'(读取模式),否则设置为'w'(写入模式)。

  2. 它初始化一个变量n以跟踪条目数量。

  3. 使用指定的mode打开feed_db文件。

  4. 对于文件中的每一行,它检查该行是否非空,并逐行处理。

  5. 对于非空行,它增加n的计数,并从该行中提取哈希值和ID。

  6. 如果提取的ID与指定的_id_to_check相等,则返回True

  7. 否则,如果提取的哈希值与指定的_hash_to_check相等,则返回True

  8. 如果没有找到匹配的条目,则返回False

  9. 如果在处理过程中发生任何异常,它打印错误消息。

请注意,这段代码依赖于ossysBcolors等外部库。此外,还涉及到其他未提及的变量和函数,如Bcolors等。

===

好了,GPT分析得非常清晰了,太省事了。有了GPT,我们人类的代码阅读能力将大幅提升。

截个图,看下运行后的结果图,结果放在feeds.db中:

收集CVE信息的方法分为不同的阶段。它们主要分为两种

(1)漏洞分析和风险评估完成后的CVE信息检索方法。

  • 此方法涉及在所有进程完成后收集 CVE 信息。

  • 当然,有几天的时间滞后(速度较慢)。

(2)在CVE信息被列为漏洞的阶段检索CVE信息的方法。

  • 这是指在分配 CVE ID 并公开披露漏洞后立即进入的阶段。

  • 在这个阶段,可能只有关于漏洞的基本信息,或者可能没有对CVSS评分进行评估,可能缺少参考文档等必要内容。


文章来源: http://mp.weixin.qq.com/s?__biz=MjM5NDcxMDQzNA==&mid=2247487989&idx=1&sn=8f6ab1d42668adbd81626604376b677d&chksm=a682c73891f54e2e6fe5077359bbc9fb9cc391533ce27bedbc8098d922ddbcc8b6f930737c88&scene=0&xtrack=1#rd
如有侵权请联系:admin#unsafe.sh