
Démonstration éducative d'exploitation de l'injection SQL CVE-2014-2323 dans mod_mysql_vhost de lighttpd, avec un laboratoire basé sur Docker pour l'analyse pratique des vulnérabilités et leur correction.
title: Ep4 - Vulnérabilité liée aux Réseaux members:
Vulnérabilité associée :
CVE-2014-2323 [1] was assigned to SQL injection bug.
CVE-2014-2324 [2] was assigned to the path traversal bug.
Confirmer : http://download.lighttpd.net/lighttpd/security/lighttpd_sa_2014_01.txt
Le service à exploiter est Lighttpd. C'est un serveur web open-source (licence BSD) optimisé pour être léger et rapide. Il est apparu comme une 'preuve de concept' du fameux problème c10k (comment gérer 10 000 connexions simultanées sur un serveur), et a ainsi gagné une grande popularité à l'époque (2003), actuellement utilisé par Whatsapp.com, Xkcd et par le passé, Youtube. Son positionnement sur le marché est assez intéressant, comme le montre le graphique :

Le serveur cherche à gérer le problème de nombreuses connexions en utilisant des mécanismes asynchrones via des événements (kqueue sous BSD, epoll sous Linux) réduisant le besoin de plusieurs threads, ce qui se traduit par une empreinte mémoire bien plus faible et une meilleure utilisation du CPU (stratégie également utilisée par les serveurs Nginx, dont l'utilisation a considérablement augmenté au fil des ans) :

L'une des fonctionnalités de lighty est la gestion aisée des hôtes virtuels.
Il s'agit d'une méthode utilisée pour héberger plusieurs noms de domaine dont la résolution se fait vers une même adresse IP, réduisant ainsi les coûts d'hébergement pour les entreprises souhaitant proposer des sites web, car il n'est pas nécessaire de réserver un serveur dédié pour chaque site.
La technique peut être basée sur IP (une interface par hôte) ou basée sur le nom (un nom par hôte, partageant l'interface) - explorée dans cette présentation.
Basé sur le nom
: utilise le 'Hostname' fourni par le client pour identifier quel service utiliser pour répondre en conséquence. Cette méthode présente deux difficultés : des complications pour gérer les sessions sécurisées (TLS) - la poignée de main doit être effectuée avant tout passage d'en-tête indiquant l'hôte au serveur, compliquant alors la détermination du certificat à présenter lors de la poignée de main. Une solution à ce problème est une extension de TLS appelée Server Name Indication (SNI) qui permet de présenter le nom au début de la poignée de main, permettant ainsi le choix du certificat correct. Un second problème concerne la tentative de connexion sans en-tête Host bien défini, entraînant une indétermination du service à utiliser.
Basé sur IP
: utilise des IP séparés pour chaque application. Le serveur web est alors configuré pour plusieurs interfaces réseau physiques (ou virtuelles sous une même interface) et répond ensuite en fonction de l'adresse IP (de destination).
L'IP aliasing permet de créer des interfaces virtuelles pour chaque service.
Dans le cas d'une grande entreprise, il peut devenir complexe de gérer ce mappage selon le nombre de clients. Lighty offre donc un support pour l'utilisation d'une base de données à cette fin, comme nous le montrerons plus loin.
Avant cela, voyons comment faire "à la main" la configuration d'un serveur puis ajouter du vhosting.
Préparer un serveur de base lighttpd est très simple. Il suffit de l'installer et de créer un fichier de configuration qui spécifie le port à utiliser, comment répondre à certaines requêtes et autres réglages.
Nous pouvons préparer un exemple de configuration qui ne fait que recevoir des requêtes de fichiers statiques (.html ou .txt) :
server.document-root = "/usr/lighttpd/mysite.com/"
server.port = 80
mimetype.assign = (
".html" => "text/html",
".txt" => "text/plain"
)
Imaginez maintenant que nous souhaitions créer une entreprise basée sur la vente de sites et offrir un nom de domaine propre à l'acheteur. Afin de minimiser les coûts, nous souhaitons alors créer des vhosts pour chaque client. Disons que le cours du réseau souhaite acquérir trois sites web : redes.io, mac0448.io et mac5910.io. Notre entreprise enregistre alors les domaines, pointant tous vers l'IP de notre unique serveur, avec une seule interface.
ps : pour simuler cela, nous pouvons modifier le fichier /etc/hosts :
172.17.0.2 redes.io
172.17.0.2 mac0448.io
172.17.0.2 mac5910.io
Pour être capables de servir les différents sites web des clients en résolvant à partir d'une seule IP, nous pouvons alors configurer le serveur manuellement :
server.document-root = "/usr/lighttpd/default/"
server.port = 80
mimetype.assign = (
".html" => "text/html",
".txt" => "text/plain"
)
$HTTP["host"] == "redes.io" {
server.document-root = "/usr/lighttpd/redes/"
} else $HTTP["host"] == "mac0448.io" {
server.document-root = "/usr/lighttpd/mac0448/"
} else $HTTP["host"] == "mac5910.io" {
server.document-root = "/usr/lighttpd/mac5910/"
}
Mais, comme on peut l'imaginer, cela peut devenir un problème à mesure que nous souhaitons gérer de nombreux clients et fournir différentes configurations à chaque site web comme mentionné précédemment.
Avec le module mod_mysql_vhost, nous pouvons alors connecter notre serveur à une base de données mysql responsable de ce mappage. Nous spécifions alors le nom de la base de données, comment la trouver sur notre réseau et quelle commande utiliser pour effectuer la recherche.
server.modules = (
"mod_accesslog",
"mod_mysql_vhost"
)
mysql-vhost.db = "NOME_DO_BANCO"
mysql-vhost.user = "USUARIO"
mysql-vhost.pass = "SENHA"
(!!!!!!!!!!!!!!!)
mysql-vhost.sql = "SELECT docroot FROM domains WHERE domain='?';"
(!!!!!!!!!!!!!!!)
mysql-vhost.hostname = "HOSTNAME"
mysql-vhost.port = "PORTA"
SQL est un langage déclaratif pour administrer des bases de données relationnelles, utilisé (...) etc
TODO
TODO