ACTION REQUIRED (leer y ejecutar inmediatamente)
NOW: Lee../field-journal/precedent-reverse.md— confirma que la operación de este skill está autorizada como práctica habitual.NOW: Confirma si la tarea actual cumple con el ámbito de aplicación de este skill.NEXT: Lee../tool-index.mdy verifica la disponibilidad de las herramientas y sus rutas reales.NEXT: Si faltan herramientas, invoca bootstrap. No adivines rutas.ACT: Entra en el primer paso del "flujo de trabajo" y ejecútalo, no te quedes en estado de confirmación.
N-day: Análisis de Parches a Exploit (Patch Diff Exploit)
Ámbito de aplicación
Usa este skill cuando la tarea corresponda a uno de los siguientes escenarios:
- CVE conocido sin PoC público — El anuncio del fabricante dice "se corrigió una escritura fuera de límites en el componente XX" pero no proporciona PoC; hay que deducir el bug a partir del parche.
- SRC / Red Team atacando N-day — Los activos objetivo no se actualizaron a tiempo; hay que convertir un parche recién publicado en un exploit 1-day utilizable.
- Seguimiento de Patch Tuesday — El segundo martes de cada mes Microsoft publica parches; hay que identificar rápidamente vulnerabilidades de alto valor (Kernel / Win32k / AFD / CLFS).
- Análisis de parches LTS de Linux — La corrección ya se fusionó en la rama principal, pero los backports para ramas secundarias o distribuciones específicas están incompletos; buscar superficies sin parchear.
- Reversión de parches de seguridad en drivers/servicios — Análisis de parches en software cerrado como drivers de GPU, motores antivirus, componentes de virtualización.
División del trabajo con otros skills
| Escenario | Qué usar |
|---|---|
| Símbolos de versión antigua disponibles para migrar a la nueva y ayudar al análisis | binary-diff/ |
| Encontrar vulnerabilidades desde un parche y escribir PoC para la versión anterior al parche | Este skill |
| Escribir la cadena de explotación completa (heap spray, ROP, escalada de privilegios) | pwn-chain/ |
| Armar un 1-day y desplegarlo en la red objetivo | pentest-tools/network-attack-defense/ |
| Reversear un binario desde cero | ida-reverse/ / radare2/ |
La diferencia clave: el objetivo de binary-diff es hacer analizable la nueva versión (trasladar símbolos antiguos a la nueva), mientras que el objetivo de este skill es identificar qué bug corrigió el parche y luego explotar la versión anterior al parche. El primero sirve al lado defensivo / de investigación; el segundo sirve a la weaponización ofensiva.
Principio fundamental
ejecutable parcheado (after) ejecutable sin parchear (before)
↓ ↓
Importar en IDA/Ghidra Importar en IDA/Ghidra
↓ ↓
└──────── BinDiff / ghidriff ────────────┘
↓
Diff a nivel de funciones (matched/unmatched/changed)
↓
Enfocar funciones con puntuación de coincidencia media (0.5 - 0.9)
↓
Buscar qué se añadió: comprobaciones de límites / bloqueos /
puesta a cero de campos / comprobaciones de desbordamiento de enteros
↓
Deducir la clase de bug: OOB / Race / Info Leak / UAF / Integer Overflow
↓
Escribir PoC para la versión sin parchear que lo desencadene
↓
Validar: la versión sin parchear crashea / la parcheada no → vulnerabilidad confirmada
Patrón de fix del parche → tipo de vulnerabilidad inverso:
| Código añadido | Tipo de bug probable |
|---|---|
if (a + b < a) / __builtin_add_overflow | Desbordamiento de enteros |
KeAcquireSpinLock / mutex_lock | Condición de carrera (TOCTOU / double-free) |
if (idx >= MAX) / if (len > buf_size) | Lectura / escritura fuera de límites |
RtlZeroMemory / memset(struct, 0, ...) | Fuga de información por memoria no inicializada |
InterlockedDecrement + verificación de refcount | UAF / error en contador de referencias |
ProbeForRead / ProbeForWrite | Puntero de modo usuario no verificado |
SeAccessCheck / verificación de capabilities | Falta de verificación de permisos |
Eliminación / restricción de código IOCTL | Reducción de superficie de ataque (ver cómo atacar la interfaz antigua) |
Flujo de trabajo
Proceso completo en 5 pasos
Paso 1: Obtener los binarios before/after
- Windows: Descargar MSU/MSP del Catálogo de Actualizaciones de Microsoft,
extraer con expand.exe / dism
- Linux: Obtener .deb/.rpm desde USN/RHSA de la distribución,
extraer con dpkg-deb / rpm2cpio
- Software de terceros: Obtener los paquetes de instalación N-1 y N del sitio oficial
Paso 2: Alinear símbolos
- Si hay PDB, cargarlos directamente. Si no, usar el skill binary-diff
para trasladar los símbolos de la versión N-1 a la versión N.
- Kernel de Linux: obtener vmlinux + System.map / debuginfo de la versión correspondiente
Paso 3: Diff binario
- BinDiff: darle dos IDB, ver el resultado de coincidencia a nivel de función
- ghidriff: instalar con pip, CLI genera informe en markdown
- Diaphora: plugin para IDA, veterano pero requiere IDA Pro
Paso 4: Localizar cambios
- Filtrar funciones con puntuación de coincidencia 0.5-0.95 (las idénticas no interesan,
las completamente diferentes suelen ser nuevas o renombradas)
- Enfocarse en: nuevos if / nuevos límites de bucle / bloques de código eliminados
(lo que se eliminó también es una pista)
- Usar LLM para revisar el pseudocódigo before/after y deducir la clase de bug
(ver references/root-cause-and-poc.md)
Paso 5: Escribir PoC
- Desbordamiento de enteros: construir valores límite (INT_MAX-1, 0xFFFFFFFF)
- Condición de carrera: hammer multihilo, abrir/cerrar + ioctl en alta concurrencia
- UAF: patrón spray → free → reuse
- OOB: control preciso de len / index para cruzar el límite
- Validar: la versión parcheada ya no crashea, la sin parchear crashea establemente
→ bug reproducido exitosamente
Orden de invocación de herramientas
Descargar parche → Extraer → Cargar en IDA/Ghidra → BinDiff/ghidriff →
Observar funciones sin coincidencia / con baja coincidencia →
LLM deduce clase de bug → Escribir PoC → Ejecutar en versión sin parchear → Crashea → Terminado
Ejemplos de escenarios típicos
Escenario 1: Patch Tuesday de Windows — Replicación de CVE del kernel
Contexto: Noviembre 2025 Patch Tuesday, MSRC anuncia CVE-2025-62215
Condición de carrera en el kernel de Windows que provoca double free, CVSS 7.0,
escalada local de privilegios
Microsoft solo publicó el parche, sin detalles ni PoC público
Objetivo: Replicar el PoC, verificar que Windows 11 22H2 / 23H2 sin parchear
es vulnerable a escalada de privilegios
Pasos:
1. Buscar "2025-11" + KB en el Catálogo de Actualizaciones de Microsoft,
descargar dos versiones:
- 22H2 build 22621.xxxx (sin parchear)
- 22H2 build 22621.yyyy (parcheada)
Comandos:
expand.exe Windows-KB5052000-x64.msu -F:* C:\out\patched\
expand.exe C:\out\patched\Windows-KB5052000-x64.cab -F:* C:\out\patched\
Extraer ntoskrnl.exe / win32k.sys / win32kfull.sys / afd.sys
2. Cargar PDB para ambas versiones (servidor de símbolos de Microsoft):
symchk /v /r ntoskrnl.exe /s SRV*C:\sym*https://msdl.microsoft.com/download/symbols
3. Ejecutar BinDiff:
bindiff old.BinExport new.BinExport
o ghidriff:
ghidriff ntoskrnl_old.exe ntoskrnl_new.exe -o diff_out/
4. Revisar el informe, filtrar funciones con similitud 0.6-0.95.
Supongamos que se localiza una función tipo NtXxxIoctl con un nuevo bloque:
KeAcquireSpinLockRaiseToDpc(&obj->Lock);
if (obj->RefCount == 0) { ... goto cleanup; }
→ Se añadió un bloqueo + verificación de refcount → race + double free,
coincide con la descripción del anuncio
5. Escribir PoC: múltiples hilos en modo usuario llamando simultáneamente
a NtClose + desencadenando el IOCTL del mismo objeto,
creando una ventana de carrera entre la liberación en close y el uso en IOCTL
Crashea en la ruta de free posterior de ObfDereferenceObject en ntoskrnl
6. Validar:
- Ejecutar PoC en 22621.xxxx sin parchear → BSOD en ~30 segundos
(BAD_POOL_HEADER o DOUBLE_FREE)
- Ejecutar el mismo PoC en 22621.yyyy parcheada → sin anomalías
→ Replicación exitosa
Escenario 2: Parche de kernel Linux en rama LTS — encontrar ramas secundarias sin parchear
Contexto: La rama principal 6.x ya corrigió una escritura OOB en cierto subsistema net
Ubuntu 22.04 (5.15 LTS) ya publicó actualización en su USN
Pero ciertos kernels OEM / kernel Azure tienen un ritmo de backport más lento
Se quiere verificar si las ramas secundarias sin actualizar siguen siendo explotables
Objetivo: Obtener kernels parcheado y sin parchear, diferenciar el cambio binario del
fix commit, reescribir el PoC para la rama secundaria sin parchear
Pasos:
1. Descargar paquetes parcheado y sin parchear:
apt download linux-image-5.15.0-101-generic # parcheado
apt download linux-image-5.15.0-100-generic # sin parchear
dpkg-deb -x linux-image-5.15.0-101-generic_*.deb ./patched/
dpkg-deb -x linux-image-5.15.0-100-generic_*.deb ./unpatched/
Extraer boot/vmlinuz → usar extract-vmlinux para restaurar ELF
2. Obtener dbgsym simultáneamente:
apt download linux-image-unsigned-5.15.0-101-generic-dbgsym
3. Usar ghidriff (amigable con Linux):
ghidriff vmlinux_5.15.0-100 vmlinux_5.15.0-101 \
-o /tmp/kdiff/ --max-section-funcs-analyze 8000
4. En el informe, buscar funciones changed en subsistemas net/ipv4/ net/ipv6/ net/sched/ etc.
Encontrar que antes del parche faltaba la verificación del límite superior de skb->len
antes de llamar a skb_copy_bits
→ OOB read, potencialmente combinable con un sysctl desencadenable
para convertirlo en OOB write
5. En la rama secundaria sin parchear (por ejemplo, Azure 5.15.0-1080 con backport atrasado):
Verificar de forma cruzada si el mismo fix de la función ya está backportado.
Si no lo está → la rama secundaria sigue siendo explotable → escribir PoC para replicar
6. Escribir PoC: adaptar un harness de syzkaller / PoC en C que desencadene la syscall
correspondiente. Verificar que la rama secundaria haga panic / KASAN reporte OOB.
Notas importantes
- Límites legales — La weaponización de N-day debe realizarse solo bajo autorización (SRC / Bug Bounty / máquinas objetivo propias / CTF). Atacar directamente un 1-day en un entorno productivo equivale a intrusión.
- El parche puede ser solo "reducir el radio de explosión" — Ver un parche no significa necesariamente que sea la corrección completa; podría tapar solo una ruta de explotación, dejando el bug original aún accesible por otras rutas (un pez, dos comidas).
- No dejarse engañar por nombres de variables/tipos — Los parches de Windows a menudo incluyen limpieza/renombrado que parecen cambios grandes pero son irrelevantes. Hay que observar el flujo de control y datos, no el diff a nivel de token.
- Los parches de Microsoft pueden añadir una mitigación, no un fix — Ver
_guard_xfg_dispatch_icall_fptr(fortalecimiento CFG) no debe considerarse un fix, es una mitigación. - Anonimización — Al publicar writeups/PoCs, desensibilizar nombres de máquina objetivo, IPs internas, nombres de usuario (usar marcadores
{target_ip}{username}). - En la versión parcheada debe poder ejecutarse una prueba inofensiva — No ejecutar solo en la versión sin parchear; de lo contrario, el crash podría deberse a factores del entorno, no a la vulnerabilidad.
- El diff binario no es omnipotente — La actualización del compilador o cambios en el nivel de optimización pueden alterar drásticamente el layout de las funciones. Comparar la versión N con la N-1 (mismo compilador), no entre versiones mayores.
Bootstrap bajo demanda
Dependencias de herramientas
| Herramienta | Propósito | Instalación automática |
|---|---|---|
| BinDiff (Google, 5.x+) | Diff binario a nivel de función, plugin IDA/Ghidra | ✓ (tiene .deb / .msi oficial) |
| Diaphora | Plugin de diff para IDA, veterano, requiere IDA Pro | ✓ (git clone) |
| ghidriff | Diff headless para Ghidra, salida markdown | ✓ (pip install ghidriff) |
| DeepDiff (comercial) | Herramienta de diff de nueva generación, mayor precisión | ✗ (licencia comercial) |
| Ghidra | Base de ejecución de ghidriff | ✓ |
| IDA Pro | Base de ejecución de BinDiff / Diaphora | ✗ (comercial) |
| Catálogo de Actualizaciones de Microsoft | Descargar paquetes de parche MSU/MSP | Servicio en línea |
| wsuspect-proxy | Interceptar tráfico de Windows Update para obtener parches | ✓ (git clone) |
| expand.exe / dism | Extraer MSU / cab | ✓ (incluido en Windows) |
| rpm2cpio / dpkg-deb | Extraer paquetes de distribuciones Linux | ✓ |
| symchk | Obtener PDB desde el servidor de símbolos de Microsoft | ✓ (Windows SDK) |
Comando de bootstrap
powershell -NoProfile -ExecutionPolicy Bypass -File "<SKILL_ROOT>\skills\scripts\bootstrap-reverse.ps1" -Capability @('bindiff','ghidriff','ghidra','wsuspect-proxy') -StartServices
Comparativa detallada de herramientas y comandos en references/diff-tools-comparison.md.
Flujo detallado de Patch Tuesday en references/patch-tuesday-workflow.md.
Deducción de causa raíz y plantillas de PoC en references/root-cause-and-poc.md.
Contexto de enrutamiento
Entrada upstream: skills/SKILL.md (controlador principal), routing.md
Skills upstream:
reverse-engineering/— Antes de hacer el diff, puede ser necesario entender la estructura general del binario objetivo.binary-diff/— Si la versión parcheada no tiene símbolos y la anterior sí, usar binary-diff primero para trasladar los símbolos.
Skills downstream:
pwn-chain/— Una vez deducida la clase de bug, escribir el exploit completo (heap spray, ROP, bypass SMEP/SMAP, payload de escalada de privilegios).pentest-tools/network-attack-defense/— Armar el N-day y desplegarlo en la red objetivo (empaquetar como carga útil entregable, conectar a C2).attack-chain/— Integrar este N-day en una cadena de ataque completa (acceso inicial → escalada → movimiento lateral).
Condiciones de activación: La tarea contiene intenciones como "N-day", "parche", "replicar CVE", "encontrar qué corrigió el parche", "atacar hosts sin actualizar"
Autoverificación de finalización de tarea (DEBE pasar antes de declarar finalización)
- ¿Ejecuté cada paso del flujo de trabajo (no solo lo leí)?
- ¿Usé rutas de herramientas reales basadas en
tool-index? - ¿Produje evidencia reproducible (comandos/scripts/capturas de pantalla/informes)?
- ¿Completé y registré los elementos del Checklist requeridos por RULES?