Содержание статьи
- Готовим стенд
- Удаленное подключение
- Получаем бэкдор
- Устанавливаем бэкдор
- Шаг 1
- Шаг 2
- Шаг 3
- Шаг 4
- Ковыряем прошивку и ломаем контрольную сумму файловой системы
- Собираем все обратно
- Проверка бэкдора
- Выводы
Как известно, даже инструменты для обеспечения сетевой безопасности могут иметь серьезные уязвимости. В этой статье мы разберем, как злоумышленник может взломать межсетевой экран FortiGate и установить в его прошивке бэкдор.
Эта история начинается с того, что однажды я прочитал ресерч на CVE-2022-42475, в котором происходит переполнение кучи. Уязвимость приводит к выполнению произвольного кода. Я решил попробовать реализовать PoC, но мне помешало отсутствие лицензии. Перед тем как реализовывать этот PoC, необходимо установить бэкдор на FortiGate с использованием уязвимости CVE-2019-5587. В статье я расскажу, как сделать этот бэкдор и как он работает.
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
FortiGate — межсетевой экран с возможностью маршрутизации нового поколения. Он включает в себя большинство традиционных сервисов, таких как проверка трафика, антивирус, VPN, системы предотвращения вторжений, и другие функции обеспечения безопасности. Для демонстрации уязвимости и дальнейших исследований необходимо подготовить стенд с использованием FortiGate.
Готовим стенд
Для ресерча была выбрана версия FortiGate VM64 v6.4.5 build1828 (GA). Стенд разворачиваю на VMware ESXI, а образы маршрутизатора должны иметь расширения .out, .ovf, .zip.
После распаковки архива мы получим следующие файлы.
В дальнейшем для реверса и исследования бинарей нам понадобится диск виртуальной машины fortios.vmdk.
В VMware ESXI нужно импортировать существующую виртуальную машину, поэтому следует выбрать режим Create/Register VM, а затем — Deploy a virtual machine from an OVF or OVA file.
Теперь надо указать следующие файлы для загрузки виртуальной машины:
-
datadrive.vmdk— системный жесткий диск FortiGate; -
FortiGate-VM64.ovf— виртуальная машина; -
fortios.vmdk— файловая система и сама начинка FortiGate.
Имя у виртуалки может быть произвольным, я назвал ее просто FortiGate.
Перейдем к настройкам сети. Все сетевые адаптеры, кроме первого, выключим, потому что будем работать только с одним. Также изменим интерфейс с [pt]Network на VM Network. Это нужно, чтобы виртуальная машина находилась с нами в одной сети.
Запускаем виртуальную машину, вводим логин — admin, пароль — Enter, после чего новый пароль необходимо придумать.
По умолчанию FortiGate настроен на использование в качестве NTP-сервера. Необходимо отключить NTP-синхронизацию для перехода в пробный режим.
NTP — сетевой протокол для синхронизации внутренних часов компьютера посредством использования сетей с переменной латентностью.
config system ntp set ntpsync disable set type custom end
-
config system ntp— команда для входа в режим конфигурирования NTP; -
set ntpsync disable— команда для отключения синхронизации с NTP-сервером; -
set type custom— команда для установки NTP-сервера, который указывается вручную.
Теперь настало время настроить маршрутизатор. Настраивать будем удаленное подключение и доступ к веб‑интерфейсу фортика.
Удаленное подключение
Настраивать SSH, HTTP, HTTPS, Telnet будем в CLI FortiGate. Для удаленного подключения нужно настроить интерфейс, который мы оставили включенным:
config system interface edit port1 set mode static set role lan set allowaccess http https telnet ssh ping set ip 192.168.0.217/24 show end
-
config system interface— команда для входа в режим конфигурации интерфейса; -
edit port1— команда для конфигурации определенного интерфейса; -
port1— условное обозначение интерфейса; -
set mode static— команда для установки статического адреса. Чтобы настроить DHCP, нужно вместоstaticнаписатьDHCP, и тогда IP-адреса будут установлены автоматически; -
set role lan— команда для установления роли и интерфейса. В FortiGate есть четыре роли:- роль
lanозначает, что интерфейс используется для подключения к локальной сети; - роль
wanозначает, что интерфейс используется для подключения к интернету; - роль
dmzозначает, что интерфейс используется для подключения к серверам; - роль
undefinedозначает, что интерфейс не имеет конкретной роли;
- роль
-
set allowaccess http https telnet ssh ping— команда для доступа к управлению с использованиемhttps,http,telnet,ssh,ping; -
set ip 192.168.0.217/24— команда для установки IP-адреса и маски подсети; -
show— команда, которая показывает все настройки интерфейса; -
end— команда для завершения настройки.
Вот так выглядит результат работы команды show.
Теперь настраиваем статическую маршрутизацию для доступа из других сетей к Web и CLI:
config router static edit 1 set gateway 192.168.0.255 set device port1 set dst 0.0.0.0 0.0.0.0 set status enable next end
-
config router static— команда для конфигурации статических маршрутов; -
edit 1— команда настройки нумерации с неиспользуемого номера; -
set gateway 192.168.0.255— команда для установки адреса шлюза; -
set device port1— команда для установки интерфейса; -
set dst 0.0.0.0 0.0.0.0— команда для установки места назначения; -
set status enable— команда для включения статической маршрутизации; -
end— команда для завершения настройки.
Команда get router info routing-table all нужна для проверки настройки статической маршрутизации:
S* 0.0.0.0/0 [10/0] via 192.168.0.255, port1 C 192.168.0.0/24 is directly connected, port1
Этот вывод говорит о том, что для всех устройств, находящихся в сети, шлюз по умолчанию будет 192.168.0.255, а значит, настройка статической маршрутизации прошла успешно.
После этого подключаемся к веб‑интерфейсу через браузер по адресу 192.168.0.217. Логин и пароль используй такой же, как и при подключении к командной строке.
Получаем бэкдор
После успешной подготовки стенда настало время для бэкдора. Зайдем в директорию с образом виртуальной машины и виртуальными дисками FortiGate. В моем случае виртуальный диск называется forti_6_4_5-disk1.vmdk.
Дальше наступает часть монтирования и отравления rootfs.gz. Монтирование выполняется следующим образом:
sudo modprobe nbd max_part=16 sudo mkdir /mnt/fortios sudo qemu-nbd -r -c /dev/nbd1 ./forti_6_4_5-disk1.vmdk sudo mount /dev/nbd1p1 /mnt/fortios
-
sudo modprobe nbd max_part=16— команда подготовки для монтирования статического VDI-образа; -
sudo mkdir /mnt/fortios— команда для создания директории/mnt/fortios; -
sudo qemu-nbd -r -c /dev/nbd1 ./forti_6_4_5-disk1.vmdk— команда для экспорта образа диска QEMU, с использованием протокола NBD:-
-r— ключ означает экспорт диска только для чтения; -
-c— ключ означает подключение файла c указанным именем к папке /dev устройства NBD;
-
-
sudo mount /dev/nbd1p1 /mnt/fortios— команда для монтирования диска.
NBD (Network Block Device) — сетевой протокол, который можно использовать для пересылки блочного устройства (обычно жесткого диска или раздела) с одного компьютера на другой. Например, локальный компьютер может получить доступ к жесткому диску, подключенному к другому компьютеру. В нашем случае протокол используется для подключения виртуального жесткого диска к компьютеру. QEMU умеет экспортировать виртуальный образ диска, используя протокол NBD.
В результате forti_6_4_5-disk1.vmdk успешно монтируется к нашему компьютеру.