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