Next-Gen Reverse Engineering Training¶
Módulo 6: Kernel Exploitation - Real Microsoft Patches¶
Objetivo del módulo: aprender un flujo práctico para estudiar un parche real de Microsoft, construir una VM vulnerable y una VM parcheada, extraer los binarios modificados desde paquetes
.msu/.cab/.psf, ubicar el driver relevante y preparar el material para hacer patch diffing de forma ordenada.
Tabla de Contenidos¶
- Caso de estudio: CVE-2024-38144
- Idea general del workflow
- Conseguir la ISO vulnerable
- Instalación vulnerable sin red
- Validar build y crear snapshot-0
- Descargar e instalar el parche objetivo
- Troubleshooting de instalación de parches
- Instalar el parche mensual anterior
- Encontrar los archivos modificados
- Extraer el parche
.msu - Trabajar con
.cab,.psfyexpress.psf.cix.xml - Ubicar
ksthunk.sys - Preparar binarios para patch diffing
- Metodología de análisis del diff
- Notas sobre endianess
- Checklist del laboratorio
- Glosario
Clase 1 apuntes¶
1. Caso de estudio: CVE-2024-38144¶
El módulo toma como primer caso real un parche de Microsoft:
- CVE: CVE-2024-38144
- Nombre: Kernel Streaming WOW Thunk Service Driver Elevation of Privilege Vulnerability
- Componente:
ksthunk.sys - Tipo: Elevation of Privilege local
- Weakness:
CWE-190: Integer Overflow or Wraparound - Fecha de publicación: 13 de agosto de 2024
- Parche objetivo del ejemplo:
KB5041585
La idea no es empezar escribiendo un exploit, sino entender qué archivo cambió, qué función cambió, qué validación agregó Microsoft y qué bug queda implícito al comparar vulnerable vs patched.
¿Por qué estudiar parches reales?¶
Los parches de Microsoft suelen agrupar muchas vulnerabilidades en un mismo paquete mensual. Eso obliga a trabajar con disciplina:
- Identificar el KB correcto.
- Conseguir una build vulnerable cercana.
- Extraer o recuperar el archivo vulnerable y el parcheado.
- Compararlos con herramientas como IDA Pro, BinDiff, Diaphora o bindiffing manual.
- Confirmar que el cambio corresponde al CVE estudiado y no a otro fix del mismo mes.
2. Idea general del workflow¶
El flujo del módulo es:
- Buscar el CVE en MSRC.
- Identificar el KB que contiene el parche.
- Instalar una VM Windows vulnerable, preferentemente una build inmediatamente anterior.
- Deshabilitar updates para congelar el estado.
- Crear
snapshot-0de la VM vulnerable. - Instalar el parche objetivo y crear
snapshot-1. - Ubicar el archivo parcheado.
- Restaurar
snapshot-0e instalar el parche mensual anterior si hace falta ajustar la baseline. - Obtener el archivo vulnerable equivalente.
- Comparar ambas versiones del binario.
snapshot-0 snapshot-1
VM vulnerable + KB objetivo VM parcheada
------------- ------------> ------------
ksthunk.sys old ksthunk.sys new
\ /
\ /
\ /
+------ patch diff -------+
3. Conseguir la ISO vulnerable¶
Para estudiar un parche, la build de Windows debe ser:
- Vulnerable.
- Compatible con el KB que se quiere instalar.
- Lo suficientemente cercana al parche objetivo para evitar problemas de prerequisitos.
Opciones comunes:
- Descargar la ISO desde una suscripción de Microsoft si se tiene acceso.
- Usar una ISO pública de Windows y llevarla hasta una build previa con updates offline.
- Buscar una build inmediatamente anterior al parche que se quiere estudiar.
En las slides se usa como ejemplo Windows 11 23H2 con build:
Esa build aparece asociada al acumulativo de mayo de 2024:
La regla práctica es: la build vulnerable debe estar antes de la actualización que corrige el CVE.
4. Instalación vulnerable sin red¶
La instalación debe hacerse sin conexión a internet para evitar que Windows Update corrija la vulnerabilidad automáticamente.
Modo de red recomendado¶
- Usar una red host-only o aislada.
- Evitar NAT/bridged durante la instalación.
- No iniciar sesión con una cuenta Microsoft si eso fuerza conectividad.
Bypass de requisito de red en Windows 11¶
En la pantalla Let's connect you to a network:
- Presionar
Shift + F10. - Ejecutar:
- La VM reinicia.
- Elegir la opción equivalente a I don't have internet.
- Crear una cuenta local.
Deshabilitar actualizaciones¶
El material usa Wu10Man para deshabilitar servicios de update:
- Release usada en las slides:
v4.4.0 - URL: https://github.com/WereDev/Wu10Man/releases/tag/v4.4.0
La razón es simple: si Windows se actualiza solo, se pierde la build vulnerable y el laboratorio deja de ser reproducible.
5. Validar build y crear snapshot-0¶
Antes de tocar parches:
- Ejecutar
winver. - Confirmar edición, versión y build.
- Documentar el estado exacto.
- Crear un snapshot de la VM.
Nombre sugerido por el módulo:
Ejemplo visto en las slides:
Qué conviene anotar¶
| Dato | Ejemplo |
|---|---|
| Windows version | Windows 11 23H2 |
| Build | 22631.3593 |
| KB base | KB5037771 |
| Arquitectura | x64 |
| Red | host-only / sin internet |
| Updates | deshabilitados |
| Snapshot | snapshot-0 |
6. Descargar e instalar el parche objetivo¶
El parche objetivo del ejemplo es:
En el Microsoft Update Catalog se busca el KB y se descarga el paquete que corresponda a la arquitectura y versión del sistema.
Para Windows 11 x64, las slides muestran entradas como:
Instalación controlada¶
- Mantener la VM sin internet.
- Habilitar temporalmente servicios de update desde Wu10Man si el instalador lo requiere.
- Ejecutar el
.msu. - Reiniciar.
- Volver a deshabilitar updates.
- Confirmar build con
winver. - Crear un snapshot de la VM parcheada.
Nombre sugerido:
Este snapshot sirve para recuperar el archivo parcheado más adelante sin repetir toda la instalación.
7. Troubleshooting de instalación de parches¶
Un error común es que el instalador diga que el parche no aplica a esa computadora. Suele pasar cuando la ISO es demasiado vieja o cuando falta un prerequisito.
Causas comunes¶
| Problema | Causa probable | Acción |
|---|---|---|
El .msu no aplica |
ISO demasiado vieja | Usar una ISO más cercana al mes del parche |
| Error por prerequisito | Falta Servicing Stack Update | Instalar el SSU requerido |
| Build equivocada | KB de otra rama/version | Revisar versión, arquitectura y canal |
| El sistema se actualizó solo | Updates activos | Restaurar snapshot y aislar red |
Regla práctica¶
Mientras más cerca esté la ISO vulnerable del parche objetivo, menos conflictos aparecen. Idealmente se trabaja con la build inmediatamente anterior o con el acumulativo mensual anterior.
8. Instalar el parche mensual anterior¶
Para construir una imagen vulnerable más precisa, el módulo propone instalar el parche mensual anterior al objetivo.
En el ejemplo:
- Parche objetivo:
KB5041585- agosto de 2024 - Parche anterior:
KB5040442- julio de 2024
Flujo:
- Restaurar
snapshot-0. - Instalar
KB5040442. - Reiniciar.
- Deshabilitar updates.
- Confirmar build.
- Crear un snapshot adicional si se quiere preservar esta baseline.
Esto ayuda a que el diff entre vulnerable y patched sea más chico y relevante.
9. Encontrar los archivos modificados¶
Esta es la parte difícil del proceso. Un parche mensual contiene cambios para muchas vulnerabilidades y componentes, no solo para el CVE que se está estudiando.
Para CVE-2024-38144, las slides muestran que el archivo interesante es:
ksthunk.sys corresponde al Kernel Streaming WOW Thunk Service Driver. El nombre ayuda a buscar dentro del paquete usando términos como:
Fuentes para ubicar el archivo¶
- MSRC, para confirmar CVE, KB y componente.
- Microsoft Update Catalog, para descargar el
.msu. - Archivos instalados dentro de
snapshot-0ysnapshot-1. express.psf.cix.xml, para buscar nombres dentro del paquete.- Winbindex, para encontrar versiones históricas de binarios de Windows.
URL útil:
10. Extraer el parche .msu¶
El material renombra el parche descargado como:
Luego lo copia a una carpeta de trabajo, por ejemplo:
Extraer el MSU¶
Si aparecen solo CABs y no PSF¶
El resultado puede incluir archivos como:
wsusscan.cab
onepackage.AggregatedMetadata.cab
LCUCompDB_KB5041585.xml.cab
Windows11.0-KB5041585-x64.cab
Windows11.0-KB5041585-x64.psf
11. Trabajar con .cab, .psf y express.psf.cix.xml¶
Microsoft usa distintos formatos para distribuir actualizaciones. En patches modernos es común encontrar:
.msu: contenedor de update..cab: cabinet con metadatos o payloads..psf: Patch Storage File, suele contener deltas.express.psf.cix.xml: índice XML con referencias a archivos dentro del delta.
Cuando hay CAB + PSF¶
Si el paquete trae una combinación como:
el módulo recomienda usar PSFExtractor:
https://github.com/Secant1006/PSFExtractor/releases
Ejemplo de uso visto en la slide:
Buscar en express.psf.cix.xml¶
Abrir el XML con Notepad++ o un editor que soporte archivos grandes y buscar:
Esto permite descubrir entradas relacionadas con ksthunk.sys.
Punto importante: el .psf puede contener deltas, no necesariamente el archivo completo. El XML sirve para identificar nombres y rutas, pero no siempre alcanza para obtener un binario final directamente usable. Una vez conocido el nombre, se puede:
- Recuperar el archivo desde la VM vulnerable.
- Recuperar el archivo desde la VM parcheada.
- Descargar una versión específica desde Winbindex si está disponible.
- Reconstruir el archivo desde el delta si se domina ese flujo, aunque el módulo no usa ese método.
12. Ubicar ksthunk.sys¶
Con el nombre del driver identificado, el siguiente paso es obtener dos versiones comparables:
Desde snapshots¶
- Iniciar
snapshot-0o la baseline vulnerable. - Copiar
ksthunk.sysa una carpeta de análisis. - Iniciar
snapshot-1. - Copiar la versión parcheada.
- Renombrar los archivos para evitar confusión.
Ejemplo:
Rutas probables¶
Los drivers del sistema suelen estar bajo:
Verificar metadata¶
En Windows se puede revisar:
- Propiedades del archivo.
- Firma digital.
- Fecha de modificación.
- File version.
- Product version.
También sirve guardar hashes:
Get-FileHash .\ksthunk_22631_3593_vuln.sys -Algorithm SHA256
Get-FileHash .\ksthunk_KB5041585_patched.sys -Algorithm SHA256
13. Preparar binarios para patch diffing¶
Antes de abrir IDA/BinDiff, ordenar el material evita errores.
Estructura de carpeta recomendada¶
case-CVE-2024-38144\
00-info\
notes.md
msrc.txt
01-packages\
KB5041585.msu
KB5040442.msu
02-binaries\
vulnerable\
ksthunk.sys
patched\
ksthunk.sys
03-ida\
vulnerable\
patched\
04-diff\
Checklist previo al diff¶
- Confirmar que ambos archivos son del mismo componente.
- Confirmar arquitectura.
- Confirmar firma y metadata.
- Confirmar hashes.
- Confirmar que la versión parcheada viene del KB objetivo.
- Confirmar que la vulnerable es anterior al KB objetivo.
Flujo con IDA y BinDiff¶
- Abrir
ksthunk.sysparcheado en IDA. - Esperar a que termine el análisis.
- Guardar la base
.i64. - Abrir
ksthunk.sysvulnerable. - Esperar análisis y guardar
.i64. - Ejecutar BinDiff entre ambas bases.
- Ordenar por funciones con similitud menor a
1.0. - Revisar primero funciones pequeñas con cambios de control flow o validaciones nuevas.
14. Metodología de análisis del diff¶
El diff por sí solo no explica la vulnerabilidad. Solo muestra diferencias. El trabajo del reverser es interpretar esas diferencias.
Qué buscar en un patch de integer overflow¶
Como el CVE está asociado a CWE-190, conviene prestar atención a patrones como:
- Nuevas comparaciones antes de una suma, multiplicación o conversión.
- Checks de tamaño contra límites máximos.
- Uso nuevo de helpers seguros de arithmetic.
- Cambios de tipos signed/unsigned.
- Condiciones nuevas antes de reservar memoria.
- Validaciones antes de copiar buffers.
- Caminos de error nuevos que devuelven
STATUS_INVALID_PARAMETERo similar.
Ejemplo conceptual:
// Antes: cálculo directo
size = count * entry_size;
// Después: validación previa o helper seguro
if (count > MAX / entry_size) {
return STATUS_INVALID_PARAMETER;
}
size = count * entry_size;
Este ejemplo no describe el patch real, solo el patrón típico que se busca al investigar una corrección de integer overflow/wraparound.
Preguntas guía¶
| Pregunta | Por qué importa |
|---|---|
| ¿Qué función cambió? | Acota la superficie real del fix |
| ¿Qué entrada controla usuario? | Permite conectar bug con superficie de ataque |
| ¿Qué validación se agregó? | Suele revelar la condición vulnerable |
| ¿Hay cambios en tamaños o casts? | Indicio fuerte en bugs CWE-190 |
| ¿El cambio afecta IOCTLs? | En drivers, suele ser la ruta user-kernel |
| ¿Qué error retorna el código nuevo? | Ayuda a reconstruir el contrato esperado |
Confirmar que el cambio corresponde al CVE¶
No alcanza con encontrar una función distinta. Un acumulativo mensual puede cambiar muchas funciones por motivos no relacionados.
Señales de buena atribución:
- El nombre/ruta del archivo coincide con el componente del CVE.
- La fecha y versión corresponden al KB correcto.
- El cambio introduce validaciones coherentes con
CWE-190. - La función modificada es alcanzable desde la superficie esperada.
- No hay otra vulnerabilidad del mismo mes que explique mejor el cambio.
15. Notas sobre endianess¶
La última slide deja un recordatorio de endianess:
Los bytes ASCII:
En little endian, un entero se almacena con el byte menos significativo primero. Por eso, si se quiere ver el texto CORE en memoria, el entero puede aparecer representado como:
Esto es importante en reversing de Windows porque muchos valores de 4 bytes, como tags de pool o constantes mágicas, se ven invertidos según si se miran como bytes, string o entero.
Regla práctica¶
| Vista | Valor |
|---|---|
| Bytes en memoria | 43 4f 52 45 |
| ASCII | CORE |
| Entero big endian | 0x434f5245 |
| Entero little endian | 0x45524f43 |
16. Checklist del laboratorio¶
VM vulnerable¶
- ISO correcta.
- Sin conexión a internet.
- Windows instalado con cuenta local.
- Updates deshabilitados.
- Build confirmada con
winver. -
snapshot-0creado.
VM parcheada¶
- KB objetivo descargado.
- Arquitectura correcta.
- Prerequisitos revisados.
- KB instalado offline.
- Reinicio completo.
- Updates deshabilitados nuevamente.
-
snapshot-1creado.
Extracción¶
-
.msupreservado. -
.cabextraídos. -
.psfprocesado si aplica. -
express.psf.cix.xmlrevisado. -
ksthunk.sysidentificado.
Patch diffing¶
- Binario vulnerable guardado.
- Binario parcheado guardado.
- Hashes calculados.
- Metadata documentada.
- Bases IDA guardadas.
- Diff generado.
- Cambios atribuibles al CVE documentados.
17. Glosario¶
| Término | Descripción |
|---|---|
| MSRC | Microsoft Security Response Center. Publica CVEs, severidad, productos afectados y KBs relacionados. |
| CVE | Identificador público de una vulnerabilidad. |
| CWE | Clasificación del tipo de debilidad. CWE-190 corresponde a integer overflow/wraparound. |
| KB | Knowledge Base. Identificador de actualización de Microsoft, por ejemplo KB5041585. |
| MSU | Microsoft Update Standalone Package. Contenedor instalable de updates. |
| CAB | Cabinet file. Formato de archivo comprimido usado por Windows. |
| PSF | Patch Storage File. Formato usado para transportar deltas de actualización. |
| SSU | Servicing Stack Update. Actualización del componente que instala updates. Puede ser prerequisito. |
| LCU | Latest Cumulative Update. Paquete acumulativo mensual. |
| Snapshot | Estado guardado de una VM para volver a una build exacta. |
| Winbindex | Servicio para buscar y descargar binarios históricos de Windows desde fuentes de Microsoft. |
| Patch diffing | Comparación de binarios vulnerable/parcheado para inferir qué bug se corrigió. |
| BinDiff | Herramienta de Google para comparar bases de datos de IDA. |
ksthunk.sys |
Driver del Kernel Streaming WOW Thunk Service, componente del caso CVE-2024-38144. |
| WOW / WOW64 | Capa de compatibilidad para ejecutar software de 32 bits en Windows de 64 bits. |
| Endianess | Orden en que una arquitectura almacena bytes de valores multibyte. Windows x86/x64 usa little endian. |
Apunte basado en el PDF Modulo_06_Kernel_Exploitation.pdf - Binary Gecko, Next-Gen Reverse Engineering Training, Módulo 6: Kernel Exploitation - Real Microsoft Patches. Se amplió con metodología de laboratorio, organización de binarios, checklist y criterios de análisis para patch diffing.