diff --git a/monkey/monkey_island/cc/services/attack/attack_schema.py b/monkey/monkey_island/cc/services/attack/attack_schema.py index a49079fa4..3c3a451f2 100644 --- a/monkey/monkey_island/cc/services/attack/attack_schema.py +++ b/monkey/monkey_island/cc/services/attack/attack_schema.py @@ -66,6 +66,22 @@ SCHEMA = { } } }, + "persistence": { + "title": "Persistence", + "type": "object", + "link": "https://attack.mitre.org/tactics/TA0003/", + "properties": { + "T1136": { + "title": "Create account", + "type": "bool", + "value": True, + "necessary": False, + "link": "https://attack.mitre.org/techniques/T1136", + "description": "Adversaries with a sufficient level of access " + "may create a local system, domain, or cloud tenant account." + } + } + }, "defence_evasion": { "title": "Defence evasion", "type": "object", @@ -289,22 +305,6 @@ SCHEMA = { "description": "Data exfiltration is performed over the Command and Control channel." } } - }, - "persistence": { - "title": "Persistence", - "type": "object", - "link": "https://attack.mitre.org/tactics/TA0003/", - "properties": { - "T1136": { - "title": "Create account", - "type": "bool", - "value": True, - "necessary": False, - "link": "https://attack.mitre.org/techniques/T1136", - "description": "Adversaries with a sufficient level of access " - "may create a local system, domain, or cloud tenant account." - } - } } } } diff --git a/monkey/monkey_island/cc/services/attack/technique_reports/T1136.py b/monkey/monkey_island/cc/services/attack/technique_reports/T1136.py index 04450d4a6..4cd78c9a3 100644 --- a/monkey/monkey_island/cc/services/attack/technique_reports/T1136.py +++ b/monkey/monkey_island/cc/services/attack/technique_reports/T1136.py @@ -34,5 +34,5 @@ class T1136(AttackTechnique): 'result': ': '.join([pba['name'], pba['result'][0]]) }] }) - data.update(T1136.get_message_and_status(status)) + data.update(T1136.get_base_data_by_status(status)) return data diff --git a/monkey/monkey_island/cc/ui/src/components/attack/techniques/T1136.js b/monkey/monkey_island/cc/ui/src/components/attack/techniques/T1136.js index b9c4b6aff..55cd9966c 100644 --- a/monkey/monkey_island/cc/ui/src/components/attack/techniques/T1136.js +++ b/monkey/monkey_island/cc/ui/src/components/attack/techniques/T1136.js @@ -1,6 +1,7 @@ import React from 'react'; import ReactTable from 'react-table'; -import {renderMachineFromSystemData, ScanStatus} from './Helpers' +import {renderMachineFromSystemData, ScanStatus} from './Helpers'; +import MitigationsComponent from "./MitigationsComponent"; class T1136 extends React.Component { @@ -35,6 +36,7 @@ class T1136 extends React.Component { showPagination={false} defaultPageSize={this.props.data.info.length} /> : ''} + ); } diff --git a/monkey/monkey_island/cc/ui/src/components/report-components/SecurityReport.js b/monkey/monkey_island/cc/ui/src/components/report-components/SecurityReport.js index e25b7f126..d6891b5bb 100644 --- a/monkey/monkey_island/cc/ui/src/components/report-components/SecurityReport.js +++ b/monkey/monkey_island/cc/ui/src/components/report-components/SecurityReport.js @@ -407,18 +407,23 @@ class ReportPageComponent extends AuthComponent {
-
- -
-
- -
+
+ +
+ +
+ +
+ +
+
{this.generateReportPthMap()}
+
diff --git a/monkey/monkey_island/cc/ui/src/components/report-components/security/BreachedServers.js b/monkey/monkey_island/cc/ui/src/components/report-components/security/BreachedServers.js index 4eeb1f971..3ea23a075 100644 --- a/monkey/monkey_island/cc/ui/src/components/report-components/security/BreachedServers.js +++ b/monkey/monkey_island/cc/ui/src/components/report-components/security/BreachedServers.js @@ -1,5 +1,6 @@ import React from 'react'; -import ReactTable from 'react-table' +import ReactTable from 'react-table'; +import Pluralize from 'pluralize'; let renderArray = function (val) { return
{val.map(x =>
{x}
)}
; @@ -34,14 +35,20 @@ class BreachedServersComponent extends React.Component { let defaultPageSize = this.props.data.length > pageSize ? pageSize : this.props.data.length; let showPagination = this.props.data.length > pageSize; return ( -
- -
+ <> +

+ The Monkey successfully breached {this.props.data.length} {Pluralize('machine', this.props.data.length)}: +

+
+ +
+ ); } } diff --git a/monkey/monkey_island/cc/ui/src/components/report-components/security/PostBreach.js b/monkey/monkey_island/cc/ui/src/components/report-components/security/PostBreach.js index b0fe5fa9e..c482fb992 100644 --- a/monkey/monkey_island/cc/ui/src/components/report-components/security/PostBreach.js +++ b/monkey/monkey_island/cc/ui/src/components/report-components/security/PostBreach.js @@ -1,5 +1,6 @@ import React from 'react'; -import ReactTable from 'react-table' +import ReactTable from 'react-table'; +import Pluralize from 'pluralize'; let renderArray = function (val) { return {val.map(x => {x})}; @@ -62,19 +63,26 @@ class PostBreachComponent extends React.Component { }); let defaultPageSize = pbaMachines.length > pageSize ? pageSize : pbaMachines.length; let showPagination = pbaMachines > pageSize; + const pbaCount = pbaMachines.reduce((accumulated, pbaMachine) => accumulated+pbaMachine["pba_results"].length, 0); return ( -
- { - return renderDetails(row.original.pba_results); - }} - /> -
- + <> +

+ The Monkey performed {pbaCount} post-breach {Pluralize('action', pbaCount)} on {pbaMachines.length} {Pluralize('machine', pbaMachines.length)}: +

+
+ { + return renderDetails(row.original.pba_results); + }} + /> +
+ ); } } diff --git a/monkey/monkey_island/cc/ui/src/components/report-components/security/ScannedServers.js b/monkey/monkey_island/cc/ui/src/components/report-components/security/ScannedServers.js index 7a4495da3..644d77f54 100644 --- a/monkey/monkey_island/cc/ui/src/components/report-components/security/ScannedServers.js +++ b/monkey/monkey_island/cc/ui/src/components/report-components/security/ScannedServers.js @@ -1,5 +1,6 @@ import React from 'react'; -import ReactTable from 'react-table' +import ReactTable from 'react-table'; +import Pluralize from 'pluralize'; let renderArray = function (val) { return
{val.map(x =>
{x}
)}
; @@ -32,17 +33,33 @@ class ScannedServersComponent extends React.Component { } render() { + let defaultPageSize = this.props.data.length > pageSize ? pageSize : this.props.data.length; let showPagination = this.props.data.length > pageSize; + + const scannedMachinesCount = this.props.data.length; + const reducerFromScannedServerToServicesAmount = (accumulated, scannedServer) => accumulated + scannedServer["services"].length; + const scannedServicesAmount = this.props.data.reduce(reducerFromScannedServerToServicesAmount, 0); + return ( -
- -
+ <> +

+ The Monkey discovered + {scannedServicesAmount} + open {Pluralize('service', scannedServicesAmount)} + on + {scannedMachinesCount} + {Pluralize('machine', scannedMachinesCount)}: +

+
+ +
+ ); } }