93 lines
4.0 KiB
Python
93 lines
4.0 KiB
Python
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.")
|