Merge branch 'develop' into bugfix/random_pep

This commit is contained in:
Ace Pace 2020-05-05 23:57:34 +03:00
commit 2f4904d3a3
77 changed files with 10979 additions and 7378 deletions

View File

@ -53,7 +53,7 @@ script:
- cd - - cd -
- cd monkey_island/cc/ui - cd monkey_island/cc/ui
- eslint ./src --quiet - eslint ./src --quiet
- JS_WARNINGS_AMOUNT_UPPER_LIMIT=37 - JS_WARNINGS_AMOUNT_UPPER_LIMIT=490
- eslint ./src --max-warnings $JS_WARNINGS_AMOUNT_UPPER_LIMIT - eslint ./src --max-warnings $JS_WARNINGS_AMOUNT_UPPER_LIMIT
after_success: after_success:

View File

@ -4,6 +4,7 @@ from monkey_island.cc.models import Monkey
from monkey_island.cc.services.attack.technique_reports import T1210, T1197, T1110, T1075, T1003, T1059, T1086, T1082 from monkey_island.cc.services.attack.technique_reports import T1210, T1197, T1110, T1075, T1003, T1059, T1086, T1082
from monkey_island.cc.services.attack.technique_reports import T1145, T1105, T1065, T1035, T1129, T1106, T1107, T1188 from monkey_island.cc.services.attack.technique_reports import T1145, T1105, T1065, T1035, T1129, T1106, T1107, T1188
from monkey_island.cc.services.attack.technique_reports import T1090, T1041, T1222, T1005, T1018, T1016, T1021, T1064 from monkey_island.cc.services.attack.technique_reports import T1090, T1041, T1222, T1005, T1018, T1016, T1021, T1064
from monkey_island.cc.services.attack.technique_reports import T1136
from monkey_island.cc.services.attack.attack_config import AttackConfig from monkey_island.cc.services.attack.attack_config import AttackConfig
from monkey_island.cc.database import mongo from monkey_island.cc.database import mongo
from monkey_island.cc.services.reporting.report_generation_synchronisation import safe_generate_attack_report from monkey_island.cc.services.reporting.report_generation_synchronisation import safe_generate_attack_report
@ -35,7 +36,8 @@ TECHNIQUES = {'T1210': T1210.T1210,
'T1018': T1018.T1018, 'T1018': T1018.T1018,
'T1016': T1016.T1016, 'T1016': T1016.T1016,
'T1021': T1021.T1021, 'T1021': T1021.T1021,
'T1064': T1064.T1064 'T1064': T1064.T1064,
'T1136': T1136.T1136
} }
REPORT_NAME = 'new_report' REPORT_NAME = 'new_report'

View File

@ -289,6 +289,22 @@ SCHEMA = {
"description": "Data exfiltration is performed over the Command and Control channel." "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."
}
}
} }
} }
} }

View File

@ -0,0 +1,39 @@
from monkey_island.cc.services.attack.technique_reports import AttackTechnique
from monkey_island.cc.services.reporting.report import ReportService
from common.utils.attack_utils import ScanStatus
from common.data.post_breach_consts import POST_BREACH_BACKDOOR_USER, POST_BREACH_COMMUNICATE_AS_NEW_USER
from monkey_island.cc.models import Monkey
__author__ = "shreyamalviya"
class T1136(AttackTechnique):
tech_id = "T1136"
unscanned_msg = "Monkey didn't try creating a new user on the network's systems."
scanned_msg = "Monkey tried creating a new user on the network's systems, but failed."
used_msg = "Monkey created a new user on the network's systems."
@staticmethod
def get_report_data():
data = {'title': T1136.technique_title()}
scanned_nodes = ReportService.get_scanned()
status = ScanStatus.UNSCANNED.value
for node in scanned_nodes:
if node['pba_results'] != 'None':
for pba in node['pba_results']:
if pba['name'] in [POST_BREACH_BACKDOOR_USER,
POST_BREACH_COMMUNICATE_AS_NEW_USER]:
status = ScanStatus.USED.value if pba['result'][1]\
else ScanStatus.SCANNED.value
data.update({
'info': [{
'machine': {
'hostname': pba['hostname'],
'ips': node['ip_addresses'],
},
'result': ': '.join([pba['name'], pba['result'][0]])
}]
})
data.update(T1136.get_message_and_status(status))
return data

View File

@ -140,7 +140,7 @@ SCHEMA = {
}, },
], ],
}, },
"post_breach_acts": { "post_breach_actions": {
"title": "Post breach actions", "title": "Post breach actions",
"type": "string", "type": "string",
"anyOf": [ "anyOf": [
@ -150,7 +150,7 @@ SCHEMA = {
"BackdoorUser" "BackdoorUser"
], ],
"title": "Back door user", "title": "Back door user",
"attack_techniques": [] "attack_techniques": ["T1136"]
}, },
{ {
"type": "string", "type": "string",
@ -158,7 +158,7 @@ SCHEMA = {
"CommunicateAsNewUser" "CommunicateAsNewUser"
], ],
"title": "Communicate as new user", "title": "Communicate as new user",
"attack_techniques": [] "attack_techniques": ["T1136"]
}, },
], ],
}, },
@ -375,9 +375,10 @@ SCHEMA = {
"type": "array", "type": "array",
"uniqueItems": True, "uniqueItems": True,
"items": { "items": {
"$ref": "#/definitions/post_breach_acts" "$ref": "#/definitions/post_breach_actions"
}, },
"default": [ "default": [
"BackdoorUser",
"CommunicateAsNewUser" "CommunicateAsNewUser"
], ],
"description": "List of actions the Monkey will run post breach" "description": "List of actions the Monkey will run post breach"

View File

@ -1,10 +1,15 @@
{ {
"presets": [ "presets": [
"es2015", [
"stage-0", "@babel/preset-env",
"react" {
"useBuiltIns": "entry"
}
],
"@babel/preset-react"
], ],
"plugins": [ "plugins": [
"emotion" "emotion",
"@babel/plugin-proposal-class-properties"
] ]
} }

View File

@ -3,11 +3,25 @@
"plugins": [ "plugins": [
"react" "react"
], ],
"extends": [
"eslint:recommended",
"plugin:react/recommended"
],
"parserOptions": { "parserOptions": {
"ecmaVersion": 6, "ecmaVersion": 6,
"sourceType": "module", "sourceType": "module",
"allowImportExportEverywhere": false,
"ecmaFeatures": { "ecmaFeatures": {
"jsx": true "jsx": true,
"globalReturn": false
},
"babelOptions": {
"configFile": ".babelrc"
}
},
"settings": {
"react": {
"version": "detect"
} }
}, },
"env": { "env": {
@ -25,9 +39,8 @@
], ],
"no-undef": 1, "no-undef": 1,
"global-strict": 0, "global-strict": 0,
"no-extra-semi": 1,
"no-underscore-dangle": 0, "no-underscore-dangle": 0,
"no-console": 1, "no-console": 0,
"no-unused-vars": 1, "no-unused-vars": 1,
"no-trailing-spaces": [ "no-trailing-spaces": [
1, 1,
@ -38,6 +51,14 @@
"no-unreachable": 1, "no-unreachable": 1,
"no-alert": 0, "no-alert": 0,
"react/jsx-uses-react": 1, "react/jsx-uses-react": 1,
"react/jsx-uses-vars": 1 "react/jsx-uses-vars": 1,
"react/jsx-key": 1,
"react/prop-types": 1,
"react/no-unescaped-entities": 1,
"react/no-unknown-property": [1, { "ignore": ["class"] }],
"react/no-string-refs": 1,
"react/display-name": 1,
"no-useless-escape": 1,
"no-prototype-builtins": 1
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -21,23 +21,23 @@
"repository": "", "repository": "",
"keywords": [], "keywords": [],
"author": "Guardicore", "author": "Guardicore",
"browserslist": "> 0.25%, not dead",
"devDependencies": { "devDependencies": {
"babel-cli": "^6.26.0", "@babel/cli": "^7.8.4",
"babel-core": "^6.26.3", "@babel/core": "^7.9.6",
"babel-eslint": "^8.2.6", "@babel/plugin-proposal-class-properties": "^7.8.3",
"babel-loader": "^7.1.5", "@babel/plugin-transform-runtime": "^7.9.6",
"babel-polyfill": "^6.26.0", "@babel/preset-env": "^7.9.6",
"babel-preset-env": "^1.7.0", "@babel/preset-react": "^7.9.0",
"babel-preset-es2015": "^6.24.1", "@babel/runtime": "^7.9.6",
"babel-preset-react": "^6.24.1", "babel-eslint": "^10.1.0",
"babel-preset-stage-0": "^6.5.0", "babel-loader": "^8.0.0",
"bower-webpack-plugin": "^0.1.9",
"chai": "^4.2.0", "chai": "^4.2.0",
"copyfiles": "^2.1.1", "copyfiles": "^2.2.0",
"css-loader": "^1.0.1", "css-loader": "^3.5.0",
"eslint": "^5.16.0", "eslint": "^6.8.0",
"eslint-loader": "^2.2.1", "eslint-loader": "^4.0.1",
"eslint-plugin-react": "^7.16.0", "eslint-plugin-react": "^7.19.0",
"file-loader": "^1.1.11", "file-loader": "^1.1.11",
"glob": "^7.1.6", "glob": "^7.1.6",
"html-loader": "^0.5.5", "html-loader": "^0.5.5",
@ -50,21 +50,22 @@
"karma-phantomjs-launcher": "^1.0.0", "karma-phantomjs-launcher": "^1.0.0",
"karma-sourcemap-loader": "^0.3.5", "karma-sourcemap-loader": "^0.3.5",
"karma-webpack": "^3.0.5", "karma-webpack": "^3.0.5",
"minimist": "^1.2.0", "minimist": "^1.2.5",
"mocha": "^5.2.0", "mocha": "^5.2.0",
"null-loader": "^0.1.1", "null-loader": "^0.1.1",
"phantomjs-prebuilt": "^2.1.16", "phantomjs-prebuilt": "^2.1.16",
"react-addons-test-utils": "^15.6.2", "react-addons-test-utils": "^15.6.2",
"react-event-timeline": "^1.6.3", "react-event-timeline": "^1.6.3",
"react-hot-loader": "^4.12.18", "react-hot-loader": "^4.12.20",
"rimraf": "^2.7.1", "rimraf": "^2.7.1",
"style-loader": "^0.22.1", "style-loader": "^0.22.1",
"url-loader": "^1.1.2", "url-loader": "^1.1.2",
"webpack": "^4.41.2", "webpack": "^4.43.0",
"webpack-cli": "^3.3.10", "webpack-cli": "^3.3.11",
"webpack-dev-server": "^3.9.0" "webpack-dev-server": "^3.10.3"
}, },
"dependencies": { "dependencies": {
"@babel/polyfill": "^7.8.0",
"@emotion/core": "^10.0.22", "@emotion/core": "^10.0.22",
"@fortawesome/fontawesome-svg-core": "^1.2.25", "@fortawesome/fontawesome-svg-core": "^1.2.25",
"@fortawesome/free-regular-svg-icons": "^5.11.2", "@fortawesome/free-regular-svg-icons": "^5.11.2",
@ -110,6 +111,7 @@
"react-tooltip-lite": "^1.10.0", "react-tooltip-lite": "^1.10.0",
"redux": "^4.0.4", "redux": "^4.0.4",
"sass-loader": "^7.3.1", "sass-loader": "^7.3.1",
"sha3": "^2.0.7" "sha3": "^2.0.7",
"stylelint": "^13.3.3"
} }
} }

View File

@ -1,9 +1,9 @@
/*eslint no-console:0 */ /*eslint no-console:0 */
'use strict'; 'use strict';
require('core-js/fn/object/assign'); import assign from 'core-js/fn/object'
const webpack = require('webpack'); import webpack from 'webpack'
const WebpackDevServer = require('webpack-dev-server'); import WebpackDevServer from 'webpack-dev-server'
const config = require('./webpack.config'); import config from './webpack.config'
/** /**
* Flag indicating whether webpack compiled for the first time. * Flag indicating whether webpack compiled for the first time.

View File

@ -2,7 +2,8 @@ import React from 'react';
import {BrowserRouter as Router, NavLink, Redirect, Route, Switch} from 'react-router-dom'; import {BrowserRouter as Router, NavLink, Redirect, Route, Switch} from 'react-router-dom';
import {Col, Grid, Row} from 'react-bootstrap'; import {Col, Grid, Row} from 'react-bootstrap';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faCheck, faUndo } from '@fortawesome/free-solid-svg-icons' import { faCheck } from '@fortawesome/free-solid-svg-icons/faCheck'
import { faUndo } from '@fortawesome/free-solid-svg-icons/faUndo'
import RunServerPage from 'components/pages/RunServerPage'; import RunServerPage from 'components/pages/RunServerPage';
import ConfigurePage from 'components/pages/ConfigurePage'; import ConfigurePage from 'components/pages/ConfigurePage';
@ -25,10 +26,10 @@ import 'react-toggle/style.css';
import 'react-table/react-table.css'; import 'react-table/react-table.css';
import VersionComponent from './side-menu/VersionComponent'; import VersionComponent from './side-menu/VersionComponent';
let logoImage = require('../images/monkey-icon.svg'); import logoImage from '../images/monkey-icon.svg';
let infectionMonkeyImage = require('../images/infection-monkey.svg'); import infectionMonkeyImage from '../images/infection-monkey.svg';
let guardicoreLogoImage = require('../images/guardicore-logo.png'); import guardicoreLogoImage from '../images/guardicore-logo.png';
let notificationIcon = require('../images/notification-logo-512x512.png'); import notificationIcon from '../images/notification-logo-512x512.png';
const reportZeroTrustRoute = '/report/zeroTrust'; const reportZeroTrustRoute = '/report/zeroTrust';
@ -125,7 +126,7 @@ class AppComponent extends AuthComponent {
<Row> <Row>
<Col sm={3} md={2} className='sidebar'> <Col sm={3} md={2} className='sidebar'>
<div className='header'> <div className='header'>
<img src={logoImage} style={{width: '5vw', margin: '15px'}}/> <img alt="logo" src={logoImage} style={{width: '5vw', margin: '15px'}}/>
<img src={infectionMonkeyImage} style={{width: '15vw'}} alt='Infection Monkey'/> <img src={infectionMonkeyImage} style={{width: '15vw'}} alt='Infection Monkey'/>
</div> </div>
@ -188,7 +189,7 @@ class AppComponent extends AuthComponent {
<hr/> <hr/>
<div className='guardicore-link text-center' style={{'marginBottom': '0.5em'}}> <div className='guardicore-link text-center' style={{'marginBottom': '0.5em'}}>
<span>Powered by</span> <span>Powered by</span>
<a href='http://www.guardicore.com' target='_blank'> <a href='http://www.guardicore.com' rel="noopener noreferrer" target='_blank'>
<img src={guardicoreLogoImage} alt='GuardiCore'/> <img src={guardicoreLogoImage} alt='GuardiCore'/>
</a> </a>
</div> </div>

View File

@ -8,8 +8,8 @@ import '../../styles/Tooltip.scss';
import {Col} from 'react-bootstrap'; import {Col} from 'react-bootstrap';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faCircle as faCircle } from '@fortawesome/free-solid-svg-icons'; import { faCircle as faCircle } from '@fortawesome/free-solid-svg-icons/faCircle';
import { faCircle as faCircleThin } from '@fortawesome/free-regular-svg-icons'; import { faCircle as faCircleThin } from '@fortawesome/free-regular-svg-icons/faCircle';
class ConfigMatrixComponent extends AuthComponent { class ConfigMatrixComponent extends AuthComponent {
constructor(props) { constructor(props) {

View File

@ -49,7 +49,7 @@ class MitigationsComponent extends React.Component {
static getMitigationName(name, url) { static getMitigationName(name, url) {
if(url){ if(url){
return (<a href={url} target={'_blank'}>{name}</a>) return (<a href={url} rel="noopener noreferrer" target={'_blank'}>{name}</a>)
} else { } else {
return (<p>{name}</p>) return (<p>{name}</p>)
} }

View File

@ -0,0 +1,43 @@
import React from 'react';
import ReactTable from 'react-table';
import {renderMachineFromSystemData, ScanStatus} from './Helpers'
class T1136 extends React.Component {
constructor(props) {
super(props);
}
static getColumns() {
return ([{
columns: [
{ Header: 'Machine',
id: 'machine',
accessor: x => renderMachineFromSystemData(x.machine),
style: {'whiteSpace': 'unset'}},
{ Header: 'Result',
id: 'result',
accessor: x => x.result,
style: {'whiteSpace': 'unset'}}
]
}])
}
render() {
return (
<div>
<div>{this.props.data.message}</div>
<br/>
{this.props.data.status === ScanStatus.USED ?
<ReactTable
columns={T1136.getColumns()}
data={this.props.data.info}
showPagination={false}
defaultPageSize={this.props.data.info.length}
/> : ''}
</div>
);
}
}
export default T1136;

View File

@ -1,6 +1,6 @@
import React from 'react'; import React from 'react';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faHandPointLeft } from '@fortawesome/free-solid-svg-icons' import { faHandPointLeft } from '@fortawesome/free-solid-svg-icons/faHandPointLeft'
import Toggle from 'react-toggle'; import Toggle from 'react-toggle';
import {OverlayTrigger, Tooltip} from 'react-bootstrap'; import {OverlayTrigger, Tooltip} from 'react-bootstrap';
import download from 'downloadjs' import download from 'downloadjs'

View File

@ -346,8 +346,8 @@ class ConfigurePageComponent extends AuthComponent {
throw Error() throw Error()
} }
return res; return res;
}).catch(error => { }).catch((error) => {
console.log('bad configuration'); console.log(`bad configuration ${error}`);
this.setState({lastAction: 'invalid_configuration'}); this.setState({lastAction: 'invalid_configuration'});
})); }));
} }

View File

@ -21,10 +21,10 @@ class LicensePageComponent extends React.Component {
<p> <p>
Copyright <i className="glyphicon glyphicon-copyright-mark"/> {rainge(2015)} Guardicore Ltd. Copyright <i className="glyphicon glyphicon-copyright-mark"/> {rainge(2015)} Guardicore Ltd.
<br/> <br/>
Licensed under <a href="https://www.gnu.org/licenses/gpl-3.0.html" target="_blank">GPLv3</a>. Licensed under <a href="https://www.gnu.org/licenses/gpl-3.0.html" rel="noopener noreferrer" target="_blank">GPLv3</a>.
</p> </p>
<p> <p>
The source code is available on <a href="https://github.com/guardicore/monkey" target="_blank">GitHub</a> The source code is available on <a href="https://github.com/guardicore/monkey" rel="noopener noreferrer" target="_blank">GitHub</a>
</p> </p>
</div> </div>
</Col> </Col>

View File

@ -2,7 +2,8 @@ import React from 'react';
import {Col, Modal} from 'react-bootstrap'; import {Col, Modal} from 'react-bootstrap';
import {Link} from 'react-router-dom'; import {Link} from 'react-router-dom';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faStopCircle, faMinus } from '@fortawesome/free-solid-svg-icons' import { faStopCircle } from '@fortawesome/free-solid-svg-icons/faStopCircle'
import { faMinus } from '@fortawesome/free-solid-svg-icons/faMinus'
import PreviewPaneComponent from 'components/map/preview-pane/PreviewPane'; import PreviewPaneComponent from 'components/map/preview-pane/PreviewPane';
import {ReactiveGraph} from 'components/reactive-graph/ReactiveGraph'; import {ReactiveGraph} from 'components/reactive-graph/ReactiveGraph';
import {getOptions, edgeGroupToColor} from 'components/map/MapOptions'; import {getOptions, edgeGroupToColor} from 'components/map/MapOptions';

View File

@ -2,7 +2,7 @@ import React from 'react';
import '../../styles/NotFoundPage.scss'; import '../../styles/NotFoundPage.scss';
let monkeyDetective = require('../../images/detective-monkey.svg'); import monkeyDetective from '../../images/detective-monkey.svg';
class ConfigurePageComponent extends React.Component{ class ConfigurePageComponent extends React.Component{
constructor(props) { constructor(props) {
@ -12,7 +12,7 @@ class ConfigurePageComponent extends React.Component{
render(){ render(){
return( return(
<div className={'not-found'}> <div className={'not-found'}>
<img className={'monkey-detective'} src={monkeyDetective}/> <img alt="404 monkey image" className={'monkey-detective'} src={monkeyDetective}/>
<div className={'text-block'}> <div className={'text-block'}>
<h1 className={'not-found-title'}>404</h1> <h1 className={'not-found-title'}>404</h1>
<h2 className={'not-found-subtitle'}>Page not found</h2> <h2 className={'not-found-subtitle'}>Page not found</h2>

View File

@ -5,7 +5,9 @@ import CopyToClipboard from 'react-copy-to-clipboard';
import GridLoader from 'react-spinners/GridLoader'; import GridLoader from 'react-spinners/GridLoader';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faClipboard, faCheck, faSync } from '@fortawesome/free-solid-svg-icons'; import { faClipboard } from '@fortawesome/free-solid-svg-icons/faClipboard';
import { faCheck } from '@fortawesome/free-solid-svg-icons/faCheck';
import { faSync } from '@fortawesome/free-solid-svg-icons/faSync';
import {Link} from 'react-router-dom'; import {Link} from 'react-router-dom';
import AuthComponent from '../AuthComponent'; import AuthComponent from '../AuthComponent';
@ -254,7 +256,7 @@ class RunMonkeyPageComponent extends AuthComponent {
<i className="glyphicon glyphicon-info-sign" style={{'marginRight': '5px'}}/> <i className="glyphicon glyphicon-info-sign" style={{'marginRight': '5px'}}/>
Not sure what this is? Not seeing your AWS EC2 instances? <a Not sure what this is? Not seeing your AWS EC2 instances? <a
href="https://github.com/guardicore/monkey/wiki/Monkey-Island:-Running-the-monkey-on-AWS-EC2-instances" href="https://github.com/guardicore/monkey/wiki/Monkey-Island:-Running-the-monkey-on-AWS-EC2-instances"
target="_blank">Read the documentation</a>! rel="noopener noreferrer" target="_blank">Read the documentation</a>!
</p> </p>
</div> </div>
{ {

View File

@ -22,7 +22,7 @@ class RunServerPageComponent extends React.Component {
</p> </p>
<p> <p>
To read more about the Monkey, visit <a href="http://infectionmonkey.com" To read more about the Monkey, visit <a href="http://infectionmonkey.com"
target="_blank">infectionmonkey.com</a> rel="noopener noreferrer" target="_blank">infectionmonkey.com</a>
</p> </p>
<p> <p>
Go ahead and <Link to="/run-monkey">run the monkey</Link>. Go ahead and <Link to="/run-monkey">run the monkey</Link>.

View File

@ -3,7 +3,10 @@ import {Col, Button} from 'react-bootstrap';
import '../../styles/Collapse.scss'; import '../../styles/Collapse.scss';
import '../../styles/report/AttackReport.scss'; import '../../styles/report/AttackReport.scss';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import {faCircle, faEye, faEyeSlash, faRadiation} from '@fortawesome/free-solid-svg-icons'; import {faCircle} from '@fortawesome/free-solid-svg-icons/faCircle';
import {faRadiation} from '@fortawesome/free-solid-svg-icons/faRadiation';
import {faEye} from '@fortawesome/free-solid-svg-icons/faEye';
import {faEyeSlash} from '@fortawesome/free-solid-svg-icons/faEyeSlash';
import ReportHeader, {ReportTypes} from './common/ReportHeader'; import ReportHeader, {ReportTypes} from './common/ReportHeader';
import {ScanStatus} from '../attack/techniques/Helpers'; import {ScanStatus} from '../attack/techniques/Helpers';

View File

@ -16,9 +16,8 @@ import SecurityIssuesGlance from './common/SecurityIssuesGlance';
import PrintReportButton from './common/PrintReportButton'; import PrintReportButton from './common/PrintReportButton';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faMinus } from '@fortawesome/free-solid-svg-icons'; import { faMinus } from '@fortawesome/free-solid-svg-icons/faMinus';
import guardicoreLogoImage from '../../images/guardicore-logo.png'
let guardicoreLogoImage = require('../../images/guardicore-logo.png');
class ReportPageComponent extends AuthComponent { class ReportPageComponent extends AuthComponent {

View File

@ -20,7 +20,7 @@ class ReportMatrixComponent extends React.Component {
} }
let tech_type = this.state.schema.properties[type_key]; let tech_type = this.state.schema.properties[type_key];
columns.push({ columns.push({
Header: () => (<a href={tech_type.link} target="_blank">{tech_type.title}</a>), Header: () => (<a href={tech_type.link} rel="noopener noreferrer" target="_blank">{tech_type.title}</a>),
id: type_key, id: type_key,
accessor: x => this.renderTechnique(x[tech_type.title]), accessor: x => this.renderTechnique(x[tech_type.title]),
style: {'whiteSpace': 'unset'} style: {'whiteSpace': 'unset'}

View File

@ -3,9 +3,9 @@ import Collapse from '@kunukn/react-collapse';
import AttackReport from '../AttackReport'; import AttackReport from '../AttackReport';
import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; import {FontAwesomeIcon} from '@fortawesome/react-fontawesome';
import {faQuestionCircle} from '@fortawesome/free-solid-svg-icons'; import {faQuestionCircle} from '@fortawesome/free-solid-svg-icons/faQuestionCircle';
const classNames = require('classnames'); import classNames from 'classnames';
class SelectedTechnique extends React.Component { class SelectedTechnique extends React.Component {
@ -37,7 +37,7 @@ class SelectedTechnique extends React.Component {
{this.state.techniques[tech_id].title} {this.state.techniques[tech_id].title}
</span> </span>
<span> <span>
<a href={this.state.techniques[tech_id].link} target='_blank' className={'link-to-technique'}> <a href={this.state.techniques[tech_id].link} rel="noopener noreferrer" target='_blank' className={'link-to-technique'}>
<FontAwesomeIcon icon={faQuestionCircle}/> <FontAwesomeIcon icon={faQuestionCircle}/>
</a> </a>
</span> </span>

View File

@ -1,12 +1,15 @@
import React from 'react'; import React from 'react';
import Collapse from '@kunukn/react-collapse'; import Collapse from '@kunukn/react-collapse';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faQuestionCircle, faChevronUp, faChevronDown, faToggleOn } from '@fortawesome/free-solid-svg-icons' import { faQuestionCircle } from '@fortawesome/free-solid-svg-icons/faQuestionCircle'
import { faChevronUp } from '@fortawesome/free-solid-svg-icons/faChevronUp'
import { faChevronDown } from '@fortawesome/free-solid-svg-icons/faChevronDown'
import { faToggleOn } from '@fortawesome/free-solid-svg-icons/faToggleON'
import {Button} from 'react-bootstrap'; import {Button} from 'react-bootstrap';
import AttackReport from '../AttackReport'; import AttackReport from '../AttackReport';
const classNames = require('classnames'); import classNames from 'classnames';
class TechniqueDropdowns extends React.Component{ class TechniqueDropdowns extends React.Component{
@ -40,7 +43,7 @@ class TechniqueDropdowns extends React.Component{
{this.state.techniques[tech_id].title} {this.state.techniques[tech_id].title}
</span> </span>
<span> <span>
<a href={this.state.techniques[tech_id].link} target='_blank' className={'link-to-technique'}> <a href={this.state.techniques[tech_id].link} rel="noopener noreferrer" target='_blank' className={'link-to-technique'}>
<FontAwesomeIcon icon={faQuestionCircle}/> <FontAwesomeIcon icon={faQuestionCircle}/>
</a> </a>
<FontAwesomeIcon icon={this.state.collapseOpen === tech_id ? faChevronDown : faChevronUp}/> <FontAwesomeIcon icon={this.state.collapseOpen === tech_id ? faChevronDown : faChevronUp}/>

View File

@ -2,7 +2,7 @@ import React, {Component} from 'react';
import {Col} from 'react-bootstrap'; import {Col} from 'react-bootstrap';
import * as PropTypes from 'prop-types'; import * as PropTypes from 'prop-types';
let monkeyLogoImage = require('../../../images/monkey-icon.svg'); import monkeyLogoImage from '../../../images/monkey-icon.svg';
export const ReportTypes = { export const ReportTypes = {
zeroTrust: 'Zero Trust', zeroTrust: 'Zero Trust',
@ -29,7 +29,7 @@ export class ReportHeader extends Component {
</div> </div>
</Col> </Col>
<Col xs={4}> <Col xs={4}>
<img src={monkeyLogoImage} <img alt="monkey logo image" src={monkeyLogoImage}
style={{ style={{
float: 'right', float: 'right',
width: '80px' width: '80px'

View File

@ -4,7 +4,7 @@ import {Badge, Button} from 'react-bootstrap';
import * as PropTypes from 'prop-types'; import * as PropTypes from 'prop-types';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faList } from '@fortawesome/free-solid-svg-icons'; import { faList } from '@fortawesome/free-solid-svg-icons/faList';
export default class EventsButton extends Component { export default class EventsButton extends Component {
constructor(props) { constructor(props) {

View File

@ -1,11 +1,10 @@
import React, {Component} from 'react'; import React, {Component} from 'react';
import {Badge, Modal} from 'react-bootstrap'; import {Modal} from 'react-bootstrap';
import EventsTimeline from './EventsTimeline'; import EventsTimeline from './EventsTimeline';
import * as PropTypes from 'prop-types'; import * as PropTypes from 'prop-types';
import saveJsonToFile from '../../utils/SaveJsonToFile'; import saveJsonToFile from '../../utils/SaveJsonToFile';
import EventsModalButtons from './EventsModalButtons'; import EventsModalButtons from './EventsModalButtons';
import Pluralize from 'pluralize' import Pluralize from 'pluralize'
import {statusToLabelType} from './StatusLabel';
export default class EventsModal extends Component { export default class EventsModal extends Component {
constructor(props) { constructor(props) {

View File

@ -2,8 +2,8 @@ import React, {Component} from 'react';
import {Timeline, TimelineEvent} from 'react-event-timeline'; import {Timeline, TimelineEvent} from 'react-event-timeline';
import * as PropTypes from 'prop-types'; import * as PropTypes from 'prop-types';
let monkeyLocalIcon = require('../../../images/zerotrust/im-alert-machine-icon.svg'); import monkeyLocalIcon from '../../../images/zerotrust/im-alert-machine-icon.svg';
let monkeyNetworkIcon = require('../../../images/zerotrust/im-alert-network-icon.svg'); import monkeyNetworkIcon from '../../../images/zerotrust/im-alert-network-icon.svg';
const eventTypeToIcon = { const eventTypeToIcon = {
'monkey_local': monkeyLocalIcon, 'monkey_local': monkeyLocalIcon,

View File

@ -3,7 +3,7 @@ import {Button} from 'react-bootstrap';
import * as PropTypes from 'prop-types'; import * as PropTypes from 'prop-types';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faDownload } from '@fortawesome/free-solid-svg-icons'; import { faDownload } from '@fortawesome/free-solid-svg-icons/faDownload';
export default class ExportEventsButton extends Component { export default class ExportEventsButton extends Component {
render() { render() {

View File

@ -1,7 +1,5 @@
import React, {Component, Fragment} from 'react'; import React, {Component} from 'react';
import PillarLabel from './PillarLabel'; import {ZeroTrustStatuses} from './ZeroTrustPillars';
import EventsButton from './EventsButton';
import ZeroTrustPillars, {ZeroTrustStatuses} from './ZeroTrustPillars';
import {FindingsTable} from './FindingsTable'; import {FindingsTable} from './FindingsTable';

View File

@ -3,7 +3,13 @@ import {statusToLabelType} from './StatusLabel';
import * as PropTypes from 'prop-types'; import * as PropTypes from 'prop-types';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faDatabase, faUser, faWifi, faCloud, faLaptop, faEyeSlash, faCogs } from '@fortawesome/free-solid-svg-icons'; import { faDatabase } from '@fortawesome/free-solid-svg-icons/faDatabase';
import { faUser } from '@fortawesome/free-solid-svg-icons/faUser';
import { faWifi } from '@fortawesome/free-solid-svg-icons/faWifi';
import { faCloud } from '@fortawesome/free-solid-svg-icons/faCloud';
import { faLaptop } from '@fortawesome/free-solid-svg-icons/faLaptop';
import { faEyeSlash } from '@fortawesome/free-solid-svg-icons/faEyeSlash';
import { faCogs } from '@fortawesome/free-solid-svg-icons/faCogs';
const pillarToIcon = { const pillarToIcon = {
'Data': faDatabase, 'Data': faDatabase,

View File

@ -5,7 +5,7 @@ import {NavLink} from 'react-router-dom';
import {Panel} from 'react-bootstrap'; import {Panel} from 'react-bootstrap';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faChevronDown } from '@fortawesome/free-solid-svg-icons'; import { faChevronDown } from '@fortawesome/free-solid-svg-icons/faChevronDown';
class ZeroTrustReportLegend extends Component { class ZeroTrustReportLegend extends Component {

View File

@ -2,7 +2,10 @@ import React, {Component} from 'react';
import * as PropTypes from 'prop-types'; import * as PropTypes from 'prop-types';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faCheck, faExclamationTriangle, faBomb, faQuestion } from '@fortawesome/free-solid-svg-icons'; import { faCheck } from '@fortawesome/free-solid-svg-icons/faCheck';
import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons/faExclamationTriangle';
import { faBomb } from '@fortawesome/free-solid-svg-icons/faBomb';
import { faQuestion } from '@fortawesome/free-solid-svg-icons/faQuestion';
const statusToIcon = { const statusToIcon = {
'Passed': faCheck, 'Passed': faCheck,

View File

@ -1,7 +1,7 @@
import React from 'react'; import React from 'react';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faDownload } from '@fortawesome/free-solid-svg-icons'; import { faDownload } from '@fortawesome/free-solid-svg-icons/faDownload';
class VersionComponent extends React.Component { class VersionComponent extends React.Component {
constructor(props) { constructor(props) {
@ -34,7 +34,7 @@ class VersionComponent extends React.Component {
<div> <div>
<b>Newer version available!</b> <b>Newer version available!</b>
<br/> <br/>
<b><a target="_blank" href={this.state.downloadLink}>Download here <FontAwesomeIcon icon={faDownload}/></a></b> <b><a rel="noopener noreferrer" target="_blank" href={this.state.downloadLink}>Download here <FontAwesomeIcon icon={faDownload}/></a></b>
</div> </div>
: :
undefined undefined

View File

@ -83,7 +83,7 @@ class CheckboxComponent extends React.PureComponent {
type='checkbox' value={this.state.checked} type='checkbox' value={this.state.checked}
name={this.props.name}/> name={this.props.name}/>
<label className='text'>{this.props.children}</label> <label className='text'>{this.props.children}</label>
<div className='ui-btn-ping' onTransitionEnd={this.stopAnimation}></div> <div className='ui-btn-ping' onTransitionEnd={this.stopAnimation}/>
</div> </div>
) )
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 163 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 167 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 8.1 KiB

View File

@ -1,11 +1,14 @@
<!doctype html> <!doctype html>
<html> <html lang="en">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<title>Infection Monkey Island Server</title> <title>Infection Monkey Island Server</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="description" content=""> <meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<link rel="preconnect" href="//fonts.googleapis.com">
<link rel="preconnect" href="//fonts.gstatic.com">
<link rel="preconnect" href="//netdna.bootstrapcdn.com">
</head> </head>
<body> <body>
<div id="app"></div> <div id="app"></div>

View File

@ -1,7 +1,7 @@
import '@babel/polyfill';
import 'core-js/fn/object/assign'; import 'core-js/fn/object/assign';
import React from 'react'; import React from 'react';
import ReactDOM from 'react-dom'; import ReactDOM from 'react-dom';
import 'babel-polyfill';
import App from './components/Main'; import App from './components/Main';
import Bootstrap from 'bootstrap/dist/css/bootstrap.css'; // eslint-disable-line no-unused-vars import Bootstrap from 'bootstrap/dist/css/bootstrap.css'; // eslint-disable-line no-unused-vars

View File

@ -2,7 +2,7 @@ import StandardConfig from './StandardConfig';
import AwsConfig from './AwsConfig'; import AwsConfig from './AwsConfig';
import PasswordConfig from './PasswordConfig'; import PasswordConfig from './PasswordConfig';
const SERVER_CONFIG_JSON = require('../../../server_config.json'); import SERVER_CONFIG_JSON from '../../../server_config.json';
const CONFIG_DICT = const CONFIG_DICT =
{ {

View File

@ -1,5 +1,4 @@
@import url('https://fonts.googleapis.com/css?family=Open+Sans'); @import url('https://fonts.googleapis.com/css?family=Open+Sans|Alegreya&display=swap');
@import url('https://fonts.googleapis.com/css?family=Alegreya');
/* Base Application Styles */ /* Base Application Styles */

View File

@ -8,7 +8,7 @@ module.exports = {
test: /\.js$/, test: /\.js$/,
exclude: /node_modules/, exclude: /node_modules/,
use: { use: {
loader: "babel-loader" loader: "babel-loader",
} }
}, },
{ {