From 0938d0446b0917efd76b69fdf3a85a27faae89b9 Mon Sep 17 00:00:00 2001
From: Lukas Koenen <lukas.koenen@h-da.de>
Date: Mon, 4 Sep 2023 12:39:49 +0200
Subject: [PATCH] feat: output severity json

---
 .../report_builders/html_report_builder.py    | 35 ++++++++++++++++++-
 .../report_builders/json_report_builder.py    |  3 +-
 contrib/report_builders/report_builder.py     |  2 +-
 output_report.py                              |  2 +-
 run.sh                                        |  3 ++
 5 files changed, 41 insertions(+), 4 deletions(-)

diff --git a/contrib/report_builders/html_report_builder.py b/contrib/report_builders/html_report_builder.py
index e7af652..7b4162b 100644
--- a/contrib/report_builders/html_report_builder.py
+++ b/contrib/report_builders/html_report_builder.py
@@ -1,3 +1,4 @@
+import json
 import os
 from typing import Any
 
@@ -7,6 +8,25 @@ from contrib.descriptions import VulnDescriptionProvider
 from contrib.report_builders import JsonReportBuilder
 
 
+class Severity:
+    def __init__(self, severity):
+        self.level = severity
+        self.num_level = 0
+
+        if severity == 'Medium':
+            self.num_level = 1
+
+        if severity == 'High':
+            self.num_level = 2
+
+    def toJSON(self):
+        return json.dumps(self, default=lambda o: o.__dict__,
+                          sort_keys=True, indent=4)
+
+    def __lt__(self, other):
+        return self.num_level < other.num_level
+
+
 class JinjaHtmlReportBuilder(JsonReportBuilder):
     def __init__(self, description_provider: VulnDescriptionProvider):
         super().__init__(description_provider)
@@ -15,7 +35,20 @@ class JinjaHtmlReportBuilder(JsonReportBuilder):
         self._read_template()  # type: Template
 
     def build(self) -> Any:
-        return self._template.render(data=self._buffer)
+        json_data = self._buffer
+
+        max_severity = Severity('Low')
+        for vv in json_data['vulnerable'].values():
+            for v in vv['vulnerabilities']:
+                s = Severity(v['severity_str'])
+
+                if s > max_severity:
+                    max_severity = s
+
+        with open(f'{json_data["output_path"]}.severity', 'w+') as severity:
+            severity.write(max_severity.toJSON())
+
+        return self._template.render(data=json_data)
 
     def _read_template(self):
         template_loader = FileSystemLoader(searchpath=self.template_path)
diff --git a/contrib/report_builders/json_report_builder.py b/contrib/report_builders/json_report_builder.py
index 4af6e2d..49d26b6 100644
--- a/contrib/report_builders/json_report_builder.py
+++ b/contrib/report_builders/json_report_builder.py
@@ -11,9 +11,10 @@ class JsonReportBuilder(ReportBuilder):
         self.description_provider = description_provider
         self._buffer = {'ips': [], 'vulnerable': {}, 'not_vulnerable': {}, 'password_auth_enabled': []}
 
-    def init_report(self, start_date: str, nmap_command: str):
+    def init_report(self, start_date: str, nmap_command: str, output_path: str):
         self._buffer['start_date'] = start_date
         self._buffer['nmap_command'] = nmap_command
+        self._buffer['output_path'] = output_path
 
     def build(self) -> Any:
         return json.dumps(self._buffer)
diff --git a/contrib/report_builders/report_builder.py b/contrib/report_builders/report_builder.py
index cd919d0..279bcec 100644
--- a/contrib/report_builders/report_builder.py
+++ b/contrib/report_builders/report_builder.py
@@ -8,7 +8,7 @@ __all__ = ['ReportBuilder']
 
 
 class ReportBuilder(metaclass=abc.ABCMeta):
-    def init_report(self, start_date: str, nmap_command: str):
+    def init_report(self, start_date: str, nmap_command: str, output_path: str):
         """
         Creates document section with report overview
         """
diff --git a/output_report.py b/output_report.py
index c6a1a00..8973d64 100644
--- a/output_report.py
+++ b/output_report.py
@@ -13,7 +13,7 @@ from contrib.report_builders import ReportBuilder, LatexReportBuilder, MarkdownR
 def create_report(parser: FlanXmlParser, builder: ReportBuilder, nmap_command: str, start_date: str, output_writer: IO,
                   ip_reader: IO):
 
-    builder.init_report(start_date, nmap_command)
+    builder.init_report(start_date, nmap_command, os.path.splitext(output_writer.name)[0])
 
     if parser.vulnerable_services:
         builder.add_vulnerable_section()
diff --git a/run.sh b/run.sh
index ad90700..db943d0 100755
--- a/run.sh
+++ b/run.sh
@@ -20,6 +20,7 @@ xml_subdir=$xml_dir/$current_time
 report_subdir=$report_dir/$current_time
 
 report_file=report_$current_time.$report_extension
+severity_file=report_$current_time.severity
 
 if [[ ! -z $project ]]
 then
@@ -27,6 +28,7 @@ then
     report_subdir=$report_dir/$project/$current_time
 
     report_file=report_$project\_$current_time.$report_extension
+    severity_file=report_$project\_$current_time.severity
 fi
 
 function upload {
@@ -85,3 +87,4 @@ then
     sed -i 's/%/\\%/g' $root_dir/$report_dir/$report_file
 fi
 upload $report_subdir/$report_file
+upload $report_subdir/$severity_file
-- 
GitLab