Skip to content

Commit 828fc7a

Browse files
Fixes unicode exceptions when changing passwords containing encoded characters longer than 2 bytes (#1955)
1 parent 756ca96 commit 828fc7a

File tree

2 files changed

+9
-6
lines changed

2 files changed

+9
-6
lines changed

impacket/dcerpc/v5/samr.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -2835,12 +2835,14 @@ def hSamrUnicodeChangePasswordUser2(dce, serverName='\x00', userName='', oldPass
28352835

28362836
samUser = SAMPR_USER_PASSWORD()
28372837
try:
2838-
samUser['Buffer'] = b'A'*(512-len(newPassword)*2) + newPassword.encode('utf-16le')
2838+
encoded_password = newPassword.encode('utf-16le')
28392839
except UnicodeDecodeError:
28402840
import sys
2841-
samUser['Buffer'] = b'A'*(512-len(newPassword)*2) + newPassword.decode(sys.getfilesystemencoding()).encode('utf-16le')
2841+
encoded_password = newPassword.decode(sys.getfilesystemencoding()).encode('utf-16le')
28422842

2843-
samUser['Length'] = len(newPassword)*2
2843+
samUser['Buffer'] = b'A' * (512 - len(encoded_password)) + encoded_password
2844+
2845+
samUser['Length'] = len(encoded_password)
28442846
pwdBuff = samUser.getData()
28452847

28462848
rc4 = ARC4.new(oldPwdHashNT)

tests/dcerpc/test_samr.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -2272,7 +2272,7 @@ def test_SamrUnicodeChangePasswordUser2(self):
22722272

22732273
oldPwd = 'ADMIN'
22742274
oldPwdHashNT = ntlm.NTOWFv1(oldPwd)
2275-
newPwd = "".join([random.choice(string.ascii_letters) for i in range(15)])
2275+
newPwd = "".join([random.choice(string.ascii_letters) for i in range(15)]) + "❤️🤷‍♂️😈"
22762276
newPwdHashNT = ntlm.NTOWFv1(newPwd)
22772277

22782278
try:
@@ -2285,8 +2285,9 @@ def test_SamrUnicodeChangePasswordUser2(self):
22852285
request['ServerName'] = ''
22862286
request['UserName'] = self.test_account
22872287
samUser = samr.SAMPR_USER_PASSWORD()
2288-
samUser['Buffer'] = b'A'*(512-len(newPwd)*2) + newPwd.encode('utf-16le')
2289-
samUser['Length'] = len(newPwd)*2
2288+
encoded_password = newPwd.encode('utf-16le')
2289+
samUser['Buffer'] = b'A'*(512-len(encoded_password)) + encoded_password
2290+
samUser['Length'] = len(encoded_password)
22902291
pwdBuff = samUser.getData()
22912292

22922293
rc4 = ARC4.new(oldPwdHashNT)

0 commit comments

Comments
 (0)