Sécurité Web : Comment trouver un backdoor PHP sur son serveur

2
270

Lorsque des pirates accèdent à votre serveur Web, ils procèdent parfois à l’installation d’un backdoor (PHP Shell, NDLR) conçu pour leur permettre de retrouver l’entrée même après que vous ayez nettoyé le site, corrigé la faille de sécurité qui a permis le hack et aussi à contourner les mesures visant à verrouiller les futures tentatives des pirates que vous auriez pu mettre en place à améliorer la sécurité du site.

Un script backdoor peut être appelé à partir d’un navigateur comme toute autre page Web. Il donne à son utilisateur une interface Web où le pirate peut télécharger, uploader, afficher ou modifier des fichiers, créer des répertoires, et gérer autrement le site en utilisant la capacité de PHP pour lire et écrire des fichiers et de passer des commandes du système par le biais du système d’exploitation.

Les backdoors peuvent être difficiles à trouver car ils sont généralement dissimulés dans des fichiers qui font déjà partie du site ou téléchargés en tant que nouveaux fichiers avec des noms innocents, placés le plus souvent dans un répertoire avec de nombreux fichiers.

1) Détecter les scripts backdoors en cherchant dans les logs d’accès du serveur Web

Une façon de trouver ces scripts est de rechercher dans les logs d’accès au site Web des lignes suspectes qui peuvent être générées lorsque quelqu’un utilise ce type de scripts.

Voici un bon exemple, à partir d’un log HTTP d’Apache, d’un script de porte dérobée dans le cas d’une utilisation réelle par un pirate. Éditez le fichier /public_html/.htaccess :


xxx.xxx.xxx.xxx - - [dd/mm/yyyy:hh:mm:ss -0700]
"GET /path/footer.inc.php?act=edit&file=/home/account/public_html/.htaccess HTTP/1.1"
200 4795 "http://website/path/footer.inc.php?act=filemanager" "Mozilla/5.0..." 


  • Footer.inc.php est le fichier innocemment nommé contenant le backdoor.
  • Notez bien “act”(action)=edit and file=.htaccess.
  • Le referer (page consultée) a été aussi la page de porte dérobée, qui est doté d’un gestionnaire de fichiers.

Personne ne devrait être en mesure de modifier vos fichiers. htaccess à partir d’une page Web ! Une ligne de journal comme celui-ci est un énorme avertissement, et pointe directement vers le fichier ou le script de backdoor est caché.

Ci-dessous vous sont suggéré un certain nombre de choses évidentes à rechercher dans votre fichier de logs :

  • htaccess” : Sauf si vous écrivez dans le fichier .htaccess ou que le nom de ce fichier est dans vos URL du moteur de recherche convivial de nom de fichier, il n’y a aucune raison pour le mot “htaccess” n’apparaisse dans vos logs d’accès HTTP.
  • act=edit” : Dans l’exemple ci-dessus, variations possibles.
    action=edit” : Dans l’exemple ci-dessus, variations possibles.
  • filemanager” : Un autre mot qui ne devrait pas normalement apparaître dans votre fichier de logs.

Si vous utilisez des éditeurs sous forme d’interface web légitimes comme CKEditor ou TinyMCE, ils pourraient éventuellement produire des lignes de journal comme celles citées préalablement, mais les pages étant appelées comme on le voit dans votre fichier journal doivent être reconnaissables en tant que scripts appartenant à ces éditeurs, et non pas des noms bizarres comme “footer.inc.php“.

Il y a plusieurs façon d’obtenir les journaux, autrement que par SSH. Via cPanel par exemple. Plesk est similaire, et si vous n’avez aucun des deux, ou quelque chose de comparable, vous pouvez habituellement obtenir les logs par FTP, généralement à partir d’un dossier en dehors public_html, avec “logs” ou “journaux d’accès” dans son nom.

2) Détecter les scripts backdoors en cherchant dans les fichiers avec les commandes grep ou findstr

Les scripts faisant office de backdoors ont souvent besoin d’utiliser des commandes PHP non légitimes, de sorte que vous pouvez rechercher ces commandes dans les fichiers présents sur votre serveur. Il existe des programmes de recherche que vous pouvez utiliser pour rechercher du texte dans des fichiers. Les deux décrits ci-dessous sont ceux que vous exécutez à partir d’une ligne de commande (prompt), et donc sans interface graphique.

Code PHP suspect à rechercher

Il s’agit d’une liste non exhaustives des fonctions PHP qui sont nécessaires pour des scripts malveillants, mais moins couramment utilisées par les plus légitimes, mais les faux positifs sont certainement une possibilité, en particulier pour les trois derniers dans la liste. Ne supprimez pas un script ou un fichier simplement parce qu’il utilise un ou plusieurs de ces fonctions. Utilisez votre jugement lors de l’inspection du code environnant. D’autre part, si un en-tête en haut du fichier dit que c’est une “web shell“, écrit par une équipe de pirates (certains d’entre eux le précise), vous pouvez être raisonnablement certain que vous devez supprimer le script dans votre serveur.

  • passthru
  • shell_exec
  • system
  • phpinfo
  • base64_decode
  • edoced_46esab  (base64_decode utilisé en arrière pour éviter la détection par des recherches de chaîne comme ceci)
  • chmod
  • mkdir
  • “ (backticks avec une commande du système d’exploitation entre eux)
  • fopen
  • fclose
  • readfile
Recherche de texte avec la commande grep sous linux

Sur un serveur Linux, le programme grep est déjà installé dans le cadre du système d’exploitation. Le seul problème est de trouver comment le lancer.

Si vous avez accès en ligne de commande à votre serveur (SSH), il n’y a pas de problème. Vous pouvez le lancer depuis la ligne de commande et les résultats seront directement affichés. Toutefois, pour des raisons de sécurité, de nombreux hébergeurs mutualisés ne permettent pas à leurs clients un accès SSH.

Dans ce cas, la solution pourrait être d’utiliser crontab pour planifier et exécuter votre commande. Crontab est disponible sur la plupart des hébergeurs et est intégré dans cPanel comme Cron Jobs et Plesk en tant que tâches planifiées. Tout ce qui serait normalement affiché dans votre fenêtre de terminal (la sortie de votre commande et les messages d’erreur) vous est envoyé dans un mail. La procédure de mise en place du cron est la même que celui décrit ici, sauf que dans l’étape 4, vous saisissez votre commande grep au lieu de celle décrite dans cet article.

Les anciennes versions de grep ont des moyens limités. Les plus récents permettent l’utilisation des expressions régulières de Perl et d’autres options.

Exécuter ces commandes de test, soit à partir d’une ligne de commande shell ou par la méthode Cron Job, selon que vous pouvez utiliser. Vous constaterez probablement que vous ne pouvez entrer qu’une commande dans chaque tâche cron vous créez, cette procédure est un peu plus longue :

1. Déterminer le répertoire par défaut qui commence en crontab : pwd
Le résultat devrait être quelque chose comme /home/nom d’utilisateur

2. Obtenez une liste des fichiers et dossiers dans ce répertoire : ls-aFlq
Examinez la liste pour faire public_html sûr, c’est là-bas. Il devrait ressembler à ceci:
drwxr-x — 39 xxxxxxxx xxxxxxxx 4096 12 janvier 18:30 public_html/

3. Déterminer la version de votre serveur de grep: grep – version

4. Déterminez les options que votre version de supports grep: grep – help
Si la sortie a une ligne de ce genre, vous avez une version plus récente qui prend en charge les expressions régulières Perl :
-P, – perl-regexp PATRON est une expression régulière

Vous êtes maintenant familiarisé avec la méthode de saisie de ces commandes, et avez des informations qui vous aideront à prendre des décisions jugement dans les prochaines étapes, telles que si vous pouvez utiliser les expressions régulières plus complexes ou doit utiliser les plus simples.

Nous allons restreindre la recherche dans le dossier public_html et tout ce qu’elle contient. Quand vous avez obtenu votre inscription à l’annuaire à l’étape 2 ci-dessus, vous avez probablement vu qu’il ya beaucoup de fichiers et dossiers à l’extérieur public_html. Il n’est pas impossible que le code malveillant pourrait avoir été placé là, mais nous allons les ignorer pour ces recherches automatiques mondiale.

Une des raisons est qu’il permettra d’éviter grep recherche de tous vos e-mails stockés, consulter le site Web logs, et d’autres fichiers potentiellement massive qui pourrait prendre beaucoup de temps et de générer beaucoup de faux positifs.

L’autre raison est qu’il ya certains types de fichiers qui peuvent pousser grep pour arrêter la recherche, mais ne quittera pas la course, le laissant dans un état essentiellement accroché. Lorsque vous êtes de l’exécuter à partir de cron, vous n’êtes pas capable de taper Control-C pour le faire taire. Pour l’instant, nous allons essayer de rendre cette situation aussi improbable que possible en limitant la recherche aux fichiers qui sont en fait une partie de votre site web.

Au moins un type de fichier qui peuvent pousser grep à accrocher est un «dispositif», qui sous Linux est un fichier. Vous n’êtes pas susceptible de rencontrer cette situation sur un serveur partagé, mais sur un serveur dédié, il est préférable d’éviter de chercher dans les répertoires suivants avec grep : /dev/, /lib/, /media/, /proc/, /sys/ . Si grep essaie de rechercher un périphérique en mode caractère, il siégera attendre éternellement pour l’entrée de l’appareil. En autant que je sache, il ne sera pas bloquer le serveur, mais je ne sais pas comment le forcer à mettre fin à partir de cron.

Une exception notable à l’extérieur public ignorant les fichiers HTML, c’est que si vous voyez un fichier htaccess. Dans le même dossier où est public_html (qui est, en dehors public_html), vous devriez l’examiner manuellement les codes malveillants. Il s’agit d’un fichier texte.

Recherches Exemple de texte pour le code PHP suspectes

Cette syntaxe simple devrait travailler avec les versions grep plus. Ne la recherche une fois pour chacun des mots-clés PHP suggéré ci-dessus. Pour comprendre les options utilisées dans les lignes ci-dessous, veuillez consulter le texte d’aide que vous avez obtenu dans une étape préliminaire ci-dessus. La combinaison spatiale astérisque dans l’expression régulière permet de zéro ou plusieurs espaces entre la fin de la commande et la parenthèse ouvrante, deux styles différents de codage PHP :

grep -Rn “passthru *(” public_html/

Votre email résultat contiendra une liste des fichiers où les lignes correspondants ont été trouvés, les numéros de ligne où les matchs a eu lieu, et le texte des lignes qui correspondent.

Si votre texte Aide grep a montré que le drapeau du P-(expressions régulières de Perl) est disponible, vous pouvez combiner toutes les recherches en une seule commande de ce genre, bien qu’il puisse générer un e-mail la suite de plusieurs mégaoctets, si il s’avère que l’une des fonctions sont largement utilisés par bon nombre de vos scripts légitimes (faux positifs) :

grep -RPn “(passthru|shell_exec|system|phpinfo|base64_decode|chmod|mkdir|fopen|fclose|readfile) *\(” public_html/

Grep est un programme de recherche flexible et puissant. Vous pouvez également l’utiliser pour les recherches journal d’accès discuté à la section 1 du présent article.

Recherche de texte sous Windows avec findstr

Un utilitaire intégré Windows similaire à grep est appelé findstr. Vous pouvez obtenir de l’aide pour elle (même sur votre propre PC Windows après l’ouverture d’une invite de commande) avec findstr d’aide, ou findstr /?. Findstr devrait être suffisant pour ces recherches, mais il existe une version Win32 de grep disponible1. Cependant, je ne sais pas si hébergement partagé Windows plans prévoient normalement un mécanisme pour obtenir l’invite de commande où vous pouvez exécuter des commandes système. Plesk Tâches planifiées peut-être une possibilité.

Recherche simple

*.* signifie tous les fichiers, les jokers de style DOS

Pour rechercher un mot clé à la fois :

findstr /r /s /n /c:”passthru *(” *.*

Pour rechercher tous les mots-clés à la fois, avec un risque de faux positifs ou une grande quantité de la production. Notez que ce format vous ne pouvez pas permettre d’espaces entre la commande et la parenthèse. Une parenthèse a été ajouté au système parce que c’est un mot commun :

findstr /r /s /n “passthru shell_exec system( phpinfo base64_decode chmod mkdir fopen fclose readfile” *.*

Noms de quelques web shells connus : c99, c100, r57.php, gifimg.php, etc. Bien entendu chacun a de multiples variations…

Quelques captures d’écran de backdoors Web :

2 Commentaires

  1. bjr je recherche qq pour maider à enlever une backdoor sur site et serveur ..
    connaissez vous cette personne ??
    merci
    yann

Les commentaires sont fermés.