Rename Communicate as new user to Communicate as backdoor user

This commit is contained in:
Ilija Lazoroski 2021-08-30 12:44:13 +02:00
parent 7e293ac16d
commit 10697934d6
13 changed files with 34 additions and 30 deletions

View File

@ -70,10 +70,12 @@ Changelog](https://keepachangelog.com/en/1.0.0/).
- Improve runtime of some unit tests. #1125 - Improve runtime of some unit tests. #1125
- Run curl OR wget (not both) when attempting to communicate as a new user on - Run curl OR wget (not both) when attempting to communicate as a new user on
Linux. #1407 Linux. #1407
- Renamed Communicate as new user to Communicate as backdoor user. #1433
### Removed ### Removed
- Relevant dead code as reported by Vulture. #1149 - Relevant dead code as reported by Vulture. #1149
- Island logger config and --logger-config CLI option. #1151 - Island logger config and --logger-config CLI option. #1151
- Backdoor user post breach action. #1433
### Fixed ### Fixed
- Attempt to delete a directory when monkey config reset was called. #1054 - Attempt to delete a directory when monkey config reset was called. #1054

View File

@ -39,9 +39,9 @@ class MyNewPba(PBA):
#### Implementation #### Implementation
If your PBA consists only of simple shell commands, you can reuse the generic PBA by passing the commands into the constructor. See the `add_user.py` PBA for reference. If your PBA consists only of simple shell commands, you can reuse the generic PBA by passing the commands into the constructor. See the `account_discovery.py` PBA for reference.
Otherwise, you'll need to override the `run` method with your own implementation. See the `communicate_as_new_user.py` PBA for reference. Make sure to send the relevant PostBreachTelem upon success/failure. You can log during the PBA as well. Otherwise, you'll need to override the `run` method with your own implementation. See the `communicate_as_backdoor_user.py` PBA for reference. Make sure to send the relevant PostBreachTelem upon success/failure. You can log during the PBA as well.
### Modify the Monkey Island ### Modify the Monkey Island
@ -73,4 +73,4 @@ Now you can choose your PBA when configuring the Infection Monkey on the Monkey
#### Telemetry processing #### Telemetry processing
If you wish to process your PBA telemetry (for example, to analyze it for report data), add a processing function to the `POST_BREACH_TELEMETRY_PROCESSING_FUNCS`, which can be found at `monkey/monkey_island/cc/services/telemetry/processing/post_breach.py`. You can reference the `process_communicate_as_new_user_telemetry` method as an example. If you wish to process your PBA telemetry (for example, to analyze it for report data), add a processing function to the `POST_BREACH_TELEMETRY_PROCESSING_FUNCS`, which can be found at `monkey/monkey_island/cc/services/telemetry/processing/post_breach.py`. You can reference the `process_communicate_as_backdoor_user_telemetry` method as an example.

View File

@ -1,4 +1,4 @@
POST_BREACH_COMMUNICATE_AS_NEW_USER = "Communicate as new user" POST_BREACH_COMMUNICATE_AS_BACKDOOR_USER = "Communicate as backdoor user"
POST_BREACH_FILE_EXECUTION = "File execution" POST_BREACH_FILE_EXECUTION = "File execution"
POST_BREACH_SHELL_STARTUP_FILE_MODIFICATION = "Modify shell startup file" POST_BREACH_SHELL_STARTUP_FILE_MODIFICATION = "Modify shell startup file"
POST_BREACH_HIDDEN_FILES = "Hide files and directories" POST_BREACH_HIDDEN_FILES = "Hide files and directories"

View File

@ -40,7 +40,7 @@ TEST_SCHEDULED_EXECUTION = "scheduled_execution"
TEST_MALICIOUS_ACTIVITY_TIMELINE = "malicious_activity_timeline" TEST_MALICIOUS_ACTIVITY_TIMELINE = "malicious_activity_timeline"
TEST_SEGMENTATION = "segmentation" TEST_SEGMENTATION = "segmentation"
TEST_TUNNELING = "tunneling" TEST_TUNNELING = "tunneling"
TEST_COMMUNICATE_AS_NEW_USER = "communicate_as_new_user" TEST_COMMUNICATE_AS_BACKDOOR_USER = "communicate_as_backdoor_user"
TEST_SCOUTSUITE_PERMISSIVE_FIREWALL_RULES = "scoutsuite_permissive_firewall_rules" TEST_SCOUTSUITE_PERMISSIVE_FIREWALL_RULES = "scoutsuite_permissive_firewall_rules"
TEST_SCOUTSUITE_UNENCRYPTED_DATA = "scoutsuite_unencrypted_data" TEST_SCOUTSUITE_UNENCRYPTED_DATA = "scoutsuite_unencrypted_data"
TEST_SCOUTSUITE_DATA_LOSS_PREVENTION = "scoutsuite_data_loss_prevention" TEST_SCOUTSUITE_DATA_LOSS_PREVENTION = "scoutsuite_data_loss_prevention"
@ -58,7 +58,7 @@ TESTS = (
TEST_DATA_ENDPOINT_HTTP, TEST_DATA_ENDPOINT_HTTP,
TEST_DATA_ENDPOINT_ELASTIC, TEST_DATA_ENDPOINT_ELASTIC,
TEST_TUNNELING, TEST_TUNNELING,
TEST_COMMUNICATE_AS_NEW_USER, TEST_COMMUNICATE_AS_BACKDOOR_USER,
TEST_SCOUTSUITE_PERMISSIVE_FIREWALL_RULES, TEST_SCOUTSUITE_PERMISSIVE_FIREWALL_RULES,
TEST_SCOUTSUITE_UNENCRYPTED_DATA, TEST_SCOUTSUITE_UNENCRYPTED_DATA,
TEST_SCOUTSUITE_DATA_LOSS_PREVENTION, TEST_SCOUTSUITE_DATA_LOSS_PREVENTION,
@ -206,7 +206,7 @@ TESTS_MAP = {
PILLARS_KEY: [NETWORKS, VISIBILITY_ANALYTICS], PILLARS_KEY: [NETWORKS, VISIBILITY_ANALYTICS],
POSSIBLE_STATUSES_KEY: [STATUS_UNEXECUTED, STATUS_FAILED], POSSIBLE_STATUSES_KEY: [STATUS_UNEXECUTED, STATUS_FAILED],
}, },
TEST_COMMUNICATE_AS_NEW_USER: { TEST_COMMUNICATE_AS_BACKDOOR_USER: {
TEST_EXPLANATION_KEY: "The Monkey tried to create a new user and communicate " TEST_EXPLANATION_KEY: "The Monkey tried to create a new user and communicate "
"with the internet from it.", "with the internet from it.",
FINDING_EXPLANATION_BY_STATUS_KEY: { FINDING_EXPLANATION_BY_STATUS_KEY: {

View File

@ -4,7 +4,7 @@ import shutil
import string import string
import subprocess import subprocess
from common.common_consts.post_breach_consts import POST_BREACH_COMMUNICATE_AS_NEW_USER from common.common_consts.post_breach_consts import POST_BREACH_COMMUNICATE_AS_BACKDOOR_USER
from infection_monkey.post_breach.pba import PBA from infection_monkey.post_breach.pba import PBA
from infection_monkey.telemetry.post_breach_telem import PostBreachTelem from infection_monkey.telemetry.post_breach_telem import PostBreachTelem
from infection_monkey.utils.auto_new_user_factory import create_auto_new_user from infection_monkey.utils.auto_new_user_factory import create_auto_new_user
@ -26,7 +26,7 @@ USERNAME_PREFIX = "somenewuser"
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class CommunicateAsNewUser(PBA): class CommunicateAsBackdoorUser(PBA):
""" """
This PBA creates a new user, and then creates HTTPS requests as that user. This is used for a This PBA creates a new user, and then creates HTTPS requests as that user. This is used for a
Zero Trust test of the People pillar. See the relevant telemetry processing to see what findings Zero Trust test of the People pillar. See the relevant telemetry processing to see what findings
@ -34,14 +34,16 @@ class CommunicateAsNewUser(PBA):
""" """
def __init__(self): def __init__(self):
super(CommunicateAsNewUser, self).__init__(name=POST_BREACH_COMMUNICATE_AS_NEW_USER) super(CommunicateAsBackdoorUser, self).__init__(
name=POST_BREACH_COMMUNICATE_AS_BACKDOOR_USER
)
def run(self): def run(self):
username = CommunicateAsNewUser.get_random_new_user_name() username = CommunicateAsBackdoorUser.get_random_new_user_name()
try: try:
password = get_random_password() password = get_random_password()
with create_auto_new_user(username, password) as new_user: with create_auto_new_user(username, password) as new_user:
http_request_commandline = CommunicateAsNewUser.get_commandline_for_http_request( http_request_commandline = CommunicateAsBackdoorUser.get_commandline_for_http_request(
INFECTION_MONKEY_WEBSITE_URL INFECTION_MONKEY_WEBSITE_URL
) )
exit_status = new_user.run_as(http_request_commandline) exit_status = new_user.run_as(http_request_commandline)

View File

@ -1,4 +1,4 @@
from common.common_consts.post_breach_consts import POST_BREACH_COMMUNICATE_AS_NEW_USER from common.common_consts.post_breach_consts import POST_BREACH_COMMUNICATE_AS_BACKDOOR_USER
from monkey_island.cc.services.attack.technique_reports.pba_technique import PostBreachTechnique from monkey_island.cc.services.attack.technique_reports.pba_technique import PostBreachTechnique
@ -7,4 +7,4 @@ class T1136(PostBreachTechnique):
unscanned_msg = "Monkey didn't try creating a new user on the network's systems." 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." 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." used_msg = "Monkey created a new user on the network's systems."
pba_names = [POST_BREACH_COMMUNICATE_AS_NEW_USER] pba_names = [POST_BREACH_COMMUNICATE_AS_BACKDOOR_USER]

View File

@ -22,7 +22,7 @@ class PostBreachTechnique(AttackTechnique, metaclass=abc.ABCMeta):
""" """
:param post_breach_action_names: Names of post-breach actions with which the technique is :param post_breach_action_names: Names of post-breach actions with which the technique is
associated associated
(example - `["Communicate as new user"]` for T1136) (example - `["Communicate as backdoor user"]` for T1136)
:return: Mongo query that parses attack telemetries for a simple report component :return: Mongo query that parses attack telemetries for a simple report component
(gets machines and post-breach action usage). (gets machines and post-breach action usage).
""" """

View File

@ -7,8 +7,8 @@ POST_BREACH_ACTIONS = {
"anyOf": [ "anyOf": [
{ {
"type": "string", "type": "string",
"enum": ["CommunicateAsNewUser"], "enum": ["CommunicateAsBackdoorUser"],
"title": "Communicate as new user", "title": "Communicate as backdoor user",
"safe": True, "safe": True,
"info": "Attempts to create a new user, create HTTPS requests as that " "info": "Attempts to create a new user, create HTTPS requests as that "
"user and delete the user " "user and delete the user "

View File

@ -67,7 +67,7 @@ MONKEY = {
"uniqueItems": True, "uniqueItems": True,
"items": {"$ref": "#/definitions/post_breach_actions"}, "items": {"$ref": "#/definitions/post_breach_actions"},
"default": [ "default": [
"CommunicateAsNewUser", "CommunicateAsBackdoorUser",
"ModifyShellStartupFiles", "ModifyShellStartupFiles",
"HiddenFiles", "HiddenFiles",
"TrapCommand", "TrapCommand",

View File

@ -1,16 +1,16 @@
import copy import copy
from common.common_consts.post_breach_consts import POST_BREACH_COMMUNICATE_AS_NEW_USER from common.common_consts.post_breach_consts import POST_BREACH_COMMUNICATE_AS_BACKDOOR_USER
from monkey_island.cc.database import mongo from monkey_island.cc.database import mongo
from monkey_island.cc.models import Monkey from monkey_island.cc.models import Monkey
from monkey_island.cc.services.telemetry.zero_trust_checks.communicate_as_new_user import ( from monkey_island.cc.services.telemetry.zero_trust_checks.communicate_as_backdoor_user import (
check_new_user_communication, check_new_user_communication,
) )
EXECUTION_WITHOUT_OUTPUT = "(PBA execution produced no output)" EXECUTION_WITHOUT_OUTPUT = "(PBA execution produced no output)"
def process_communicate_as_new_user_telemetry(telemetry_json): def process_communicate_as_backdoor_user_telemetry(telemetry_json):
current_monkey = Monkey.get_single_monkey_by_guid(telemetry_json["monkey_guid"]) current_monkey = Monkey.get_single_monkey_by_guid(telemetry_json["monkey_guid"])
message = telemetry_json["data"]["result"][0] message = telemetry_json["data"]["result"][0]
success = telemetry_json["data"]["result"][1] success = telemetry_json["data"]["result"][1]
@ -18,7 +18,7 @@ def process_communicate_as_new_user_telemetry(telemetry_json):
POST_BREACH_TELEMETRY_PROCESSING_FUNCS = { POST_BREACH_TELEMETRY_PROCESSING_FUNCS = {
POST_BREACH_COMMUNICATE_AS_NEW_USER: process_communicate_as_new_user_telemetry, POST_BREACH_COMMUNICATE_AS_BACKDOOR_USER: process_communicate_as_backdoor_user_telemetry,
} }

View File

@ -4,7 +4,7 @@ from monkey_island.cc.services.zero_trust.monkey_findings.monkey_zt_finding_serv
MonkeyZTFindingService, MonkeyZTFindingService,
) )
COMM_AS_NEW_USER_FAILED_FORMAT = "Monkey on {} couldn't communicate as new user. Details: {}" COMM_AS_NEW_USER_FAILED_FORMAT = "Monkey on {} couldn't communicate as backdoor user. Details: {}"
COMM_AS_NEW_USER_SUCCEEDED_FORMAT = ( COMM_AS_NEW_USER_SUCCEEDED_FORMAT = (
"New user created by Monkey on {} successfully tried to " "New user created by Monkey on {} successfully tried to "
"communicate with the internet. Details: {}" "communicate with the internet. Details: {}"
@ -14,7 +14,7 @@ COMM_AS_NEW_USER_SUCCEEDED_FORMAT = (
def check_new_user_communication(current_monkey, success, message): def check_new_user_communication(current_monkey, success, message):
status = zero_trust_consts.STATUS_FAILED if success else zero_trust_consts.STATUS_PASSED status = zero_trust_consts.STATUS_FAILED if success else zero_trust_consts.STATUS_PASSED
MonkeyZTFindingService.create_or_add_to_existing( MonkeyZTFindingService.create_or_add_to_existing(
test=zero_trust_consts.TEST_COMMUNICATE_AS_NEW_USER, test=zero_trust_consts.TEST_COMMUNICATE_AS_BACKDOOR_USER,
status=status, status=status,
events=[ events=[
get_attempt_event(current_monkey), get_attempt_event(current_monkey),
@ -25,7 +25,7 @@ def check_new_user_communication(current_monkey, success, message):
def get_attempt_event(current_monkey): def get_attempt_event(current_monkey):
tried_to_communicate_event = Event.create_event( tried_to_communicate_event = Event.create_event(
title="Communicate as new user", title="Communicate as backdoor user",
message="Monkey on {} tried to create a new user and communicate from it.".format( message="Monkey on {} tried to create a new user and communicate from it.".format(
current_monkey.hostname current_monkey.hostname
), ),
@ -40,7 +40,7 @@ def get_result_event(current_monkey, message, success):
) )
return Event.create_event( return Event.create_event(
title="Communicate as new user", title="Communicate as backdoor user",
message=message_format.format(current_monkey.hostname, message), message=message_format.format(current_monkey.hostname, message),
event_type=zero_trust_consts.EVENT_TYPE_MONKEY_NETWORK, event_type=zero_trust_consts.EVENT_TYPE_MONKEY_NETWORK,
) )

View File

@ -175,7 +175,7 @@
"PBA_windows_filename": "", "PBA_windows_filename": "",
"PBA_linux_filename": "", "PBA_linux_filename": "",
"post_breach_actions": [ "post_breach_actions": [
"CommunicateAsNewUser", "CommunicateAsBackdoorUser",
"ModifyShellStartupFiles", "ModifyShellStartupFiles",
"HiddenFiles", "HiddenFiles",
"TrapCommand", "TrapCommand",

View File

@ -18,8 +18,8 @@ EVENTS = [
timestamp=datetime.strptime("2021-01-19 12:07:17.802138", "%Y-%m-%d %H:%M:%S.%f"), timestamp=datetime.strptime("2021-01-19 12:07:17.802138", "%Y-%m-%d %H:%M:%S.%f"),
), ),
Event.create_event( Event.create_event(
title="Communicate as new user", title="Communicate as backdoor user",
message="Monkey on gc-pc-244 couldn't communicate as new user. " message="Monkey on gc-pc-244 couldn't communicate as backdoor user. "
"Details: System error 5 has occurred. Access is denied.", "Details: System error 5 has occurred. Access is denied.",
event_type="monkey_network", event_type="monkey_network",
timestamp=datetime.strptime("2021-01-19 12:22:42.246020", "%Y-%m-%d %H:%M:%S.%f"), timestamp=datetime.strptime("2021-01-19 12:22:42.246020", "%Y-%m-%d %H:%M:%S.%f"),
@ -28,7 +28,7 @@ EVENTS = [
TESTS = [ TESTS = [
zero_trust_consts.TEST_ENDPOINT_SECURITY_EXISTS, zero_trust_consts.TEST_ENDPOINT_SECURITY_EXISTS,
zero_trust_consts.TEST_COMMUNICATE_AS_NEW_USER, zero_trust_consts.TEST_COMMUNICATE_AS_BACKDOOR_USER,
] ]
STATUS = [ STATUS = [