Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CallbackHell — Exploit pour CVE-2021-40449 - Vulnérabilité d'élévation de privilèges Win32k (LPE) | Kitploit
Outils/GitHubGitHub/ly4k/callbackhell
Escalade de PrivilègesAnalyse des VulnérabilitésExploitationShellcodePost-ExploitationDéveloppement de Charges UtilesExploitation de Binaires
GitHubly4k/callbackhell

CallbackHell

Exploit pour CVE-2021-40449 - Vulnérabilité d'élévation de privilèges Win32k (LPE)

Voir le dépôt
481952il y a 4 ansVérifié par Kitploit

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

CallbackHell

Exploit pour CVE-2021-40449 (Win32k - LPE)

  • CallbackHell
    • Description
    • Analyse technique
    • PoC
    • Références

Description

CVE-2021-40449 est une use-after-free dans Win32k qui permet une élévation de privilèges locale.

La vulnérabilité a été découverte dans la nature par Kaspersky.

L'exploit découvert a été écrit pour prendre en charge les produits Windows suivants :

  • Microsoft Windows Vista
  • Microsoft Windows 7
  • Microsoft Windows 8
  • Microsoft Windows 8.1
  • Microsoft Windows Server 2008
  • Microsoft Windows Server 2008 R2
  • Microsoft Windows Server 2012
  • Microsoft Windows Server 2012 R2
  • Microsoft Windows 10 (build 14393)
  • Microsoft Windows Server 2016 (build 14393)
  • Microsoft Windows 10 (build 17763)
  • Microsoft Windows Server 2019 (build 17763)

Cependant, cet exploit n'est actuellement testé que sur les versions suivantes :

  • Microsoft Windows 10 (build 14393)
  • Microsoft Windows 10 (build 17763)

Analyse technique

Je recommande vivement la lecture de l'analyse technique de Kaspersky avant de continuer.

Comme mentionné dans l'analyse technique de Kasperky, la vulnérabilité existe dans GreResetDCInternal. Si un attaquant hooke le callback en mode utilisateur DrvEnablePDEV, qui est appelé pendant hdcOpenDCW, il est possible de détruire le contexte de périphérique d'origine en appelant ResetDC, ce qui provoque une use-after-free dans le noyau lorsque le callback en mode utilisateur retourne.

Le pseudo-code suivant est partiellement issu du code source divulgué de Windows XP et du reverse engineering de la dernière version (avant le correctif) de GreResetDCInternal de Win32kfull.sys. Les parties non pertinentes ont été supprimées avec [...]. Recherchez les commentaires VULN: .

root@kitploit:~
BOOL GreResetDCInternal(
    HDC hdc,
    DEVMODEW *pdmw,
    BOOL *pbBanding,
    DRIVER_INFO_2W *pDriverInfo2,
    PVOID ppUMdhpdev)
{
    // [...]
    HDC hdcNew;

    {
        // Create DCOBJ from HDC
        DCOBJ dco(hdc);

        if (!dco.bValid())
        {
            SAVE_ERROR_CODE(ERROR_INVALID_HANDLE);
        }
        else
        {
            // Create DEVOBJ from `dco`
            PDEVOBJ po(dco.hdev());

            // [...]

            // Create the new DC
            // VULN: Can result in a usermode callback that destroys old DC, which
            // invalidates `dco` and `po`
            hdcNew = hdcOpenDCW(L"",
                                pdmw,
                                DCTYPE_DIRECT,
                                po.hSpooler,
                                prton,
                                pDriverInfo2,
                                ppUMdhpdev);

            if (hdcNew)
            {
                po->hSpooler = NULL;

                DCOBJ dcoNew(hdcNew);

                if (!dcoNew.bValid())
                {
                    SAVE_ERROR_CODE(ERROR_INVALID_HANDLE);
                }
                else
                {
                    // Transfer any remote fonts

                    dcoNew->pPFFList = dco->pPFFList;
                    dco->pPFFList = NULL;

                    // Transfer any color transform

                    dcoNew->pCXFList = dco->pCXFList;
                    dco->pCXFList = NULL;

                    PDEVOBJ poNew((HDEV)dcoNew.pdc->ppdev());

                    // Let the driver know
                    // VULN: Method is taken from old (possibly destroyed) `po`
                    PFN_DrvResetPDEV rfn = po->ppfn[INDEX_DrvResetPDEV];

                    if (rfn != NULL)
                    {
                        (*rfn)(po->dhpdev, poNew->dhpdev);
                    }

                    // [...]
                }
            }
        }
    }

    // Destroy old DC
    // [...]
}

Comme on peut le voir dans le pseudo-code, l'ancien contexte de périphérique peut être libéré dans un callback en mode utilisateur depuis l'appel hdcOpenDCW, et plus tard, la méthode DrvResetPDEV est récupérée depuis l'ancien contexte de périphérique et appelée avec (po->dhpdev, poNew->dhpdev).

Pour créer et hooker un contexte de périphérique, on peut procéder comme suit :

  • Trouver une imprimante disponible avec EnumPrinters
  • Charger le pilote d'imprimante en mémoire avec OpenPrinter, GetPrinterDriver et LoadLibraryExA
  • Obtenir la table de callbacks en mode utilisateur du pilote d'imprimante avec GetProcAddress et DrvEnableDriver
  • Déprotéger la table de callbacks en mode utilisateur du pilote d'imprimante avec VirtualProtect
  • Écraser les entrées souhaitées de la table de callbacks en mode utilisateur du pilote d'imprimante
  • Créer un contexte de périphérique pour l'imprimante avec CreateDC(NULL, printerName, NULL, NULL)

Nous devrions maintenant avoir un contexte de périphérique pour une imprimante avec des callbacks en mode utilisateur hookés.

Nous ne nous intéressons qu'à un seul hook, à savoir DrvEnablePDEV. Ce hook est intéressant à deux égards : déclencher l'UAF (use-after-free) et contrôler les arguments, comme décrit précédemment. Pour déclencher la vulnérabilité UAF, nous appellerons ResetDC à l'intérieur du hook, ce qui détruira l'ancien contexte de périphérique. Lorsque nous revenons du hook, nous serons toujours à l'intérieur du premier GreResetDCInternal, qui peu après récupérera et appellera le pointeur de fonction pour DrvResetPDEV depuis notre ancien contexte de périphérique détruit avec les deux arguments retournés par DrvEnablePDEV : l'ancien et le nouveau DHPDEV.

Si votre processus s'exécute avec un niveau d'intégrité moyen, KASLR ne devrait pas poser de problème à l'aide de EnumDeviceDrivers et NtQuerySystemInformation.

Kaspersky mentionne que l'exploit original utilisait des objets de palette GDI et un seul appel de fonction noyau pour obtenir une lecture/écriture mémoire arbitraire. Cet exploit utilise une technique pour allouer un BitMapHeader sur le grand pool et RtlSetAllBits pour activer tous les privilèges sur notre jeton de processus actuel. Le BitMapHeader pointera vers _SEP_TOKEN_PRIVILEGES de notre jeton de processus actuel. En appelant RtlSetAllBits(BitMapHeader), il est possible d'activer tous les privilèges pour notre jeton de processus actuel avec un seul appel de fonction noyau. À partir de là, on peut abuser des nouveaux privilèges pour obtenir SYSTEM. Cet exploit utilise SeDebugPrivilege pour injecter du shellcode dans le processus winlogon.exe.

PoC

./poc.png

Références

  • https://securelist.com/mysterysnail-attacks-with-windows-zero-day/104509/
  • https://github.com/siberas/CVE-2016-3309_Reloaded/
  • https://www.ired.team/miscellaneous-reversing-forensics/windows-kernel-internals/how-kernel-exploits-abuse-tokens-for-privilege-escalation
  • https://github.com/KaLendsi/CVE-2021-40449-Exploit
  • https://mp.weixin.qq.com/s/AcFS0Yn9SDuYxFnzbBqhkQ
Télécharger l’outil