diff --git a/monkey/monkey_island/cc/ui/src/components/report-components/common/ExternalLink.tsx b/monkey/monkey_island/cc/ui/src/components/report-components/common/ExternalLink.tsx new file mode 100644 index 000000000..14a724bb2 --- /dev/null +++ b/monkey/monkey_island/cc/ui/src/components/report-components/common/ExternalLink.tsx @@ -0,0 +1,19 @@ +import React, {ReactFragment, ReactElement} from 'react'; +import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; +import {faExternalLinkSquareAlt} from '@fortawesome/free-solid-svg-icons'; + +type Props = { + url: string, + text: string, +} + +function ExternalLink(props: Props): ReactElement { + return ( + + {props.text} + + + ) +} + +export default ExternalLink diff --git a/monkey/monkey_island/cc/ui/src/components/report-components/ransomware/AttackSection.tsx b/monkey/monkey_island/cc/ui/src/components/report-components/ransomware/AttackSection.tsx index 58e1bc1a3..10f39e4b0 100644 --- a/monkey/monkey_island/cc/ui/src/components/report-components/ransomware/AttackSection.tsx +++ b/monkey/monkey_island/cc/ui/src/components/report-components/ransomware/AttackSection.tsx @@ -3,11 +3,21 @@ import IslandHttpClient from '../../IslandHttpClient'; import {FileEncryptionTable, TableRow} from './FileEncryptionTable'; import NumberedReportSection from './NumberedReportSection'; import LoadingIcon from '../../ui-components/LoadingIcon'; +import ExternalLink from '../common/ExternalLink'; + +const ATTACK_DESCRIPTION = <> + After the attacker or malware has propagated through your network, + your data is at risk on any machine the attacker can access. It can be + encrypted and held for ransom, exfiltrated, or manipulated in + whatever way the attacker chooses. +
+
+ + -const ATTACK_DESCRIPTION = 'After the attacker or malware has propagated through your network, \ - your data is at risk on any machine the attacker can access. It can be \ - encrypted and held for ransom, exfiltrated, or manipulated in \ - whatever way the attacker chooses.' const HOSTNAME_REGEX = /^(.* - )?(\S+) :.*$/; function AttackSection(): ReactElement { diff --git a/monkey/monkey_island/cc/ui/src/components/report-components/ransomware/BreachSection.tsx b/monkey/monkey_island/cc/ui/src/components/report-components/ransomware/BreachSection.tsx index 1c2b71d99..fb4498e8e 100644 --- a/monkey/monkey_island/cc/ui/src/components/report-components/ransomware/BreachSection.tsx +++ b/monkey/monkey_island/cc/ui/src/components/report-components/ransomware/BreachSection.tsx @@ -3,11 +3,23 @@ import IslandHttpClient from '../../IslandHttpClient'; import NumberedReportSection from './NumberedReportSection'; import LoadingIcon from '../../ui-components/LoadingIcon'; import {renderLimitedArray} from '../common/RenderArrays'; +import ExternalLink from '../common/ExternalLink'; + +const BREACH_DESCRIPTION = <> + Ransomware attacks start after machines in the internal network get + compromised. The initial compromise was simulated by running Monkey Agents + manually. Detecting ransomware at this stage will minimize the impact to the + organization. +
+
+ + function BreachSection() { const [machines, setMachines] = useState(null); - let description = 'Ransomware attacks start after machines in the internal network get compromised. ' + - 'The initial compromise was simulated by running Monkey Agents manually.'; useEffect(() => { IslandHttpClient.get('/api/exploitations/manual') @@ -16,7 +28,7 @@ function BreachSection() { if(machines !== null){ let body = getBreachSectionBody(machines); - return () + return () } else { return } diff --git a/monkey/monkey_island/cc/ui/src/components/report-components/ransomware/LateralMovement.tsx b/monkey/monkey_island/cc/ui/src/components/report-components/ransomware/LateralMovement.tsx index a5f76f722..75af68ea5 100644 --- a/monkey/monkey_island/cc/ui/src/components/report-components/ransomware/LateralMovement.tsx +++ b/monkey/monkey_island/cc/ui/src/components/report-components/ransomware/LateralMovement.tsx @@ -2,19 +2,20 @@ import React, {ReactElement} from 'react'; import NumberedReportSection from './NumberedReportSection'; import pluralize from 'pluralize' import BreachedServersComponent from '../security/BreachedServers'; +import ExternalLink from '../common/ExternalLink'; -const LATERAL_MOVEMENT_DESCRIPTION = 'After the initial breach, the attacker will begin the Lateral \ - Movement phase of the attack. They will employ various \ - techniques in order to compromise other systems in your \ - network. \ -
\ -
\ - \ - See some real-world examples on Guardicore\'s blog. \ - ' +const LATERAL_MOVEMENT_DESCRIPTION = <> + After the initial breach, the attacker will begin the Lateral + Movement phase of the attack. They will employ various + techniques in order to compromise other systems in your + network. +
+
+ + type PropagationStats = { num_scanned_nodes: number, diff --git a/monkey/monkey_island/cc/ui/src/components/report-components/ransomware/NumberedReportSection.tsx b/monkey/monkey_island/cc/ui/src/components/report-components/ransomware/NumberedReportSection.tsx index c0876137b..6312fd665 100644 --- a/monkey/monkey_island/cc/ui/src/components/report-components/ransomware/NumberedReportSection.tsx +++ b/monkey/monkey_island/cc/ui/src/components/report-components/ransomware/NumberedReportSection.tsx @@ -5,7 +5,7 @@ import {faInfoCircle} from '@fortawesome/free-solid-svg-icons'; type Props = { index: number, title: string, - description: string, + description: ReactFragment, body: ReactFragment } @@ -14,7 +14,7 @@ function NumberedReportSection(props: Props): ReactElement {
- + {props.body}
@@ -27,11 +27,11 @@ function Header({index, title}: {index: number, title: string}): ReactElement { ) } -function Description({text}: {text: string}): ReactElement { +function Description({description}: {description: ReactFragment}): ReactElement { return (
- + {description}
) } diff --git a/monkey/monkey_island/cc/ui/src/styles/pages/report/RansomwareReport.scss b/monkey/monkey_island/cc/ui/src/styles/pages/report/RansomwareReport.scss index 143e3f835..57eeed88d 100644 --- a/monkey/monkey_island/cc/ui/src/styles/pages/report/RansomwareReport.scss +++ b/monkey/monkey_island/cc/ui/src/styles/pages/report/RansomwareReport.scss @@ -22,3 +22,7 @@ .ransomware-breach-section .ip-address { display: inline-block; } + +.numbered-report-section .external-link-icon { + margin-left: .25em; +}