agencies

cvedetails에서 description 가지고 오기 본문

Ⅲ. 정보보안

cvedetails에서 description 가지고 오기

agencies 2024. 11. 13. 11:35
import os
import requests
from bs4 import BeautifulSoup
import pandas as pd
import time

# CVE description 가져오기
def fetch_cvedetails_description(cve_id):
    print(f"Fetching {cve_id} from web")
    url = f"https://www.cvedetails.com/cve/{cve_id}"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"
    }
    try:
        response = requests.get(url, headers=headers, timeout=10)
        if response.status_code != 200:
            print(f"Failed to fetch {cve_id}, Status Code: {response.status_code}")
            return "No description found"
        
        soup = BeautifulSoup(response.text, 'html.parser')
        description_tag = soup.find('div', {'id': 'cvedetailssummary'})
        description = description_tag.text.strip() if description_tag else "No description found"
        return description
    except requests.exceptions.RequestException as e:
        print(f"Error fetching {cve_id}: {e}")
        return "No description found"

# CSV 파일 생성 및 갱신 함수
def save_to_csv(data, filename="cve_vulnerabilities.csv"):
    columns = ["index", "cve_number", "description"]
    df = pd.DataFrame(data, columns=columns)
    if os.path.exists(filename):
        existing_df = pd.read_csv(filename)
        df = pd.concat([existing_df, df], ignore_index=True)
    df.to_csv(filename, index=False)
    print(f"Data saved to {filename}")

# 기존 CSV 파일에서 CVE 목록 로드
def load_existing_cves(filename="cve_vulnerabilities.csv"):
    if os.path.exists(filename):
        df = pd.read_csv(filename)
        return set(df['cve_number']), len(df)
    return set(), 0

# 메인 코드
def main():
    data = []
    filename = "cve_vulnerabilities.csv"

    # 기존 CSV 파일에서 중복된 CVE 번호 확인
    existing_cves, last_index = load_existing_cves(filename)

    # 새로 추가할 CVE 번호 범위 설정 (예제: CVE-2023-0050부터 CVE-2023-0200까지)

    cve_ids = [f"CVE-2023-{i:04d}" for i in range(1,1000)]

    for cve_id in cve_ids:
        # 이미 수집된 CVE 번호는 건너뛰기
        if cve_id in existing_cves:
            print(f"Skipping {cve_id}, already exists in the CSV.")
            continue

        # CVE description 가져오기
        description = fetch_cvedetails_description(cve_id)
        last_index += 1
        data.append([last_index, cve_id, description])

        # 서버 과부하를 방지하기 위해 잠시 대기
        time.sleep(1)

    # CSV 파일로 저장 (기존 데이터에 추가)
    save_to_csv(data, filename)

# 코드 실행
if __name__ == "__main__":
    main()

 

기존 cve 설명이 있는 csv 파일을 로드하는데 만약 없다면 새로 만들고 

있다면 중복 cve 값은 제외하고 추가하는 코드입니다.

 

 

 

이런식으로 저장됩니다.

 

 

 


※ 고도화된 코드

ctrl + c 로 중단할때에도 저장!

중복으로 저장되는 것 방지 코드!

 

import os
import requests
from bs4 import BeautifulSoup
import pandas as pd
import time

# CVE description 가져오기
def fetch_cvedetails_description(cve_id):
    print(f"Fetching {cve_id} from web")
    url = f"https://www.cvedetails.com/cve/{cve_id}"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"
    }
    try:
        response = requests.get(url, headers=headers, timeout=10)
        if response.status_code != 200:
            print(f"Failed to fetch {cve_id}, Status Code: {response.status_code}")
            return "No description found"
        
        soup = BeautifulSoup(response.text, 'html.parser')
        description_tag = soup.find('div', {'id': 'cvedetailssummary'})
        description = description_tag.text.strip() if description_tag else "No description found"
        return description
    except requests.exceptions.RequestException as e:
        print(f"Error fetching {cve_id}: {e}")
        return "No description found"

# CSV 파일 생성 및 갱신 함수
def save_to_csv(data, filename="cve_vulnerabilities.csv"):
    if not data:
        print("No new data to save.")
        return

    columns = ["index", "cve_number", "description"]
    df = pd.DataFrame(data, columns=columns)
    if os.path.exists(filename):
        existing_df = pd.read_csv(filename)
        df = pd.concat([existing_df, df], ignore_index=True)
    df.to_csv(filename, index=False)
    print(f"Data saved to {filename}")

# 기존 CSV 파일에서 CVE 목록 로드
def load_existing_cves(filename="cve_vulnerabilities.csv"):
    if os.path.exists(filename):
        try:
            # 파일을 다양한 인코딩 방식으로 읽기 시도
            df = pd.read_csv(filename, encoding='utf-8')
        except UnicodeDecodeError:
            print("UTF-8 decoding failed, trying ISO-8859-1...")
            df = pd.read_csv(filename, encoding='ISO-8859-1')  # 대안 인코딩 방식 시도
        return set(df['cve_number']), len(df)
    return set(), 0


# 메인 코드
def main():
    data = []
    filename = "cve_vulnerabilities.csv"

    # 기존 CSV 파일에서 중복된 CVE 번호 확인
    existing_cves, last_index = load_existing_cves(filename)

    # 새로 추가할 CVE 번호 범위 설정 (예제: CVE-2023-0900부터 CVE-2023-0905까지)
    cve_ids = [f"CVE-2023-{i:04d}" for i in range(5, 50)]

    try:
        for cve_id in cve_ids:
            # 이미 수집된 CVE 번호는 건너뛰기
            if cve_id in existing_cves:
                print(f"Skipping {cve_id}, already exists in the CSV.")
                continue

            # CVE description 가져오기
            description = fetch_cvedetails_description(cve_id)

            # 유효한 description만 추가
            if description != "No description found":
                last_index += 1
                data.append([last_index, cve_id, description])

    except KeyboardInterrupt:
        print("\nProcess interrupted by user. Saving progress...")

    finally:
        # 새롭게 추가된 데이터가 있는 경우에만 CSV 파일로 저장
        if data:
            save_to_csv(data, filename)
        print("Process completed. Data saved.")

# 코드 실행
if __name__ == "__main__":
    main()

 

 

만능 gpt..

(참고로 csv 파일을 보면 특정 cve-num은 저장되지 않는데 이는 description이 없어서 그렇다)

보면

31 32 가 없는데

 

이렇게 없을 경우는 추가가 안된다.

cve_vulnerabilities.csv
6.50MB