forked from p15670423/monkey
Added user deactivation as another "security" layer for the user deletion in windows
This commit is contained in:
parent
c767250760
commit
9dc1607754
|
@ -2,7 +2,8 @@ import logging
|
||||||
import subprocess
|
import subprocess
|
||||||
|
|
||||||
from infection_monkey.post_breach.actions.add_user import BackdoorUser
|
from infection_monkey.post_breach.actions.add_user import BackdoorUser
|
||||||
from infection_monkey.utils.windows.users import get_windows_commands_to_delete_user, get_windows_commands_to_add_user
|
from infection_monkey.utils.windows.users import get_windows_commands_to_delete_user, get_windows_commands_to_add_user, \
|
||||||
|
get_windows_commands_to_deactivate_user
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -48,7 +49,8 @@ class AutoNewUser(object):
|
||||||
self.username,
|
self.username,
|
||||||
".", # Use current domain.
|
".", # Use current domain.
|
||||||
self.password,
|
self.password,
|
||||||
win32con.LOGON32_LOGON_INTERACTIVE, # Logon type - interactive (normal user).
|
win32con.LOGON32_LOGON_INTERACTIVE, # Logon type - interactive (normal user). Need this to open ping
|
||||||
|
# using a shell.
|
||||||
win32con.LOGON32_PROVIDER_DEFAULT) # Which logon provider to use - whatever Windows offers.
|
win32con.LOGON32_PROVIDER_DEFAULT) # Which logon provider to use - whatever Windows offers.
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
raise NewUserError("Can't logon as {}. Error: {}".format(self.username, str(err)))
|
raise NewUserError("Can't logon as {}. Error: {}".format(self.username, str(err)))
|
||||||
|
@ -61,9 +63,20 @@ class AutoNewUser(object):
|
||||||
# Logoff
|
# Logoff
|
||||||
self.logon_handle.Close()
|
self.logon_handle.Close()
|
||||||
|
|
||||||
# Try to delete user
|
# Try to disable and then delete the user.
|
||||||
|
self.try_deactivate_user()
|
||||||
|
self.try_disable_user()
|
||||||
|
|
||||||
|
def try_disable_user(self):
|
||||||
try:
|
try:
|
||||||
_ = subprocess.Popen(
|
_ = subprocess.check_output(
|
||||||
get_windows_commands_to_delete_user(self.username), stderr=subprocess.STDOUT, shell=True)
|
get_windows_commands_to_delete_user(self.username), stderr=subprocess.STDOUT, shell=True)
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
raise NewUserError("Can't delete user {}. Info: {}".format(self.username, err))
|
raise NewUserError("Can't delete user {}. Info: {}".format(self.username, err))
|
||||||
|
|
||||||
|
def try_deactivate_user(self):
|
||||||
|
try:
|
||||||
|
_ = subprocess.check_output(
|
||||||
|
get_windows_commands_to_deactivate_user(self.username), stderr=subprocess.STDOUT, shell=True)
|
||||||
|
except Exception as err:
|
||||||
|
raise NewUserError("Can't deactivate user {}. Info: {}".format(self.username, err))
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
ACTIVE_NO_NET_USER = '/ACTIVE:NO'
|
||||||
|
|
||||||
|
|
||||||
def get_windows_commands_to_add_user(username, password, should_be_active=False):
|
def get_windows_commands_to_add_user(username, password, should_be_active=False):
|
||||||
windows_cmds = [
|
windows_cmds = [
|
||||||
'net',
|
'net',
|
||||||
|
@ -6,7 +9,7 @@ def get_windows_commands_to_add_user(username, password, should_be_active=False)
|
||||||
password,
|
password,
|
||||||
'/add']
|
'/add']
|
||||||
if not should_be_active:
|
if not should_be_active:
|
||||||
windows_cmds.append('/ACTIVE:NO')
|
windows_cmds.append(ACTIVE_NO_NET_USER)
|
||||||
return windows_cmds
|
return windows_cmds
|
||||||
|
|
||||||
|
|
||||||
|
@ -16,3 +19,11 @@ def get_windows_commands_to_delete_user(username):
|
||||||
'user',
|
'user',
|
||||||
username,
|
username,
|
||||||
'/delete']
|
'/delete']
|
||||||
|
|
||||||
|
|
||||||
|
def get_windows_commands_to_deactivate_user(username):
|
||||||
|
return [
|
||||||
|
'net',
|
||||||
|
'user',
|
||||||
|
username,
|
||||||
|
ACTIVE_NO_NET_USER]
|
||||||
|
|
Loading…
Reference in New Issue