forked from p15670423/monkey
Agent: Parse --servers to SocketAddress
This commit is contained in:
parent
4982999b99
commit
53a9c62245
|
@ -21,6 +21,7 @@ from common.network.network_utils import (
|
||||||
get_my_ip_addresses,
|
get_my_ip_addresses,
|
||||||
get_network_interfaces,
|
get_network_interfaces,
|
||||||
)
|
)
|
||||||
|
from common.types.utils import socketaddress_from_string
|
||||||
from common.utils.argparse_types import positive_int
|
from common.utils.argparse_types import positive_int
|
||||||
from common.utils.attack_utils import ScanStatus, UsageEnum
|
from common.utils.attack_utils import ScanStatus, UsageEnum
|
||||||
from common.version import get_version
|
from common.version import get_version
|
||||||
|
@ -113,6 +114,7 @@ class InfectionMonkey:
|
||||||
|
|
||||||
self._singleton = SystemSingleton()
|
self._singleton = SystemSingleton()
|
||||||
self._opts = self._get_arguments(args)
|
self._opts = self._get_arguments(args)
|
||||||
|
self._server_strings = [str(s) for s in self._opts.servers]
|
||||||
|
|
||||||
self._agent_event_serializer_registry = self._setup_agent_event_serializers()
|
self._agent_event_serializer_registry = self._setup_agent_event_serializers()
|
||||||
|
|
||||||
|
@ -138,7 +140,11 @@ class InfectionMonkey:
|
||||||
def _get_arguments(args):
|
def _get_arguments(args):
|
||||||
arg_parser = argparse.ArgumentParser()
|
arg_parser = argparse.ArgumentParser()
|
||||||
arg_parser.add_argument("-p", "--parent")
|
arg_parser.add_argument("-p", "--parent")
|
||||||
arg_parser.add_argument("-s", "--servers", type=lambda arg: arg.strip().split(","))
|
arg_parser.add_argument(
|
||||||
|
"-s",
|
||||||
|
"--servers",
|
||||||
|
type=lambda arg: [socketaddress_from_string(s) for s in arg.strip().split(",")],
|
||||||
|
)
|
||||||
arg_parser.add_argument("-d", "--depth", type=positive_int, default=0)
|
arg_parser.add_argument("-d", "--depth", type=positive_int, default=0)
|
||||||
opts = arg_parser.parse_args(args)
|
opts = arg_parser.parse_args(args)
|
||||||
InfectionMonkey._log_arguments(opts)
|
InfectionMonkey._log_arguments(opts)
|
||||||
|
@ -147,9 +153,9 @@ class InfectionMonkey:
|
||||||
|
|
||||||
# TODO: By the time we finish 2292, _connect_to_island_api() may not need to return `server`
|
# TODO: By the time we finish 2292, _connect_to_island_api() may not need to return `server`
|
||||||
def _connect_to_island_api(self) -> Tuple[Optional[str], Optional[IIslandAPIClient]]:
|
def _connect_to_island_api(self) -> Tuple[Optional[str], Optional[IIslandAPIClient]]:
|
||||||
logger.debug(f"Trying to wake up with servers: {', '.join(self._opts.servers)}")
|
logger.debug(f"Trying to wake up with servers: {', '.join(self._server_strings)}")
|
||||||
server_clients = find_available_island_apis(
|
server_clients = find_available_island_apis(
|
||||||
self._opts.servers, HTTPIslandAPIClientFactory(self._agent_event_serializer_registry)
|
self._server_strings, HTTPIslandAPIClientFactory(self._agent_event_serializer_registry)
|
||||||
)
|
)
|
||||||
|
|
||||||
server, island_api_client = self._select_server(server_clients)
|
server, island_api_client = self._select_server(server_clients)
|
||||||
|
@ -158,13 +164,13 @@ class InfectionMonkey:
|
||||||
logger.info(f"Successfully connected to the island via {server}")
|
logger.info(f"Successfully connected to the island via {server}")
|
||||||
else:
|
else:
|
||||||
raise Exception(
|
raise Exception(
|
||||||
f"Failed to connect to the island via any known servers: {self._opts.servers}"
|
f"Failed to connect to the island via any known servers: {self._server_strings}"
|
||||||
)
|
)
|
||||||
|
|
||||||
# NOTE: Since we pass the address for each of our interfaces to the exploited
|
# NOTE: Since we pass the address for each of our interfaces to the exploited
|
||||||
# machines, is it possible for a machine to unintentionally unregister itself from the
|
# machines, is it possible for a machine to unintentionally unregister itself from the
|
||||||
# relay if it is able to connect to the relay over multiple interfaces?
|
# relay if it is able to connect to the relay over multiple interfaces?
|
||||||
servers_to_close = (s for s in self._opts.servers if s != server and server_clients[s])
|
servers_to_close = (s for s in self._server_strings if s != server and server_clients[s])
|
||||||
send_remove_from_waitlist_control_message_to_relays(servers_to_close)
|
send_remove_from_waitlist_control_message_to_relays(servers_to_close)
|
||||||
|
|
||||||
return server, island_api_client
|
return server, island_api_client
|
||||||
|
@ -184,7 +190,7 @@ class InfectionMonkey:
|
||||||
def _select_server(
|
def _select_server(
|
||||||
self, server_clients: Mapping[str, Optional[IIslandAPIClient]]
|
self, server_clients: Mapping[str, Optional[IIslandAPIClient]]
|
||||||
) -> Tuple[Optional[str], Optional[IIslandAPIClient]]:
|
) -> Tuple[Optional[str], Optional[IIslandAPIClient]]:
|
||||||
for server in self._opts.servers:
|
for server in self._server_strings:
|
||||||
if server_clients[server]:
|
if server_clients[server]:
|
||||||
return server, server_clients[server]
|
return server, server_clients[server]
|
||||||
|
|
||||||
|
@ -192,7 +198,7 @@ class InfectionMonkey:
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _log_arguments(args):
|
def _log_arguments(args):
|
||||||
arg_string = " ".join([f"{key}: {value}" for key, value in vars(args).items()])
|
arg_string = ", ".join([f"{key}: {value}" for key, value in vars(args).items()])
|
||||||
logger.info(f"Monkey started with arguments: {arg_string}")
|
logger.info(f"Monkey started with arguments: {arg_string}")
|
||||||
|
|
||||||
def start(self):
|
def start(self):
|
||||||
|
@ -255,7 +261,7 @@ class InfectionMonkey:
|
||||||
|
|
||||||
def _build_server_list(self, relay_port: int):
|
def _build_server_list(self, relay_port: int):
|
||||||
relay_servers = [f"{ip}:{relay_port}" for ip in get_my_ip_addresses()]
|
relay_servers = [f"{ip}:{relay_port}" for ip in get_my_ip_addresses()]
|
||||||
return self._opts.servers + relay_servers
|
return self._server_strings + relay_servers
|
||||||
|
|
||||||
def _build_master(self, relay_port: int):
|
def _build_master(self, relay_port: int):
|
||||||
servers = self._build_server_list(relay_port)
|
servers = self._build_server_list(relay_port)
|
||||||
|
|
Loading…
Reference in New Issue