diff --git a/monkey/monkey_island/cc/ui/src/components/configuration-components/PropagationConfig.tsx b/monkey/monkey_island/cc/ui/src/components/configuration-components/PropagationConfig.tsx new file mode 100644 index 000000000..b00e4653d --- /dev/null +++ b/monkey/monkey_island/cc/ui/src/components/configuration-components/PropagationConfig.tsx @@ -0,0 +1,98 @@ +import Form from 'react-jsonschema-form-bs4'; +import React, {useState, useEffect} from 'react'; +import {Nav} from 'react-bootstrap'; +import _ from 'lodash'; + +const sectionOrder = [ + 'exploitation', + 'network_scan', + 'credentials', + 'maximum_depth' +]; + +const initialSection = sectionOrder[0]; + +export default function PropagationConfig(props) { + const { + schema, + uiSchema, + onChange, + customFormats, + className, + formData + } = props; + const [selectedSection, setSelectedSection] = useState(initialSection); + const [displayedSchema, setDisplayedSchema] = useState(getSchemaByKey(schema, initialSection)); + const [displayedSchemaUi, setDisplayedSchemaUi] = useState(getUiSchemaByKey(uiSchema, initialSection)); + const [localFormData, setLocalFormData] = useState(formData[initialSection]); + + useEffect(() => { + setLocalFormData(formData[selectedSection]); + setDisplayedSchema(getSchemaByKey(schema, selectedSection)); + setDisplayedSchemaUi(getUiSchemaByKey(uiSchema, selectedSection)); + setLocalFormData(formData[selectedSection]); + }, [selectedSection]) + + useEffect(() => { + setLocalFormData(formData[selectedSection]); + }, [formData]) + + const onInnerDataChange = (innerData) => { + let innerDataClone = _.clone(innerData); + let formDataClone = _.clone(formData); + + formDataClone[selectedSection] = innerDataClone.formData; + onChange({formData: formDataClone}); + } + + const setSection = (sectionKey) => { + setSelectedSection(sectionKey); + } + + const renderNav = () => { + return () + } + + + return (
+ {renderNav()} +
+ +
+
) +} + +function getSchemaByKey(schema, key) { + return schema['properties'][key]; +} + +function getUiSchemaByKey(uiSchema, key) { + return uiSchema[key]; +} + +function getNavTitle(schema, key) { + if (key === 'maximum_depth') { + return 'General'; + } + if (key === 'credentials') { + return 'Credentials'; + } + return schema['properties'][key].title; +} diff --git a/monkey/monkey_island/cc/ui/src/components/configuration-components/UiSchema.js b/monkey/monkey_island/cc/ui/src/components/configuration-components/UiSchema.js index d70a6f32c..ac9b22ead 100644 --- a/monkey/monkey_island/cc/ui/src/components/configuration-components/UiSchema.js +++ b/monkey/monkey_island/cc/ui/src/components/configuration-components/UiSchema.js @@ -30,6 +30,16 @@ export default function UiSchema(props) { } } }, + credentials: { + exploit_ssh_keys: { + items: { + public_key: { + }, + private_key: { + } + } + } + }, network_scan: { targets: { info_box: { diff --git a/monkey/monkey_island/cc/ui/src/components/pages/ConfigurePage.js b/monkey/monkey_island/cc/ui/src/components/pages/ConfigurePage.js index ead85a236..c0423d8af 100644 --- a/monkey/monkey_island/cc/ui/src/components/pages/ConfigurePage.js +++ b/monkey/monkey_island/cc/ui/src/components/pages/ConfigurePage.js @@ -8,6 +8,7 @@ import {faCheck} from '@fortawesome/free-solid-svg-icons/faCheck'; import {faExclamationCircle} from '@fortawesome/free-solid-svg-icons/faExclamationCircle'; import {formValidationFormats} from '../configuration-components/ValidationFormats'; import transformErrors from '../configuration-components/ValidationErrorMessages'; +import PropagationConfig from '../configuration-components/PropagationConfig' import UnsafeConfigOptionsConfirmationModal from '../configuration-components/UnsafeConfigOptionsConfirmationModal.js'; import isUnsafeOptionSelected from '../utils/SafeOptionValidator.js'; @@ -16,7 +17,7 @@ import ConfigImportModal from '../configuration-components/ImportConfigModal'; import applyUiSchemaManipulators from '../configuration-components/UISchemaManipulators.tsx'; import HtmlFieldDescription from '../configuration-components/HtmlFieldDescription.js'; import CONFIGURATION_TABS_PER_MODE from '../configuration-components/ConfigurationTabs.js'; -import {SCHEMA} from '../../services/configuration/config_schema.js'; +import {SCHEMA} from '../../services/configuration/configSchema.js'; import {reformatConfig} from '../configuration-components/ReformatHook'; const CONFIG_URL = '/api/agent-configuration'; @@ -296,13 +297,17 @@ class ConfigurePageComponent extends AuthComponent { formProperties['formData'], formProperties['uiSchema']); - return ( -
-
- -
-
- ) + if (this.state.selectedSection === 'propagation') { + return () + } else { + return ( +
+
+ +
+
+ ) + } }; setPbaFilenameWindows = (filename) => { diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index e0bc667de..bd6933ac2 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -6,7 +6,7 @@ import {cloneDeep} from 'lodash'; import {getDefaultPaneParams, InfoPane, WarningType} from './InfoPane'; import {MasterCheckbox, MasterCheckboxState} from './MasterCheckbox'; import ChildCheckboxContainer from './ChildCheckbox'; -import {getFullDefinitionByKey, getObjectFromRegistryByRef} from './JsonSchemaHelpers'; +import {getFullDefinitionByKey} from './JsonSchemaHelpers'; function AdvancedMultiSelectHeader(props) { const { @@ -38,14 +38,12 @@ class AdvancedMultiSelect extends React.Component { this.state = { infoPaneParams: getDefaultPaneParams( - this.props.schema.items.$ref, - this.props.registry, + this.props.schema.items, this.isUnsafeOptionSelected(selectedPluginNames) ), allPluginNames: allPluginNames, masterCheckboxState: this.getMasterCheckboxState(selectedPluginNames), - pluginDefinitions: getObjectFromRegistryByRef(this.props.schema.items.$ref, - this.props.registry).pluginDefs, + pluginDefinitions: this.props.schema.items.pluginDefs, selectedPluginNames: selectedPluginNames }; } @@ -55,23 +53,17 @@ class AdvancedMultiSelect extends React.Component { } onChange = (strValues) => { - let newValues = []; - for (let j = 0; j < strValues.length; j++) { - let found = false; - for (let i = 0; i < this.state.allPluginNames.length; i++) { - if (strValues[j] === this.state.allPluginNames[i]['name']) { - newValues.push(JSON.parse(JSON.stringify(this.props.value[i]))) - found = true; - break; - } - } - if (!found) { - newValues.push(this.state.pluginDefinitions[strValues[j]]); - } + let pluginArray = this.namesToPlugins(strValues, this.state.pluginDefinitions); + this.props.onChange(pluginArray) + this.setState({selectedPluginNames: pluginArray.map(v => v.name)}); + } + + namesToPlugins = (names, allPlugins) => { + let plugins = []; + for (let i = 0; i < names.length; i++){ + plugins.push(cloneDeep(allPlugins[names[i]])); } - newValues = JSON.parse(JSON.stringify(newValues)); - this.props.onChange(newValues) - this.setState({selectedPluginNames: newValues.map(v => v.name)}); + return plugins } // Sort options alphabetically. "Unsafe" options float to the top so that they @@ -146,14 +138,12 @@ class AdvancedMultiSelect extends React.Component { } isSafe = (itemKey) => { - let fullDef = getFullDefinitionByKey(this.props.schema.items.$ref, - this.props.registry, itemKey); + let fullDef = getFullDefinitionByKey(this.props.schema.items, itemKey); return fullDef.safe; } setPaneInfo = (itemKey) => { - let definitionObj = getFullDefinitionByKey(this.props.schema.items.$ref, - this.props.registry, itemKey); + let definitionObj = getFullDefinitionByKey(this.props.schema.items, itemKey); this.setState( { infoPaneParams: { diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js b/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js index 21e71e29f..436aae5e5 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js @@ -1,9 +1,7 @@ -import {Card, Button} from 'react-bootstrap'; +import {Button, Card} from 'react-bootstrap'; import React from 'react'; import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; import {faQuestionCircle} from '@fortawesome/free-solid-svg-icons'; - -import {getObjectFromRegistryByRef} from './JsonSchemaHelpers'; import WarningIcon from './WarningIcon'; const WarningType = { @@ -12,8 +10,8 @@ const WarningType = { MULTIPLE: 2 } -function getDefaultPaneParams(refString, registry, isUnsafeOptionSelected) { - let configSection = getObjectFromRegistryByRef(refString, registry); +function getDefaultPaneParams(items, isUnsafeOptionSelected) { + let configSection = items; return ( { title: configSection.title, diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/JsonSchemaHelpers.js b/monkey/monkey_island/cc/ui/src/components/ui-components/JsonSchemaHelpers.js index 9a3d9c66b..e320e2057 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/JsonSchemaHelpers.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/JsonSchemaHelpers.js @@ -1,19 +1,6 @@ -import {resolveObjectPath} from './utils/ObjectPathResolver'; - -function getFullDefinitionByKey(refString, registry, itemKey) { - let fullArray = getFullDefinitionsFromRegistry(refString, registry); +function getFullDefinitionByKey(items, itemKey) { + let fullArray = items.anyOf; return fullArray.filter(e => (e.enum[0] === itemKey))[0]; } -// Definitions passed to components only contains value and label, -// custom fields like "info" or "links" must be pulled from registry object using this function -function getFullDefinitionsFromRegistry(refString, registry) { - return getObjectFromRegistryByRef(refString, registry).anyOf; -} - -function getObjectFromRegistryByRef(refString, registry) { - let refArray = refString.replace('#', '').split('/'); - return resolveObjectPath(refArray, registry); -} - -export {getFullDefinitionByKey, getObjectFromRegistryByRef}; +export {getFullDefinitionByKey}; diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/utils/ObjectPathResolver.js b/monkey/monkey_island/cc/ui/src/components/ui-components/utils/ObjectPathResolver.js deleted file mode 100644 index 9fef26c7a..000000000 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/utils/ObjectPathResolver.js +++ /dev/null @@ -1,11 +0,0 @@ - -// Resolves object's path if it's specified in a dot notation. -// (e.g. params: "firstLevel.secondLevel.property", myObject) -export function resolveObjectPath(pathArray, obj) { - return pathArray.reduce(function(prev, curr) { - if(curr === '') - return prev; - else - return prev ? prev[curr] : null; - }, obj || self) -} diff --git a/monkey/monkey_island/cc/ui/src/components/utils/SafeOptionValidator.js b/monkey/monkey_island/cc/ui/src/components/utils/SafeOptionValidator.js index 52aec245d..2f9e88298 100644 --- a/monkey/monkey_island/cc/ui/src/components/utils/SafeOptionValidator.js +++ b/monkey/monkey_island/cc/ui/src/components/utils/SafeOptionValidator.js @@ -2,27 +2,27 @@ function getPluginDescriptors(schema, config) { return ([ { name: 'Brute force exploiters', - allPlugins: schema.definitions.brute_force_classes.anyOf, + allPlugins: schema.properties.propagation.properties.exploitation.properties.brute_force.items.anyOf, selectedPlugins: config.propagation.exploitation.brute_force }, { name: 'Vulnerability exploiters', - allPlugins: schema.definitions.vulnerability_classes.anyOf, + allPlugins: schema.properties.propagation.properties.exploitation.properties.vulnerability.items.anyOf, selectedPlugins: config.propagation.exploitation.vulnerability }, { name: 'Fingerprinters', - allPlugins: schema.definitions.fingerprinter_classes.anyOf, + allPlugins: schema.properties.propagation.properties.network_scan.properties.fingerprinters.items.anyOf, selectedPlugins: config.propagation.network_scan.fingerprinters }, { name: 'PostBreachActions', - allPlugins: schema.definitions.post_breach_actions.anyOf, + allPlugins: schema.properties.post_breach_actions.items.anyOf, selectedPlugins: config.post_breach_actions }, { name: 'CredentialCollectors', - allPlugins: schema.definitions.credential_collectors_classes.anyOf, + allPlugins: schema.properties.credential_collectors.items.anyOf, selectedPlugins: config.credential_collectors } ]); diff --git a/monkey/monkey_island/cc/ui/src/services/configuration/configSchema.js b/monkey/monkey_island/cc/ui/src/services/configuration/configSchema.js new file mode 100644 index 000000000..1aa888a9e --- /dev/null +++ b/monkey/monkey_island/cc/ui/src/services/configuration/configSchema.js @@ -0,0 +1,40 @@ +import PROPAGATION_CONFIGURATION_SCHEMA from './propagation/propagation.js'; +import CREDENTIAL_COLLECTORS from './credentialCollectors.js'; +import POST_BREACH_ACTIONS from './postBreachActions.js'; +import RANSOMWARE_SCHEMA from './ransomware'; +import CUSTOM_PBA_CONFIGURATION_SCHEMA from './customPBAs'; + +export const SCHEMA = { + 'title': 'Monkey', + 'type': 'object', + 'properties': { + 'propagation': PROPAGATION_CONFIGURATION_SCHEMA, + 'post_breach_actions': { + 'title': 'Post-breach actions', + 'type': 'array', + 'uniqueItems': true, + 'items': POST_BREACH_ACTIONS + }, + 'custom_pbas': CUSTOM_PBA_CONFIGURATION_SCHEMA, + 'payloads': RANSOMWARE_SCHEMA, + 'credential_collectors': { + 'title': 'Credential collectors', + 'type': 'array', + 'uniqueItems': true, + 'items': CREDENTIAL_COLLECTORS + }, + 'advanced': { + 'title': 'Advanced', + 'type': 'object', + 'properties':{ + 'keep_tunnel_open_time': { + 'title': 'Keep tunnel open time', + 'type': 'number', + 'default': 30, + 'description': 'Time to keep tunnel open before going down after last exploit (in seconds)' + } + } + } + }, + 'options': {'collapsed': true} +} diff --git a/monkey/monkey_island/cc/ui/src/services/configuration/config_schema.js b/monkey/monkey_island/cc/ui/src/services/configuration/config_schema.js deleted file mode 100644 index 6700e5e4a..000000000 --- a/monkey/monkey_island/cc/ui/src/services/configuration/config_schema.js +++ /dev/null @@ -1,58 +0,0 @@ -import {customPBAConfigurationSchema} from './definitions/custom_pbas.js'; -import {ransomwareSchema} from './definitions/ransomware.js'; -import {propagationConfigurationSchema} from './definitions/propagation.js'; -import {bruteForceExploiters, vulnerabilityExploiters} from './definitions/exploiter_classes.js'; -import {credentialCollectors} from './definitions/credential_collectors.js'; -import {postBreachActions} from './definitions/post_breach_actions.js'; -import {fingerprinterClasses} from './definitions/fingerprinter_classes.js' - -export const SCHEMA = { - 'title': 'Monkey', - 'type': 'object', - 'definitions': { - 'brute_force_classes': bruteForceExploiters, - 'vulnerability_classes': vulnerabilityExploiters, - 'credential_collectors_classes': credentialCollectors, - 'post_breach_actions': postBreachActions, - 'fingerprinter_classes': fingerprinterClasses - }, - 'properties': { - 'propagation': propagationConfigurationSchema, - 'post_breach_actions': { - 'title': 'Post-breach actions', - 'type': 'array', - 'uniqueItems': true, - 'items': { - '$ref': '#/definitions/post_breach_actions' - } - }, - 'custom_pbas': customPBAConfigurationSchema, - 'payloads': ransomwareSchema, - 'credential_collectors': { - 'title': 'Credential collectors', - 'type': 'array', - 'uniqueItems': true, - 'items': { - '$ref': '#/definitions/credential_collectors_classes' - }, - 'default': [ - 'MimikatzCollector', - 'SSHCollector' - ] - }, - 'advanced': { - 'title': 'Advanced', - 'type': 'object', - 'properties':{ - 'keep_tunnel_open_time': { - 'title': 'Keep tunnel open time', - 'format': 'float', - 'type': 'number', - 'default': 30, - 'description': 'Time to keep tunnel open before going down after last exploit (in seconds)' - } - } - } - }, - 'options': {'collapsed': true} -} diff --git a/monkey/monkey_island/cc/ui/src/services/configuration/definitions/credential_collectors.js b/monkey/monkey_island/cc/ui/src/services/configuration/credentialCollectors.js similarity index 92% rename from monkey/monkey_island/cc/ui/src/services/configuration/definitions/credential_collectors.js rename to monkey/monkey_island/cc/ui/src/services/configuration/credentialCollectors.js index 5f73c33ac..ba7b4a77b 100644 --- a/monkey/monkey_island/cc/ui/src/services/configuration/definitions/credential_collectors.js +++ b/monkey/monkey_island/cc/ui/src/services/configuration/credentialCollectors.js @@ -1,4 +1,4 @@ -export const credentialCollectors = { +const CREDENTIAL_COLLECTORS = { 'title': 'Credential Collectors', 'description': 'Click on a credential collector to find out what it collects.', 'type': 'string', @@ -23,3 +23,4 @@ export const credentialCollectors = { } ] } +export default CREDENTIAL_COLLECTORS diff --git a/monkey/monkey_island/cc/ui/src/services/configuration/definitions/custom_pbas.js b/monkey/monkey_island/cc/ui/src/services/configuration/customPBAs.js similarity index 94% rename from monkey/monkey_island/cc/ui/src/services/configuration/definitions/custom_pbas.js rename to monkey/monkey_island/cc/ui/src/services/configuration/customPBAs.js index 06d51a304..e8c5933ae 100644 --- a/monkey/monkey_island/cc/ui/src/services/configuration/definitions/custom_pbas.js +++ b/monkey/monkey_island/cc/ui/src/services/configuration/customPBAs.js @@ -1,4 +1,4 @@ -export const customPBAConfigurationSchema = { +const CUSTOM_PBA_CONFIGURATION_SCHEMA = { 'title': 'Custom PBA', 'properties': { 'linux_command': { @@ -49,3 +49,4 @@ export const customPBAConfigurationSchema = { } } } +export default CUSTOM_PBA_CONFIGURATION_SCHEMA; diff --git a/monkey/monkey_island/cc/ui/src/services/configuration/definitions/exploitation.js b/monkey/monkey_island/cc/ui/src/services/configuration/definitions/exploitation.js deleted file mode 100644 index fdbd04401..000000000 --- a/monkey/monkey_island/cc/ui/src/services/configuration/definitions/exploitation.js +++ /dev/null @@ -1,26 +0,0 @@ -import {exploitationOptionsConfigurationSchema} from './exploitation_options.js'; - -export const exploitationConfigurationSchema = { - 'title': 'Exploiters', - 'type': 'object', - 'description': 'Choose which exploiters the Monkey will attempt.', - 'properties': { - 'brute_force': { - 'title': 'Brute force exploiters', - 'type': 'array', - 'uniqueItems': true, - 'items': { - '$ref': '#/definitions/brute_force_classes' - } - }, - 'vulnerability': { - 'title': 'Vulnerability Exploiters', - 'type': 'array', - 'uniqueItems': true, - 'items': { - '$ref': '#/definitions/vulnerability_classes' - } - }, - 'options': exploitationOptionsConfigurationSchema - } -}; diff --git a/monkey/monkey_island/cc/ui/src/services/configuration/definitions/network_scan.js b/monkey/monkey_island/cc/ui/src/services/configuration/definitions/network_scan.js deleted file mode 100644 index 713ac1c82..000000000 --- a/monkey/monkey_island/cc/ui/src/services/configuration/definitions/network_scan.js +++ /dev/null @@ -1,21 +0,0 @@ -import {icmpScanConfigurationSchema} from './icmp_scan.js'; -import {scanTargetConfigurationSchema} from './scan_target.js'; -import {tcpScanConfigurationSchema} from './tcp_scan.js'; - -export const networkScanConfigurationSchema = { - 'title': 'Network analysis', - 'type': 'object', - 'properties': { - 'fingerprinters': { - 'title': 'Fingerprinters', - 'type': 'array', - 'uniqueItems': true, - 'items': { - '$ref': '#/definitions/fingerprinter_classes' - } - }, - 'icmp': icmpScanConfigurationSchema, - 'targets': scanTargetConfigurationSchema, - 'tcp': tcpScanConfigurationSchema - } -} diff --git a/monkey/monkey_island/cc/ui/src/services/configuration/definitions/exploitation_options.js b/monkey/monkey_island/cc/ui/src/services/configuration/exploitationOptions.js similarity index 76% rename from monkey/monkey_island/cc/ui/src/services/configuration/definitions/exploitation_options.js rename to monkey/monkey_island/cc/ui/src/services/configuration/exploitationOptions.js index e13d4ef7d..4995fb575 100644 --- a/monkey/monkey_island/cc/ui/src/services/configuration/definitions/exploitation_options.js +++ b/monkey/monkey_island/cc/ui/src/services/configuration/exploitationOptions.js @@ -1,4 +1,4 @@ -export const exploitationOptionsConfigurationSchema = { +const EXPLOITATION_OPTIONS_CONFIGURATION_SCHEMA = { 'title': 'Exploiters Options', 'type': 'object', 'properties': { @@ -13,3 +13,4 @@ export const exploitationOptionsConfigurationSchema = { } } } +export default EXPLOITATION_OPTIONS_CONFIGURATION_SCHEMA; diff --git a/monkey/monkey_island/cc/ui/src/services/configuration/definitions/exploiter_classes.js b/monkey/monkey_island/cc/ui/src/services/configuration/exploiterClasses.js similarity index 98% rename from monkey/monkey_island/cc/ui/src/services/configuration/definitions/exploiter_classes.js rename to monkey/monkey_island/cc/ui/src/services/configuration/exploiterClasses.js index bc7137fa1..3d03679b3 100644 --- a/monkey/monkey_island/cc/ui/src/services/configuration/definitions/exploiter_classes.js +++ b/monkey/monkey_island/cc/ui/src/services/configuration/exploiterClasses.js @@ -1,4 +1,4 @@ -export const bruteForceExploiters = { +export const BRUTE_FORCE_EXPLOITERS = { 'title': 'Brute force exploiters', 'description': 'Click on exploiter to get more information about it.' + '\u26A0' @@ -68,7 +68,7 @@ export const bruteForceExploiters = { ] } -export const vulnerabilityExploiters = { +export const VULNERABILITY_EXPLOITERS = { 'title': 'Vulnerability exploiters', 'description': 'Click on exploiter to get more information about it.' + '\u26A0 Note that using unsafe exploits may cause craches of the exploited ' + diff --git a/monkey/monkey_island/cc/ui/src/services/configuration/definitions/plugins.js b/monkey/monkey_island/cc/ui/src/services/configuration/plugins.js similarity index 100% rename from monkey/monkey_island/cc/ui/src/services/configuration/definitions/plugins.js rename to monkey/monkey_island/cc/ui/src/services/configuration/plugins.js diff --git a/monkey/monkey_island/cc/ui/src/services/configuration/definitions/post_breach_actions.js b/monkey/monkey_island/cc/ui/src/services/configuration/postBreachActions.js similarity index 98% rename from monkey/monkey_island/cc/ui/src/services/configuration/definitions/post_breach_actions.js rename to monkey/monkey_island/cc/ui/src/services/configuration/postBreachActions.js index e0606b8d1..8429dfb21 100644 --- a/monkey/monkey_island/cc/ui/src/services/configuration/definitions/post_breach_actions.js +++ b/monkey/monkey_island/cc/ui/src/services/configuration/postBreachActions.js @@ -1,4 +1,4 @@ -export const postBreachActions = { +const POST_BREACH_ACTIONS = { 'title': 'Post-Breach Actions', 'description': 'Runs scripts/commands on infected machines. These actions safely simulate what ' + 'an adversary might do after breaching a new machine. Used in ATT&CK and Zero trust reports.', @@ -109,3 +109,4 @@ export const postBreachActions = { } +export default POST_BREACH_ACTIONS; diff --git a/monkey/monkey_island/cc/ui/src/services/configuration/propagation/credentials.js b/monkey/monkey_island/cc/ui/src/services/configuration/propagation/credentials.js new file mode 100644 index 000000000..f2ba5c222 --- /dev/null +++ b/monkey/monkey_island/cc/ui/src/services/configuration/propagation/credentials.js @@ -0,0 +1,62 @@ +const CREDENTIALS = { + 'title': 'Credentials', + 'type': 'object', + 'properties': { + 'exploit_user_list': { + 'title': 'Exploit user list', + 'type': 'array', + 'uniqueItems': true, + 'items': {'type': 'string'}, + 'default': [], + 'description': 'List of usernames that will be used by exploiters that need ' + + 'credentials, like SSH brute-forcing.' + }, + 'exploit_password_list': { + 'title': 'Exploit password list', + 'type': 'array', + 'uniqueItems': true, + 'items': {'type': 'string'}, + 'default': [], + 'description': 'List of passwords that will be used by exploiters that need ' + + 'credentials, like SSH brute-forcing.' + }, + 'exploit_lm_hash_list': { + 'title': 'Exploit LM hash list', + 'type': 'array', + 'uniqueItems': true, + 'items': {'type': 'string'}, + 'default': [], + 'description': 'List of LM hashes to use on exploits using credentials' + }, + 'exploit_ntlm_hash_list': { + 'title': 'Exploit NTLM hash list', + 'type': 'array', + 'uniqueItems': true, + 'items': {'type': 'string'}, + 'default': [], + 'description': 'List of NTLM hashes to use on exploits using credentials' + }, + 'exploit_ssh_keys': { + 'title': 'SSH key pairs list', + 'type': 'array', + 'uniqueItems': true, + 'default': [], + 'items': { + 'type': 'object', + 'properties': { + 'public_key': { + 'title': 'Public Key', + 'type': 'string' + }, + 'private_key': { + 'title': 'Private Key', + 'type': 'string' + } + } + }, + 'description': 'List of SSH key pairs to use, when trying to ssh into servers' + } + } +} + +export default CREDENTIALS; diff --git a/monkey/monkey_island/cc/ui/src/services/configuration/propagation/exploitation.js b/monkey/monkey_island/cc/ui/src/services/configuration/propagation/exploitation.js new file mode 100644 index 000000000..2b24b91f3 --- /dev/null +++ b/monkey/monkey_island/cc/ui/src/services/configuration/propagation/exploitation.js @@ -0,0 +1,24 @@ +import EXPLOITATION_OPTIONS_CONFIGURATION_SCHEMA from '../exploitationOptions.js'; +import {BRUTE_FORCE_EXPLOITERS, VULNERABILITY_EXPLOITERS} from '../exploiterClasses'; + +const EXPLOITATION_CONFIGURATION_SCHEMA = { + 'title': 'Exploiters', + 'properties': { + 'brute_force': { + 'items': BRUTE_FORCE_EXPLOITERS, + 'title': 'Brute force exploiters', + 'type': 'array', + 'uniqueItems': true + }, + 'vulnerability': { + 'items': VULNERABILITY_EXPLOITERS, + 'title': 'Vulnerability Exploiters', + 'type': 'array', + 'uniqueItems': true + } + }, + 'options': EXPLOITATION_OPTIONS_CONFIGURATION_SCHEMA, + 'type': 'object' +}; + +export default EXPLOITATION_CONFIGURATION_SCHEMA; diff --git a/monkey/monkey_island/cc/ui/src/services/configuration/definitions/fingerprinter_classes.js b/monkey/monkey_island/cc/ui/src/services/configuration/propagation/fingerprinterClasses.js similarity index 95% rename from monkey/monkey_island/cc/ui/src/services/configuration/definitions/fingerprinter_classes.js rename to monkey/monkey_island/cc/ui/src/services/configuration/propagation/fingerprinterClasses.js index 1d4621599..51cba1708 100644 --- a/monkey/monkey_island/cc/ui/src/services/configuration/definitions/fingerprinter_classes.js +++ b/monkey/monkey_island/cc/ui/src/services/configuration/propagation/fingerprinterClasses.js @@ -1,4 +1,4 @@ -export const fingerprinterClasses = { +const FINGERPRINTER_CLASSES = { 'title': 'Fingerprinters', 'description': 'Fingerprint modules collect info about external services ' + 'Infection Monkey scans.', @@ -50,3 +50,5 @@ export const fingerprinterClasses = { ] } + +export default FINGERPRINTER_CLASSES; diff --git a/monkey/monkey_island/cc/ui/src/services/configuration/definitions/icmp_scan.js b/monkey/monkey_island/cc/ui/src/services/configuration/propagation/icmpScan.js similarity index 70% rename from monkey/monkey_island/cc/ui/src/services/configuration/definitions/icmp_scan.js rename to monkey/monkey_island/cc/ui/src/services/configuration/propagation/icmpScan.js index 25d72b21c..88ad74217 100644 --- a/monkey/monkey_island/cc/ui/src/services/configuration/definitions/icmp_scan.js +++ b/monkey/monkey_island/cc/ui/src/services/configuration/propagation/icmpScan.js @@ -1,12 +1,13 @@ -export const icmpScanConfigurationSchema = { +const ICMP_SCAN_CONFIGURATION_SCHEMA = { 'title': 'Ping scanner', 'type': 'object', 'properties': { 'timeout': { - 'format': 'float', 'title': 'Ping scan timeout', 'type': 'number', 'description': 'Maximum time to wait for ping response' } } } + +export default ICMP_SCAN_CONFIGURATION_SCHEMA; diff --git a/monkey/monkey_island/cc/ui/src/services/configuration/propagation/networkScan.js b/monkey/monkey_island/cc/ui/src/services/configuration/propagation/networkScan.js new file mode 100644 index 000000000..ecd7643cc --- /dev/null +++ b/monkey/monkey_island/cc/ui/src/services/configuration/propagation/networkScan.js @@ -0,0 +1,22 @@ +import ICMP_SCAN_CONFIGURATION_SCHEMA from './icmpScan.js'; +import SCAN_TARGET_CONFIGURATION_SCHEMA from './scanTarget.js'; +import FINGERPRINTER_CLASSES from './fingerprinterClasses'; +import TCP_SCAN_CONFIGURATION_SCHEMA from './tcpScan'; + +const NETWORK_SCAN_CONFIGURATION_SCHEMA = { + 'title': 'Network analysis', + 'type': 'object', + 'properties': { + 'fingerprinters': { + 'title': 'Fingerprinters', + 'type': 'array', + 'uniqueItems': true, + 'items': FINGERPRINTER_CLASSES + }, + 'icmp': ICMP_SCAN_CONFIGURATION_SCHEMA, + 'targets': SCAN_TARGET_CONFIGURATION_SCHEMA, + 'tcp': TCP_SCAN_CONFIGURATION_SCHEMA + } +} + +export default NETWORK_SCAN_CONFIGURATION_SCHEMA; diff --git a/monkey/monkey_island/cc/ui/src/services/configuration/definitions/propagation.js b/monkey/monkey_island/cc/ui/src/services/configuration/propagation/propagation.js similarity index 54% rename from monkey/monkey_island/cc/ui/src/services/configuration/definitions/propagation.js rename to monkey/monkey_island/cc/ui/src/services/configuration/propagation/propagation.js index 3099876dc..6df67ff3e 100644 --- a/monkey/monkey_island/cc/ui/src/services/configuration/definitions/propagation.js +++ b/monkey/monkey_island/cc/ui/src/services/configuration/propagation/propagation.js @@ -1,11 +1,13 @@ -import {exploitationConfigurationSchema} from './exploitation.js'; -import {networkScanConfigurationSchema} from './network_scan.js'; +import NETWORK_SCAN_CONFIGURATION_SCHEMA from './networkScan.js'; +import CREDENTIALS from './credentials'; +import EXPLOITATION_CONFIGURATION_SCHEMA from './exploitation'; -export const propagationConfigurationSchema = { +const PROPAGATION_CONFIGURATION_SCHEMA = { 'title': 'Propagation', 'type': 'object', 'properties': { - 'exploitation': exploitationConfigurationSchema, + 'exploitation': EXPLOITATION_CONFIGURATION_SCHEMA, + 'credentials': CREDENTIALS, 'maximum_depth': { 'title': 'Maximum scan depth', 'type': 'integer', @@ -18,6 +20,7 @@ export const propagationConfigurationSchema = { 'Monkey propagating too far, '+ 'if the "Local network scan" is enabled' }, - 'network_scan': networkScanConfigurationSchema + 'network_scan': NETWORK_SCAN_CONFIGURATION_SCHEMA } } +export default PROPAGATION_CONFIGURATION_SCHEMA; diff --git a/monkey/monkey_island/cc/ui/src/services/configuration/definitions/scan_target.js b/monkey/monkey_island/cc/ui/src/services/configuration/propagation/scanTarget.js similarity index 96% rename from monkey/monkey_island/cc/ui/src/services/configuration/definitions/scan_target.js rename to monkey/monkey_island/cc/ui/src/services/configuration/propagation/scanTarget.js index ba2c769e6..8d81b10e4 100644 --- a/monkey/monkey_island/cc/ui/src/services/configuration/definitions/scan_target.js +++ b/monkey/monkey_island/cc/ui/src/services/configuration/propagation/scanTarget.js @@ -1,4 +1,4 @@ -export const scanTargetConfigurationSchema = { +const SCAN_TARGET_CONFIGURATION_SCHEMA = { 'title': 'Network', 'type': 'object', 'properties': { @@ -68,3 +68,4 @@ export const scanTargetConfigurationSchema = { } } +export default SCAN_TARGET_CONFIGURATION_SCHEMA; diff --git a/monkey/monkey_island/cc/ui/src/services/configuration/definitions/tcp_scan.js b/monkey/monkey_island/cc/ui/src/services/configuration/propagation/tcpScan.js similarity index 85% rename from monkey/monkey_island/cc/ui/src/services/configuration/definitions/tcp_scan.js rename to monkey/monkey_island/cc/ui/src/services/configuration/propagation/tcpScan.js index abfdc709d..98baee38c 100644 --- a/monkey/monkey_island/cc/ui/src/services/configuration/definitions/tcp_scan.js +++ b/monkey/monkey_island/cc/ui/src/services/configuration/propagation/tcpScan.js @@ -1,4 +1,4 @@ -export const tcpScanConfigurationSchema = { +const TCP_SCAN_CONFIGURATION_SCHEMA = { 'title': 'TCP scanner', 'type': 'object', 'properties': { @@ -13,9 +13,9 @@ export const tcpScanConfigurationSchema = { }, 'timeout': { 'title': 'TCP scan timeout', - 'format': 'float', 'type': 'number', 'description': 'Maximum time to wait for TCP response.' } } } +export default TCP_SCAN_CONFIGURATION_SCHEMA; diff --git a/monkey/monkey_island/cc/ui/src/services/configuration/definitions/ransomware.js b/monkey/monkey_island/cc/ui/src/services/configuration/ransomware.js similarity index 97% rename from monkey/monkey_island/cc/ui/src/services/configuration/definitions/ransomware.js rename to monkey/monkey_island/cc/ui/src/services/configuration/ransomware.js index fa46d03c9..ea0262b69 100644 --- a/monkey/monkey_island/cc/ui/src/services/configuration/definitions/ransomware.js +++ b/monkey/monkey_island/cc/ui/src/services/configuration/ransomware.js @@ -1,4 +1,4 @@ -export const ransomwareSchema = { +const RANSOMWARE_SCHEMA = { 'title': 'Payloads', 'properties': { 'encryption': { @@ -63,3 +63,5 @@ export const ransomwareSchema = { } } } + +export default RANSOMWARE_SCHEMA;