通过Python ldap3在Active Directory中启用“用户无法更改密码”

问题描述

我们正在尝试通过Python中的Ldap3库创建一个服务帐户。服务帐户已成功创建,但是存在一个小问题。用于“用户无法更改密码”的复选框之一未被选中。

我们进行了一些研究,发现要设置此属性,我们需要遵循此处给出的一些步骤:https://docs.microsoft.com/en-us/windows/win32/adsi/modifying-user-cannot-change-password-ldap-provider。在此链接中给出的逻辑与Python使用不同的编程语言,因此我们尝试在Python中复制相同的逻辑。根据我们的理解,我们实现了该功能,该功能已成功执行,但是在AD服务器上看不到预期的效果(“用户无法更改密码”复选框未选中)。

下面是用于创建ACL对象并将其添加到服务帐户的代码。

def create_object_ace(privguid,sid):
    print("creating ace object")
    nace = ldaptypes.ACE()
    nace['AceType'] = ldaptypes.ACCESS_DENIED_OBJECT_ACE.ACE_TYPE
    nace['AceFlags'] = 0x00
    acedata = ldaptypes.ACCESS_DENIED_OBJECT_ACE()
    acedata['Mask'] = ldaptypes.ACCESS_MASK()
    acedata['Mask']['Mask'] = ldaptypes.ACCESS_ALLOWED_OBJECT_ACE.ADS_RIGHT_DS_CONTROL_ACCESS
    acedata['ObjectType'] = string_to_bin(privguid)
    acedata['InheritedObjectType'] = b''
    acedata['Sid'] = ldaptypes.LDAP_SID()
    acedata['Sid'].fromCanonical(sid)
    assert sid == acedata['Sid'].formatCanonical()
    acedata['Flags'] = ldaptypes.ACCESS_DENIED_OBJECT_ACE.ACE_OBJECT_TYPE_PRESENT
    nace['Ace'] = acedata
    return nace

s = Server('ad_server.com',get_info=ALL)
c = Connection(s,user="testdomain\\username",password="password",authentication=NTLM)
c.search(search_base="DC=testad,DC=com",search_filter="(CN=svc_account_47)",search_scope=SUBTREE,attributes=['objectSid','sAMAccountName'])

entry = c.entries[0]
usersid = entry['objectSid'].value

controls = security_descriptor_control(sdflags=0x04)
c.search(search_base="DC=testahs,search_filter='(&(objectCategory=domain))',attributes=['SAMAccountName','nTSecurityDescriptor'],controls=controls)
entry = c.entries[0]
secDescData = entry['nTSecurityDescriptor'].raw_values[0]
secDesc = ldaptypes.SR_SECURITY_DESCRIPTOR(data=secDescData)

secDesc['Dacl']['Data'].append(create_object_ace('ab721a53-1e2f-11d0-9819-00aa0040529b',usersid)) # This GUID is for 'User cannot change password'

dn = entry.entry_dn
data = secDesc.getData()

c.modify(dn,{'nTSecurityDescriptor': (ldap3.MODIFY_REPLACE,[data])},controls=controls)

print(c.result)  # gives -> {'result': 0,'description': 'success','dn': '','message': '','referrals': None,'type': 'modifyResponse'}

Python代码参考来自以下链接:

https://github.com/SecureAuthCorp/impacket/blob/master/impacket/examples/ntlmrelayx/attacks/ldapattack.py

有人可以在这里帮助我。预先感谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)