Skip to content

Commit 3517c32

Browse files
author
Martim Valente
committed
Script to list the number of vulnerabilities for each target of the account
1 parent bba6d81 commit 3517c32

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed

.DS_Store

6 KB
Binary file not shown.

list_target_vulns.py

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
#!/usr/bin/env python
2+
3+
"""
4+
Script to list the number of vulnerabilities for each target of the account
5+
"""
6+
7+
8+
import csv
9+
import requests
10+
from urllib.parse import urljoin
11+
12+
def fetch_all_targets(api_base_url, headers):
13+
resp = requests.get(urljoin(api_base_url, "targets/?length=10000"), headers=headers)
14+
resp.raise_for_status()
15+
return resp.json().get("results", [])
16+
17+
def fetch_target_findings(api_base_url, target_id, headers):
18+
endpoint = urljoin(api_base_url, f"targets/{target_id}/findings/?length=10000")
19+
resp = requests.get(endpoint, headers=headers)
20+
resp.raise_for_status()
21+
return resp.json().get("results", [])
22+
23+
def count_severity(findings):
24+
high = sum(1 for f in findings if f.get("severity") == 30 or f.get("severity") == "HIGH")
25+
med = sum(1 for f in findings if f.get("severity") == 20 or f.get("severity") == "MEDIUM")
26+
low = sum(1 for f in findings if f.get("severity") == 10 or f.get("severity") == "LOW")
27+
return high, med, low
28+
29+
def main():
30+
token = input("API Token: ")
31+
instance = input("Instance (eu, us, au): ")
32+
csv_path = input("CSV file path (default: ./targets_findings.csv): ") or "./targets_findings.csv"
33+
headers = {"Authorization": f"JWT {token}", "Content-Type": "application/json"}
34+
api_base = f"https://api.{instance}.probely.com"
35+
36+
print("Fetching targets...")
37+
try:
38+
targets = fetch_all_targets(api_base, headers)
39+
except requests.HTTPError as e:
40+
print("Failed to fetch targets:", e)
41+
return
42+
43+
if not targets:
44+
print("No targets found.")
45+
return
46+
47+
print(f"Found {len(targets)} target(s). Fetching findings per target...")
48+
49+
with open(csv_path, "w", newline='') as f:
50+
writer = csv.writer(f)
51+
writer.writerow(["Target URL", "Target Name", "High Vulns", "Medium Vulns", "Low Vulns"])
52+
53+
for t in targets:
54+
target_id = t.get("id", "")
55+
target_url = t.get("site", {}).get("url", "Unknown")
56+
target_name = t.get("name", "")
57+
58+
try:
59+
findings = fetch_target_findings(api_base, target_id, headers)
60+
except requests.HTTPError:
61+
print(f"Warning: Could not fetch findings for target {target_url} (ID: {target_id})")
62+
writer.writerow([target_url, target_name, "N/A", "N/A", "N/A"])
63+
continue
64+
65+
high, med, low = count_severity(findings)
66+
writer.writerow([target_url, target_name, high, med, low])
67+
68+
print(f"Done! Results saved to {csv_path}")
69+
70+
if __name__ == "__main__":
71+
main()

0 commit comments

Comments
 (0)