import os import requests import pandas as pd from datetime import datetime, timedelta def get_latest_cves(days=3): try: end_date = datetime.now() start_date = end_date - timedelta(days=days) start_date_str = start_date.strftime("%Y-%m-%dT%H:%M:%S") end_date_str = end_date.strftime("%Y-%m-%dT%H:%M:%S") nvd_url = f"https://services.nvd.nist.gov/rest/json/cves/1.0?pubStartDate={start_date_str}&pubEndDate={end_date_str}" response = requests.get(nvd_url) if response.status_code == 200: return response.json() else: print(f"Error: Unable to fetch CVE data. Status code: {response.status_code}") print("Response content:", response.content) return None except requests.exceptions.RequestException as e: print(f"Error: Unable to fetch CVE data. {e}") return None def extract_cvss_data(cve_entry): cvss_data = cve_entry.get("impact", {}).get("baseMetricV2", {}).get("cvssV2", {}) if cvss_data: return { "CVSS Version": "2.0", "Vector String": cvss_data.get("vectorString", ""), "Base Score": cvss_data.get("baseScore", ""), "Base Severity": cvss_data.get("severity", ""), "Access Vector": cvss_data.get("accessVector", ""), "Access Complexity": cvss_data.get("accessComplexity", ""), "Authentication": cvss_data.get("authentication", ""), "Confidentiality Impact": cvss_data.get("confidentialityImpact", ""), "Integrity Impact": cvss_data.get("integrityImpact", ""), "Availability Impact": cvss_data.get("availabilityImpact", ""), "Exploitability Score": cve_entry.get("exploitabilityScore", ""), "Impact Score": cve_entry.get("impactScore", "") } else: return { "CVSS Version": "", "Vector String": "", "Base Score": "", "Base Severity": "", "Access Vector": "", "Access Complexity": "", "Authentication": "", "Confidentiality Impact": "", "Integrity Impact": "", "Availability Impact": "", "Exploitability Score": "", "Impact Score": "" } def generate_excel_report(cves, excel_filename): try: data = [] for vulnerability_entry in cves.get("result", {}).get("CVE_Items", []): cve_entry = vulnerability_entry.get("cve", {}) cve_id = cve_entry.get("CVE_data_meta", {}).get("ID", "") descriptions = cve_entry.get("description", {}).get("description_data", []) english_descriptions = [desc.get("value", "") for desc in descriptions if desc.get("lang") == "en"] description = " ".join(english_descriptions) references = cve_entry.get("references", {}).get("reference_data", []) reference_urls = [ref.get("url", "") for ref in references] reference_sources = [ref.get("name", "") for ref in references] reference_url = reference_urls[0] if reference_urls else "" reference_source = reference_sources[0] if reference_sources else "" cvss_data = extract_cvss_data(vulnerability_entry) data.append({ "CVE ID": cve_id, "Description": description, "Reference URL": reference_url, "Reference Source": reference_source, **cvss_data }) df = pd.DataFrame(data) df.to_excel(excel_filename, index=False) print(f"Excel report generated successfully: {excel_filename}") except Exception as e: print(f"Error: Unable to generate Excel report. {e}") if __name__ == "__main__": latest_cves = get_latest_cves() if latest_cves: excel_timestamp = datetime.now().strftime("%Y%m%d%H%M%S") excel_filename = f"latest_cves_{excel_timestamp}.xlsx" generate_excel_report(latest_cves, excel_filename) else: print("No CVEs found.")