J’ai eu la “chance” de pouvoir vivre pleinement une intrusion sur mon serveur causée par une faille de sécurité. Histoire de mettre à profit cet heureux moment, je vous propose un retour sur mon investigation suite à cette intrusion.
Les failles de sécurité viennent toujours de là ou on s’y attend le moins. Dans mon cas, le responsale est h5ai, un petit logiciel qui permet d’avoir un index apache/nginx plus joli. Rien de bien méchant, sauf que, rien n’est jamais simple…
Découverte de la faille
J’ai découvert l’intrusion dans les règles de l’art : en me rendant sur l’index habituellement géré par h5ai. Et surprise, surprise quand j’aperçois cette page en lieu et place de mon index :
Je me connecte donc rapidement en SSH sur mon serveur, pour voir l’étendu des dégats. Nous sommes alors le vendredi 9 octobre. Les fichiers sont là depuis 24 septembre, soit 15 jours. Mazette, ça fait un bout de temps que personne n’est venu ici. Je désactive PHP (sudo service php5-fpm stop
), m’empresse de regarder les logs nginx, de copier tout les fichiers incriminés dans un dossier ailleurs et de mettre à jour h5ai. J’ai pu identifier plusieurs fichiers et dossiers malveillants dans mon racine web.
Informations sur la CVE
La faille de sécurité a été identifiée sous le nom CVE-2015-3203 le 28 septembre 2015. Soit 4 jours après mon attaque. C’est un peu comme un Early Access sur Steam, mais en plus c’est gratuit…
Par la même occasion on en apprend plus sur la faille de sécurité :
Unrestricted file upload vulnerability in h5ai before 0.25.0 allows remote attackers to execute arbitrary code by uploading a file with an executable extension, then accessing it via a direct request to the file in the directory specified by the href parameter.
TL;DR : Sur certaines versions de h5ai il est possible d’envoyer des fichiers sur le serveur sans restriction. Fichiers qui seront ensuite interprétés par PHP.
Une faille basique, complètement bête. A aucun moment la fonction d’envoie est mentionnée sur h5ai.
Après cet épisode, on peut trouver un message bien discret sur le site de h5ai :
There was a securtiy flaw in versions 0.22.0 - 0.24.1 that was fixed in 0.25.0. If you are still using one of this versions you are advised to upgrade.
Pour ceux qui seraient intéressé par l’exploit, vous pouvez en trouver un sur Exploit-DB. (Bien évidemment il est a utiliser uniquement pour tester votre installation…)
Un RAT PHP
Le RAT PHP contient une interface, permettant de prendre le contrôle du serveur, et de nombreux outils. On citera, entre autres, la possibilité de naviguer dans les fichiers du serveur, d’executer des commandes, d’automatiser l’ajout d’un compte dans un Wordpress ou un Joomla, etc.
On notera que le code n’est pas directement en clair dans le fichier, il est compressé en gzip puis converti en base 64. L’ensemble est ensuite décodé puis passé dans un eval qui va interpréter le code.
On remarquera que la “team” qui a réalisé ce logiciel est indonésienne et se nomme “D’MASTERPIECE”.
Le mailer
Le fichier PHP du mailer quant à lui n’est pas obfusqué. Il est d’ailleurs écrit dans un PHP plus propre (en utilisant des classes). On remarquera le soin apporté au design…
Son seul objectif est d’utiliser le serveur email de la cible pour envoyer des emails.
Retour sur l’attaque
Afin d’accéder au serveur, nos pirates revendiquant le nom de “Dragon Net” ont exploité la faille de sécurité dans h5ai pour s’en servir comme base avancée pour des attaques (mailer et RAT).
Ils ont ensuite utilisé le RAT pour fouiller dans les fichiers du site et uploadé différents fichiers, entre autre un .ssh/known_hosts
(mais c’est tout côté SSH).
Sur leur défaçage, ils se targuent de se contenter de publier leurs revendications. Et en effet, ils semblent n’avoir rien fait d’autre. Cependant, on peut supposer que leur intentions ne sont pas aussi louables qu’ils le prétendent : pourquoi ne pas avoir directement envoyé leur fichier index.html ? Le RAT et le mailer semblent avoir été inutiles dans notre cas…
On notera d’ailleurs que la team ayant réalisé l’attaque n’est pas la même que celle qui a créé les outils. Il y a un marché pour tout…
Faute d’informations supplémentaires je suppose qu’ils ont prévu ces fichiers “au cas où” ils aient besoin d’un serveur.
Exploitation et possibilités
La faille de h5ai, par chance, n’a été exploitée que pour des revendications politiques/religieuses. Mais on peut imaginer bien pire…
Tout d’abord, actuellement tous mes sites web en PHP sur cette machine utilisent le même utilisateur. On peut donc supposer qu’il aurait pu défacer ces sites webs, et la base de données qui va avec. Il était aussi possible de lancer des attaques DDoS depuis la machine, executer des programmes, etc.
Cependant, notre pirate n’avait pas d’accès root, il n’avait donc pas accès au reste du système… heureusement !
Les mesures de sécurité
Cet épisode amène à des réflexions. Tout d’abord sur le choix de h5ai : comment une telle faille est arrivée dans ce logiciel. Son objectif n’a jamais été l’envoi de données ! Peut-on encore lui faire confiance ? Peu d’annonce à ce sujet, une description laconique sur le site officiel, pas grand chose sur git…
Deuxièmement, je me suis intéressé aux mises à jours des différents applications web de ma machine. Quelles sont les applications installées ? Sont-elles à jour ?
Enfin, le problème de PHP se pose : comment compartimenter les sites en plusieurs utilisateurs distincts afin qu’un site compromis ne puisse pas atteindre les autres ? Comment prévenir l’execution de scripts PHP indésirable ? SELinux n’aurait pas forcément été d’une grande aide dans mon cas, même s’il peut être un rempart de plus, pour détecter ce genre d’actions frauduleuses.
Aujourd’hui les containers sont à la mode (LXC, Docker, …). L’utilisation de ces derniers pourraient être un gage de sécurité supplémentaire. En effet, le pirate resterait coincé dans le conteneur. De plus ces derniers sont censés être plus simple à mettre à jour. Mais leur sécurité n’est pas encore parfaite.
En tout cas, en terme de sécurité, il ne faut pas se reposer sur un rempart, car une faille de sécurité peut facilement le casser, mais sur plusieurs (container, utilisateurs distincts, SELinux et mises à jour fréquentes).