27 Commits
Author SHA1 Message Date
arvindrai 7c02440a9d Update scripts/CVE_scanner_new.py 2025-12-02 05:00:06 +00:00
arvindrai 5444493997 Update scripts/cve_scanner_new1.py 2025-12-02 04:59:03 +00:00
arvindrai 9907dd8a54 Update scripts/IMPORTANT.txt 2025-12-02 04:58:27 +00:00
arvindrai a5e297ef82 Update old-scripts/CVSS_scores.py 2025-12-02 04:57:51 +00:00
arvindrai 68d03bab49 Update old-scripts/top_vulnerability_types.py 2025-12-02 04:57:23 +00:00
arvindrai 1d14560e29 Upload files to "old-scripts"
uploaded
2025-12-02 04:56:35 +00:00
arvindrai 5b3be73f35 Delete scripts/CVE_scanner.py 2025-12-02 04:54:43 +00:00
arvindrai 36b209e529 Delete scripts/CVSS_scores.py 2025-12-02 04:54:23 +00:00
arvindrai ddbf1c6999 Delete old_scripts 2025-12-02 04:52:31 +00:00
arvindrai 999e6d75af Upload files to "old-scripts"
removed
2025-12-02 04:52:24 +00:00
arvindrai 2d9bbc9044 Update scripts/CVSS_scores.py 2025-12-02 04:48:48 +00:00
arvindrai 72cf84dc2f Add old_scripts 2025-12-02 04:46:30 +00:00
arvindrai 8c77b3a1a8 Upload files to "scripts"
old
2025-12-02 04:44:06 +00:00
arvindrai 57c8367e2a Upload files to "scripts"
added the better one
2025-12-02 04:42:40 +00:00
arvindrai 76d71bb285 Add scripts/IMPORTANT.txt 2025-12-02 04:20:35 +00:00
arvindrai c25761f7fb Upload files to "scripts"
a better CVE
2025-12-02 03:28:18 +00:00
arvindrai ea2e544a76 Add scripts/CVE_scanner_new.py
updated with a new and better script
2025-12-02 03:21:11 +00:00
arvindrai ac3b422377 Add requirements.txt
added requirements.txt for the extra modules
2025-12-02 02:36:11 +00:00
arvindrai 0d8e4d8ccb Upload files to "scripts"
added a new python file that updates the CVE list using API calls
2025-12-02 02:31:15 +00:00
arvindrai e27b0c57db Upload files to "/"
sorted list of the original .json of vulnerabilities
2025-10-29 04:58:44 +00:00
arvindrai 564222d082 Upload files to "Figures" 2025-10-29 04:22:27 +00:00
arvindrai d0db901e65 Upload files to "Figures"
CVSS Scores
2025-10-29 03:32:15 +00:00
arvindrai 6d785b4252 Upload files to "scripts"
Python script which plots a histogram of the distribution of CVSS severities
2025-10-29 03:31:31 +00:00
arvindrai 8f78abb808 Add scripts/CVE_scanner.py
Python script that scans an array of selected plugins against the names found in our CVE.
2025-10-29 03:19:27 +00:00
arvindrai c6550981a4 Delete scripts
was a file, not a directory
2025-10-29 03:12:52 +00:00
arvindrai cccd9eedd0 Add scripts 2025-10-29 03:10:09 +00:00
arvindrai 4056d29124 added cve database 2025-10-22 00:45:52 -04:00
18 changed files with 2726821 additions and 73 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

BIN
View File
Binary file not shown.
Binary file not shown.
-42
View File
@@ -1,49 +1,11 @@
version: '3.8'
services:
loki:
image: grafana/loki:3.0.0
container_name: loki
ports:
- "3100:3100"
command: -config.file=/etc/loki/local-config.yaml
restart: unless-stopped
grafana:
image: grafana/grafana:10.4.0
container_name: grafana
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=ocfsecure
depends_on:
- loki
restart: unless-stopped
alloy:
image: grafana/alloy:latest
container_name: alloy
volumes:
- ./alloy-config.yml:/etc/alloy/config.alloy
- ./logs:/var/log/scanner
ports:
- "12345:12345" # optional web UI/debug
command: run /etc/alloy/config.alloy
environment:
- ALLOY_ENABLE_WEB=true
depends_on:
- loki
restart: unless-stopped
apache:
build:
context: ./apache
ports:
- "8080:80"
networks:
- shared_net
- default
volumes:
- userdata:/home
depends_on:
@@ -90,7 +52,3 @@ volumes:
userdata:
db_data:
wp_data:
networks:
shared_net:
external: true
-2
View File
@@ -1,2 +0,0 @@
Username: admin
Password: wp_graf_pass
@@ -1,29 +0,0 @@
version: "3.8"
networks:
shared_net:
external: true
services:
loki:
image: grafana/loki:3.0.0
container_name: loki
ports:
- "3100:3100"
command: -config.file=/etc/loki/local-config.yaml
networks:
- shared_net
grafana:
image: grafana/grafana:10.4.0
container_name: grafana
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=admin
depends_on:
- loki
networks:
- shared_net
+40
View File
@@ -0,0 +1,40 @@
import json
import matplotlib.pyplot as plt
json_path = "wordfence_vulnerabilities.json"
def load_cvss_scores(path):
"""Load JSON data and extract all CVSS scores into a list"""
with open(path, "r", encoding="utf-8") as f:
data = json.load(f)
scores = []
for entry in data:
if "cvss_score" in entry and isinstance(entry["cvss_score"], (int, float)):
scores.append(entry["cvss_score"])
return scores
def plot_hist(scores):
"""Plot a histogram of CVSS scores"""
plt.figure(figsize=(8, 5))
plt.hist(scores, bins=10, edgecolor="black", color="skyblue")
plt.title("Distribution of CVSS Scores in Vulnerability Data")
plt.xlabel("CVSS Score")
plt.ylabel("Number of Vulnerabilities")
plt.grid(alpha=0.4)
plt.savefig("cvss_distribution.png")
plt.show()
if __name__ == "__main__":
scores = load_cvss_scores(json_path)
print(f"Loaded {len(scores)} CVSS scores.")
print("Sample:", scores[:10])
if scores:
plot_hist(scores)
else:
print("error")
+49
View File
@@ -0,0 +1,49 @@
#!/usr/bin/env python3
import json
from collections import Counter
import matplotlib.pyplot as plt
path = "wordfence_vulnerabilities.json"
# Load JSON data
with open(path, "r", encoding="utf-8") as f:
data = json.load(f)
vuln_types = []
for entry in data:
title = entry.get("title")
if not isinstance(title, str):
continue
# Split on the first dash (" - ") and take the right-hand side
if " - " in title:
vuln = title.split(" - ", 1)[1].strip()
vuln_types.append(vuln)
# Count occurrences
counts = Counter(vuln_types)
top25 = counts.most_common(25)
total = sum(counts.values())
if not vuln_types:
print("error")
exit()
# Print table of top 25
print("\nTop 25 Vulnerability Types:\n")
for name, count in top25:
rel = (count / total) * 100
print(f"{name:60} {count:5d} ({rel:5.2f}%)")
# Visualization
labels, values = zip(*top25)
plt.figure(figsize=(10, 6))
plt.barh(labels[::-1], values[::-1], color="cornflowerblue")
plt.title("Top 25 Most Common Vulnerability Types")
plt.xlabel("Count")
plt.ylabel("Vulnerability Type")
plt.tight_layout()
plt.show()
+1
View File
@@ -0,0 +1 @@
requests
+89
View File
@@ -0,0 +1,89 @@
#!/usr/bin/env python3
import json
import os
# vars
JSON_FILE = "wordfence_vulnerabilities.json"
BAD_LIST = []
JSON_OUT = "matches.json"
def load_local(path):
with open(path, "r", encoding="utf-8") as f:
return json.load(f)
def get_entries(data):
# try to find the main list of vulnerabilities
if isinstance(data, dict):
if "vulnerabilities" in data:
return data["vulnerabilities"]
for value in data.values():
if isinstance(value, list):
return value
return []
elif isinstance(data, list):
return data
else:
return []
def main():
if os.path.exists(JSON_FILE):
print("Loading ...", JSON_FILE)
data = load_local(JSON_FILE)
else:
print("Error: JSON file not found:", JSON_FILE)
return
entries = get_entries(data)
bad_set = set(BAD_LIST)
hits = []
for item in entries:
if not isinstance(item, dict):
continue
if item.get("type") != "plugin":
continue
slug = (item.get("slug") or "").strip()
if not slug:
continue
if slug in bad_set:
hit = {
"slug": slug,
"title": item.get("title"),
"cve": item.get("cve"),
"severity": item.get("severity"),
"cvss_score": item.get("cvss_score"),
"cve_link": item.get("cve_link"),
"raw": item
}
hits.append(hit)
if not hits:
print("No matches at all")
else:
print("Found", len(hits), "matches:")
for h in hits:
print(
"-",
h["slug"],
"| CVE:", h.get("cve"),
"| sev:", h.get("severity"),
"| CVSS:", h.get("cvss_score")
)
print(" link:", h.get("cve_link"))
# save
with open(JSON_OUT, "w", encoding="utf-8") as f:
json.dump(hits, f, ensure_ascii=False, indent=2)
print("Saved to", JSON_OUT)
if __name__ == "__main__":
main()
+2
View File
@@ -0,0 +1,2 @@
get_CVE.py **MUST** be ran before cve_scanner_new1 can be ran since it runs using a list that is fetched daily.
CVE_scanner.py runs on a static list called wordfence_vulnerabilities.json that is stored in the same directory, which is an old list of major vulnerabilities.
+77
View File
@@ -0,0 +1,77 @@
#!/usr/bin/env python3
import json
import os
JSON_FILE = "wordfence_CVE.json"
JSON_OUT = "malware.json"
BAD_PLUGINS = []
def load_file(path):
with open(path, "r", encoding="utf-8") as f:
return json.load(f)
def main():
if not os.path.exists(JSON_FILE):
print("json file not found:", JSON_FILE)
return
data = load_file(JSON_FILE)
bad_set = set()
for n in BAD_PLUGINS:
if isinstance(n, str):
n = n.strip()
if n:
bad_set.add(n)
hits = []
for key, item in data.items():
if not isinstance(item, dict):
continue
software_list = item.get("software") or []
for s in software_list:
if not isinstance(s, dict):
continue
if s.get("type") != "plugin":
continue
name = (s.get("name") or "").strip()
if name not in bad_set:
continue
affected = s.get("affected_versions") or {}
if not affected:
continue
refs = item.get("references") or []
ref = refs[0] if refs else None
hit = {
"id": item.get("id"),
"title": item.get("title"),
"name": name,
"slug": s.get("slug"),
"affected_versions": list(affected.keys()),
"link": ref,
"raw": item
}
hits.append(hit)
if not hits:
print("no matches found")
else:
print("found", len(hits), "matches")
for h in hits:
print("-", h["name"], "|", ", ".join(h["affected_versions"]))
with open(JSON_OUT, "w", encoding="utf-8") as f:
json.dump(hits, f, ensure_ascii=False, indent=2)
print("saved json to", JSON_OUT)
if __name__ == "__main__":
main()
+22
View File
@@ -0,0 +1,22 @@
#!/usr/bin/env python3
import requests
import os
URL = "https://www.wordfence.com/api/intelligence/v2/vulnerabilities/scanner"
OUT_FILE = "wordfence_CVE.json"
def main():
print("API request.....")
r = requests.get(URL, timeout=60)
r.raise_for_status()
script_dir = os.path.dirname(os.path.abspath(__file__))
out_path = os.path.join(script_dir, OUT_FILE)
with open(out_path, "w", encoding="utf-8") as f:
f.write(r.text)
print("File Saved!")
if __name__ == "__main__":
main()
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+520306
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff