A WebShield ügyfélkör bővülése hozta magával azt a tényt is, hogy egyre több a mintavételezési lehetőségem, sokkal könnyebb újabbnál újabb támadási minták és vírusok begyűjtése. Igazából mindegy is lehetne számomra, hogy egy-egy kártevő mit csinál, mi a célja.
Ennek ellenére mindig van bennem valami gyermeki kíváncsiság, tudni akarom mi történik a kártevő futásakor. Persze időm nem mindig engedi, hogy azonnal foglalkozzak az új mintákkal, ezért szorgosan pakolom őket egy mappába a gépemen, hátha egyszer lesz időm elemezgetni őket. Amikor aztán rámjön az elemezhetnék, kiveszek találomra egy mintát és megpróbálom visszafejteni a működését.
Obfuscation is not security
Mivel a kártevőnek valahogy le kell futnia, nem igazán lehet titkosítani. Titkosítás helyett az úgynevezett obfuszkációt szokták használni. Az obfuszkáció gyakorlatilag azt jeleni, hogy az eredeti kód parancsait úgy cserélgetjük / helyettesítjük, hogy a végén egy emberi szem számára olvashatatlan katyvaszt kapjunk. Leegyszerűsítve olyan, mintha a 12 helyett azt írnám, hogy 3+3+7-1. Ha ez utóbbit kiértékelem, ugyanúgy 12 lesz az eredmény, mint ahogyan az eredetiben is.
Ez a tény magával vonja azt is, hogy ezek a kártevők bizony visszafejthetők. Ugyanakkor vannak olyan szinten, több körben obfuszkált kártevők is, aminél már azt mondom, hogy ehhez nincs türelmem, nem ér annyit.
Egyszerűbb példák
Régebben volt jellemző, hogy a kártékony kód egy egyszerű encode-olással (pl base64), vagy tömörítéssel volt „rejtve”, ezek a legkönnyebben megfejthető vírusok. Van, hogy ennél összetettebb módon obfuszkálvt a kód. Viszont a végén van egy „eval” parancs. Az eval lefuttatja a paraméterként kapott kódrészt. Ha ezt az eval parancsot echo-ra vagy print-re cseréli az ember, akkor futtatás helyett szépen kiírja a kártevő a futtatandó kódot. Ezzel a módszerrel néhány lépésben vissza lehetett fejteni az eredetit.
A neten fellelhető néhány eszköz, amivel ezeket az egyszerűbb kártevőket több-kevesebb sikerrel vissza lehet fejteni. Ilyen az unphp.net, vagy a ddecode.com/phpdecoder.
Aztán jöttek a bonyolultabb minták, amelyek létrehoznak egy halom értelmezhetetlen nevű változót, hogy utána egymásra hivatkozva építsék fel a kódot. A fenti eszközöknek általában már beletörik a bicskája az ilyen kártevők visszafejtésébe.
Hogyan fogok neki?
Az obfuszkált kódokban nincs sortörés, ezzel is nehezítve a megértést. A PHP nyelvben viszont a pontosvessző, illetve kapcsos zárójelek után tipikusan szokás sortörést tenni. Egy egyszerű search and replace művelet segít ezen. Ha megvan a sorokra tördelt kód, akkor felmérem, hogy a kód visszafejtéséhez mi lehet a legjobb módszer.
Lehetséges, hogy van benne egy „eval” valahol, akkor a feljebb említett módszerrel a vírust veszem rá, hogy dekódolja önmagát. Ha esetleg hosszabb, összefüggő encode-olt részeket találok, akkor célszerű ezeket dekódolni először, és behelyettesíteni a kódba. Ez több körben kell eljátszani, de lépésről lépésre egyre tisztább lesz a kód.
A végén szinte garantált, hogy lesz pár függvénydefiníció, értelmetlen névvel, a vírus fő részében pedig ezek a függvények kerülnek meghívásra. Ezeknek a függvényeknek a kódját megnézve viszonylag egyszerű megfejteni hogy mit csinál, és lehet neki egy értelmes nevet adni. Nem mindegy értelmezhetőség szempontjából, hogy azt látom egy sorban, hogy
lghrsv(tthdsy($url),$f);
vagy azt, hogy
save_file(open_url($url), $f);
Ez utóbbiból rögtön látszik hogy a netről tölt le valamit maga mellé a kártevő.
Egy debugger mindig jól jön…
Ha éppen bonyolultabb a kártevő, vagy csak gyorsan akarok ránézni valamire, akkor jó ha van kéznél egy fejlesztőeszköz, amivel lehet vizsgálni a programokat futás közben. Ebben régimódi vagyok, NetBeans-t használok. Erre a célra viszont tökéletes.
A kódban megfelelő helyre elhelyezett töréspontokkal a felesleget (változók létrehozása, bitbűvészkedés) át lehet ugrani. Elég arra a részre fókuszálni, ahol a vezérlés van. Ezen a ponton nem fog zavarni, hogy ha ilyet látok:
$Ge.$g10($D21($g10($D21($g10($D21($g10($D21("53")).$g10($D21($g10($D21("53"))."1")))).$g10($D21("50")))).$g10($D21("55")))).$O1c
A debugger képes arra, hogy ha ezt a részt az egérrel kijelölöm, akkor visszafejti nekem, hogy mit is jelent pontosan ez a karaktersorozat:
Érdekel a téma?
Május 25-én tartok egy előadást, ahol többek között erről is fogok beszélni. A fő tematika a kártevők evolúciója, azaz hogy miként változtak meg az elmúlt években, és milyen lépéseket kell megtenni ahhoz, hogy a WordPress oldalad továbbra is védett legyen. Az újabb vírusokat egyre nehezebb felismerni is, visszafejteni is.
Az esemény Facebook oldalát itt találod: https://www.facebook.com/events/1951959148365999/
További információért katt ide: https://www.webshield.hu/termek/eloadas-wordpress-kartevok-evolucioja/
Nagyon érdekes téma. És igazán elgondolkodtató. A virus védelem nagyon fontos.