Беззащитная защита. Изучаем уязвимость, дающую встроить бэкдор в FortiGate

Содержание статьи

  • Готовим стенд
  • Удаленное подключение
  • Получаем бэкдор
  • Устанавливаем бэкдор
  • Шаг 1
  • Шаг 2
  • Шаг 3
  • Шаг 4
  • Ковыряем прошивку и ломаем контрольную сумму файловой системы
  • Собираем все обратно
  • Проверка бэкдора
  • Выводы

Как извес­тно, даже инс­тру­мен­ты для обес­печения сетевой безопас­ности могут иметь серь­езные уяз­вимос­ти. В этой статье мы раз­берем, как зло­умыш­ленник может взло­мать меж­сетевой экран 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

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *