From 6019432a2b980f63615001eb8a250774fbc27c0e Mon Sep 17 00:00:00 2001 From: Oran Nadler Date: Tue, 22 May 2018 03:00:06 -0700 Subject: [PATCH] pth report is now shown also in the website --- monkey_island/cc/app.py | 2 ++ monkey_island/cc/resources/pthreport.py | 21 ++++++++++++++++++- monkey_island/cc/resources/pthreporthtml.py | 21 +++++++++++++++++++ .../components/pages/PassTheHashMapPage.js | 8 +++++++ 4 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 monkey_island/cc/resources/pthreporthtml.py diff --git a/monkey_island/cc/app.py b/monkey_island/cc/app.py index 981cf3de1..33d1bb53b 100644 --- a/monkey_island/cc/app.py +++ b/monkey_island/cc/app.py @@ -19,6 +19,7 @@ from cc.resources.monkey_configuration import MonkeyConfiguration from cc.resources.monkey_download import MonkeyDownload from cc.resources.netmap import NetMap from cc.resources.pthmap import PthMap +from cc.resources.pthreporthtml import PthReportHtml from cc.resources.node import Node from cc.resources.report import Report from cc.resources.root import Root @@ -106,5 +107,6 @@ def init_app(mongo_url): api.add_resource(TelemetryFeed, '/api/telemetry-feed', '/api/telemetry-feed/') api.add_resource(Log, '/api/log', '/api/log/') api.add_resource(PthMap, '/api/pthmap', '/api/pthmap/') + api.add_resource(PthReportHtml, '/api/pthreport', '/api/pthreport/') return app diff --git a/monkey_island/cc/resources/pthreport.py b/monkey_island/cc/resources/pthreport.py index 313ef6a20..b89a8b078 100644 --- a/monkey_island/cc/resources/pthreport.py +++ b/monkey_island/cc/resources/pthreport.py @@ -1228,4 +1228,23 @@ def main(): print """""" if __name__ == "__main__": - main() \ No newline at end of file + main() + +from cStringIO import StringIO +import sys + +class Capturing(list): + def __enter__(self): + self._stdout = sys.stdout + sys.stdout = self._stringio = StringIO() + return self + def __exit__(self, *args): + self.extend(self._stringio.getvalue().splitlines()) + del self._stringio # free up some memory + sys.stdout = self._stdout + +def get_report_html(): + with Capturing() as output: + main() + + return "\n".join(output) \ No newline at end of file diff --git a/monkey_island/cc/resources/pthreporthtml.py b/monkey_island/cc/resources/pthreporthtml.py new file mode 100644 index 000000000..8aa10870f --- /dev/null +++ b/monkey_island/cc/resources/pthreporthtml.py @@ -0,0 +1,21 @@ +import hashlib +import binascii +import copy +import flask_restful +from pthreport import PassTheHashReport, Machine, get_report_html + +from cc.auth import jwt_required +from cc.services.edge import EdgeService +from cc.services.node import NodeService +from cc.database import mongo + +class PthReportHtml(flask_restful.Resource): + @jwt_required() + def get(self, **kw): + pth = PassTheHashReport() + html = get_report_html() + + return \ + { + "html": html + } diff --git a/monkey_island/cc/ui/src/components/pages/PassTheHashMapPage.js b/monkey_island/cc/ui/src/components/pages/PassTheHashMapPage.js index 26ce71cc9..2ac43f094 100644 --- a/monkey_island/cc/ui/src/components/pages/PassTheHashMapPage.js +++ b/monkey_island/cc/ui/src/components/pages/PassTheHashMapPage.js @@ -29,6 +29,7 @@ class PassTheHashMapPageComponent extends AuthComponent { super(props); this.state = { graph: {nodes: [], edges: []}, + report: "", selected: null, selectedType: null, killPressed: false, @@ -58,6 +59,12 @@ class PassTheHashMapPageComponent extends AuthComponent { this.setState({graph: res}); this.props.onStatusChange(); }); + this.authFetch('/api/pthreport') + .then(res => res.json()) + .then(res => { + this.setState({report: res.html}); + this.props.onStatusChange(); + }); }; render() { @@ -70,6 +77,7 @@ class PassTheHashMapPageComponent extends AuthComponent {
+
);