home *** CD-ROM | disk | FTP | other *** search
/ DEFCON 15 / DefCon15.bin / Speakers / Jennings / Extras / incognito / token_info.c < prev    next >
C/C++ Source or Header  |  2007-07-07  |  5KB  |  150 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 "handle_arguments.h"
  13.  
  14. BOOL get_domain_from_token(HANDLE token, char *domain_to_return)
  15. {
  16.     LPVOID TokenUserInfo[BUF_SIZE];
  17.     char username[BUF_SIZE], domainname[BUF_SIZE];
  18.     DWORD user_length = sizeof(username), domain_length = sizeof(domainname), sid_type = 0, returned_tokinfo_length;
  19.  
  20.     if (!GetTokenInformation(token, TokenUser, TokenUserInfo, BUF_SIZE, &returned_tokinfo_length))
  21.         return FALSE;
  22.     LookupAccountSidA(NULL, ((TOKEN_USER*)TokenUserInfo)->User.Sid, username, &user_length, domainname, &domain_length, (PSID_NAME_USE)&sid_type);
  23.  
  24.     strcpy(domain_to_return, domainname);
  25.  
  26.     return TRUE;
  27. }
  28.  
  29. BOOL get_domain_username_from_token(HANDLE token, char *full_name_to_return)
  30. {
  31.     LPVOID TokenUserInfo[BUF_SIZE];
  32.     char username[BUF_SIZE], domainname[BUF_SIZE];
  33.     DWORD user_length = sizeof(username), domain_length = sizeof(domainname), sid_type = 0, returned_tokinfo_length;
  34.  
  35.     if (!GetTokenInformation(token, TokenUser, TokenUserInfo, BUF_SIZE, &returned_tokinfo_length))
  36.         return FALSE;
  37.     LookupAccountSidA(NULL, ((TOKEN_USER*)TokenUserInfo)->User.Sid, username, &user_length, domainname, &domain_length, (PSID_NAME_USE)&sid_type);
  38.  
  39.      // Make full name in DOMAIN\USERNAME format
  40.     sprintf(full_name_to_return, "%s\\%s", domainname, username);
  41.  
  42.     return TRUE;
  43. }
  44.  
  45. BOOL get_domain_groups_from_token(HANDLE token, char **group_name_array[], DWORD *num_groups)
  46. {
  47.     LPVOID TokenGroupsInfo[BUF_SIZE];
  48.     char groupname[BUF_SIZE], domainname[BUF_SIZE];
  49.     DWORD i, group_length = sizeof(groupname), domain_length = sizeof(domainname), sid_type = 0, returned_tokinfo_length;
  50.  
  51.     if (!GetTokenInformation(token, TokenGroups, TokenGroupsInfo, BUF_SIZE, &returned_tokinfo_length))
  52.         return FALSE;
  53.     *group_name_array = (char**)calloc(((TOKEN_GROUPS*)TokenGroupsInfo)->GroupCount, sizeof(char*));
  54.     *num_groups = ((TOKEN_GROUPS*)TokenGroupsInfo)->GroupCount;
  55.  
  56.     for (i=0;i<*num_groups;i++)
  57.     {
  58.         LookupAccountSidA(NULL, ((TOKEN_GROUPS*)TokenGroupsInfo)->Groups[i].Sid, groupname, &group_length, domainname, &domain_length, (PSID_NAME_USE)&sid_type);
  59.         (*group_name_array)[i] = (char*)calloc(BUF_SIZE, sizeof(char));
  60.         // Make full name in DOMAIN\GROUPNAME format
  61.         sprintf((*group_name_array)[i], "%s\\%s", domainname, groupname);
  62.     }     
  63.  
  64.     return TRUE;
  65. }
  66.  
  67. BOOL is_delegation_token(HANDLE token)
  68. {
  69.     HANDLE temp_token;
  70.     BOOL ret;
  71.     LPVOID TokenImpersonationInfo[BUF_SIZE];
  72.     DWORD returned_tokinfo_length;
  73.  
  74.     if (GetTokenInformation(token, TokenImpersonationLevel, TokenImpersonationInfo, BUF_SIZE, &returned_tokinfo_length))
  75.     if (*((SECURITY_IMPERSONATION_LEVEL*)TokenImpersonationInfo) == SecurityDelegation)
  76.         return TRUE;
  77.     else
  78.         return FALSE;
  79.  
  80.     ret = DuplicateTokenEx(token, TOKEN_ALL_ACCESS, NULL, SecurityDelegation, TokenImpersonation, &temp_token);
  81.     CloseHandle(temp_token);
  82.     return ret;
  83. }
  84.  
  85. BOOL is_impersonation_token(HANDLE token)
  86. {
  87.     HANDLE temp_token;
  88.     BOOL ret;
  89.     LPVOID TokenImpersonationInfo[BUF_SIZE];
  90.     DWORD returned_tokinfo_length;
  91.  
  92.     if (GetTokenInformation(token, TokenImpersonationLevel, TokenImpersonationInfo, BUF_SIZE, &returned_tokinfo_length))
  93.     if (*((SECURITY_IMPERSONATION_LEVEL*)TokenImpersonationInfo) >= SecurityImpersonation)
  94.         return TRUE;
  95.     else
  96.         return FALSE;
  97.  
  98.     ret = DuplicateTokenEx(token, TOKEN_ALL_ACCESS, NULL, SecurityImpersonation, TokenImpersonation, &temp_token);
  99.     CloseHandle(temp_token);
  100.     return ret;
  101. }
  102.  
  103. BOOL is_token(HANDLE token, char *requested_name)
  104. {    
  105.     DWORD i, num_groups=0;
  106.     char *full_name, **group_name_array = NULL;
  107.     BOOL ret = FALSE;
  108.  
  109.     // If token is NULL then return
  110.     if (!token)
  111.         return FALSE;
  112.  
  113.     full_name = calloc(BUF_SIZE, sizeof(char));
  114.     get_domain_username_from_token(token, full_name);
  115.     if (!_stricmp(requested_name, full_name))
  116.         ret = TRUE;
  117.  
  118.     get_domain_groups_from_token(token, &group_name_array, &num_groups);
  119.     
  120.     for (i=0;i<num_groups;i++)
  121.     {
  122.         if (!_stricmp(requested_name, group_name_array[i]))
  123.             ret = TRUE;
  124.         free(group_name_array[i]);
  125.     }
  126.  
  127.     // Cleanup
  128.     free(group_name_array);
  129.     free(full_name);
  130.  
  131.     return ret;
  132. }
  133.  
  134. BOOL is_local_system()
  135. {
  136.     HANDLE token;
  137.     char full_name[BUF_SIZE];
  138.  
  139.     // If there is a thread token use that, otherwise use current process token
  140.     if (!OpenThreadToken(GetCurrentThread(), TOKEN_ALL_ACCESS, TRUE, &token))
  141.         OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &token);
  142.     
  143.     get_domain_username_from_token(token, full_name);
  144.     CloseHandle(token);
  145.  
  146.     if (!_stricmp("NT AUTHORITY\\SYSTEM", full_name))
  147.         return TRUE;
  148.     else
  149.         return FALSE;
  150. }