Skip to content

Commit c1a53aa

Browse files
feat in net.py: add functionality to enable and disable user accounts (#1801)
* feat in net.py: add functionality to enable and disable user accounts * fix: do not overwrite flags when enabling/disabling accounts * call function create account with according flags in net.py * refactor keep uac flags out of parameters of enable,disable function definitions
1 parent 67e1924 commit c1a53aa

File tree

1 file changed

+38
-1
lines changed

1 file changed

+38
-1
lines changed

examples/net.py

+38-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
# python net.py Administrator:password@targetMachine group -name "Domain Admins"
2525
# python net.py Administrator:password@targetMachine computer -name DC$
2626
# python net.py Administrator:password@targetMachine group -name "Domain Admins" -join EvilUs3r
27+
# python net.py Administrator:password@targetMachine user -enable EvilUs3r
28+
# python net.py Administrator:password@targetMachine user -disable EvilUs3r
2729
#
2830
# Author:
2931
# Alex Romero (@NtAlexio2)
@@ -215,11 +217,32 @@ def Remove(self, name):
215217
self._close_domain()
216218

217219
def _hEnableAccount(self, user_handle):
220+
user_account_control = samr.hSamrQueryInformationUser2(self._dce, user_handle, samr.USER_INFORMATION_CLASS.UserAllInformation)['Buffer']['All']['UserAccountControl']
218221
buffer = samr.SAMPR_USER_INFO_BUFFER()
219222
buffer['tag'] = samr.USER_INFORMATION_CLASS.UserControlInformation
220-
buffer['Control']['UserAccountControl'] = samr.USER_ALL_ADMINCOMMENT
223+
buffer['Control']['UserAccountControl'] = user_account_control ^ samr.USER_ACCOUNT_DISABLED
221224
samr.hSamrSetInformationUser2(self._dce, user_handle, buffer)
222225

226+
def _hDisableAccount(self, user_handle):
227+
user_account_control = samr.hSamrQueryInformationUser2(self._dce, user_handle, samr.USER_INFORMATION_CLASS.UserAllInformation)['Buffer']['All']['UserAccountControl']
228+
buffer = samr.SAMPR_USER_INFO_BUFFER()
229+
buffer['tag'] = samr.USER_INFORMATION_CLASS.UserControlInformation
230+
buffer['Control']['UserAccountControl'] = samr.USER_ACCOUNT_DISABLED | user_account_control
231+
samr.hSamrSetInformationUser2(self._dce, user_handle, buffer)
232+
233+
def SetUserAccountControl(self, name, action):
234+
info = self.Query(name)
235+
domain_handle = self._open_domain()
236+
try:
237+
user_handle = self._get_user_handle(domain_handle, name)
238+
if action == 'enable':
239+
self._hEnableAccount(user_handle)
240+
else:
241+
self._hDisableAccount(user_handle)
242+
finally:
243+
self._close_domain()
244+
245+
223246

224247
class Computer(User):
225248
def __init__(self, smbConnection):
@@ -358,6 +381,16 @@ def run(self, remoteName, remoteHost):
358381
actionObject.Remove(self.__options.remove)
359382
print("[+] {} account deleted succesfully!".format(self.__action))
360383

384+
elif self.__is_option_present(self.__options, 'enable'):
385+
print("[*] Enabling {} account '{}'".format(self.__action, self.__options.enable))
386+
actionObject.SetUserAccountControl(self.__options.enable, "enable")
387+
print("[+] {} account enabled succesfully!".format(self.__action))
388+
389+
elif self.__is_option_present(self.__options, 'disable'):
390+
print("[*] Disabling {} account '{}'".format(self.__action, self.__options.disable))
391+
actionObject.SetUserAccountControl(self.__options.disable, "disable")
392+
print("[+] {} account disabled succesfully!".format(self.__action))
393+
361394
elif self.__is_option_present(self.__options, 'join'):
362395
print("[*] Adding user account '{}' to group '{}'".format(self.__options.join,self.__options.name))
363396
actionObject.Join(self.__options.name, self.__options.join)
@@ -466,12 +499,16 @@ def __is_option_present(self, options, option):
466499
user_parser.add_argument('-create', action="store", metavar = "NAME", help='Add new user account to domain/computer.')
467500
user_parser.add_argument('-remove', action="store", metavar = "NAME", help='Remove existing user account from domain/computer.')
468501
user_parser.add_argument('-newPasswd', action="store", metavar = "PASSWORD", help='New password to set for creating account.')
502+
user_parser.add_argument('-enable', action="store", metavar = "NAME", help='Enables account.')
503+
user_parser.add_argument('-disable', action="store", metavar = "NAME", help='Disables account.')
469504

470505
computer_parser = subparsers.add_parser('computer', help='Enumerate all computers in domain level')
471506
computer_parser.add_argument('-name', action="store", metavar = "NAME", help='Display single computer information.')
472507
computer_parser.add_argument('-create', action="store", metavar = "NAME", help='Add new computer account to domain.')
473508
computer_parser.add_argument('-remove', action="store", metavar = "NAME", help='Remove existing computer account from domain.')
474509
computer_parser.add_argument('-newPasswd', action="store", metavar = "PASSWORD", help='New password to set for creating account.')
510+
computer_parser.add_argument('-enable', action="store", metavar = "NAME", help='Enables account.')
511+
computer_parser.add_argument('-disable', action="store", metavar = "NAME", help='Disables account.')
475512

476513
localgroup_parser = subparsers.add_parser('localgroup', help='Enumerate local groups (aliases) of local computer')
477514
localgroup_parser.add_argument('-name', action="store", metavar = "NAME", help='Operate on single specific domain group account.')

0 commit comments

Comments
 (0)