forked from p15670423/monkey
Merge pull request #1643 from guardicore/1538-propagation-credentials-endpoint
Implement propagation credentials endpoint
This commit is contained in:
commit
6a1b6c784e
|
@ -8,6 +8,8 @@ Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
### Added
|
### Added
|
||||||
- credentials.json file for storing Monkey Island user login information. #1206
|
- credentials.json file for storing Monkey Island user login information. #1206
|
||||||
|
- "GET /api/propagation-credentials/<string:guid>" endpoint for agents to
|
||||||
|
retrieve updated credentials from the Island. #1538
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
- "Communicate as Backdoor User" PBA's HTTP requests to request headers only and
|
- "Communicate as Backdoor User" PBA's HTTP requests to request headers only and
|
||||||
|
|
|
@ -56,7 +56,7 @@ class ControlChannel(IControlChannel):
|
||||||
def get_credentials_for_propagation(self) -> dict:
|
def get_credentials_for_propagation(self) -> dict:
|
||||||
try:
|
try:
|
||||||
response = requests.get( # noqa: DUO123
|
response = requests.get( # noqa: DUO123
|
||||||
f"{self._control_channel_server}/api/propagationCredentials",
|
f"{self._control_channel_server}/api/propagation-credentials/{self._agent_id}",
|
||||||
verify=False,
|
verify=False,
|
||||||
proxies=ControlClient.proxies,
|
proxies=ControlClient.proxies,
|
||||||
timeout=SHORT_REQUEST_TIMEOUT,
|
timeout=SHORT_REQUEST_TIMEOUT,
|
||||||
|
@ -67,3 +67,5 @@ class ControlChannel(IControlChannel):
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
# TODO: Evaluate how this exception is handled; don't just log and ignore it.
|
# TODO: Evaluate how this exception is handled; don't just log and ignore it.
|
||||||
logger.error(f"An error occurred while trying to connect to server. {e}")
|
logger.error(f"An error occurred while trying to connect to server. {e}")
|
||||||
|
|
||||||
|
return {}
|
||||||
|
|
|
@ -169,7 +169,7 @@ def init_api_resources(api):
|
||||||
"/api/fileUpload/<string:file_type>?load=<string:filename>",
|
"/api/fileUpload/<string:file_type>?load=<string:filename>",
|
||||||
"/api/fileUpload/<string:file_type>?restore=<string:filename>",
|
"/api/fileUpload/<string:file_type>?restore=<string:filename>",
|
||||||
)
|
)
|
||||||
api.add_resource(PropagationCredentials, "/api/propagationCredentials")
|
api.add_resource(PropagationCredentials, "/api/propagation-credentials/<string:guid>")
|
||||||
api.add_resource(RemoteRun, "/api/remote-monkey", "/api/remote-monkey/")
|
api.add_resource(RemoteRun, "/api/remote-monkey", "/api/remote-monkey/")
|
||||||
api.add_resource(VersionUpdate, "/api/version-update", "/api/version-update/")
|
api.add_resource(VersionUpdate, "/api/version-update", "/api/version-update/")
|
||||||
api.add_resource(StartedOnIsland, "/api/monkey_control/started_on_island")
|
api.add_resource(StartedOnIsland, "/api/monkey_control/started_on_island")
|
||||||
|
|
|
@ -1,9 +1,16 @@
|
||||||
import flask_restful
|
import flask_restful
|
||||||
|
|
||||||
|
from monkey_island.cc.database import mongo
|
||||||
from monkey_island.cc.services.config import ConfigService
|
from monkey_island.cc.services.config import ConfigService
|
||||||
|
|
||||||
|
|
||||||
class PropagationCredentials(flask_restful.Resource):
|
class PropagationCredentials(flask_restful.Resource):
|
||||||
def get(self):
|
def get(self, guid: str):
|
||||||
|
monkey_json = mongo.db.monkey.find_one_or_404({"guid": guid})
|
||||||
|
ConfigService.decrypt_flat_config(monkey_json["config"])
|
||||||
|
|
||||||
return {"propagation_credentials": ConfigService.get_config_propagation_credentials()}
|
propagation_credentials = ConfigService.get_config_propagation_credentials_from_flat_config(
|
||||||
|
monkey_json["config"]
|
||||||
|
)
|
||||||
|
|
||||||
|
return {"propagation_credentials": propagation_credentials}
|
||||||
|
|
|
@ -410,21 +410,13 @@ class ConfigService:
|
||||||
ConfigService.set_config_value(STARTED_ON_ISLAND_PATH, value)
|
ConfigService.set_config_value(STARTED_ON_ISLAND_PATH, value)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_config_propagation_credentials():
|
def get_config_propagation_credentials_from_flat_config(config):
|
||||||
return {
|
return {
|
||||||
"exploit_user_list": ConfigService.get_config_value(
|
"exploit_user_list": config.get("exploit_user_list", []),
|
||||||
USER_LIST_PATH, should_decrypt=False
|
"exploit_password_list": config.get("exploit_password_list", []),
|
||||||
),
|
"exploit_lm_hash_list": config.get("exploit_lm_hash_list", []),
|
||||||
"exploit_password_list": ConfigService.get_config_value(
|
"exploit_ntlm_hash_list": config.get("exploit_ntlm_hash_list", []),
|
||||||
PASSWORD_LIST_PATH, should_decrypt=False
|
"exploit_ssh_keys": config.get("exploit_ssh_keys", []),
|
||||||
),
|
|
||||||
"exploit_lm_hash_list": ConfigService.get_config_value(
|
|
||||||
LM_HASH_LIST_PATH, should_decrypt=False
|
|
||||||
),
|
|
||||||
"exploit_ntlm_hash_list": ConfigService.get_config_value(
|
|
||||||
NTLM_HASH_LIST_PATH, should_decrypt=False
|
|
||||||
),
|
|
||||||
"exploit_ssh_keys": ConfigService.get_config_value(SSH_KEYS_PATH, should_decrypt=False),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
|
|
@ -29,18 +29,18 @@
|
||||||
"dropper_target_path_linux": "/tmp/monkey",
|
"dropper_target_path_linux": "/tmp/monkey",
|
||||||
"dropper_target_path_win_32": "C:\\Windows\\temp\\monkey32.exe",
|
"dropper_target_path_win_32": "C:\\Windows\\temp\\monkey32.exe",
|
||||||
"dropper_target_path_win_64": "C:\\Windows\\temp\\monkey64.exe",
|
"dropper_target_path_win_64": "C:\\Windows\\temp\\monkey64.exe",
|
||||||
"exploit_lm_hash_list": [],
|
"exploit_lm_hash_list": ["lm_hash_1", "lm_hash_2"],
|
||||||
"exploit_ntlm_hash_list": [],
|
"exploit_ntlm_hash_list": ["nt_hash_1", "nt_hash_2", "nt_hash_3"],
|
||||||
"exploit_password_list": [
|
"exploit_password_list": [
|
||||||
"root",
|
"test",
|
||||||
"123456",
|
"iloveyou",
|
||||||
"password",
|
"12345"
|
||||||
"123456789",
|
|
||||||
"qwerty",
|
|
||||||
"111111",
|
|
||||||
"iloveyou"
|
|
||||||
],
|
],
|
||||||
"exploit_ssh_keys": [
|
"exploit_ssh_keys": [
|
||||||
|
{
|
||||||
|
"public_key": "my_public_key",
|
||||||
|
"private_key": "my_private_key"
|
||||||
|
}
|
||||||
],
|
],
|
||||||
"exploit_user_list": [
|
"exploit_user_list": [
|
||||||
"Administrator",
|
"Administrator",
|
||||||
|
|
|
@ -80,3 +80,16 @@ def test_format_config_for_agent__pbas(flat_monkey_config):
|
||||||
assert "PBA_linux_filename" not in flat_monkey_config
|
assert "PBA_linux_filename" not in flat_monkey_config
|
||||||
assert "custom_PBA_windows_cmd" not in flat_monkey_config
|
assert "custom_PBA_windows_cmd" not in flat_monkey_config
|
||||||
assert "PBA_windows_filename" not in flat_monkey_config
|
assert "PBA_windows_filename" not in flat_monkey_config
|
||||||
|
|
||||||
|
|
||||||
|
def test_get_config_propagation_credentials_from_flat_config(flat_monkey_config):
|
||||||
|
expected_creds = {
|
||||||
|
"exploit_lm_hash_list": ["lm_hash_1", "lm_hash_2"],
|
||||||
|
"exploit_ntlm_hash_list": ["nt_hash_1", "nt_hash_2", "nt_hash_3"],
|
||||||
|
"exploit_password_list": ["test", "iloveyou", "12345"],
|
||||||
|
"exploit_ssh_keys": [{"private_key": "my_private_key", "public_key": "my_public_key"}],
|
||||||
|
"exploit_user_list": ["Administrator", "root", "user", "ubuntu"],
|
||||||
|
}
|
||||||
|
|
||||||
|
creds = ConfigService.get_config_propagation_credentials_from_flat_config(flat_monkey_config)
|
||||||
|
assert creds == expected_creds
|
||||||
|
|
Loading…
Reference in New Issue