Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CallbackHell — Exploit para CVE-2021-40449 - Vulnerabilidade de Elevação de Privilégio no Win32k (LPE) | Kitploit
Ferramentas/GitHubGitHub/ly4k/callbackhell
Escalada de PrivilégiosAnálise de VulnerabilidadesExploraçãoShellcodePós-ExploraçãoDesenvolvimento de PayloadsExploração de Binários
GitHubly4k/callbackhell

CallbackHell

Exploit para CVE-2021-40449 - Vulnerabilidade de Elevação de Privilégio no Win32k (LPE)

Ver Repositório
48195há 4 anosRevisado pelo Kitploit

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

CallbackHell

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

  • CallbackHell
    • Descrição
    • Artigo Técnico
    • PoC
    • Referências

Descrição

CVE-2021-40449 é um use-after-free no Win32k que permite escalada de privilégio local.

A vulnerabilidade foi encontrada em campo pela Kaspersky.

O exploit descoberto foi escrito para suportar os seguintes produtos Windows:

  • 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)

No entanto, este exploit foi testado atualmente apenas nas seguintes versões:

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

Artigo Técnico

Recomendo fortemente a leitura do artigo técnico da Kaspersky antes de prosseguir.

Conforme mencionado no artigo técnico por Kasperky, a vulnerabilidade existe em GreResetDCInternal. Se um atacante interceptar o callback em modo de usuário DrvEnablePDEV, que é chamado durante hdcOpenDCW, é possível destruir o contexto de dispositivo original chamando ResetDC, o que causa um use-after-free no kernel quando o callback de modo de usuário retorna.

O pseudo-código a seguir é parcialmente criado a partir do código-fonte vazado do Windows XP e por engenharia reversa do GreResetDCInternal mais recente (antes do patch) do Win32kfull.sys. As partes irrelevantes foram removidas com [...]. Procure pelos comentários 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
    // [...]
}

Como pode ser visto no pseudo-código, o contexto de dispositivo antigo pode ser liberado em um callback de modo de usuário a partir da chamada hdcOpenDCW, e posteriormente, o método DrvResetPDEV é recuperado do contexto de dispositivo antigo e chamado com (po->dhpdev, poNew->dhpdev).

Para criar e interceptar um contexto de dispositivo, pode-se fazer o seguinte:

  • Encontre uma impressora disponível com EnumPrinters
  • Carregue o driver da impressora na memória com OpenPrinter, GetPrinterDriver e LoadLibraryExA
  • Obtenha a tabela de callbacks de modo de usuário do driver da impressora com GetProcAddress e DrvEnableDriver
  • Desproteja a tabela de callbacks de modo de usuário do driver da impressora com VirtualProtect
  • Substitua as entradas desejadas da tabela de callbacks de modo de usuário do driver da impressora
  • Crie um contexto de dispositivo para a impressora com CreateDC(NULL, printerName, NULL, NULL)

Agora devemos ter um contexto de dispositivo para uma impressora com callbacks de modo de usuário interceptados.

Estamos interessados em apenas um hook, a saber, DrvEnablePDEV. Este hook é interessante em dois aspectos: desencadear o UAF e controlar os argumentos, conforme descrito anteriormente. Para desencadear a vulnerabilidade UAF, chamaremos ResetDC dentro do hook, que destruirá o contexto de dispositivo antigo. Quando retornarmos do hook, ainda estaremos dentro do primeiro GreResetDCInternal, que logo em seguida obterá e chamará o ponteiro de função para DrvResetPDEV do nosso contexto de dispositivo antigo e destruído com os dois argumentos que foram retornados de DrvEnablePDEV; o antigo e o novo DHPDEV.

Se o seu processo estiver rodando com um nível de integridade médio, o KASLR não deve ser um problema com a ajuda de EnumDeviceDrivers e NtQuerySystemInformation.

Kaspersky menciona que o exploit original usava objetos de paleta GDI e uma única chamada de função do kernel para alcançar leitura/escrita arbitrária de memória. Este exploit usa uma técnica para alocar um BitMapHeader no big pool e RtlSetAllBits para habilitar todas as permissões no token do nosso processo atual. O BitMapHeader apontará para o _SEP_TOKEN_PRIVILEGES do token do nosso processo atual. Chamando RtlSetAllBits(BitMapHeader), é possível habilitar todas as permissões para o token do nosso processo atual com uma única chamada de função do kernel. A partir daí, pode-se abusar das novas permissões para obter SYSTEM. Este exploit usa SeDebugPrivilege para injetar shellcode no processo winlogon.exe.

PoC

./poc.png

Referências

  • 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
Baixar ferramenta