Skip to content

Commit add381f

Browse files
committed
Rename Kev tab to exploit tab
Add support for exploitdb , metasploit, kev Fix Exploit data_source typo Signed-off-by: ziadhany <ziadhany2016@gmail.com>
1 parent a8aedf8 commit add381f

File tree

7 files changed

+406
-151
lines changed

7 files changed

+406
-151
lines changed

vulnerabilities/improvers/exploitdb.py

Lines changed: 43 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33
import logging
44
from typing import Iterable
55

6-
from django.db import IntegrityError
76
from django.db.models import QuerySet
87
from sphinx.util import requests
98

109
from vulnerabilities.improver import Improver
1110
from vulnerabilities.improver import Inference
1211
from vulnerabilities.models import Advisory
1312
from vulnerabilities.models import Alias
13+
from vulnerabilities.models import Exploit
1414
from vulnerabilities.models import VulnerabilityReference
1515
from vulnerabilities.models import VulnerabilityRelatedReference
1616

@@ -48,45 +48,61 @@ def get_inferences(self, advisory_data) -> Iterable[Inference]:
4848

4949
csvreader = csv.reader(raw_data)
5050

51-
# Ignore the csv header
52-
next(csvreader) # header
51+
header = next(csvreader)
5352
for row in csvreader:
5453
try:
5554
aliases = row[11].split(";")
55+
5656
for raw_alias in aliases:
57-
alias = Alias.objects.get(alias=raw_alias)
58-
if not alias:
57+
try:
58+
alias = Alias.objects.get(alias=raw_alias)
59+
except Alias.DoesNotExist:
5960
continue
6061

6162
vul = alias.vulnerability
6263
if not vul:
6364
continue
6465

65-
if raw_alias:
66-
url_map = {
67-
"file_url": f"https://gitlab.com/exploit-database/exploitdb/-/blob/main/{row[1]}"
68-
if row[1]
69-
else None,
70-
"direct_url": row[16] if row[16] else None,
71-
}
72-
73-
for key, url in url_map.items():
74-
if url:
75-
ref, created = VulnerabilityReference.objects.update_or_create(
76-
reference_id=row[11],
77-
reference_type=VulnerabilityReference.EXPLOIT,
78-
defaults={"url": url},
66+
url_map = {
67+
"file_url": f"https://gitlab.com/exploit-database/exploitdb/-/blob/main/{row[1]}"
68+
if row[1]
69+
else None,
70+
"direct_url": row[16] if row[16] else None,
71+
}
72+
73+
for key, url in url_map.items():
74+
if url:
75+
ref, created = VulnerabilityReference.objects.update_or_create(
76+
reference_id=row[11],
77+
reference_type=VulnerabilityReference.EXPLOIT,
78+
defaults={"url": url},
79+
)
80+
81+
if created:
82+
VulnerabilityRelatedReference.objects.get_or_create(
83+
vulnerability=vul,
84+
reference=ref,
7985
)
8086

81-
if created:
82-
VulnerabilityRelatedReference.objects.create(
83-
vulnerability=vul,
84-
reference=ref,
85-
)
87+
try:
88+
Exploit.objects.update_or_create(
89+
vulnerability=vul,
90+
data_source="Exploit-DB",
91+
defaults={
92+
"date_added": row[header.index("date_added")],
93+
"description": row[header.index("description")],
94+
"known_ransomware_campaign_use": row[header.index("verified")],
95+
"source_date_published": row[header.index("date_published")],
96+
"exploit_type": row[header.index("type")],
97+
"platform": row[header.index("platform")],
98+
"source_date_updated": row[header.index("date_updated")],
99+
"source_url": row[header.index("codes")],
100+
},
101+
)
102+
except Exception as e:
103+
logger.error(f"Error updating or creating Exploit: {e}")
86104

87-
except Alias.DoesNotExist as e:
88-
logger.error(f"No Alias found for exploit id {row[0]}: {e}")
89105
except Exception as e:
90-
logger.error(e)
106+
logger.error(f"Error processing row {row}: {e}")
91107

92108
return []
Lines changed: 61 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
import logging
22
from typing import Iterable
33

4+
import requests
45
from django.db.models import QuerySet
5-
from sphinx.util import requests
66

77
from vulnerabilities.improver import Improver
88
from vulnerabilities.improver import Inference
9-
from vulnerabilities.models import Advisory, VulnerabilityReference, VulnerabilityRelatedReference
9+
from vulnerabilities.models import Advisory
1010
from 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

1216
logger = 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 []

vulnerabilities/improvers/vulnerability_kev.py

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -28,40 +28,40 @@ def get_inferences(self, advisory_data) -> Iterable[Inference]:
2828
Fetch Kev data, iterate over it to find the vulnerability with the specified alias, and create or update
2929
the Kev instance accordingly.
3030
"""
31+
try:
32+
kev_url = "https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json"
33+
response = requests.get(kev_url)
34+
kev_data = response.json()
35+
if response.status_code != 200:
36+
logger.error(
37+
f"Failed to fetch the CISA Catalog of Known Exploited Vulnerabilities: {kev_url}"
38+
)
39+
return []
3140

32-
kev_url = (
33-
"https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json"
34-
)
35-
response = requests.get(kev_url)
36-
kev_data = response.json()
37-
if response.status_code != 200:
38-
logger.error(
39-
f"Failed to fetch the CISA Catalog of Known Exploited Vulnerabilities: {kev_url}"
40-
)
41-
return []
41+
for kev_vul in kev_data.get("vulnerabilities", []):
42+
alias = Alias.objects.get_or_none(alias=kev_vul["cveID"])
43+
if not alias:
44+
continue
4245

43-
for kev_vul in kev_data.get("vulnerabilities", []):
44-
alias = Alias.objects.get_or_none(alias=kev_vul["cveID"])
45-
if not alias:
46-
continue
46+
vul = alias.vulnerability
4747

48-
vul = alias.vulnerability
49-
50-
if not vul:
51-
continue
52-
53-
Exploit.objects.update_or_create(
54-
vulnerability=vul,
55-
defaults={
56-
"description": kev_vul["shortDescription"],
57-
"date_added": kev_vul["dateAdded"],
58-
"required_action": kev_vul["requiredAction"],
59-
"due_date": kev_vul["dueDate"],
60-
"resources_and_notes": kev_vul["notes"],
61-
"known_ransomware_campaign_use": True
62-
if kev_vul["knownRansomwareCampaignUse"] == "Known"
63-
else False,
64-
},
65-
)
48+
if not vul:
49+
continue
6650

51+
Exploit.objects.update_or_create(
52+
vulnerability=vul,
53+
data_source="KEV",
54+
defaults={
55+
"description": kev_vul["shortDescription"],
56+
"date_added": kev_vul["dateAdded"],
57+
"required_action": kev_vul["requiredAction"],
58+
"due_date": kev_vul["dueDate"],
59+
"resources_and_notes": kev_vul["notes"],
60+
"known_ransomware_campaign_use": True
61+
if kev_vul["knownRansomwareCampaignUse"] == "Known"
62+
else False,
63+
},
64+
)
65+
except Exception as e:
66+
logger.error(e)
6767
return []

0 commit comments

Comments
 (0)