def check_vulns(self): vulns = [] for possible_flow in self.tracked_patterns: for pat_name, tracked in possible_flow.items(): if len(tracked['sources']) > 0 and len(tracked['sinks']) > 0: for sink in tracked['sinks']: # [:] makes a copy of the array, so the reported vuln isn't changed # after being reported vuln_name = pat_name src = tracked['sources'][:] san = tracked['sanitizers'][:] snk = [sink][:] vuln = Vulnerability(vuln_name, src, san, snk) duplicated = False for rv in self.reported_vuls: duplicated = False if str(rv) == str(vuln): duplicated = True break if not duplicated: self.reported_vuls.append(vuln) vulns.append(vuln) # clear already reported sinks tracked['sinks'] = [] return vulns
def start_element(self, name, attrs): if name == self.VULNERABILITY: self.vul = Vulnerability() self.vul.setName(attrs[self.VULNERABILITY_NAME]) elif name == self.VULNERABILITY_DESCRIPTION: self.tag = self.VULNERABILITY_DESCRIPTION elif name == self.VULNERABILITY_SOLUTION: #self.tag = self.VULNERABILITY_SOLUTION self.vul.setSolution(attrs["text"]) elif name == self.VULNERABILITY_REFERENCES: self.references = {} elif name == self.VULNERABILITY_REFERENCE: self.tag = self.VULNERABILITY_REFERENCE elif name == self.VULNERABILITY_REFERENCE_TITLE: self.tag = self.VULNERABILITY_REFERENCE_TITLE elif name == self.VULNERABILITY_REFERENCE_URL: self.tag = self.VULNERABILITY_REFERENCE_URL
def register_vuln(self, vuln=None, name=None, i18n_name=None, category=None, description=None, solution=None, risk_level=None): if not vuln: vuln = Vulnerability(name=name, i18n_name=i18n_name, category=category, description=description, solution=solution, risk_level=risk_level) report = self.db.filter(name=vuln.name, plugin_name=self.plugin_name) if len(report): return report = VulnReport(vuln, plugin_name=self.plugin_name) self.db.add(report)
def parseVulRow(tableRow): tdElems = tableRow.find_all('td') strs = list(tdElems[0].strings) lenovoCode = clearSpecialChars(strs[0]) description = clearSpecialChars(strs[1]) aElems = tdElems[0].find_all('a') link = lenovoSupportHome + aElems[0]['href'] firstDate = clearSpecialChars(tdElems[1].string) lastDate = clearSpecialChars(tdElems[2].string) ve = Vulnerability(lenovoCode, description, link, firstDate, lastDate) vulCollection[lenovoCode] = ve
def start_element(self, name, attrs): if name == self.VULNERABILITY: self.vul = Vulnerability() self.vul.setName(attrs[self.VULNERABITITY_NAME]) elif name == self.VULNERABILITY_DESCRIPTION: self.tag = self.VULNERABILITY_DESCRIPTION elif name == self.VULNERABILITY_SOLUTION: #self.tag = self.VULNERABILITY_SOLUTION self.vul.setSolution(attrs["text"]) elif name == self.VULNERABILITY_REFERENCES: self.references = {} elif name == self.VULNERABILITY_REFERENCE: self.tag = self.VULNERABILITY_REFERENCE elif name == self.VULNERABILITY_REFERENCE_TITLE: self.tag = self.VULNERABILITY_REFERENCE_TITLE elif name == self.VULNERABILITY_REFERENCE_URL: self.tag = self.VULNERABILITY_REFERENCE_URL
def setUp(self) -> None: self.v1 = Vulnerability() self.v1.set_vector("AV:A/AC:H/PR:L/UI:R/S:U/C:L/I:L/A:L") self.v1.set_metric("E", "P") self.v1.set_metric("RL", "T") self.v1.set_metric("RC", "X") self.v1.set_metric("MAC", "H") self.v1.set_metric("MUI", "R") self.v1.set_metric("MI", "N") # AV:A/AC:H/PR:L/UI:R/S:U/C:L/I:L/A:L/E:P/RL:T/RC:X/CR:X/IR:X/AR:X/MAV:X/MAC:H/MPR:X/MUI:R/MS:X/MC:X/MI:N/MA:X 4.3 3.9 3.1 self.v2 = Vulnerability() self.v2.set_vector("AV:N/AC:H/PR:L/UI:R/S:U/C:N/I:N/A:L") self.v2.set_metric("RL", "U") self.v2.set_metric("CR", "L") self.v2.set_metric("IR", "L") self.v2.set_metric("MAV", "A") self.v2.set_metric("MAC", "H") self.v2.set_metric("MPR", "N") self.v2.set_metric("MUI", "R") self.v2.set_metric("MS", "U") # AV:N/AC:H/PR:L/UI:R/S:U/C:N/I:N/A:L/E:X/RL:U/RC:X/CR:L/IR:L/AR:X/MAV:A/MAC:H/MPR:N/MUI:R/MS:U/MC:X/MI:X/MA:X 2.6 2.6 2.6 self.v3 = Vulnerability() self.v3.set_vector("AV:L/AC:H/PR:L/UI:N/S:U/C:L/I:L/A:H") self.v3.set_metric("E", "P") self.v3.set_metric("AR", "H") self.v3.set_metric("MPR", "H") self.v3.set_metric("MUI", "N") self.v3.set_metric("MS", "U") # AV:L/AC:H/PR:L/UI:N/S:U/C:L/I:L/A:H/E:P/RL:X/RC:X/CR:X/IR:X/AR:H/MAV:X/MAC:X/MPR:H/MUI:N/MS:U/MC:X/MI:X/MA:X 5.8 5.5 6.0 self.v4 = Vulnerability() self.v4.set_vector("AV:N/AC:H/PR:N/UI:R/S:C/C:N/I:N/A:H") self.v4.set_metric("E", "P") self.v4.set_metric("RL", "U") self.v4.set_metric("AR", "H") self.v4.set_metric("MUI", "R") self.v4.set_metric("MS", "U") self.v4.set_metric("MC", "L") self.v4.set_metric("MI", "N") self.v4.set_metric("MA", "N") # AV:N/AC:H/PR:N/UI:R/S:C/C:N/I:N/A:H/E:P/RL:U/RC:X/CR:X/IR:X/AR:H/MAV:X/MAC:X/MPR:X/MUI:R/MS:U/MC:L/MI:N/MA:N 6.1 5.8 3.0 self.v5 = Vulnerability() self.v5.set_vector("AV:L/AC:L/PR:H/UI:R/S:C/C:H/I:L/A:H") self.v5.set_metric("E", "P") self.v5.set_metric("RL", "O") self.v5.set_metric("IR", "M") self.v5.set_metric("MAV", "N") self.v5.set_metric("MAC", "H") self.v5.set_metric("MC", "L") self.v5.set_metric("MA", "N") # AV:L/AC:L/PR:H/UI:R/S:C/C:H/I:L/A:H/E:P/RL:O/RC:X/CR:X/IR:M/AR:X/MAV:N/MAC:H/MPR:X/MUI:X/MS:X/MC:L/MI:X/MA:N 7.7 6.9 3.6 self.v6 = Vulnerability() self.v6.set_vector("AV:L/AC:H/PR:N/UI:R/S:U/C:N/I:H/A:H") self.v6.set_metric("RL", "W") self.v6.set_metric("RC", "R") self.v6.set_metric("IR", "M") self.v6.set_metric("MAV", "N") self.v6.set_metric("MAC", "H") self.v6.set_metric("MPR", "L") self.v6.set_metric("MUI", "N") self.v6.set_metric("MC", "L") self.v6.set_metric("MI", "L") self.v6.set_metric("MA", "L") # AV:L/AC:H/PR:N/UI:R/S:U/C:N/I:H/A:H/E:X/RL:W/RC:R/CR:X/IR:M/AR:X/MAV:N/MAC:H/MPR:L/MUI:N/MS:X/MC:L/MI:L/MA:L 6.3 5.9 4.7 self.v7 = Vulnerability() self.v7.set_vector("AV:A/AC:L/PR:H/UI:R/S:C/C:H/I:L/A:N") self.v7.set_metric("RL", "U") self.v7.set_metric("RC", "U") self.v7.set_metric("MAV", "N") self.v7.set_metric("MUI", "N") self.v7.set_metric("MA", "L") # AV:A/AC:L/PR:H/UI:R/S:C/C:H/I:L/A:N/E:X/RL:U/RC:U/CR:X/IR:X/AR:X/MAV:N/MAC:X/MPR:X/MUI:N/MS:X/MC:X/MI:X/MA:L 6.5 6.0 7.6 self.v8 = Vulnerability() self.v8.set_vector("AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H") self.v8.set_metric("E", "F") self.v8.set_metric("RL", "T") self.v8.set_metric("IR", "L") self.v8.set_metric("MAV", "N") self.v8.set_metric("MAC", "L") self.v8.set_metric("MUI", "N") self.v8.set_metric("MC", "L") self.v8.set_metric("MI", "N") self.v8.set_metric("MA", "L") # AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H/E:F/RL:T/RC:X/CR:X/IR:L/AR:X/MAV:N/MAC:L/MPR:X/MUI:N/MS:X/MC:L/MI:N/MA:L 7.0 6.6 5.1 self.v9 = Vulnerability() self.v9.set_vector("AV:A/AC:L/PR:H/UI:R/S:U/C:L/I:N/A:N") self.v9.set_metric("E", "U") self.v9.set_metric("RL", "O") self.v9.set_metric("IR", "L") self.v9.set_metric("MAV", "N") self.v9.set_metric("MAC", "L") self.v9.set_metric("MUI", "R") self.v9.set_metric("MI", "L") # AV:A/AC:L/PR:H/UI:R/S:U/C:L/I:N/A:N/E:U/RL:O/RC:X/CR:X/IR:L/AR:X/MAV:N/MAC:L/MPR:X/MUI:R/MS:X/MC:X/MI:L/MA:X 2.1 1.9 2.6 self.v10 = Vulnerability() self.v10.set_vector("AV:P/AC:H/PR:N/UI:R/S:C/C:H/I:H/A:N") self.v10.set_metric("RL", "W") self.v10.set_metric("IR", "L") self.v10.set_metric("CR", "H") self.v10.set_metric("MAV", "N") self.v10.set_metric("MAC", "H") self.v10.set_metric("MPR", "H") self.v10.set_metric("MUI", "R") self.v10.set_metric("MC", "L") self.v10.set_metric("MI", "N") self.v10.set_metric("MA", "N") # AV:P/AC:H/PR:N/UI:R/S:C/C:H/I:H/A:N/E:X/RL:W/RC:X/CR:H/IR:L/AR:X/MAV:N/MAC:H/MPR:H/MUI:R/MS:X/MC:L/MI:N/MA:N 6.7 6.5 3.4 self.v11 = Vulnerability() self.v11.set_vector("AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H") self.v11.set_metric("E", "P") self.v11.set_metric("RL", "T") self.v11.set_metric("RC", "R") self.v11.set_metric("CR", "H") self.v11.set_metric("IR", "H") self.v11.set_metric("AR", "H") self.v11.set_metric("MAV", "A") self.v11.set_metric("MAC", "H") self.v11.set_metric("MPR", "L") self.v11.set_metric("MUI", "R") self.v11.set_metric("MS", "C") self.v11.set_metric("MC", "H") self.v11.set_metric("MI", "H") self.v11.set_metric("MA", "H")
class TestVulnerability(unittest.TestCase): def setUp(self) -> None: self.v1 = Vulnerability() self.v1.set_vector("AV:A/AC:H/PR:L/UI:R/S:U/C:L/I:L/A:L") self.v1.set_metric("E", "P") self.v1.set_metric("RL", "T") self.v1.set_metric("RC", "X") self.v1.set_metric("MAC", "H") self.v1.set_metric("MUI", "R") self.v1.set_metric("MI", "N") # AV:A/AC:H/PR:L/UI:R/S:U/C:L/I:L/A:L/E:P/RL:T/RC:X/CR:X/IR:X/AR:X/MAV:X/MAC:H/MPR:X/MUI:R/MS:X/MC:X/MI:N/MA:X 4.3 3.9 3.1 self.v2 = Vulnerability() self.v2.set_vector("AV:N/AC:H/PR:L/UI:R/S:U/C:N/I:N/A:L") self.v2.set_metric("RL", "U") self.v2.set_metric("CR", "L") self.v2.set_metric("IR", "L") self.v2.set_metric("MAV", "A") self.v2.set_metric("MAC", "H") self.v2.set_metric("MPR", "N") self.v2.set_metric("MUI", "R") self.v2.set_metric("MS", "U") # AV:N/AC:H/PR:L/UI:R/S:U/C:N/I:N/A:L/E:X/RL:U/RC:X/CR:L/IR:L/AR:X/MAV:A/MAC:H/MPR:N/MUI:R/MS:U/MC:X/MI:X/MA:X 2.6 2.6 2.6 self.v3 = Vulnerability() self.v3.set_vector("AV:L/AC:H/PR:L/UI:N/S:U/C:L/I:L/A:H") self.v3.set_metric("E", "P") self.v3.set_metric("AR", "H") self.v3.set_metric("MPR", "H") self.v3.set_metric("MUI", "N") self.v3.set_metric("MS", "U") # AV:L/AC:H/PR:L/UI:N/S:U/C:L/I:L/A:H/E:P/RL:X/RC:X/CR:X/IR:X/AR:H/MAV:X/MAC:X/MPR:H/MUI:N/MS:U/MC:X/MI:X/MA:X 5.8 5.5 6.0 self.v4 = Vulnerability() self.v4.set_vector("AV:N/AC:H/PR:N/UI:R/S:C/C:N/I:N/A:H") self.v4.set_metric("E", "P") self.v4.set_metric("RL", "U") self.v4.set_metric("AR", "H") self.v4.set_metric("MUI", "R") self.v4.set_metric("MS", "U") self.v4.set_metric("MC", "L") self.v4.set_metric("MI", "N") self.v4.set_metric("MA", "N") # AV:N/AC:H/PR:N/UI:R/S:C/C:N/I:N/A:H/E:P/RL:U/RC:X/CR:X/IR:X/AR:H/MAV:X/MAC:X/MPR:X/MUI:R/MS:U/MC:L/MI:N/MA:N 6.1 5.8 3.0 self.v5 = Vulnerability() self.v5.set_vector("AV:L/AC:L/PR:H/UI:R/S:C/C:H/I:L/A:H") self.v5.set_metric("E", "P") self.v5.set_metric("RL", "O") self.v5.set_metric("IR", "M") self.v5.set_metric("MAV", "N") self.v5.set_metric("MAC", "H") self.v5.set_metric("MC", "L") self.v5.set_metric("MA", "N") # AV:L/AC:L/PR:H/UI:R/S:C/C:H/I:L/A:H/E:P/RL:O/RC:X/CR:X/IR:M/AR:X/MAV:N/MAC:H/MPR:X/MUI:X/MS:X/MC:L/MI:X/MA:N 7.7 6.9 3.6 self.v6 = Vulnerability() self.v6.set_vector("AV:L/AC:H/PR:N/UI:R/S:U/C:N/I:H/A:H") self.v6.set_metric("RL", "W") self.v6.set_metric("RC", "R") self.v6.set_metric("IR", "M") self.v6.set_metric("MAV", "N") self.v6.set_metric("MAC", "H") self.v6.set_metric("MPR", "L") self.v6.set_metric("MUI", "N") self.v6.set_metric("MC", "L") self.v6.set_metric("MI", "L") self.v6.set_metric("MA", "L") # AV:L/AC:H/PR:N/UI:R/S:U/C:N/I:H/A:H/E:X/RL:W/RC:R/CR:X/IR:M/AR:X/MAV:N/MAC:H/MPR:L/MUI:N/MS:X/MC:L/MI:L/MA:L 6.3 5.9 4.7 self.v7 = Vulnerability() self.v7.set_vector("AV:A/AC:L/PR:H/UI:R/S:C/C:H/I:L/A:N") self.v7.set_metric("RL", "U") self.v7.set_metric("RC", "U") self.v7.set_metric("MAV", "N") self.v7.set_metric("MUI", "N") self.v7.set_metric("MA", "L") # AV:A/AC:L/PR:H/UI:R/S:C/C:H/I:L/A:N/E:X/RL:U/RC:U/CR:X/IR:X/AR:X/MAV:N/MAC:X/MPR:X/MUI:N/MS:X/MC:X/MI:X/MA:L 6.5 6.0 7.6 self.v8 = Vulnerability() self.v8.set_vector("AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H") self.v8.set_metric("E", "F") self.v8.set_metric("RL", "T") self.v8.set_metric("IR", "L") self.v8.set_metric("MAV", "N") self.v8.set_metric("MAC", "L") self.v8.set_metric("MUI", "N") self.v8.set_metric("MC", "L") self.v8.set_metric("MI", "N") self.v8.set_metric("MA", "L") # AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H/E:F/RL:T/RC:X/CR:X/IR:L/AR:X/MAV:N/MAC:L/MPR:X/MUI:N/MS:X/MC:L/MI:N/MA:L 7.0 6.6 5.1 self.v9 = Vulnerability() self.v9.set_vector("AV:A/AC:L/PR:H/UI:R/S:U/C:L/I:N/A:N") self.v9.set_metric("E", "U") self.v9.set_metric("RL", "O") self.v9.set_metric("IR", "L") self.v9.set_metric("MAV", "N") self.v9.set_metric("MAC", "L") self.v9.set_metric("MUI", "R") self.v9.set_metric("MI", "L") # AV:A/AC:L/PR:H/UI:R/S:U/C:L/I:N/A:N/E:U/RL:O/RC:X/CR:X/IR:L/AR:X/MAV:N/MAC:L/MPR:X/MUI:R/MS:X/MC:X/MI:L/MA:X 2.1 1.9 2.6 self.v10 = Vulnerability() self.v10.set_vector("AV:P/AC:H/PR:N/UI:R/S:C/C:H/I:H/A:N") self.v10.set_metric("RL", "W") self.v10.set_metric("IR", "L") self.v10.set_metric("CR", "H") self.v10.set_metric("MAV", "N") self.v10.set_metric("MAC", "H") self.v10.set_metric("MPR", "H") self.v10.set_metric("MUI", "R") self.v10.set_metric("MC", "L") self.v10.set_metric("MI", "N") self.v10.set_metric("MA", "N") # AV:P/AC:H/PR:N/UI:R/S:C/C:H/I:H/A:N/E:X/RL:W/RC:X/CR:H/IR:L/AR:X/MAV:N/MAC:H/MPR:H/MUI:R/MS:X/MC:L/MI:N/MA:N 6.7 6.5 3.4 self.v11 = Vulnerability() self.v11.set_vector("AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H") self.v11.set_metric("E", "P") self.v11.set_metric("RL", "T") self.v11.set_metric("RC", "R") self.v11.set_metric("CR", "H") self.v11.set_metric("IR", "H") self.v11.set_metric("AR", "H") self.v11.set_metric("MAV", "A") self.v11.set_metric("MAC", "H") self.v11.set_metric("MPR", "L") self.v11.set_metric("MUI", "R") self.v11.set_metric("MS", "C") self.v11.set_metric("MC", "H") self.v11.set_metric("MI", "H") self.v11.set_metric("MA", "H") def test_enter_wrong_metric_for_base_score(self): v_wrong = Vulnerability() self.assertRaises(ValueError, v_wrong.set_vector, "AV:N/AC:H/PR:L/UI:R/S:U/C:L/I:X/A:L") def test_enter_wrong_order_for_base_score(self): v_wrong = Vulnerability() self.assertRaises(ValueError, v_wrong.set_vector, "AV:A/AC:H/PR:L/UI:R/S:U/C:L/A:L") def test_enter_more_more_than_base_score(self): v_wrong = Vulnerability() self.assertRaises(ValueError, v_wrong.set_vector, "AV:A/AC:H/PR:L/UI:R/S:U/C:L:I:X/A:L/MAV/AC") def test_enter_base_score_in_wrong_order(self): v_wrong = Vulnerability() self.assertRaises(ValueError, v_wrong.set_vector, "AV:A/AC:H/PR:L/UI:R/S:U/I:L/C:L/A:L") def test_enter_wrong_metric_value(self): v_wrong = Vulnerability() self.assertRaises(ValueError, v_wrong.set_metric, "AV", "K") def test_enter_wrong_metric_key(self): v_wrong = Vulnerability() self.assertRaises(KeyError, v_wrong.set_metric, "AX", "N") def test_get_environmental_score(self): self.assertEqual(self.v1.get_env_score(), 3.1) self.assertEqual(self.v2.get_env_score(), 2.6) self.assertEqual(self.v3.get_env_score(), 6.0) self.assertEqual(self.v4.get_env_score(), 3.0) self.assertEqual(self.v5.get_env_score(), 3.6) self.assertEqual(self.v6.get_env_score(), 4.7) self.assertEqual(self.v7.get_env_score(), 7.6) self.assertEqual(self.v8.get_env_score(), 5.1) self.assertEqual(self.v9.get_env_score(), 2.6) self.assertEqual(self.v10.get_env_score(), 3.4) self.assertEqual(self.v11.get_env_score(), 6.7) def test_get_temporal_score(self): self.assertEqual(self.v1.get_temp_score(), 3.9) self.assertEqual(self.v2.get_temp_score(), 2.6) self.assertEqual(self.v3.get_temp_score(), 5.5) self.assertEqual(self.v4.get_temp_score(), 5.8) self.assertEqual(self.v5.get_temp_score(), 6.9) self.assertEqual(self.v6.get_temp_score(), 5.9) self.assertEqual(self.v7.get_temp_score(), 6.0) self.assertEqual(self.v8.get_temp_score(), 6.6) self.assertEqual(self.v9.get_temp_score(), 1.9) self.assertEqual(self.v10.get_temp_score(), 6.5) self.assertEqual(self.v11.get_temp_score(), 8.5) def test_get_base_score(self): self.assertEqual(self.v1.get_base_score(), 4.3) self.assertEqual(self.v2.get_base_score(), 2.6) self.assertEqual(self.v3.get_base_score(), 5.8) self.assertEqual(self.v4.get_base_score(), 6.1) self.assertEqual(self.v5.get_base_score(), 7.7) self.assertEqual(self.v6.get_base_score(), 6.3) self.assertEqual(self.v7.get_base_score(), 6.5) self.assertEqual(self.v8.get_base_score(), 7.0) self.assertEqual(self.v9.get_base_score(), 2.1) self.assertEqual(self.v10.get_base_score(), 6.7) self.assertEqual(self.v11.get_base_score(), 9.8) def test_total_score(self): self.assertEqual(self.v1.get_total_score(), 3.1) self.assertEqual(self.v2.get_total_score(), 2.6) self.assertEqual(self.v3.get_total_score(), 6.0) self.assertEqual(self.v4.get_total_score(), 3.0) self.assertEqual(self.v5.get_total_score(), 3.6) self.assertEqual(self.v6.get_total_score(), 4.7) self.assertEqual(self.v7.get_total_score(), 7.6) self.assertEqual(self.v8.get_total_score(), 5.1) self.assertEqual(self.v9.get_total_score(), 2.6) self.assertEqual(self.v10.get_total_score(), 3.4) self.assertEqual(self.v11.get_total_score(), 6.7)
def test_enter_wrong_metric_key(self): v_wrong = Vulnerability() self.assertRaises(KeyError, v_wrong.set_metric, "AX", "N")
def test_enter_wrong_metric_value(self): v_wrong = Vulnerability() self.assertRaises(ValueError, v_wrong.set_metric, "AV", "K")
def test_enter_base_score_in_wrong_order(self): v_wrong = Vulnerability() self.assertRaises(ValueError, v_wrong.set_vector, "AV:A/AC:H/PR:L/UI:R/S:U/I:L/C:L/A:L")
def test_enter_more_more_than_base_score(self): v_wrong = Vulnerability() self.assertRaises(ValueError, v_wrong.set_vector, "AV:A/AC:H/PR:L/UI:R/S:U/C:L:I:X/A:L/MAV/AC")
def __init__(self): self._model = Vulnerability() self.username = "" self.password = "" self.msg = "" self.check_auth = False
print(f"Host {self.ip}") print(f"OS fingerprint: {self.os} - {self.version}") if not len(self.ports): print(f"Ports: none") return print(f"Ports: ") for p in self.ports.values(): p.print() if __name__ == "__main__": print(f"### device.py example ###\n") d = Device("127.0.0.1", "Windows 10", "Build 1901") p = Port(25, "tcp") p.service = "smtp" p.software = "postfix" p.version = "2.13" v = Vulnerability() v.software = p.software v.version = p.version v.type = "RCE" v.description = "sample RCE desc" v.addExploit("https://cve.truc/exp1") v.addExploit("https://cve.truc/exp2") p.addVuln(v) d.addPort(p) d.print()
def populateList(root, hosts): reporthostnodes = root.findall('.//ReportHost') for reporthostnode in reporthostnodes: #find host info hostip = reporthostnode.attrib['name'] hostos = None hostfqdn = None hostmac = None hosttags = reporthostnode.findall('HostProperties/tag') for hosttag in hosttags: if (hosttag.attrib['name'] == "operating-system"): hostos = hosttag.text if (hosttag.attrib['name'] == "host-fqdn"): hostfqdn = hosttag.text if (hosttag.attrib['name'] == "mac-address"): hostmac = hosttag.text host = Host(hostip, hostos, hostfqdn, hostmac) reportitems = reporthostnode.findall('ReportItem') for reportitem in reportitems: port = name = protocol = severity = description = cve = synopsis = solution = pub_date = None base_score = 0.0 port = reportitem.attrib['port'] name = reportitem.attrib['pluginName'] protocol = reportitem.attrib['protocol'] severity = reportitem.attrib['severity'] description = reportitem.find('description').text synopsis = reportitem.find('synopsis').text solution = reportitem.find('solution').text cve_obj = reportitem.find('cve') if cve_obj is not None: cve = cve_obj.text base_score_obj = reportitem.find('cvss_base_score') if base_score_obj is not None: base_score = base_score_obj.text pub_date_obj = reportitem.find('vuln_publication_date') if pub_date_obj is not None: pub_date = pub_date_obj.text vuln = Vulnerability() vuln.name = name vuln.port = port vuln.protocol = protocol vuln.description = description vuln.severity = severity vuln.cve = cve vuln.base_score = base_score vuln.synopsis = synopsis vuln.solution = solution vuln.pub_date = pub_date host.addVulnerability(vuln) hosts.append(host)
class VulnerabilityXMLParser: VULNERABILITY = "vulnerability" VULNERABILITY_NAME = "name" VULNERABILITY_DESCRIPTION = "description" VULNERABILITY_SOLUTION = "solution" VULNERABILITY_REFERENCE = "reference" VULNERABILITY_REFERENCES = "references" VULNERABILITY_REFERENCE_TITLE = "title" VULNERABILITY_REFERENCE_URL = "url" vulnerabilities = [] vul = None references = {} title = "" url = "" tag = "" def __init__(self): self._parser = expat.ParserCreate() self._parser.StartElementHandler = self.start_element self._parser.EndElementHandler = self.end_element self._parser.CharacterDataHandler = self.char_data def parse(self, fileName): f = None try: f = open(fileName) content = f.read() self.feed(content) finally: if f is not None: f.close() def feed(self, data): self._parser.Parse(data, 0) def close(self): self._parser.Parse("", 1) del self._parser def start_element(self, name, attrs): if name == self.VULNERABILITY: self.vul = Vulnerability() self.vul.setName(attrs[self.VULNERABILITY_NAME]) elif name == self.VULNERABILITY_DESCRIPTION: self.tag = self.VULNERABILITY_DESCRIPTION elif name == self.VULNERABILITY_SOLUTION: #self.tag = self.VULNERABILITY_SOLUTION self.vul.setSolution(attrs["text"]) elif name == self.VULNERABILITY_REFERENCES: self.references = {} elif name == self.VULNERABILITY_REFERENCE: self.tag = self.VULNERABILITY_REFERENCE elif name == self.VULNERABILITY_REFERENCE_TITLE: self.tag = self.VULNERABILITY_REFERENCE_TITLE elif name == self.VULNERABILITY_REFERENCE_URL: self.tag = self.VULNERABILITY_REFERENCE_URL def end_element(self, name): if name == self.VULNERABILITY: self.vulnerabilities.append(self.vul) elif name == self.VULNERABILITY_REFERENCE: self.references[self.title] = self.url elif name == self.VULNERABILITY_REFERENCES: self.vul.setReferences(self.references) def char_data(self, data): if self.tag == self.VULNERABILITY_DESCRIPTION: self.vul.setDescription(data) # elif self.tag==self.VULNERABILITY_SOLUTION: # self.vul.setSolution(data) elif self.tag == self.VULNERABILITY_REFERENCE_TITLE: self.title = data elif self.tag == self.VULNERABILITY_REFERENCE_URL: self.url = data self.tag = "" def getVulnerabilities(self): return self.vulnerabilities
class VulnerabilityXMLParser: VULNERABILITY = "vulnerability" VULNERABITITY_NAME = "name" VULNERABILITY_DESCRIPTION = "description" VULNERABILITY_SOLUTION = "solution" VULNERABILITY_REFERENCE = "reference" VULNERABILITY_REFERENCES = "references" VULNERABILITY_REFERENCE_TITLE = "title" VULNERABILITY_REFERENCE_URL = "url" vulnerabilities = [] vul = None references = {} title = "" url = "" tag = "" def __init__(self): self._parser = expat.ParserCreate() self._parser.StartElementHandler = self.start_element self._parser.EndElementHandler = self.end_element self._parser.CharacterDataHandler = self.char_data def parse(self, fileName): f = None try: f = open(fileName) content = f.read() self.feed(content) finally: if f != None: f.close() def feed(self, data): self._parser.Parse(data, 0) def close(self): self._parser.Parse("", 1) del self._parser def start_element(self, name, attrs): if name == self.VULNERABILITY: self.vul = Vulnerability() self.vul.setName(attrs[self.VULNERABITITY_NAME]) elif name == self.VULNERABILITY_DESCRIPTION: self.tag = self.VULNERABILITY_DESCRIPTION elif name == self.VULNERABILITY_SOLUTION: #self.tag = self.VULNERABILITY_SOLUTION self.vul.setSolution(attrs["text"]) elif name == self.VULNERABILITY_REFERENCES: self.references = {} elif name == self.VULNERABILITY_REFERENCE: self.tag = self.VULNERABILITY_REFERENCE elif name == self.VULNERABILITY_REFERENCE_TITLE: self.tag = self.VULNERABILITY_REFERENCE_TITLE elif name == self.VULNERABILITY_REFERENCE_URL: self.tag = self.VULNERABILITY_REFERENCE_URL def end_element(self, name): if name == self.VULNERABILITY: self.vulnerabilities.append(self.vul) elif name == self.VULNERABILITY_REFERENCE: self.references[self.title] = self.url elif name == self.VULNERABILITY_REFERENCES: self.vul.setReferences(self.references) def char_data(self, data): if self.tag == self.VULNERABILITY_DESCRIPTION: self.vul.setDescription(data) # elif self.tag==self.VULNERABILITY_SOLUTION: # self.vul.setSolution(data) elif self.tag == self.VULNERABILITY_REFERENCE_TITLE: self.title = data elif self.tag == self.VULNERABILITY_REFERENCE_URL: self.url = data self.tag = "" def getVulnerabilities(self): return self.vulnerabilities
def test_enter_wrong_metric_for_base_score(self): v_wrong = Vulnerability() self.assertRaises(ValueError, v_wrong.set_vector, "AV:N/AC:H/PR:L/UI:R/S:U/C:L/I:X/A:L")
class Controller: """ Controller of the Model View Controller ... Attributes ---------- model: Vulnerability a variable to save all information about the Vulnerability username: str username is required for login password: str password is required for login msg: str msg is required for the login View Methods ------- says(sound=None) Prints the animals name and what sound it makes gui_loop(self) the main loop of the calculator application, the root is a Tk Window start(self) authentication that is required to get access to the program check_auth_gui(self) is checking if a auth.json (contains userdata) is in the template folder. if true the programm will start with the login window otherwise with the sign up window set_user(self, user): setting the current user set_password(self, password): setting the current password set_msg(self, msg): setting the message that is required print_json(self) creates an .json file. the name of the file is the same as for model.get_name(). the file is saved inside the output folder. print_txt(self) creates an .json file. the name of the file is the same as for model.get_name(). the file is saved inside the output folder. get_vector(self) -> str return the CVSS 3.1 Vector set_metric(self, base_string, value=None) is changing the values of the vector. if the value is None (default) the program is got the base score from the view and is setting it for the model. otherwise its just a single metric which sets the value for the base_string get_metric(self, env): -> str returns the value of the selected metric BASE, ENV, TEMP get_base_score(self): returns the base_score get_env_score(self): return the environmental score get_temp_score(self): return the temp score set_asset(self): set the name of the asset set_vul(self): set the name of the vulnerability get_user(self): get the name of the user get_password(self): get the name of the password """ def __init__(self): self._model = Vulnerability() self.username = "" self.password = "" self.msg = "" self.check_auth = False def gui_loop(self): root = Tk() #get_credentials(root, self) root.resizable(False, False) root.title('cvsslator') self._view = CreationView(root, self) root.mainloop() def start(self): self.msg = "LOGIN" self.check_auth_gui() def check_auth_gui(self): if os.path.isfile('../templates/auth.json'): GetCredentials(self, self.msg) if self.username == "" and self.password == "": return False else: hash_object = hashlib.sha256(self.password.encode('ascii')) hash_password = str(hash_object.hexdigest()) with open('../templates/auth.json') as auth: credentials = json.load(auth) if self.username == credentials[ 'user'] and hash_password == credentials['password']: self.username = "" self.password = "" self.gui_loop() return True else: self.username = "" self.password = "" self.msg = "Unknown Combination!" self.check_auth_gui() return False else: CreateUser(self) if self.check_auth: hash_object = hashlib.sha256(self.password.encode('ascii')) hash_password = str(hash_object.hexdigest()) credentials = { 'user': self.username, 'password': hash_password } with open('../templates/auth.json', 'w') as auth: json.dump(credentials, auth) self.username = "" self.password = "" self.gui_loop() return "set" else: return False def set_user(self, username): self.username = username def set_password(self, password): self.password = password def set_msg(self, msg): self.msg = msg def print_json(self): with open('../templates/template_output_json.json') as out: try: JSON_OUT = json.load(out) except json.decoder.JSONDecodeError: return False JSON_OUT['asset_name'] = self._model.get_asset_name() JSON_OUT['vuln_name'] = self._model.get_vulnerability_name() JSON_OUT['vektor'] = self._model.get_vector() JSON_OUT['base_score'] = self._model.get_base_score() JSON_OUT['temp_score'] = self._model.get_temp_score() JSON_OUT['env_score'] = self._model.get_env_score() JSON_OUT['total_score'] = self._model.get_total_score() if self._model.get_asset_name() != "N/D": create_name = '../output/' + self._model.get_asset_name( ) + '_output.json' else: create_name = "../output/unknown_output.json" with open(create_name, 'w') as out2: out2.write(json.dumps(JSON_OUT, indent=4)) return True def print_txt(self): with open('../templates/template_output_txt.txt', 'r') as file: TXT_OUT = file.read() TXT_OUT = TXT_OUT.replace('$asset_name$', self._model.get_asset_name()) TXT_OUT = TXT_OUT.replace('$vul_name$', self._model.get_vulnerability_name()) TXT_OUT = TXT_OUT.replace('$vektor$', str(self._model.get_vector())) TXT_OUT = TXT_OUT.replace('$base_score$', str(self._model.get_base_score())) TXT_OUT = TXT_OUT.replace('$temp_score$', str(self._model.get_temp_score())) TXT_OUT = TXT_OUT.replace('$env_score$', str(self._model.get_env_score())) TXT_OUT = TXT_OUT.replace('$total_score$', str(self._model.get_total_score())) if self._model.get_asset_name() != "N/D": create_name = '../output/' + self._model.get_asset_name( ) + '_output.txt' else: create_name = "../output/unknown_output.txt" with open(create_name, 'w') as output: output.write(TXT_OUT) def get_vector(self): return self._model.get_vector() def set_metric(self, base_string, value=None): if value == None: self._model.set_vector(base_string) else: self._model.set_metric(base_string, value) def get_metric(self, type): if type == "BASE": return self._model.get_base_vector() elif type == "TEMP": return self._model.get_temp_vector() elif type == "ENV": return self._model.get_env_vector() else: pass def get_base_score(self): return self._model.get_base_score() def get_env_score(self): return self._model.get_env_score() def get_temp_score(self): return self._model.get_temp_score() def set_vul(self, value): if value == "": self._model.set_asset_name("N/D") else: self._model.set_vulnerability_name(value) def set_asset(self, value): if value == "": self._model.set_asset_name("N/D") else: self._model.set_asset_name(value) def get_user(self): return self.username def get_password(self): return self.password