idiotc4t's blog
搜索文档…
GitBook 提供支持
NetUserAdd逆向

起因

过程

反手直接拖ida。
跟了下逻辑然后对比了下React OS发现逻辑几乎一致,那直接扣代码。
win10上UaspOpenDomain没有导出,可以使用特征码搜索的方式去调用,这里跟进了发现同样是调用了sam系函数。
跟一下函数还需要sid。
发现是由 LsaQueryInformationPolicy的获取,这个函数在ntsecapi.h里有描述,直接拿来用就好了。
至此用户创建完成,然后通过SetUserInfo设置密码,同样这个函数在windows 10上没有导出。
跟一下,发现下层函数一致并导出。
跟踪了一下函数逻辑,发现不同的UserInfo都有不同的处理方法,通常我们会传入一个USERINFO1结构体,这里会把有效信息传入到一个 USER_ALL_INFORMATION 结构体里面,这个结构体的实现和Startupinfo有点像,需要同时设置值和使用标签位,阅读发现,有一个结构体单处理密码。
这里我们只需要传入密码,然后将标志位设1。
我们就自己封装出了一个NetUserAdd。

完整代码

1
#include "ApiAddUser.h"
2
3
4
5
int wmain(int argc, wchar_t* argv[])
6
{
7
UNICODE_STRING UserName;
8
UNICODE_STRING PassWord;
9
HANDLE ServerHandle = NULL;
10
HANDLE DomainHandle = NULL;
11
HANDLE UserHandle = NULL;
12
ULONG GrantedAccess;
13
ULONG RelativeId;
14
NTSTATUS Status = NULL;
15
HMODULE hSamlib = NULL;
16
HMODULE hNtdll = NULL;
17
HMODULE hNetapi32 = NULL;
18
LSA_HANDLE hPolicy = NULL;
19
LSA_OBJECT_ATTRIBUTES ObjectAttributes = { 0 };
20
PPOLICY_ACCOUNT_DOMAIN_INFO DomainInfo = NULL;
21
USER_ALL_INFORMATION uai = { 0 };
22
23
24
hSamlib = LoadLibraryA("samlib.dll");
25
hNtdll = LoadLibraryA("ntdll");
26
27
pSamConnect SamConnect = (pSamConnect)GetProcAddress(hSamlib, "SamConnect");
28
pSamOpenDomain SamOpenDomain = (pSamOpenDomain)GetProcAddress(hSamlib, "SamOpenDomain");
29
pSamCreateUser2InDomain SamCreateUser2InDomain = (pSamCreateUser2InDomain)GetProcAddress(hSamlib, "SamCreateUser2InDomain");
30
pSamSetInformationUser SamSetInformationUser = (pSamSetInformationUser)GetProcAddress(hSamlib, "SamSetInformationUser");
31
pSamQuerySecurityObject SamQuerySecurityObject = (pSamQuerySecurityObject)GetProcAddress(hSamlib, "SamQuerySecurityObject");
32
pRtlInitUnicodeString RtlInitUnicodeString = (pRtlInitUnicodeString)GetProcAddress(hNtdll, "RtlInitUnicodeString");
33
34
RtlInitUnicodeString(&UserName, L"Admin");
35
RtlInitUnicodeString(&PassWord, L"Admin");
36
37
Status = SamConnect(NULL, &ServerHandle, SAM_SERVER_CONNECT | SAM_SERVER_LOOKUP_DOMAIN, NULL);;
38
Status = LsaOpenPolicy(NULL,&ObjectAttributes,POLICY_VIEW_LOCAL_INFORMATION,&hPolicy);
39
Status = LsaQueryInformationPolicy(hPolicy, PolicyAccountDomainInformation, (PVOID*)&DomainInfo);
40
41
Status = SamOpenDomain(ServerHandle,
42
DOMAIN_CREATE_USER | DOMAIN_LOOKUP | DOMAIN_READ_PASSWORD_PARAMETERS,
43
DomainInfo->DomainSid,
44
&DomainHandle);
45
46
Status = SamCreateUser2InDomain(DomainHandle,
47
&UserName,
48
USER_NORMAL_ACCOUNT,
49
USER_ALL_ACCESS | DELETE | WRITE_DAC,
50
&UserHandle,&GrantedAccess,&RelativeId);
51
52
RtlInitUnicodeString(&uai.NtPassword, PassWord.Buffer);
53
uai.NtPasswordPresent = TRUE;
54
uai.WhichFields |= USER_ALL_NTPASSWORDPRESENT;
55
56
57
Status = SamSetInformationUser(UserHandle,
58
UserAllInformation,
59
&uai);
60
61
return 0;
62
}
Copied!

LINKS

ReactOS: dll/win32/netapi32/user.c File Reference
最近更新 7mo ago