Agent: Remove max iters and timeout between iters options

This commit is contained in:
Shreya Malviya 2021-11-16 12:55:37 +05:30 committed by Mike Salvatore
parent 03d3a22b42
commit e774fc8a1e
3 changed files with 71 additions and 91 deletions

View File

@ -99,12 +99,6 @@ class Configuration(object):
# sets whether or not the monkey is alive. if false will stop scanning and exploiting # sets whether or not the monkey is alive. if false will stop scanning and exploiting
alive = True alive = True
# how long to wait between scan iterations
timeout_between_iterations = 100
# how many scan iterations to perform on each run
max_iterations = 1
finger_classes = [] finger_classes = []
exploiter_classes = [] exploiter_classes = []
system_info_collector_classes = [] system_info_collector_classes = []

View File

@ -43,7 +43,6 @@
"MSSQLFingerprint", "MSSQLFingerprint",
"ElasticFinger" "ElasticFinger"
], ],
"max_iterations": 3,
"monkey_log_path_windows": "%temp%\\~df1563.tmp", "monkey_log_path_windows": "%temp%\\~df1563.tmp",
"monkey_log_path_linux": "/tmp/user-1563", "monkey_log_path_linux": "/tmp/user-1563",
"ms08_067_exploit_attempts": 5, "ms08_067_exploit_attempts": 5,
@ -77,7 +76,6 @@
7001, 7001,
8088 8088
], ],
"timeout_between_iterations": 10,
"victims_max_exploit": 100, "victims_max_exploit": 100,
"victims_max_find": 100, "victims_max_find": 100,
"post_breach_actions": [] "post_breach_actions": []

View File

@ -208,98 +208,86 @@ class InfectionMonkey(object):
raise PlannedShutdownException("Marked 'not alive' from configuration.") raise PlannedShutdownException("Marked 'not alive' from configuration.")
def propagate(self): def propagate(self):
for iteration_index in range(WormConfiguration.max_iterations): ControlClient.keepalive()
ControlClient.keepalive() ControlClient.load_control_config()
ControlClient.load_control_config()
self._network.initialize() self._network.initialize()
self._fingerprint = HostFinger.get_instances() self._fingerprint = HostFinger.get_instances()
self._exploiters = HostExploiter.get_classes() self._exploiters = HostExploiter.get_classes()
if not self._keep_running or not WormConfiguration.alive: if not WormConfiguration.alive:
logger.info("Marked not alive from configuration")
machines = self._network.get_victim_machines(
max_find=WormConfiguration.victims_max_find,
stop_callback=ControlClient.check_for_stop,
)
for machine in machines:
if ControlClient.check_for_stop():
break break
machines = self._network.get_victim_machines( for finger in self._fingerprint:
max_find=WormConfiguration.victims_max_find, logger.info(
stop_callback=ControlClient.check_for_stop, "Trying to get OS fingerprint from %r with module %s",
) machine,
is_empty = True finger.__class__.__name__,
for machine in machines:
if ControlClient.check_for_stop():
break
is_empty = False
for finger in self._fingerprint:
logger.info(
"Trying to get OS fingerprint from %r with module %s",
machine,
finger.__class__.__name__,
)
try:
finger.get_host_fingerprint(machine)
except BaseException as exc:
logger.error(
"Failed to run fingerprinter %s, exception %s"
% finger.__class__.__name__,
str(exc),
)
ScanTelem(machine).send()
# skip machines that we've already exploited
if machine in self._exploited_machines:
logger.debug("Skipping %r - already exploited", machine)
continue
elif machine in self._fail_exploitation_machines:
if WormConfiguration.retry_failed_explotation:
logger.debug("%r - exploitation failed before, trying again", machine)
else:
logger.debug("Skipping %r - exploitation failed before", machine)
continue
if self._monkey_tunnel:
self._monkey_tunnel.set_tunnel_for_host(machine)
if self._default_server:
if self._network.on_island(self._default_server):
machine.set_default_server(
get_interface_to_target(machine.ip_addr)
+ (":" + self._default_server_port if self._default_server_port else "")
)
else:
machine.set_default_server(self._default_server)
logger.debug(
"Default server for machine: %r set to %s"
% (machine, machine.default_server)
)
# Order exploits according to their type
self._exploiters = sorted(
self._exploiters, key=lambda exploiter_: exploiter_.EXPLOIT_TYPE.value
) )
host_exploited = False try:
for exploiter in [exploiter(machine) for exploiter in self._exploiters]: finger.get_host_fingerprint(machine)
if self.try_exploiting(machine, exploiter): except BaseException as exc:
host_exploited = True logger.error(
VictimHostTelem("T1210", ScanStatus.USED, machine=machine).send() "Failed to run fingerprinter %s, exception %s" % finger.__class__.__name__,
if exploiter.RUNS_AGENT_ON_SUCCESS: str(exc),
break # if adding machine to exploited, won't try other exploits )
# on it
if not host_exploited:
self._fail_exploitation_machines.add(machine)
VictimHostTelem("T1210", ScanStatus.SCANNED, machine=machine).send()
if not self._keep_running:
break
if (not is_empty) and (WormConfiguration.max_iterations > iteration_index + 1): ScanTelem(machine).send()
time_to_sleep = WormConfiguration.timeout_between_iterations
logger.info("Sleeping %d seconds before next life cycle iteration", time_to_sleep)
time.sleep(time_to_sleep)
if self._keep_running and WormConfiguration.alive: # skip machines that we've already exploited
logger.info("Reached max iterations (%d)", WormConfiguration.max_iterations) if machine in self._exploited_machines:
elif not WormConfiguration.alive: logger.debug("Skipping %r - already exploited", machine)
continue
elif machine in self._fail_exploitation_machines:
if WormConfiguration.retry_failed_explotation:
logger.debug("%r - exploitation failed before, trying again", machine)
else:
logger.debug("Skipping %r - exploitation failed before", machine)
continue
if self._monkey_tunnel:
self._monkey_tunnel.set_tunnel_for_host(machine)
if self._default_server:
if self._network.on_island(self._default_server):
machine.set_default_server(
get_interface_to_target(machine.ip_addr)
+ (":" + self._default_server_port if self._default_server_port else "")
)
else:
machine.set_default_server(self._default_server)
logger.debug(
"Default server for machine: %r set to %s" % (machine, machine.default_server)
)
# Order exploits according to their type
self._exploiters = sorted(
self._exploiters, key=lambda exploiter_: exploiter_.EXPLOIT_TYPE.value
)
host_exploited = False
for exploiter in [exploiter(machine) for exploiter in self._exploiters]:
if self.try_exploiting(machine, exploiter):
host_exploited = True
VictimHostTelem("T1210", ScanStatus.USED, machine=machine).send()
if exploiter.RUNS_AGENT_ON_SUCCESS:
break # if adding machine to exploited, won't try other exploits
# on it
if not host_exploited:
self._fail_exploitation_machines.add(machine)
VictimHostTelem("T1210", ScanStatus.SCANNED, machine=machine).send()
if not self._keep_running:
break
if not WormConfiguration.alive:
logger.info("Marked not alive from configuration") logger.info("Marked not alive from configuration")
def upgrade_to_64_if_needed(self): def upgrade_to_64_if_needed(self):