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

Chrome 80

Jeffs

(L1) cache
Забанен
Регистрация
28.12.2018
Сообщения
611
Реакции
358
Пожалуйста, обратите внимание, что пользователь заблокирован
Что изменилось в 80-ом хроме, в плане хранения паролей, куки?
Слышал что теперь там используется AES256 GCM вместо CryptUnprotectData
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Ну вроде как разобрался.
%AppData%\\Google\\Chrome\\User Data\\Local State - в этом файле ищем encrypted_key - это зашифрованный ключ.
Этот encrypted_key представляет из себя строку Base64, расшифровав эту строку -
Далее уже CryptUnprotectData(...) - получаем расшифрованный ключ.
Далее с рашифровываем AES-256 GCM с ключём, который мы получили.

Не уверен, но вроде как все шифруется одним и тем же ключём
 
%AppData%\\Google\\Chrome\\User Data\\Local State - в этом файле ищем encrypted_key - это зашифрованный ключ.
Этот encrypted_key представляет из себя строку Base64, расшифровав эту строку -
да.
DPAPI на скрине это префикс, сигнализирующий, что блоб, идущий после префикса, надо декриптить с помощью DPAPI. После снятия DPAPI получаешь c данных:
v10 + nonce + key.
v10 тут это такой же простой префикс, он не нужен. а nonce + key используешь для снятия с логов aes-gcm шифрования. В хромиум сорцах везде идет чек startswith на эти префиксы + эти префиксы явно зашиты в сорцах хрома в виде констант. Размеры nonce - 12 байт вроде, размеры тоже явно зашиты в сорцах.
То есть основная работа тут это поиск подстроки и сплит.
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
да.
DPAPI это префикс, сигнализирующий, что блоб, идущий после префикса, надо декриптить с помощью DPAPI. После снятия DPAPI получаешь внутри:
v10 + nonce + key.
v10 тут это такой же простой префикс, он не нужен. а nonce + key используешь для снятия с логов aes-gcm шифрования.
Подскажи, можно ли средствами winapi Расшифровать aes-gcm? ЧТо-то ничего нагуглить не могу.
Везде OpenSSL юзают
 
Подскажи, можно ли средствами winapi Расшифровать aes-gcm? ЧТо-то ничего нагуглить не могу.
Везде OpenSSL юзают
Я ж на павершелле бахаю в основном. Средствами дотнет можно. А насчет винапи хз даже. Не смотрел
 
Подскажи, можно ли средствами winapi Расшифровать aes-gcm? ЧТо-то ничего нагуглить не могу.
Везде OpenSSL юзают
Сомневаюсь... Максимум - использование библиотеки CryptoPP :D
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Пожалуйста, обратите внимание, что пользователь заблокирован
Реализовал в общем декрипт паролей, вот только конечный вес файла под 3 метра... (спасибо OpenSSL)
Не могу найти простую реализацию AES256-GCM
 
Не могу найти простую реализацию AES256-GCM
Попробуй использовать COM обьект IE. Иешки сейчас практически все и везде 11 версии. Там имеется WebCrypto API, включая aes-gcm.(Вот описание интерфейса https://developer.mozilla.org/ru/docs/Web/API/Window/crypto и ссылка на спеки. https://www.w3.org/TR/WebCryptoAPI/#SubtleCrypto-method-encrypt) То есть ты подготавливаешь js скрипт, в котором юзаешь window.msCrypto и обращаешься из своего С/С++ к IE движку, выполняя заранее заготовленный js скрипт. И в него прокидывай nonce + key. Имхо самый простой и доступный подход, учитывая твои нюансы. Без нужды подтягивать библиотеки, писать алгоритм расшифровки самостоятельно или использовать сервер сайд расшифровку. Только учитывай, что тебе желательно найденный на просторах гитхаба семпл обращения к WebCrypto API AES-GCM прогнать транспиллером babel, либо мануально запилить полифилы, ибо то, что работает в норм браузерах, работает через жопу в ишаке. А babel тебе автоматом подгонит под стандарты IE этот модный JS.

Список поддерживаемых алгоритмов.
specs.png
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
В общем написал код для получения, расшифровки ключа.
Осталось в общем то только нормальную реализацию AES-GCM прикрутить, либо сделать как отписал Haunt выше (у меня мозгов не хватило).
За использование sqlite не бейте

Алгоритм, с помощью которого расшифровываются пароли определяется по префиксу v10.
У вас должно быть более 30 сообщений для просмотра скрытого контента.

Пароль: xss.pro
 
В общем написал код для получения, расшифровки ключа.
Осталось в общем то только нормальную реализацию AES-GCM прикрутить, либо сделать как отписал Haunt выше (у меня мозгов не хватило).
За использование sqlite не бейте

Алгоритм, с помощью которого расшифровываются пароли определяется по префиксу v10.
Скрытое содержимое
Скрытый контент для пользователей: .
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Пожалуйста, обратите внимание, что пользователь заблокирован
Линк подох, обновляю:

У вас должно быть более 30 сообщений для просмотра скрытого контента.
xss.pro
 
Перечитал топик пару раз, но так и не понял, зачем нужен encrypted_key. Насколько понял я, алгоритм следующий:

Мы декриптим блоб ( password_value ) при помощи дпапи
Получаем данные v10 / nonce / key / data, вытягиваем nonce и key и декриптим data.
Обьясните пожалуйста для идиота.
 
Перечитал топик пару раз, но так и не понял, зачем нужен encrypted_key. Насколько понял я, алгоритм следующий:

Мы декриптим блоб ( password_value ) при помощи дпапи
Получаем данные v10 / nonce / key / data, вытягиваем nonce и key и декриптим data.
Обьясните пожалуйста для идиота.
Раньше пароли и value у куки были просто накрыты dpapi. Теперь есть мастерключ, который накрыт dpapi. И куки пароли, накрытые уже aes-gcm. Вот этот ключ, что лежит под dpapi, нужен для снятия aes-gcm с паролей и куков.
 
Раньше пароли и value у куки были просто накрыты dpapi. Теперь есть мастерключ, который накрыт dpapi. И куки пароли, накрытые уже aes-gcm. Вот этот ключ, что лежит под dpapi, нужен для снятия aes-gcm с паролей и куков.
Ага. Тогда такой вопрос, если я буду декриптить уже непосредственно blob password_value - там будут лежать данные в формате: v10 + nonce + покриптованный пароль. Верно?
 
Кидали уже ж выше пример, скопирую ещё раз с гитхаба, для тебя.
Python:
def get_key_from_local_state():
    jsn = None
    with open(os.path.join(os.environ['LOCALAPPDATA'],
        r"Google\Chrome\User Data\Local State"),encoding='utf-8',mode ="r") as f:
        jsn = json.loads(str(f.readline()))
    return jsn["os_crypt"]["encrypted_key"]

def aes_decrypt(encrypted_txt):
    encoded_key = get_key_from_local_state()
    encrypted_key = base64.b64decode(encoded_key.encode())
    #remove prefix 'DPAPI'
    encrypted_key = encrypted_key[5:]
    key = dpapi_decrypt(encrypted_key)
    #get nonce. ignore prefix 'v10', length is 12 bytes.
    nonce = encrypted_txt[3:15]
    cipher = aesgcm.get_cipher(key)
    return aesgcm.decrypt(cipher,encrypted_txt[15:],nonce)

def chrome_decrypt(encrypted_txt):
    if sys.platform == 'win32':
        try:
            if encrypted_txt[:4] == b'\x01\x00\x00\x00':
                decrypted_txt = dpapi_decrypt(encrypted_txt)
                return decrypted_txt.decode()
            elif encrypted_txt[:3] == b'v10':
                decrypted_txt = aes_decrypt(encrypted_txt)
                return decrypted_txt[:-16].decode()
        except WindowsError:
            return None
    else:
        try:
            return unix_decrypt(encrypted_txt)
        except NotImplementedError:
            return None
 
Не увидел, спасибо.
Сначала читаешь с помощью sqlite хэндлера данные с Login Data и Cookies. Берёшь оттуда зашифрованные блобы, которые хочешь расшифровать. Проверяешь с чего начинается блоб. Если он начинается с '\x01\x00\x00\x00', то хром старый и шифрование там только dpapi. Юзаешь все по старинке. Если блоб начинается с v10 - то используется новое шифрование. Если шифрование новое - то:

Берёшь encrypted_key, выпиливаешь из него DPAPI префикс, после снятия base64.
encrypted_key = base64.b64decode(encoded_key.encode()) #remove prefix 'DPAPI' encrypted_key = encrypted_key[5:]
Потом снимаешь с оставшегося, после «нарезки» блоба dpapi.
key = dpapi_decrypt(encrypted_key)
Все, ключ у нас есть. Возвращаемся к данным из Login Data & Cookies.
После этого в рендже 3:15 получаем nonce с блоба с данными. (Почему такой рендж- v10 пропускаем, следующие 12 байт наш nonce)
nonce = encrypted_txt[3:15]
Ну а дальше передаём в функцию по дешифровке aes gcm nonce key и оставшийся блоб.
cipher = aesgcm.get_cipher(key)
aesgcm.decrypt(cipher,encrypted_txt[15:],nonce)
Надеюсь после этого, вопросы все точно отпали)
 


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