- {'Communication possible from ' + crossSegmentIssue['source_subnet'] + ' to ' + crossSegmentIssue['target_subnet']}
+ let crossSegmentIssueOverview = 'Communication possible from ' + crossSegmentIssue['source_subnet'] + ' to ' + crossSegmentIssue['target_subnet']
+ return
+ <>
Change {issue.username}'s password to a complex one-use password
that is not shared with other computers on the network.
@@ -484,13 +489,13 @@ class ReportPageComponent extends AuthComponent {
The Monkey authenticated over the SMB protocol with user {issue.username} and its password.
-
+ >
);
}
generateSmbPthIssue(issue) {
return (
-
+ <>
Change {issue.username}'s password to a complex one-use password
that is not shared with other computers on the network.
@@ -501,13 +506,13 @@ class ReportPageComponent extends AuthComponent {
The Monkey used a pass-the-hash attack over SMB protocol with user {issue.username}.
-
+ <>
Change {issue.username}'s password to a complex one-use password
that is not shared with other computers on the network.
@@ -518,13 +523,13 @@ class ReportPageComponent extends AuthComponent {
The Monkey authenticated over the WMI protocol with user {issue.username} and its password.
-
+ >
);
}
generateWmiPthIssue(issue) {
return (
-
+ <>
Change {issue.username}'s password to a complex one-use password
that is not shared with other computers on the network.
@@ -535,13 +540,13 @@ class ReportPageComponent extends AuthComponent {
The Monkey used a pass-the-hash attack over WMI protocol with user {issue.username}.
-
+ >
);
}
generateSshIssue(issue) {
return (
-
+ <>
Change {issue.username}'s password to a complex one-use password
that is not shared with other computers on the network.
@@ -552,13 +557,13 @@ class ReportPageComponent extends AuthComponent {
The Monkey authenticated over the SSH protocol with user {issue.username} and its password.
-
+ >
);
}
generateSshKeysIssue(issue) {
return (
-
+ <>
Protect {issue.ssh_key} private key with a pass phrase.
The machine {issue.machine} ({issue.ssh_key}.
-
+ <>
Change {issue.username}'s password to a complex one-use password
that is not shared with other computers on the network.
@@ -589,13 +594,13 @@ class ReportPageComponent extends AuthComponent {
className="badge badge-success">{issue.username} and its password, and used the SambaCry
vulnerability.
+ <>
Update your VSFTPD server to the latest version vsftpd-3.0.3.
The machine {issue.machine} (here.
-
+ >
);
}
generateElasticIssue(issue) {
return (
-
+ <>
Update your Elastic Search server to version 1.4.3 and up.
The machine {issue.machine} (
The attack was made possible because the Elastic Search server was not patched against CVE-2015-1427.
-
+ <>
Update your Bash to a ShellShock-patched version.
The machine {issue.machine} ({issue.port} was vulnerable to a shell injection attack on the
paths: {this.generateShellshockPathListBadges(issue.paths)}.
-
+ >
);
}
generateAzureIssue(issue) {
return (
-
+ <>
Delete VM Access plugin configuration files.
Credentials could be stolen from here.
-
+ <>
Segment your network and make sure there is no communication between machines from different segments.
The network can probably be segmented. A monkey instance on
-
+ <>
Some domain users are sharing passwords, this should be fixed by changing passwords.
These users are sharing access password:
{this.generateInfoBadges(issue.shared_with)}.
-
+ <>
Some users are sharing passwords, this should be fixed by changing passwords.
These users are sharing access password:
{this.generateInfoBadges(issue.shared_with)}.
-
+ <>
Make sure the right administrator accounts are managing the right machines, and that there isn’t an unintentional local
admin sharing.
@@ -730,13 +735,13 @@ class ReportPageComponent extends AuthComponent {
className="badge badge-primary">{issue.username} is defined as an administrator:
{this.generateInfoBadges(issue.shared_machines)}
-
+ <>
This critical machine is open to attacks via strong users with access to it.
The services: {this.generateInfoBadges(issue.services)} have been found on the machine
@@ -744,26 +749,26 @@ class ReportPageComponent extends AuthComponent {
These users has access to it:
{this.generateInfoBadges(issue.threatening_users)}.
-
+ >
);
}
generateTunnelIssue(issue) {
return (
-
+ <>
Use micro-segmentation policies to disable communication other than the required.
Machines are not locked down at port level. Network tunnel was set up from {issue.machine} to {issue.dest}.
-
+ >
);
}
generateStruts2Issue(issue) {
return (
-
+ <>
Upgrade Struts2 to version 2.3.32 or 2.5.10.1 or any later versions.
Struts2 server at {issue.machine} (here.
-
+ <>
Update Oracle WebLogic server to the latest supported version.
Oracle WebLogic server at {issue.machine} ( CVE-2017-10271 or
CVE-2019-2725
-
+ >
);
}
generateHadoopIssue(issue) {
return (
-
+ <>
Run Hadoop in secure mode (
add Kerberos authentication).
@@ -809,13 +814,13 @@ class ReportPageComponent extends AuthComponent {
The attack was made possible due to default Hadoop/Yarn configuration being insecure.
-
+ >
);
}
generateMSSQLIssue(issue) {
return (
-
+ <>
Disable the xp_cmdshell option.
The machine {issue.machine} (
Microsoft's documentation.
-
+ >
);
}
generateIssue = (issue) => {
- let data;
+ let issueData;
switch (issue.type) {
case 'vsftp':
- data = this.generateVsftpdBackdoorIssue(issue);
+ issueData = this.generateVsftpdBackdoorIssue(issue);
break;
case 'smb_password':
- data = this.generateSmbPasswordIssue(issue);
+ issueData = this.generateSmbPasswordIssue(issue);
break;
case 'smb_pth':
- data = this.generateSmbPthIssue(issue);
+ issueData = this.generateSmbPthIssue(issue);
break;
case 'wmi_password':
- data = this.generateWmiPasswordIssue(issue);
+ issueData = this.generateWmiPasswordIssue(issue);
break;
case 'wmi_pth':
- data = this.generateWmiPthIssue(issue);
+ issueData = this.generateWmiPthIssue(issue);
break;
case 'ssh':
- data = this.generateSshIssue(issue);
+ issueData = this.generateSshIssue(issue);
break;
case 'ssh_key':
- data = this.generateSshKeysIssue(issue);
+ issueData = this.generateSshKeysIssue(issue);
break;
case 'sambacry':
- data = this.generateSambaCryIssue(issue);
+ issueData = this.generateSambaCryIssue(issue);
break;
case 'elastic':
- data = this.generateElasticIssue(issue);
+ issueData = this.generateElasticIssue(issue);
break;
case 'shellshock':
- data = this.generateShellshockIssue(issue);
+ issueData = this.generateShellshockIssue(issue);
break;
case 'conficker':
- data = this.generateConfickerIssue(issue);
+ issueData = this.generateConfickerIssue(issue);
break;
case 'island_cross_segment':
- data = this.generateIslandCrossSegmentIssue(issue);
+ issueData = this.generateIslandCrossSegmentIssue(issue);
break;
case 'shared_passwords':
- data = this.generateSharedCredsIssue(issue);
+ issueData = this.generateSharedCredsIssue(issue);
break;
case 'shared_passwords_domain':
- data = this.generateSharedCredsDomainIssue(issue);
+ issueData = this.generateSharedCredsDomainIssue(issue);
break;
case 'shared_admins_domain':
- data = this.generateSharedLocalAdminsIssue(issue);
+ issueData = this.generateSharedLocalAdminsIssue(issue);
break;
case 'strong_users_on_crit':
- data = this.generateStrongUsersOnCritIssue(issue);
+ issueData = this.generateStrongUsersOnCritIssue(issue);
break;
case 'tunnel':
- data = this.generateTunnelIssue(issue);
+ issueData = this.generateTunnelIssue(issue);
break;
case 'azure_password':
- data = this.generateAzureIssue(issue);
+ issueData = this.generateAzureIssue(issue);
break;
case 'struts2':
- data = this.generateStruts2Issue(issue);
+ issueData = this.generateStruts2Issue(issue);
break;
case 'weblogic':
- data = this.generateWebLogicIssue(issue);
+ issueData = this.generateWebLogicIssue(issue);
break;
case 'hadoop':
- data = this.generateHadoopIssue(issue);
+ issueData = this.generateHadoopIssue(issue);
break;
case 'mssql':
- data = this.generateMSSQLIssue(issue);
+ issueData = this.generateMSSQLIssue(issue);
break;
}
- return data;
+ return
{issueData}
;
};
generateIssues = (issues) => {
let issuesDivArray = [];
for (let machine of Object.keys(issues)) {
issuesDivArray.push(
-
+
{machine}
{issues[machine].map(this.generateIssue)}
diff --git a/monkey/monkey_island/cc/ui/src/components/report-components/common/RenderArrays.js b/monkey/monkey_island/cc/ui/src/components/report-components/common/RenderArrays.js
new file mode 100644
index 000000000..936a2825b
--- /dev/null
+++ b/monkey/monkey_island/cc/ui/src/components/report-components/common/RenderArrays.js
@@ -0,0 +1,8 @@
+import React from "react";
+
+export let renderArray = function (val) {
+ return <>{val.map(x =>
{x}
)}>;
+};
+export let renderIpAddresses = function (val) {
+ return