PYTHON 访问NVD获取漏洞信息保存到本地数据库

import sqlite3

import json

import os

import psycopg2

class DataBaseConnector:

    def __init__(self, _db_config: dict):

        self.db_host = _db_config['host']  # 数据库服务器

        self.db_port = _db_config['port']  # 数据库端口,MySQL默认3306,PostgreSQL默认5432

        self.db_user = _db_config['user']  # 数据库用户

        self.db_password = _db_config['password']  # 数据库密码

        self.db_name = _db_config['db_name']  # 数据库名

        self.db_table = _db_config['db_table']  # 数据表名

        self.conn = self.connect_db()  # 数据库连接对象

        self._current_path = os.path.dirname(__file__)  # 当前文件路径

        self.start_year = int(_db_config['start_year'])  # NVD开始年份

        self.end_year = int(_db_config['end_year'])  # NVD结束年份

    def connect_db(self):

        """

        连接数据库,返回conn

        :return: 数据库连接对象

        """

        conn = sqlite3.connect('test.db')

        # conn = psycopg2.connect(

        #     host=self.db_host,

        #     port=self.db_port,

        #     user=self.db_user,

        #     password=self.db_password,

        #     database=self.db_name

        # )

        return conn

    def fill_db(self):

        cursor = self.conn.cursor()

        print("正在清理过时的数据库......")

        cursor.execute("drop table if exists nvd ")

        #cursor.execute("drop type if exists vector")

        #cursor.execute("drop type if exists level")

        # 对于攻击向量的枚举类型: ('NETWORK', 'ADJACENT_NETWORK', 'LOCAL', 'PHYSICAL')

        #enum_vector_sql = "create type vector as enum ('NETWORK', 'ADJACENT_NETWORK', 'LOCAL', 'PHYSICAL')"

        # 对于漏洞等级的枚举类型: ('CRITICAL', 'HIGH', 'MEDIUM', 'LOW')

        #enum_level_sql = "create type level as enum ('CRITICAL', 'HIGH', 'MEDIUM', 'LOW')"

        # 创建nvd数据表的SQL语句

        create_table_sql = f"create table {self.db_table} (cve_id varchar(20) not null, \

            attack_vector vector not null, vuln_level level not null, base_score decimal not null, \

            exploitability_socre decimal not null, impact_score decimal not null, primary key(cve_id))"

        #cursor.execute(enum_vector_sql)  # 创建vector

        #cursor.execute(enum_level_sql)  # 创建level

        cursor.execute(create_table_sql)  # 创建nvd数据表

        # 向nvd数据表中插入数据

        for year in range(self.start_year, self.end_year + 1):

            with open(f'nvdcve-1.1-{year}.json', 'r',encoding='gb18030',errors='ignore') as f:

                print(f"正在导入{year}年的CVE数据......", end="")

                load_dict = json.load(f)

                for cve in load_dict['CVE_Items']:

                    """

                    因为json文件中有的项可能只是占位项,并没有真的漏洞,

                    因此首先要判断是不是占位项,如果是,跳过当前项。

                    判断的标准很简单,看"impact"字段是否为空。

                    """

                    if cve['impact'] == {}:

                        continue

                    cve_id = cve['cve']['CVE_data_meta']['ID']  # CVE ID

                    """

                    2015年之前的漏洞都只有CVSS2评分,因此只能使用CVSS2;

                    而2021年最新的几个漏洞只有CVSS3,没有CVSS2,因此只能使用CVSS3;

                    中间的年份既有CVSS2,又有CVSS3。因此,无法统一标准,只能妥协:

                    如果存在CVSS3,优先使用CVSS3;否则再使用CVSS2。

                    """

                    if 'baseMetricV3' in cve['impact']:  # CVSS3

                        attack_vector = cve['impact']['baseMetricV3']['cvssV3']['attackVector']  # 攻击向量

                        vuln_level = cve['impact']['baseMetricV3']['cvssV3']['baseSeverity']  # 漏洞等级

                        base_score = cve['impact']['baseMetricV3']['cvssV3']['baseScore']  # base score

                        exploitability_score = cve['impact']['baseMetricV3'][

                            'exploitabilityScore']  # exploitability score

                        impact_score = cve['impact']['baseMetricV3']['impactScore']  # impact score

                    else:  # CVSS2

                        attack_vector = cve['impact']['baseMetricV2']['cvssV2']['accessVector']

                        vuln_level = cve['impact']['baseMetricV2']['severity']

                        base_score = cve['impact']['baseMetricV2']['cvssV2']['baseScore']

                        exploitability_score = cve['impact']['baseMetricV2']['exploitabilityScore']

                        impact_score = cve['impact']['baseMetricV2']['impactScore']

                    # 向数据库中插入数据的SQL语句

                    insert_sql = f"insert into {self.db_table} values ('{cve_id}','{attack_vector}'," \

                                 f"'{vuln_level}',{base_score:.2f},{exploitability_score:.2f},{impact_score:.2f})"

                    cursor.execute(insert_sql)  # 插入本条CVE数据

            print("导入成功!")

        self.conn.commit()

        print(f"\n[SUCCESS]成功向数据库中导入{self.start_year}年到{self.end_year}年的所有漏洞数据!")

    def download_nvd_json(self):

        """

        从NVD下载指定年份区间内的json文件并解压

        """

        #os.system(f"rm -rf {self._current_path}/nvd_json/*")

        for year in range(self.start_year, self.end_year + 1):

            # 下载文件到 /db/nvd_json/目录下

            os.system(f"c:\sqlite3\wget  https://nvd.nist.gov/feeds/json/cve/1.1/nvdcve-1.1-{year}.json.gz")

            #os.system(f"c:\sqlite3\gzip {self._current_path}\nvdcve-1.1-{year}.json.gz")

            #os.system(f"tar -xvf c:\个人目录\编程\nvdcve-1.1-2020.json.gz")

    def close(self):

        """

        关闭数据库连接

        """

        self.conn.colse()

if __name__ == "__main__":

    db_config = {'host': '127.0.0.1', 'port': '5432', 'user': 'nvd', 'password': '自定义密码', 'db_name': 'nvd', 'db_table': 'nvd', 'start_year': 2020, 'end_year': 2021}

    db = DataBaseConnector(db_config)

    #db.download_nvd_json()

    db.fill_db()

  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: NVD漏洞信息数据集是由美国国家漏洞数据库(National Vulnerability Database,简称NVD)提供的一组包含了各种软件和操作系统的安全漏洞信息的数据集。这个数据集是为了促进网络安全研究和漏洞管理而创建的。 NVD漏洞信息数据集的主要内容包括漏洞的名称、描述、危害级别、可利用性、解决方案、参考链接等。这些信息可以帮助企业和个人识别并修复系统中的安全漏洞,增强网络系统的安全性。 该数据集中的漏洞信息根据不同的标准进行分类和标记,比如CVE(通用漏洞漏洞名称)标识符。这使得研究人员和安全专家可以快速地找到相关的漏洞信息,对其进行深入分析和研究。同时,NVD还将漏洞信息与其他相关的漏洞数据库进行关联,以提供更全面和准确的信息NVD漏洞信息数据集在网络安全研究、漏洞评估、威胁情报等领域起到了重要作用。它为研究人员提供了一个基准,可以对比自己的研究成果,并且可以帮助他们发现新的安全漏洞。另外,NVD漏洞信息数据集也为企业和安全从业者提供了一个重要的参考,帮助他们及时发现并修复可能存在的漏洞,从而降低系统被攻击的风险。 总而言之,NVD漏洞信息数据集是一个重要的安全漏洞信息资源,对于网络安全研究、漏洞管理和威胁情报都有着积极的促进作用。 ### 回答2: NVD漏洞信息数据集是一种包含多个漏洞信息的数据集。NVD是“国家漏洞数据库”(National Vulnerability Database)的简称,它是美国国家标准与技术研究院(NIST)维护的一个公共数据库,用于收集、更新和发布各种软件、硬件和操作系统的漏洞信息NVD漏洞信息数据集包括了各种漏洞的详细信息,包括漏洞的名称、漏洞编号、漏洞描述、漏洞的严重程度等等。这些信息对于安全研究人员、开发人员和系统管理员来说非常有价值,可以帮助他们了解当前存在的漏洞,采取相应的防护措施。 使用NVD漏洞信息数据集,可以对漏洞进行分类和归纳,进而进行漏洞分析和评估。同时,该数据集还可以用于建立漏洞检测和防护系统,提供即时的漏洞更新和修复方案。 NVD漏洞信息数据集的更新频率较高,NIST团队会根据最新的漏洞信息不断更新和发布数据集。因此,我们可以及时地获取最新的漏洞信息,快速采取应对措施,提高系统的安全性。 总而言之,NVD漏洞信息数据集是一种非常有价值的资源,对于安全研究和漏洞防护都具有重要意义。使用该数据集进行漏洞分析和修复,可以帮助我们更好地保护系统的安全,减少潜在的安全风险。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值