Oběti crypto-ransomware Linux.Encoder.1 se našly i v České republice a některé z nich za dešifrování zaplatily – naše forenzní laboratoř dostala příležitost prozkoumat zakoupený dešifrovací balíček.
Linux.Encoder.1
Základní popis malware je uveden například na ArsTechnica nebo SecurityWeek. Po zneužití zranitelnosti v CMS Magento je spuštěn vlastní ransomware, který zašifruje soubory na disku a ve všech zašifrovaných adresářích zanechá textový soubor s instrukcemi.
Your personal files are encrypted! Encryption was produced using a unique public key RSA-2048 generated for this computer. To decrypt files you need to obtain the private key. The single copy of the private key, which will allow to decrypt the files, located on a secret server at the Internet. After that, nobody and never will be able to restore files... To obtain the private key and php script for this computer, which will automatically decrypt files, you need to pay 1 bitcoin(s) (~420 USD). Without this key, you will never be able to get your original files back. ______________________________________________ !!!!!!!!!!!!!!!!!!!!! PURSE FOR PAYMENT(ALSO AUTHORIZATION CODE): XXXXXXXXXXfiSdX2h3EZFRDdCZOi27e6Tpp !!!!!!!!!!!!!!!!!!!!! WEBSITE: https://XXXXXXXXXl6uze2.onion.to INSTRUCTION FOR DECRYPT: After you made payment, you should go to website https://XXXXXXXXXl6uze2.onion.to Use purse for payment as ur authorization code (XXXXXXXXXXfiSdX2h3EZFRDdCZOi27e6Tpp). If you already did the payment, you will see decryption pack available for download, inside decryption pack - key and script for decryption, so all what you need just upload and run that script ( for example: http://http://magentodemo.AAAA.XXXX.cz/decrypt.php ) Also, at this website you can communicate with our supports and we can help you if you have any troubles, but hope you understand we will not answer at any messages if you not able to pay. !!!P.S. Our system is fully automatic, after payment you will receive you're decrypt pack IMMEDIATELY!!! ... Q: How to use decryption pack? A: Put all files from archive to your server and just run decrpyt.php (example: website.com/decrypt.php)
Aktuálně už je znám způsob,jak data dešifrovat bez zaplacení výkupného a existuje i nástroj pro dešifrování. V prvních dnech výskytu však tato možnost nebyla k dispozici a některé oběti raději zaplatily, aby se ke svým datům dostaly hned. V takovém případě, po zaplacení určené částky, autoři malware zašlou odkaz ke stažení dešifrovacího balíčku ze sítě Tor s instrukcemi, jak provést vlastní dešifrování.
Dešifrovací balíček
V doručeném archivu typu zip se nachází textový soubor s instrukcemi (readme.txt), dešifrovací klíč (key.pem) a dešifrovací skript (decrypt.php).
Decrypt.php
Při pohledu do skriptu decrypt.php je jeho činnost ihned zřejmá – detekuje použitou architekturu a podle toho vytvoří příslušný spustitelný soubor s názvem host. Vlastní kód pro tři podporované architektury je zakódován base64 a uložen uvnitř skriptu v proměnných $so32, $so64 a $so.
$so32 = {…} $so64 = {...} ... $arch = 64; if (intval("9223372036854775807") == 2147483647) { $arch = 32; echo "x64=0\n"; } else echo "x64=1\n"; if ($freebsd == 0){ $so = $arch == 32 ? $so32 : $so64; } else { $so = {…} } … file_put_contents("./host", base64_decode($so)) …
Dále je vytvořen skript 1.sh a nastavena práva 777 pro soubory host a 1.sh. V dalším kroku je tento vytvořený skript spuštěn – jeho úkolem je spustit vytvořený soubor host s patřičnými parametry a poté smazat sám sebe:
./host decrypt key.pem /index.html rm 1.sh
Soubor decrypt.php tedy poskytuje uživatelsky relativně přívětivý způsob spuštění dešifrovacího programu. Souvislosti výše zmiňovaných souborů jsou naznačeny na obrázku:
Host
Binární soubor host provádí vlastní dešifrování se zadaným dešifrovacím klíčem, a jak se při reverzní analýze ukázalo, stejný soubor je používán také k zašifrování souborů na disku. Zkrátka racionalizace – jeden soubor slouží pro dva účely. Pro nás jako analytiky je to ulehčení práce, protože je vidět, jak probíhá proces šifrování a co přesně je do zašifrovaného souboru ukládáno. Stejně potěšující je absence obfuskace a relativně smysluplné pojmenování používaných funkcí.
Reverzní analýzou bylo zjištěno, že jsou očekávány tři parametry příkazové řádky:
- první parametr: řetězec „encrypt“ nebo „decrypt“ určující druh činnosti
- druhý parametr: jméno souboru obsahující klíč (veřejný nebo soukromý) podle činnosti
- třetí parametr: cesta k souboru „index.html“ v adresáři „www-document-root“
Validita parametrů není nijak kontrolována a program skončí ve chvíli, kdy se mu zadané parametry nepodaří správně použít.
Po spuštění proběhne inicializace generátoru náhodných čísel aktuálním časem (což se ve spojení se zahájením šifrování ve stejný okamžik ukázalo jako zásadní slabina, viz dále) a je funkcí LoadRSA()
načten vhodný klíč asymetrické šifry – veřejný pro mód šifrování nebo soukromý pro mód dešifrování.
Poté se proces spustí v režimu daemon a veškerá další činnost tak probíhá na pozadí. Soubor host je v následném kroku smazán z pevného disku a je zahájeno vlastní (de)šifrování souborů na disku.
Veřejný i soukromý klíč pro RSA je programu host dodáván zvenčí. Z dostupných dat (dešifrovací balíček) nelze zjistit, jak jsou tyto klíče generovány, ale klíče jsou vygenerovány přímo na napadeném zařízení, přičemž veřejný klíč je používán během procesu šifrování, zatímco soukromý klíč je odeslán na CaC server. Oba klíče jsou následně ze zařízení odstraněny. Zpátky se pak soukromý klíč dostává až jako součást dešifrovacího balíčku, který si uživatel stáhne po zaplacení.
Průběh zašifrování dat
Nejprve je vhodné zmínit jak probíhá výběr vhodných adresářů a souborů k zašifrovaní. Klíčová funkce int
encrypt_directory(char *directory)
, která zajišťuje zašifrování zadaného adresáře je v pevném pořadí postupně spuštěna na adresáře
- /home
- /root
- /var/lib/mysql
- všechny domovské adresáře uvedené v /etc/passwd (získáváno pomocí standardní funkce
getpwent()
) - /
V řadě případů k zašifrování nedojde kvůli absenci potřebných práv, protože zneužívaný CMS Magento zpravidla běží pod uživatelem www-data.
Součástí kódu je testování přítomnosti adresáře v „ignore listu“, který byl však v testovaném vzorku prázdný. Úplně vždy však budou šifrovány adresáře začínající řetezcem public_html, webapp nebo backup. Zřejmě jde o přípravu na další funkcionalitu nebo pozůstatek z jiného kódu. Zašifrovány by měly být také pouze soubory s následujícími příponami: php, html, tar, gz, sql, js, css, pdf, tgz, war, jar, java, class, ruby, rar, zip, db, 7z, doc, xls, properties, xml, jpg, jpeg, png, gif, mov, avi, wmv, mp3, mp4, wma, aac, wav, pem, pub, docx, apk, exe, dll, tpl, psd, asp, phtml, aspx, csv, public_html.
Vlastní zašifrování souboru je prováděno funkcí int
encrypt_file(char
*plain,
char *encrypted)
,a to následujícím způsobem (viz obrázek):
- Pro každý plain soubor je vytvořen nový soubor s příponou .encryptedpro uložení zašifrovaných dat.
- Do tohoto souboru je nejprve uložena jeho vlastnost
st_mod
(přístupová práva nastavitelná příkazemchmod()
) (4 byty). - Poté je pro soubor vygenerován jedinečný AES-128 klíč a do nového souboru uložena jeho velikost v bytech (4 byty, prakticky vždy 0×00 01 00 00) a hned za ním samotný AES klíč zašifrovaný RSA klíčem (16 bytů).
- Za zmínku stojí, že způsob generování AES klíče je velmi … nestandardní, protože je generován pouze jako 16 znakový řetězec sestávající z malých písmen a číslic a nevyužívá maximální možnou entropii.
- Ukládání velikosti klíče, který je na mnoha místech hardcoded na 16B, ukazuje na využití jiného obecnějšího kódu.
- Následně je vygenerován inicializační vektor pro AES a uložen do souboru (16B).
- Pak už jsou z původního souboru postupně načítány 16B bloky, šifrovány pomocí AES a výsledky ukládány do výstupního souboru.
- Za zmínku stojí opět ne příliš standardní implementace šifrování, kdy je používán stejný IV pro všechny bloky, místo aby byl použit výstup předchozího bloku.
Když už byly zmíněny slabiny v šifrovacím algoritmu, sluší se také doplnit, že inicializovat generátor pseudonáhodných čísel časem spuštění – což je fakticky i čas vytvoření prvního zašifrovaného souboru – opravdu nebyl dobrý nápad. Výzkumníci BitDefenderu tuto vlastnost využilia připravili nástroj pro dešifrování dat, který vygeneruje stejnou posloupnost pseudonáhodných čísel a tedy je schopen vytvořit stejné AES klíče. Pro dešifrování souborů je však potřeba mít úplně všechny zašifrované soubory s nezměněnými časovými značkami – jinak nástroj nebude moci zistit čas spuštění, správně incializovat generátor a zopakovat generování klíčů ve správném pořadí.
Pro zjištění všech přítomných souborů, které analyzovaný malware zašifroval, je potřeba hledat soubory s příponou .encrypted, které obsahují 00 01 00 00 na offsetu 4–7. Například příkazem
find / -name "*.encrypted" -exec sh -c "hexdump -n 8 {} | grep -qE '0100 0000\s*
Původní soubory jsou po dokončení jejich zašifrování smazány pomocí funce unwind(), takže existuje nenulová pravděpodobnost, že se smazané soubory dají obnovit forenzní analýzou napadeného disku. Volný prostor však mezitím mohl být přepsán, nebo – pokud se jedná o SSD disk a OS s podporou TRIM – mohla být data smazána garbage collectorem disku.
V každém adresáři, který byl zpracován šifrovacím algoritmem, je vytvořen soubor README_FOR_DECRYPT.txt, obsahující instrukce k dešifrování.
Průběh dešifrování
Spuštění programu s parametrem „decrypt“ provede dešifrování, přičemž jednotlivé kroky téměř přesně kopírují šifrovací postup. Opět jsou procházeny všechny výše zmíněné adresáře a volány funkce int
decrypt_all(char
*directory)
a int
decrypt_file(char
*encrypted, char *plain)
.
Na všechny nalezené a dostupné soubory s příponou .encrypted je aplikováno dešifrování.
- Je vytvořen nový soubor – jméno odpovídá zašifrovanému souboru s odstraněním přípony .encrypted.
- Do nového souboru je dešifrován obsah zašifrovaného souboru.
- Zašifrovaný soubor je smazán.
- Nově vytvořenému souboru jsou nastavena práva skupin pomocí funkce
chmod()
.
Všechny nalezené soubory s názvem README_FOR_DECRYPT.txt jsou smazány. Prakticky je tak obnoven původní stav před spuštěním ransomware, s jedinou výjimkou – přiřazení vlastníka a skupiny.
Shrnutí
Analýzou „dešifrovacího balíčku“ zakoupeného obětí crypto-ransomware Linux.Encryptor.1 bylo zjištěno, jakým způsobem jsou soubory (de)šifrovány, které adresáře a soubory jsou v centru pozornosti a jak jednoduše identifikovat zašifrované soubory.
Každý soubor je zašifrován s použitím symetrické šifry AES-128, přičemž příslušný klíč je jedinečný pro každý soubor a je v tomto souboru uložen v zašifrované podobě (s použitím asymetrické šifry RSA2048) spolu s inicializačním vektorem a nastavením přístupových práv. Klíče asymetrické šifry jsou společné pro všechny soubory v daném zařízení.
V analyzovaném kódu je vidět řada přípravných prací na používání šifrovacích klíčů obecné délky, ale ve většině případů je velikost 16 bytů zadána napevno. Také jsou přítomny funkce pro whitelisting a blacklisting adresářů určených k zašifrování, ale v analyzovaném vzorku nejsou využívány.
Získání zašifrovaných souborů je možné i bez zaplacení výkupného, díky predikovatelnosti použitých náhodných čísel při generování AES klíčů a známých inicializačních vektorů. Predikovatelnost je umožněna použitím aktuálního času jako seed pro funci srand()
, která inicializuje generátor pseudonáhodných čísel, přičemž hodnota použitého aktuálního času je známa – jde o čas vytvoření prvního zašifrovaného souboru. I bez této chyby by pravděpodobně část souborů bylo možné obnovit, protože původní soubory nebyly přepsány šifrovaným obsahem, ale smazány standardní cestou.
Po zaplacení výkupného se z oběti stává vážený zákazník a tvůrci ransomware myslí na jeho pohodlí – dešifrování probíhá způsobem zaplať-stáhni-spusť-enjoy. Také dešifrovací algoritmus se snaží zrušit všechny změny, které provedl, což se mu kromě přiřazení původního vlastníka a skupiny i daří. Zřejmě i ve vyděračském průmyslu je potřeba mít spokojené zákazníky, kteří se rádi vracejí…