Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Как известно, даже инструменты для обеспечения сетевой безопасности могут иметь серьезные уязвимости. В этой статье мы разберем, как злоумышленник может взломать межсетевой экран FortiGate и установить в его прошивке бэкдор.
Эта история начинается с того, что однажды я прочитал ресерч на CVE-2022-42475, в котором происходит переполнение кучи. Уязвимость приводит к выполнению произвольного кода. Я решил попробовать реализовать PoC, но мне помешало отсутствие лицензии. Перед тем как реализовывать этот PoC, необходимо установить бэкдор на FortiGate с использованием уязвимости CVE-2019-5587. В статье я расскажу, как сделать этот бэкдор и как он работает.
warning
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
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-синхронизацию для перехода в пробный режим.
info
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
— команда для монтирования диска. info
NBD (Network Block Device) — сетевой протокол, который можно использовать для пересылки блочного устройства (обычно жесткого диска или раздела) с одного компьютера на другой. Например, локальный компьютер может получить доступ к жесткому диску, подключенному к другому компьютеру. В нашем случае протокол используется для подключения виртуального жесткого диска к компьютеру. QEMU умеет экспортировать виртуальный образ диска, используя протокол NBD.
В результате forti_6_4_5-disk1.vmdk
успешно монтируется к нашему компьютеру.
Источник: xakep.ru