11import logging
22from typing import Iterable
33
4+ import requests
45from django .db .models import QuerySet
5- from sphinx .util import requests
66
77from vulnerabilities .improver import Improver
88from vulnerabilities .improver import Inference
9- from vulnerabilities .models import Advisory , VulnerabilityReference , VulnerabilityRelatedReference
9+ from vulnerabilities .models import Advisory
1010from vulnerabilities .models import Alias
11+ from vulnerabilities .models import Exploit
12+ from vulnerabilities .models import VulnerabilityReference
13+ from vulnerabilities .models import VulnerabilityRelatedReference
14+ from vulnerabilities .utils import get_reference_id
1115
1216logger = logging .getLogger (__name__ )
1317
@@ -19,69 +23,74 @@ class MetasploitImprover(Improver):
1923
2024 @property
2125 def interesting_advisories (self ) -> QuerySet :
22- # TODO Modify Metasploit Improver to iterate over the vulnerabilities alias, not the advisory
26+ # TODO: Modify Metasploit Improver to iterate over the vulnerabilities alias, not the advisory
2327 return [Advisory .objects .first ()]
2428
2529 def get_inferences (self , advisory_data ) -> Iterable [Inference ]:
26- """
27- """
30+ """"""
31+
32+ metasploit_modules_url = "https://raw.githubusercontent.com/rapid7/metasploit-framework/master/db/modules_metadata_base.json"
2833
29- metasploit_modules_url = (
30- "https://raw.githubusercontent.com/rapid7/metasploit-framework/master/db/modules_metadata_base.json"
31- )
3234 response = requests .get (metasploit_modules_url )
33- metasploit_data = response .json ()
3435 if response .status_code != 200 :
35- logger .error (
36- f"Failed to fetch the Metasploit Exploits: { metasploit_modules_url } "
37- )
36+ logger .error (f"Failed to fetch the Metasploit Exploits: { metasploit_modules_url } " )
3837 return []
39- try :
40- for file_path , record in metasploit_data .items ():
41- file_url = f"https://github.com/rapid7/metasploit-framework/tree/master/modules/{ file_path } "
4238
43- ref_list = []
44- vulnerabilities = set ()
45- for ref in record .get ("references" ):
46- if ref .startswith ("URL-" ):
47- ref_list .append (ref [4 ::])
39+ metasploit_data = response .json ()
4840
49- alias = Alias .objects .get_or_none (alias = ref )
41+ for _ , record in metasploit_data .items ():
42+ vul = None
43+ references = {
44+ f"https://github.com/rapid7/metasploit-framework/tree/master{ record .get ('path' )} "
45+ }
5046
51- if not alias :
52- continue
47+ for ref in record .get ("references" , []):
48+ if ref .startswith ("OSVDB" ):
49+ continue
5350
54- vul = alias .vulnerability
51+ if ref .startswith ("URL-" ):
52+ references .add (ref [4 :])
5553
56- if not vul :
54+ if not vul :
55+ try :
56+ alias = Alias .objects .get (alias = ref )
57+ except Alias .DoesNotExist :
5758 continue
5859
59- ref , created = VulnerabilityReference .objects .update_or_create (
60- reference_id = alias ,
61- reference_type = VulnerabilityReference .EXPLOIT ,
62- defaults = {"url" : file_url },
60+ if not alias .vulnerability :
61+ continue
62+
63+ vul = alias .vulnerability
64+
65+ if not vul :
66+ continue
67+
68+ try :
69+ Exploit .objects .update_or_create (
70+ vulnerability = vul ,
71+ date_source = "Metasploit" ,
72+ defaults = {
73+ "description" : record .get ("description" , "" ),
74+ "resources_and_notes" : str (record .get ("notes" , {})),
75+ "source_date_published" : record .get ("disclosure_date" ),
76+ "platform" : record .get ("platform" ),
77+ "source_url" : str (references ),
78+ },
79+ )
80+ except Exception as e :
81+ logger .error (e )
82+
83+ for ref_url in references :
84+ ref , created = VulnerabilityReference .objects .update_or_create (
85+ reference_id = get_reference_id (ref_url ),
86+ reference_type = VulnerabilityReference .EXPLOIT ,
87+ defaults = {"url" : ref_url },
88+ )
89+
90+ if created :
91+ VulnerabilityRelatedReference .objects .get_or_create (
92+ vulnerability = vul ,
93+ reference = ref ,
6394 )
6495
65- if created :
66- VulnerabilityRelatedReference .objects .create (
67- vulnerability = vul ,
68- reference = ref ,
69- )
70- vulnerabilities .add (vul )
71-
72- for vul in vulnerabilities :
73- for ref in ref_list :
74- ref_obj , created = VulnerabilityReference .objects .update_or_create (
75- reference_id = ref ,
76- defaults = {"url" : file_url },
77- )
78-
79- if created :
80- VulnerabilityRelatedReference .objects .create (
81- vulnerability = vul ,
82- reference = ref_obj ,
83- )
84- except Exception as e :
85- logger .error (e )
86-
87- return []
96+ return []
0 commit comments