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