import uuid import hashlib import hmac import secrets import base64 import subprocess from typing import * import os import sys import re import json import time import urllib3 import requests import socket import logging import threading import concurrent.futures import ipaddress import ssl from urllib.parse import urlparse, urljoin, urlencode, quote from collections import defaultdict from bs4 import BeautifulSoup from datetime import datetime, timezone FINGERPRINTS: list[dict] = [ {"name": "WordPress", "regex": r' list[dict]: results = [] for fp in FINGERPRINTS: try: m = re.search(fp["regex"], body, re.I) if m: version = m.group(1) if m.lastindex and m.group(1) else m.group(0) eol_info = TECH_EOL.get(fp["name"], {}).get(version, "") results.append({ "name": fp["name"], "version": version, "type": fp["type"], "eol": eol_info, }) except Exception: pass for k, v in (headers or {}).items(): if k.lower() == "server": results.append({"name": v, "version": "", "type": "Server Header", "eol": ""}) if k.lower() == "x-powered-by": results.append({"name": v, "version": "", "type": "Powered-By", "eol": ""}) return results def find_cves(tech_name: str, version: str | None = None) -> list[dict]: matches = [] for cve in CVE_DATABASE: if cve["software"].lower() not in tech_name.lower(): continue if not cve["versions"]: matches.append(cve) elif version and cve["versions"].get("<"): try: if float(version) < float(cve["versions"]["<"]): matches.append(cve) except ValueError: matches.append(cve) return matches