
# Exploit de rt26cx21x64.sys (familia Realtek PCIe GbE/2.5GbE/5GbE)
Exploit de rt26cx21x64.sys (familia Realtek PCIe GbE/2.5GbE/5GbE)
El OID 0xFF816871 mapea el bar mmio de la NIC en el espacio de direcciones virtuales del proceso llamante, (MmLockedPagesSpecifyCache), accesible desde modo usuario mediante \.\RealTekCard{GUID}
Este IOCTL (0x0012C818) está protegido por un valor de registro (DrvMode=4)
Una vez que tenemos acceso a los registros mmio, programamos los anillos de descriptores tx/rx de la NIC en modo loopback para leer/escribir direcciones físicas arbitrarias (AllocateUserPhysicalPages nos da los PFN).
El IOCTL 0x12C008 (1230872) es la primera rama vulnerable del despacho. 0x12C00C y 0x12C010 conducen a rutas diferentes, a5 transporta el código IOCTL a través del switch

Antes de llegar a la ruta DMA, el controlador comprueba un indicador global DrvMode; el bit 2 debe estar establecido o nunca llegaremos a la ruta vulnerable de mapeo MMIO.

dword_1400D0208 y 4 es la comprobación
Dos protecciones se interponen frente a la ruta vulnerable; ambas deben evaluarse como falsas para entrar en la ruta DMA. Estas son un indicador de byte en la extensión del dispositivo y la comprobación de modo de la imagen anterior

!_(_BYTE _)(a1 + 12465) es fácil de derivar, solo tenemos que asegurarnos de que el dispositivo no esté inicializado.
sub_14001B67C también es trivialmente fácil.
El controlador asigna un MDL sobre una dirección física proporcionada por el llamante sin ninguna validación; no hay validación de límites ni de rango, como si no hubiera nada en absoluto.

El MDL se mapea en el VA del kernel y la dirección base se entrega al llamante; 0x40000010 es MAP_NO_EXECUTE y MmNonCached.

MmMapLockedPagesSpecifyCache produce el VA mapeado que se escribe en *a2 y se devuelve a modo usuario, lo que nos da una primitiva arbitraria de lectura/escritura física.
nic.h.Ejecutar como administrador.
Después de la primera ejecución, se establecerán los valores de registro y necesitarás reiniciar tu PC.
Para que esto funcione, tu NIC debe estar en estado de enlace ACTIVO (para que podamos procesar descriptores).
O bien:
O bien:
$ cmake -B build
$ cmake --build build --config Release