Analýza crypto-ransomware Linux.Encoder.1

Aleš Padrta 18. 11. 2015

Šifrovaná data jako rukojmí? Obchodní model placení výkupného se už osvědčil i v elektronickém světě, a tak zřejmě budeme svědky jeho masivnějšího využívání – vzpomeňme na CryptoWall, CryptoLocker, CoinVault a řadu dalších. O premiéru pro OS Linux se postaral crypto-ransomware pojmenovaný Linux.Encoder.1.

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 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

  1. /home
  2. /root
  3. /var/lib/mysql
  4. všechny domovské adresáře uvedené v /etc/passwd (získáváno pomocí standardní funkce getpwent())
  5. /

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 vlastnostst_mod (přístupová práva nastavitelná příkazem chmod() ) (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)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.

widgety

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í…

Našli jste v článku chybu?
Podnikatel.cz: EET pro e-shopy? Postavené na hlavu

EET pro e-shopy? Postavené na hlavu

Vitalia.cz: Dostal malý pivovar ze Slovenska do Tesca

Dostal malý pivovar ze Slovenska do Tesca

Podnikatel.cz: Byla finanční manažerka, teď cvičí jógu

Byla finanční manažerka, teď cvičí jógu

Vitalia.cz: Muž, který miluje příliš. Ženám neimponuje

Muž, který miluje příliš. Ženám neimponuje

Vitalia.cz: Jak Ondra o astma přišel

Jak Ondra o astma přišel

Vitalia.cz: Test dětských svačinek: Tyhle ne!

Test dětských svačinek: Tyhle ne!

120na80.cz: Hrbatá prsa aneb mýty o implantátech

Hrbatá prsa aneb mýty o implantátech

Podnikatel.cz: Znáte už 5 novinek k #EET

Znáte už 5 novinek k #EET

DigiZone.cz: Rapl: seriál, který vás smíří s ČT

Rapl: seriál, který vás smíří s ČT

Vitalia.cz: Jsou vegani a vyrábějí nemléko

Jsou vegani a vyrábějí nemléko

DigiZone.cz: Ginx TV: pořad o počítačových hráčích

Ginx TV: pořad o počítačových hráčích

Vitalia.cz: Tahák, jak vyzrát nad zápachem z úst

Tahák, jak vyzrát nad zápachem z úst

DigiZone.cz: DVB-T2 ověřeno: seznam TV zveřejněn

DVB-T2 ověřeno: seznam TV zveřejněn

Vitalia.cz: Voda z Vltavy před a po úpravě na pitnou

Voda z Vltavy před a po úpravě na pitnou

Lupa.cz: Jak levné procesory změnily svět?

Jak levné procesory změnily svět?

DigiZone.cz: Wimbledon na Nova Sport až do 2019

Wimbledon na Nova Sport až do 2019

DigiZone.cz: Mordparta: trochu podchlazený 87. revír

Mordparta: trochu podchlazený 87. revír

Podnikatel.cz: Instalatér, malíř a elektrikář. "Vymřou"?

Instalatér, malíř a elektrikář. "Vymřou"?

DigiZone.cz: O2 Sport zbrojí na derby pražských S

O2 Sport zbrojí na derby pražských S

Lupa.cz: Aukro.cz mění majitele. Vrací se do českých rukou

Aukro.cz mění majitele. Vrací se do českých rukou