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

Вопрос по шифрованию хрома

Лично я реализовал если админ права есть, то делается полная расшифровка, без взаимодествия кома хрома. Стартуется свой же процесс как system и дальше через пайпы передаем сыну блобы дпапи которые нужно расшифровать в контексте system. Но после этого ждет сюрприз и ключ не остается расшифрованным. Второе шифрование ключа хрома утаили https://source.chromium.org/chromium/chromium/src/+/main:chrome/elevation_service/elevator.cc;l=29 здесь для хрома идет включение файла в котором есть определения на функции расшифровки, а папку internal не запушили гады. Поэтому логику шифрования получится узнать после реверса, хотя там нет ничего сложного, ничего такого нее намудрили они
Вот с хромом сделал, а как быть с еджом, использую аналогичный метод для хрома но он не работает, там тупо я сравниваю appbound encryption key и они разные, как быть?
Доков от эджа и интерфейсов от них не дано
 
Вот с хромом сделал, а как быть с еджом, использую аналогичный метод для хрома но он не работает, там тупо я сравниваю appbound encryption key и они разные, как быть?
Доков от эджа и интерфейсов от них не дано
У еджа этого 2 шифрования нет, расшифровал дпапи и все
 
У еджа этого 2 шифрования нет, расшифровал дпапи и все
А зачем он тогда добавил в Local State appbound encryption key?
Он им не пользуется даже?
 
А зачем он тогда добавил в Local State appbound encryption key?
Он им не пользуется даже?
Ты не понял о каком 2 шифровании я имею ввиду. При расшифровки дпапи appbound encryption key получается некоторая структура где хранятся данные а перед ними 4 байта их длина. Таким образом там идет 4 байта длины пути к хрому, далее сам путь к хрому, а дальше идет 4 байта и дальше лежат либо зашифрованные данные(в случае хрома) либо не зашифрованные(для еджа и других). Так вот вот длина этого блоба будет 32 у еджа что и есть ключ для расшифровки у хрома же это будет больше 32, т.к там еще одно шифрование. Вот именно для хрома копилируется такой код, который закрыт
C++:
#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
  auto post_process_result = PostProcessData(plaintext_str);
  if (!post_process_result.has_value()) {
    return post_process_result.error();
  }
  plaintext_str.swap(*post_process_result);
#endif  // BUILDFLAG(GOOGLE_CHROME_BRANDING)
 
C++:
HRESULT DecryptUserPasswordUsingEscrowService(
    const std::string& access_token,
    const base::Value::Dict& encrypted_data_dict,
    const base::TimeDelta& request_timeout,
    std::wstring* decrypted_password) {
  DCHECK(decrypted_password);
  const std::string* resource_id =
      encrypted_data_dict.FindString(kUserPasswordLsaStoreIdKey);
  const std::string* encoded_cipher_text =
      encrypted_data_dict.FindString(kUserPasswordLsaStoreEncryptedPasswordKey);

  if (!resource_id) {
    LOGFN(ERROR) << "No password resource id found to restore";
    return E_FAIL;
  }

  if (!encoded_cipher_text) {
    LOGFN(ERROR) << "No encrypted password found to restore";
    return E_FAIL;
  }

  std::string private_key;
  std::optional<base::Value> request_result;

  // Fetch the results and extract the |private_key| to be used for decryption.
  HRESULT hr = WinHttpUrlFetcher::BuildRequestAndFetchResultFromHttpService(
      PasswordRecoveryManager::Get()->GetEscrowServiceGetPrivateKeyUrl(
          *resource_id),
      access_token, {}, {}, request_timeout, kMaxNumHttpRetries,
      &request_result);

  if (FAILED(hr)) {
    LOGFN(ERROR) << "BuildRequestAndFetchResultFromHttpService hr="
                 << putHR(hr);
    return E_FAIL;
  }

  if (!request_result.has_value() || !request_result->is_dict() ||
      !ExtractKeysFromDict(
          request_result->GetDict(),
          {
              {kGetPrivateKeyResponsePrivateKeyParameterName, &private_key},
          })) {
    return E_FAIL;
  }

  std::string decoded_cipher_text;
  if (!base::Base64Decode(*encoded_cipher_text, &decoded_cipher_text)) {
    LOGFN(ERROR) << "Failed to base64 decode ciphertext";
    return E_FAIL;
  }

  std::string decoded_private_key;
  if (!Base64DecodeCryptographicKey(private_key, &decoded_private_key)) {
    LOGFN(ERROR) << "Failed to base64 decode private key";
    return E_FAIL;
  }

  auto decrypted_secret = PrivateKeyDecrypt(
      decoded_private_key, base::as_byte_span(decoded_cipher_text));

  if (decrypted_secret == std::nullopt) {
    return E_FAIL;
  }

  std::string unpadded;
  UnpadSecret(*decrypted_secret, &unpadded);
  *decrypted_password = base::UTF8ToWide(unpadded);

  SecurelyClearString(*decrypted_secret);
  SecurelyClearString(unpadded);

  return S_OK;
}

}  // namespace

из сурсов хрома

Как я понимаю - хром получает какойто юрл, видимо через него происходит общение с сервисом, не могу понять что с этим делать
 
Screenshot_20250104_205732.png

Раньше Chrome шифровал конфиденциальные данные с помощью текущего ключа пользователя, ведущего журнал. Теперь они шифруются с помощью ключа SYSTEM, к которому у текущего пользователя нет доступа, поэтому единственный способ расшифровать данные — это запросить процесс chromeBroker. Я думаю, вам нужно повысить права до NT AUTHORITY/System.
 
Посмотреть вложение 101322
Раньше Chrome шифровал конфиденциальные данные с помощью текущего ключа пользователя, ведущего журнал. Теперь они шифруются с помощью ключа SYSTEM, к которому у текущего пользователя нет доступа, поэтому единственный способ расшифровать данные — это запросить процесс chromeBroker. Я думаю, вам нужно повысить права до NT AUTHORITY/System.
"Real hackerman have him own way." Люди посмотрите на другие, не примитивные варианты...
 
Посмотреть вложение 101322
Раньше Chrome шифровал конфиденциальные данные с помощью текущего ключа пользователя, ведущего журнал. Теперь они шифруются с помощью ключа SYSTEM, к которому у текущего пользователя нет доступа, поэтому единственный способ расшифровать данные — это запросить процесс chromeBroker. Я думаю, вам нужно повысить права до NT AUTHORITY/System.
Там какая та херня с rpc каналами, я не понял этого, но понял что залезть в процесс брокера нельзя

Но если убрать эти уровни примитивности, то можно совершить инжект в хром, затем загрузить через хром бд - условно в загрузки, дешифровать ключ от лица хрома, и затем все это дело успешно отправить на сервер
 
Последнее редактирование:


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