Выбрать язык


Выбрать язык | Show only


Русский | English


четверг, 2 июня 2016 г.

PHDays CTF: "Противостояние" глазами "защитника". Часть 6. Нестандартный метод защиты SSH

Глазами "защитника": как мы участвовали в Positive Hack Days CityF "Противостояние". 
Часть 6. Нестандартный метод защиты SSH
С частью 5 (описание хода сражения)  можно ознакомиться постом ранее.

- Почему нам нельзя перенастраивать сетевое оборудование, если мы его защищать должны? Без этого никак.
- А, вы телеком-защитники. Тогда вам можно, но сервисы должны быть доступны и чтобы не терялось управление. Иначе мы подойдем к вам и спросим: "Что за дела?". Если не сможете быстро починить - вернем к настройкам до начала соревнований, а вам выставим штрафные баллы. Поэтому с изменением сетевых настроек будьте аккуратны.
- Это не проблема. А если для обеспечения безопасности нам нужно будет развернуть трафик по-другому, завязать узлом, но при этом все будет работать?
- Тогда мы придем к вам с бумажкой - записать, что и как вы делали, интересно ведь.

- А зачем ты на Positive Hack Days решил Balabit использовать? Чем он там поможет?
- Будем админов мониторить. Они обещали периодически на серверах взводить дырявые сервисы.
- Ну, как знаешь.

Это два реальных разговора при подготовке к PHDays. До определенного момента я сам не думал, что они будут настолько плотно взаимосвязаны. Естественно, после разговора с организаторами я подумывал, что надо бы и удивить, раз грозился. По ходу соревнований вектор настроения потихоньку сдвинулся от первоначального желания в сторону "забетонироваться". Но чудесным образом получилось так, что в итоге они слились. И об этом пойдет рассказ.



Как я уже писал в части 5, и говорил на сцене PHDays, довольно интересное и нестандартное у нас получилось решение по защите уязвимых серверов Unix, управляемых по SSH.
Напомню, сама по себе архитектура упрощенно выглядела следующим образом:


Но, как упоминалось в части 4 и части 5, использовать ACL на firewall с правилом default deny нам не разрешили организаторы. Поэтому изначально из псевдоинтернета трафик шел к серверам DMZ по всем протоколам и портам. Но в этой статье речь пойдет о SSH. 
Сервера, которые нам поставили в DMZ, практически все были уязвимы к CVE-2015-5600, что означало отсутствие защиты от перебора паролей и перегруза CPU. Совмещаем эти 2 условия - и получаем идеальную для хакеров ситуацию: "Не подберу - так хоть завалю". При этом, начиная с вечера первого дня, сервера появлялись, как тараканы в общаге. SSH был дырявый везде. Обновления, содержащие фикс к указанной уязвимости, были далеко не во всех репозитариях. То есть, зайти единоразово на все линукса разных версий и втоптать пару команд, чтобы дальше оно само - не вариант. Только сырцы, только хардкор. Лень - двигатель прогресса. Возможно, человек, плотнее в повседневной жизни работающий с Open Source решениями и Unix, пошел бы в сторону реализации своего репозитария либо еще как, но во мне в 3 часа ночи проснулся архитектор. 
Я вспомнил об одиноко стоящем Balabit SCB, который, несмотря на игнор первого дня, исправно крутился и жрал некоторые ресурсы вычислительной инфраструктуры организаторов. Поскольку я настраивал еще самую первую инсталляцию Balabit в СНГ, не считая остальных в течение нескольких лет, мысль попробовать пустить через него SSH смотрится вполне закономерно.
Настроив пару проксирующих правил на Balabit, я его просканировал. Модуль проброса SSH zorp-ssh оказался неуязвимым к CVE-2015-5600, равно как и к другим, известным на тот день сканеру MaxPatrol, уязвимостям. Теперь осталось придумать, как разделить трафик таким образом, чтобы SSH к серверам в DMZ балабитизировался, а остальные протоколы шли своим обычным путем. 

Рассмотрим на примере SSH, но таким же образом можно поступить и с RDP, и с Telnet, и с VNC, и с ICA (правда, чуть попотеть).

По задумке, реализованной в схеме сети, к серверам из DMZ хакеры попадали по всем протоколам и портам, проходя через пограничный firewall.

Поскольку как пограничный firewall использовался не ACL на роутере, а CheckPoint, стандартные для firewall фичи типа NAT можно было настраивать во всю мощь. Как firewall, защищающий сервера "ЦОД" - Cisco ASAv.
Чтобы не запутать в сетевых терминологиях и реализации NAT двух разных производителей, опишу вендорнезависимую концепцию, применимую на оборудовании любых производителей, поддерживающих такую технологию.

Для заворота трафика SSH на Balabit можно пойти такими путями:


1. Выделенные порты для серверов.

- Выделить диапазон портов на Balabit.
- Реализовать динамический NAT many-to-one на пограничном CheckPoint таким образом, чтобы пакеты, прилетающие из псевдоинтернета в направлении серверов DMZ на порт SSH, транслировались в пакет, где src ip подменяется на IP CheckPoint, dst ip - на IP Balabit, dst port - на выделенный для этого сервера порт на Balabit.

Packet:
SRC IP
DST IP
PROTO/PORT
Original
ANY
DMZ_srv1
TCP/22
Translated
CheckPoint_ip
Balabit_ip
TCP/port1
Original
ANY
DMZ_srv2
TCP/22
Translated
CheckPoint_ip
Balabit_ip
TCP/port2
Original
ANY
DMZ_srv3
TCP/22
Translated
CheckPoint_ip
Balabit_ip
TCP/port3
Original
ANY
DMZ_srv4
TCP/22
Translated
CheckPoint_ip
Balabit_ip
TCP/port4

- Открыть доступ для этих TCP-сессий на вход в Firewall ЦОД:

Packet:
SRC IP
DST IP
PROTO/PORT
To_Balabit
CheckPoint_ip
Balabit_ip
TCP/port1-port4

- Настроить правила проксирования на Balabit с возвратом на нужный сервер, порт 22 (SSH):

Packet:
SRC IP
DST IP
PROTO/PORT
Original
CheckPoint_ip
Balabit_ip
TCP/port1
Translated(proxied)
Balabit_ip
DMZ_srv1
TCP/22
Original
CheckPoint_ip
Balabit_ip
TCP/port2
Translated(proxied)
Balabit_ip
DMZ_srv2
TCP/22
Original
CheckPoint_ip
Balabit_ip
TCP/port3
Translated(proxied)
Balabit_ip
DMZ_srv3
TCP/22
Original
CheckPoint_ip
Balabit_ip
TCP/port4
Translated(proxied)
Balabit_ip
DMZ_srv4
TCP/22

- Разрешить выход таких пакетов с Balabit в сторону DMZ на обоих firewall:

Packet:
SRC IP
DST IP
PROTO/PORT
From_Balabit
Balabit_ip
DMZ_subnet
TCP/22

Готово. SSH-сессия функционально не нарушена, другой трафик не задет, условия игры соблюдены.


2. Выделенный пул адресов.

- Выделить в ЦОД подсеть той же размерности, что и DMZ.
- Поместить в нее интерфейс Balabit, принимающий трафик.
- Настроить маршрутизацию.
- Сконфигурировать Balabit с IP-адресами той же подсети.
- Реализовать статический NAT one-to-one  на пограничном firewall:

Packet:
SRC IP
DST IP
PROTO/PORT
Original
ANY
DMZ_subnet
TCP/22
Translated
CheckPoint_ip
Balabit_subnet
TCP/22

Можно, конечно, и не прятать SRC IP за адрес CheckPoint, но тогда необходимо, чтобы DMZ строился на серых адресах. На «противостоянии» DMZ строили на "белых"…

- Разрешить входящий трафик на Firewall ЦОД: 

Packet:
SRC IP
DST IP
PROTO/PORT
To_Balabit
CheckPoint_ip
Balabit_subnet
TCP/22

- Настроить правила проксирования на Balabit:
  
Packet:
SRC IP
DST IP
PROTO/PORT
Original
CheckPoint_ip
Balabit_ip1
TCP/22
Translated(proxied)
Balabit_ip0
DMZ_srv1
TCP/22
Original
CheckPoint_ip
Balabit_ip2
TCP/22
Translated(proxied)
Balabit_ip0
DMZ_srv2
TCP/22
Original
CheckPoint_ip
Balabit_ip3
TCP/22
Translated(proxied)
Balabit_ip0
DMZ_srv3
TCP/22
Original
CheckPoint_ip
Balabit_ip2
TCP/22
Translated(proxied)
Balabit_ip0
DMZ_srv2
TCP/22

- и разрешение на обоих firewall:

Packet:
SRC IP
DST IP
PROTO/PORT
From_Balabit
Balabit_ip0
DMZ_subnet
TCP/22

где Balabit_ip0 - адрес Balabit, сконфигурированный на интерфейсе как основной, а не IP alias (Balabit_ip1...4). Можно, конечно, настроить так, чтобы src ip был Balabit_ip1...4, но в ситуации на PHDays это было лишним.

Готово. SSH-сессия функционально не нарушена, другой трафик не задет, условия игры соблюдены. 
===


В обоих случаях, чтобы иметь возможность пускать определенные подсети на сервера DMZ мимо Balabit, необходимо на пограничном firewall перед описанными правилами поставить такое:

Packet:
SRC IP
DST IP
PROTO/PORT
Original
TRUSTED_NET
DMZ_subnet
IP/ANY
Translated
TRUSTED_NET
DMZ_subnet
IP/ANY

Учитывая то, что остальные правила срабатывают по умолчанию после описанных, в итоге схема прохождения трафика получается следующей:



Видно, что подобное решение немного напрягает при масштабировании его на большое количество серверов. Нельзя сделать "настроил и забыл" для всей подсети одной строкой. Дополнительные затраты времени вызывает необходимость:
В случае 1 - добавления правила для каждого нового сервера DMZ и на Balabit, и на firewall.
В случае 2 - разработка сетевого дизайна и настройка сети (единоразово), а также добавление нового правила на Balabit для каждого сервера DMZ.
То есть, в обоих случаях - настраивать Balabit для каждого сервера. Задача, по сути, не громоздкая, занимает 5-10 минут, и при статичности жизни сервера вполне терпима, но если все часто течет и меняется...


Оба этих ограничения связаны с тем, что сеть с точки зрения L3 была плоской, с одной таблицей маршрутизации. Есть решение, которое помогло бы прозрачно балабитизировать всю подсеть одним махом, а там хоть каждую секунду добавляйте-удаляйте сервера в подсети. Но для этого потребуется единоразово настроить MPLS L3VPN либо vrf lite на активном сетевом оборудовании (если поддерживает) и аккуратно соединить с его помощью Balabit и пограничный firewall.
Но это уже тема для совсем отдельной статьи...

Вижу немой вопрос в глазах читателей: а как же ты настроил на PHDays?
Ответ: по варианту №1 – выделенные порты.

Комментариев нет:

Отправить комментарий