diff --git a/monkey/agent_plugins/exploiters/hadoop/config-schema.json b/monkey/agent_plugins/exploiters/hadoop/config-schema.json index 0625b9f58ad..7a5a2be19d4 100644 --- a/monkey/agent_plugins/exploiters/hadoop/config-schema.json +++ b/monkey/agent_plugins/exploiters/hadoop/config-schema.json @@ -1,6 +1,4 @@ { - "title": "Hadoop/Yarn Exploiter", - "description": "Remote code execution on a Hadoop server with YARN and default settings. Logic based on https://github.com/vulhub/vulhub/tree/master/hadoop/unauthorized-yarn.", "required": [ "target_ports", "request_timeout", diff --git a/monkey/agent_plugins/exploiters/hadoop/manifest.yaml b/monkey/agent_plugins/exploiters/hadoop/manifest.yaml index c709eb487e9..1c36a0c3c0f 100644 --- a/monkey/agent_plugins/exploiters/hadoop/manifest.yaml +++ b/monkey/agent_plugins/exploiters/hadoop/manifest.yaml @@ -9,7 +9,8 @@ target_operating_systems: title: Hadoop/YARN Exploiter description: >- Remote code execution on Hadoop server with YARN and default settings. - Logic based on https://github.com/vulhub/vulhub/tree/master/hadoop/unauthorized-yarn. + + Logic based on [POC in vulnhub](https://github.com/vulhub/vulhub/tree/master/hadoop/unauthorized-yarn). safe: true remediation_suggestion: >- Run Hadoop in secure mode ([add Kerberos authentication]( diff --git a/monkey/monkey_island/cc/ui/src/components/configuration-components/MarkdownDescriptionTemplate.tsx b/monkey/monkey_island/cc/ui/src/components/configuration-components/MarkdownDescriptionTemplate.tsx new file mode 100644 index 00000000000..c50ac006b36 --- /dev/null +++ b/monkey/monkey_island/cc/ui/src/components/configuration-components/MarkdownDescriptionTemplate.tsx @@ -0,0 +1,17 @@ +import {DescriptionFieldProps} from '@rjsf/utils'; +import React from 'react'; +import remarkBreaks from 'remark-breaks'; +import ReactMarkdown from 'react-markdown'; + + +function MarkdownDescriptionTemplate(props: DescriptionFieldProps) { + const {description, id} = props; + return ( + <ReactMarkdown plugins={[remarkBreaks]} + linkTarget={'_blank'} + className={'markdown'} + children={description}/> + ); +} + +export default MarkdownDescriptionTemplate; diff --git a/monkey/monkey_island/cc/ui/src/components/configuration-components/PluginSelectorTemplate.tsx b/monkey/monkey_island/cc/ui/src/components/configuration-components/PluginSelectorTemplate.tsx index a46d8b4c715..a1ac61a3143 100644 --- a/monkey/monkey_island/cc/ui/src/components/configuration-components/PluginSelectorTemplate.tsx +++ b/monkey/monkey_island/cc/ui/src/components/configuration-components/PluginSelectorTemplate.tsx @@ -6,6 +6,7 @@ import {AdvancedMultiSelectHeader} from '../ui-components/AdvancedMultiSelect'; import {MasterCheckboxState} from '../ui-components/MasterCheckbox'; import {InfoPane, WarningType} from '../ui-components/InfoPane'; import {EXPLOITERS_PATH_PROPAGATION} from './PropagationConfig'; +import MarkdownDescriptionTemplate from './MarkdownDescriptionTemplate'; export default function PluginSelectorTemplate(props: ObjectFieldTemplateProps) { @@ -53,9 +54,10 @@ export default function PluginSelectorTemplate(props: ObjectFieldTemplateProps) let uiSchema = _.cloneDeep(props.uiSchema); for(let pluginName of Object.keys(generateDefaultConfig())) { if(!props.formContext.selectedExploiters.has(pluginName)){ - uiSchema[pluginName] = {"ui:readonly": true}; + uiSchema[pluginName] = {"ui:readonly": true, + 'ui:DescriptionFieldTemplate': MarkdownDescriptionTemplate}; } else { - uiSchema[pluginName] = {}; + uiSchema[pluginName] = {'ui:DescriptionFieldTemplate': MarkdownDescriptionTemplate}; } } props.formContext.setUiSchema(uiSchema, EXPLOITERS_PATH_PROPAGATION); 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 1b6cc86fc24..a9e1bcc8fe9 100644 --- a/monkey/monkey_island/cc/ui/src/components/pages/ConfigurePage.js +++ b/monkey/monkey_island/cc/ui/src/components/pages/ConfigurePage.js @@ -102,11 +102,16 @@ class ConfigurePageComponent extends AuthComponent { } injectManifestIntoSchema = (manifest, schema) => { + let pluginName = manifest['name']; let safe = manifest['safe']; let link = manifest['link_to_documentation']; + let description = manifest['description']; + let title = manifest['title']; let injectedSchema = _.cloneDeep(schema); - _.set(injectedSchema, `${EXPLOITERS_SCHEMA_PATH_NEW}.properties.${manifest['name']}.safe`, safe); - _.set(injectedSchema, `${EXPLOITERS_SCHEMA_PATH_NEW}.properties.${manifest['name']}.link`, link); + _.set(injectedSchema, `${EXPLOITERS_SCHEMA_PATH_NEW}.properties.${pluginName}.safe`, safe); + _.set(injectedSchema, `${EXPLOITERS_SCHEMA_PATH_NEW}.properties.${pluginName}.link`, link); + _.set(injectedSchema, `${EXPLOITERS_SCHEMA_PATH_NEW}.properties.${pluginName}.description`, description); + _.set(injectedSchema, `${EXPLOITERS_SCHEMA_PATH_NEW}.properties.${pluginName}.title`, title); return injectedSchema; } diff --git a/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss b/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss index 299d1014d1a..1c8225a1e2e 100644 --- a/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss +++ b/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss @@ -1,3 +1,7 @@ +.markdown p { + white-space: pre-wrap; +} + .config-nav .nav-item>a { color: $black; padding: 15px 10px 15px 10px;