
# Exploit rt26cx21x64.sys (famille Realtek PCIe GbE/2.5GbE/5GbE)
Exploitation de rt26cx21x64.sys (famille Realtek PCIe GbE/2.5GbE/5GbE)
L'OID 0xFF816871 mappe la bar mmio de la carte réseau dans l'espace d'adressage virtuel du processus appelant, (MmLockedPagesSpecifyCache), accessible depuis le mode utilisateur via \.\RealTekCard{GUID}
Cet IOCTL (0x0012C818) est protégé par une valeur de registre (DrvMode=4)
Une fois que nous avons accès aux registres mmio, nous programmons les anneaux de descripteurs tx/rx de la carte réseau en mode boucle pour lire/écrire des adresses physiques arbitraires (AllocateUserPhysicalPages nous donne les PFN).
L'IOCTL 0x12C008 (1230872) est la première branche de répartition vulnérable. 0x12C00C et 0x12C010 mènent à des chemins différents, a5 transporte le code IOCTL à travers le switch

Avant d'atteindre le chemin DMA, le pilote vérifie un indicateur global DrvMode, le bit 2 doit être défini sinon nous n'atteindrons jamais le chemin vulnérable de mappage MMIO.

dword_1400D0208 et 4 est la vérification
Deux gardes se trouvent devant le chemin vulnérable, les deux doivent être évaluées à faux pour accéder au chemin DMA. Il s'agit d'un indicateur d'octet sur l'extension du périphérique et de la vérification de mode dans l' image précédente

!_(_BYTE _)(a1 + 12465) est facile à contourner, il suffit de s'assurer que le périphérique n'est pas initialisé.
sub_14001B67C est également trivialement facile.
Le pilote alloue un MDL sur une adresse physique fournie par l'appelant sans aucune validation, il n'y a aucune validation de limites ou de plage, absolument rien.

Le MDL est mappé dans la VA du noyau et l'adresse de base est donnée à l'appelant, 0x40000010 est MAP_NO_EXECUTE & MmNonCached.

MmMapLockedPagesSpecifyCache produit la VA mappée qui est écrite dans *a2 et renvoyée en mode utilisateur, ce qui nous donne une primitive arbitraire de lecture/écriture physique.
nic.h.Exécuter en tant qu'administrateur.
Après la première exécution, les valeurs de registre seront définies et vous devrez redémarrer votre PC.
Pour que cela fonctionne, votre carte réseau doit être dans un état de liaison UP (afin que nous puissions traiter les descripteurs).
Soit :
OU
$ cmake -B build
$ cmake --build build --config Release