Cet article va aborder de façon pragmatique 3 points dans le contexte de l’OpFrance :

  1. Le contexte de l’OpFrance d’un point de vue technique
  2. Les techniques pour sécuriser rapidement son site sans budget ou processus complexes
  3. Sécuriser en profondeur son site, ce qui requiert du temps et un budget dédié

Contexte

OpFrance se déroule dans un contexte politique tendu ; notre point n’est pas d’en juger la pertinence, le niveau de défense des uns ou les motivations des autres. D’un point de vue pragmatique cependant, si autant de sites se sont fait hacker c’est, en général, pour quelques raisons simples :

  • Ces sites sont mis en ligne depuis longtemps et ne bénéficient plus de maintenance, de mise à jour ou de budgets pour les protéger ou les faire évoluer
  • La plupart sont hébergés à moindre coût chez des hébergeurs non spécialisés en sécurité et sans infogérance
  • Enfin, ils sont, pour la plupart, en PHP, avec un framework standard type Drupal ou WordPress ou du PHP « maison » qui a laissé des ouvertures aux pirates

Méthodes de compromission

Les attaques sur les sites concernés sont principalement de 3 ordres :

  1. Mot de passe faible sur le backoffice
  2. SQL Injection
  3. File Upload

Mot de passe faible

Les mots de passe faibles sont faciles à détecter. Les attaquants vont, en général, utiliser un outil comme THC Hydra ou Cain & Abel. Il existe des centaines de ces outils, et pour quelqu’un d’averti, en créer un soi-même ne prend que quelques minutes. Les outils telnet, openssl client et wget sont très simples à automatiser pour faire ce travail de recherche de mots de passe faibles. La plupart du temps un mot de passe faible va ressembler à : azerty, password, admin, 12345678, etc… Cela rend les mots de passe très vulnérables face à ce type d’attaque.

Injection SQL

Les injections SQL, que nous décrivons en détail dans cet article, sont un autre fléau classique du Web. Par le biais des requêtes SQL, l’attaquant va soit récupérer le mot de passe associé à un compte, soit perturber le contenu du site, soit encore passer outre le formulaire d’authentification du backoffice et donc y accéder. Ces attaques sont, pour certaines, simples à mener et donnent de bons résultats pour l’attaquant, en peu de temps. Il y a de nombreux scanners spécialisés qui vont effectuer rapidement un scanne spécifiquement pour les installations Drupal et WordPress afin d’identifier les vulnérabilités présentes. D’autres scanners plus génériques et très simples existent comme Nikto tout comme des outils de plus haut niveau comme Appscan (payant par contre).

La faille Drupal Geddon, par exemple, permet l’exploitation complète de site Drupal assez récents (CVE-2014-3704) et les alertes de sécurité sur WordPress sont assez nombreuses également.

File Upload

Il est important de noter que les sites présentent souvent la possibilité d’envoyer des informations ou des fichiers, pour finaliser un profil par exemple, avec une image ou un avatar. Ces systèmes ne contrôlent pas toujours le contenu envoyé et il devient possible d’envoyer du PHP au lieu d’une image, une « backdoor » par exemple comme il en existe des centaines (comme la célèbre C99).

Une fois ce fichier envoyé au serveur, l’attaquant l’appel tout simplement depuis son navigateur et prend alors rapidement le contrôle du serveur.

Sécuriser rapidement son site web

  1. Choisissez et mettez un bon mot de passe en place pour votre backoffice. Notre tutorial ici vous expliquera comment le faire. Définissez de bons mots de passe pour tous vos contributeurs ainsi que sur votre accès SSH, et à la console d’administration de votre serveur si vous en avez une.
  2. Mettez en place une authentification HTTP par l’entremise des fichiers HTACCESS et HTPASSWORD. C’est très simple à faire et cela évitera à l’attaquant de pouvoir « bruteforcer » / deviner le mot de passe du backoffice. Celui-ci sera également un peu mieux protégé contre les injections SQL. Il vous suffit pour cela d’ajouter au fichier .htacces, situé à la racine de votre site ou dans votre configuration de vhost apache, les lignes suivantes :
    bouclier sécurité2<Location /wp-admin>   # exemple pour un wordpress, remplacer par votre Backoffice.
      AuthType Basic
      AuthName "Restricted Area"
      AuthUserFile /etc/apache2/access/htpasswd
      Require valid-user
      Order deny,allow
      Allow from 88.88.88.88 # L'ip depuis laquelle vous administrez le site
      Satisfy any
    </Location>
    Mettez ensuite en place le fichier .htpasswd dans le répertoire /etc/apache2/access avec la commande htpasswd -c /etc/apache2/access/htpasswd backofficeadmin. Le programme va vous demander un mot de passe ; utilisez le pour vous logger sur votre backoffice, avec l’identifiant « backofficeadmin ». La ligne « allow from » devrait vous éviter d’avoir à effectuer cette étape lorsque vous êtes sur l’IP depuis laquelle vous administrez votre site. Pour connaitre votre IP, vous pouvez aller sur www.whatismyip.com. N’oubliez pas de remplacer <Location /wp-admin> par le chemin de votre backoffice.
  3. Mettez à jour vos framework et CMS ainsi que leurs extensions quand cela est possible. Il est important d’avoir une version récente car les éditeurs corrigent des bugs sans arrêt.
  4. Utilisez les mêmes outils que certains pirates pour détecter vos vulnérabilités. Des outils gratuits existent tels que WordPress-screener, Joomla-screener ou encore havyj, entre autres ; vous pouvez également lire la liste fournie par l’OWAPS ici. La plupart des pirates utilisent des distributions de type « Kali », embarquant tous les outils de sécurité nécessaires pour faire un audit. L’outil Nessus peut aussi vous aider dans cette démarche.
  5. Vérifiez que vous utilisez bien des protocoles sécurisés pour vous connecter à votre serveur ou à ses outils (SSH et non telnet, SCP et non ftp, HTTPS pour le backoffice et non http, etc.)
  6. Mettez en place un firewall tout simple pour éviter que les attaquants ne puissent scanner votre serveur ou tenter d’y accéder. En voici un exemple, le moins complexe possible, qui devrait suffire à court terme pour la plupart des sites hébergés sur un seul serveur :#!/bin/sh
    IPTABLES= »/sbin/iptables »
    MYIP= »88.88.88.88″
    start)
    echo « ———————- Firewalling ———————-« 
    $IPTABLES -F
    $IPTABLES -X
    $IPTABLES -Z
    $IPTABLES -F INPUT
    $IPTABLES -F OUTPUT
    $IPTABLES -F FORWARD
    $IPTABLES -t nat -F
    $IPTABLES -t nat -Z
    $IPTABLES -t nat -Xecho « ———————- Kernel tuning ———————-« 
    echo « 1 » > /proc/sys/net/ipv4/ip_forward
    echo « 1 » > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
    echo « 1 » > /proc/sys/net/ipv4/conf/all/log_martians
    echo « 1 » > /proc/sys/net/ipv4/tcp_syncookies
    echo « 2 » > /proc/sys/net/ipv4/tcp_ecnecho « ———————- Basic policy ———————-« 
    $IPTABLES -P INPUT DROP
    $IPTABLES -P FORWARD DROP
    $IPTABLES -P OUTPUT ACCEPT$IPTABLES -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT
    $IPTABLES -A FORWARD -m state –state RELATED,ESTABLISHED -j ACCEPT
    $IPTABLES -A INPUT -p tcp –dport 80 -j ACCEPT
    $IPTABLES -A INPUT -p tcp –dport 443 -j ACCEPT
    $IPTABLES -A INPUT -s $MYIP -j ACCEPT
    $IPTABLES -A FORWARD -s $MYIP -j ACCEPT
    ;;stop)
    echo « ———————-Shutting down Firewall ! ———————-« 
    $IPTABLES -F
    $IPTABLES -X
    $IPTABLES -Z
    $IPTABLES -F INPUT
    $IPTABLES -F OUTPUT
    $IPTABLES -F FORWARD
    $IPTABLES -t nat -F
    $IPTABLES -t nat -Z
    $IPTABLES -t nat -X
    echo 0 > /proc/sys/net/ipv4/ip_forward
    exit 0
    ;;Sauvez tout cela dans un fichier « firewall.sh », « chmod 755 firewall.sh » et « ./firewall.sh start ». Ça devrait faire l’affaire pour un moment. Vous pouvez ensuite mettre ce fichier dans « /etc/init.d/firewall.sh » et faire les liens dans les répertoires RC d’une distribution linux standard pour rendre ce firewall permanent et qu’il soit de nouveau là après un reboot.
  7. Vérifiez les droits des fichiers dans les répertoires de votre site. Ils ne doivent jamais être en 777. Quand vous faites « ls -la », si vous voyez en début de ligne rwxrwxrwx, cela signifie que vos fichiers sont modifiables par tout le monde, ce qui peut faciliter une intrusion. Mettez-les, à minima, en 755 avec la commande chmod -R 755 *
  8. Si vous le pouvez, mettez à jour la dernière version de PHP, ou tout du moins, une 5.4 ou version supérieure.

Sécuriser en profondeur son site web

Ces tips & tricks ci-dessus sont simplistes et sont la base minimale d’un début de sécurité. Pour aller plus loin :cerberhost

  • Allez chez un hébergeur spécialisé dans la sécurité si vous avez un budget adapté. Cerberhost a été conçu en ce sens
  • Faites réaliser un audit de code ou un test d’intrusion de votre site pour détecter les failles potentielles
  • Mettez un réel firewall plus complexe en place
  • Pour éviter les uploads de backdoor, il est assez simple d’identifier le type de fichier envoyé par un navigateur et de tenter de l’identifier/executer/compiler pour savoir si c’est bien une image ou du code. En général, même de façon très simple, repérer le headers des gif/jpg/pdf/png, etc. permet de savoir si on a à faire à un fichier acceptable ou non
  • Tenez à jour les composants logiciels (CMS, extensions/plugins ainsi qu’Apache, Mysql & PHP)
  • nbs-logo-naxsiMettez en place un WAF (Web Application Firewall). C’est une solution qui filtre les conversations HTTP afin d’éviter certaines attaques telles que le cross site scripting ou les injections SQL. Nous en éditons un en opensource, NAXSI, qui est gratuit et nettoie déjà des grands sites parmi le top 10 mondial.
  • Faite du hardening de vos configurations et de vos distributions Linux
  • Utilisez Fail2ban contre les bruteforces et PHP suoshin contre les attaques PHP
  • Mettez en place un Anti DDoS
  • etc…
Philippe Humeau
Philippe Humeau
Philippe a co-fondé NBS System en 1999. Après s’être concentré sur la sécurité, qu’il n’a jamais abandonnée, il se découvre une passion pour le ecommerce à partir de 2008. Tour à tour pentester, CTO, CCO puis CEO, son profil touche-à-tout l’a conduit à devenir directeur marketing et stratégie d’OT Group après notre intégration dans celui-ci.