пятница, 31 октября 2014 г.

Обход Trusted Host при помощи SNMP и поддельного IP-адреса

В прошлой заметке речь шла об управлении доверенными хостами. Там же было сказано о возможности управления устройством с недоверенного хоста. Здесь я расскажу, почему это работает и как это воспроизвести.

Пакет с данными, предназначенными хосту сети, может быть передан двумя способами - напрямую (в пределах одной подсети) или через маршрутизатор (если подсети разные). При передаче напрямую выполняется только коммутация фрейма, а при передаче через маршрутизатор осуществляется еще и роутинг пакета, где происходит подмена MAC-адреса, но верхние уровни также остаются без изменения. По большому счету, роутинг пакета - это последовательная коммутация фрейма между всеми участниками цепочки. Маршрутизатор заглядывает внутрь пакета только для того, чтобы получить представление о дальнейшем пути его движения. Таким образом, независимо от способа передачи, IP-адрес отправителя никак не участвует в работе. Иными словами, этот адрес может быть любым. Это может быть использовано для обхода IP-фильтров, таких, как trusted hosts.

Сложность такого метода заключена в том, что в большинстве случаев требуется двусторонний обмен, который в такой схеме невозможен. Если мы захотим подключиться к коммутатору, используя поддельный IP-адрес, соединение не будет установлено. Посмотрим на рисунок и проследим перемещение пакетов и кадров между устройствами. Представим, что мы пытаемся подключиться по протоколу телнет к коммутатору S с компьютера PC1, используя "подставной" компьютер PC2, IP-адрес которого находится в списке доверенных хостов коммутатора S. Каждое устройство находится в своей подсети.


Пытаемся установить подключение к коммутатору S и отправляем пакет, в котором подделан IP-адрес отправителя.
MAC(R):MAC(PC1)/IP(PC2):IP(S) - фрейм со вложенным пакетом отправляется на маршрутизатор R с компьютера PC1
MAC(S):MAC(R)/IP(PC2):IP(S) - фрейм модифицируется и передается дальше к коммутатору S с маршрутизатора R


Коммутатор видит, что IP-адрес коммутатора PC2 находится в списке trusted host и сообщает PC2 о готовности принять соединение.
MAC(R):MAC(S)/IP(S):IP(PC2) - фрейм со вложенным пакетом отправляется на машрутизатор R с коммутатора S
MAC(PC2):MAC(R)/IP(S):IP(SPC2) - фрейм модифицируется и передается дальше от маршрутизатора R к компьютеру PC2


Компьютер PC2, увидев пакет с подтверждением, который он не ожидал, проигнорирует его. На этом все закончится.

В итоге:
+ Пакет успешно дошел до получателя
+ IP-фильтр коммутатора успешно пройден
- Положительный ответ коммутатора ушел на другой компьютер

Последний минус перекрывает остальные плюсы. Соединение не может быть установлено.

На помощь нам здесь приходит SNMP. Дело в том, что SNMP основан на более низкоуровневом протоколе UDP, который является протоколом с негарантированной доставкой и не подразумевает наличие установленного подключения. Датаграммы просто передаются по сети и дальнейшая их судьба никого не заботит. :) Одного UDP пакета достаточно для сообщения коммутатору команды, которую он должен выполнить. Ответ, как и в примере выше, будет потерян, но работа при этом будет выполнена.

По ссылке находится пример скрипта, который позволяет добавить по SNMP некоторую сеть в список доверенных хостов коммутатора. Для этого понадобится: а) Установленный Python + Scapy; б) Валидное write-community; в) IP-адрес из списка trusted host коммутатора. Синтаксис и пример использования будут показаны при запуске программы без параметров.

Если Python и Scapy может поставить любой, то вот узнать write-community и настроенные на коммутаторе доверенные сети не так то просто. Для чего же тогда все это надо? Во-первых, для того, чтобы получить доступ к коммутатору, недоступному из-за ошибки при настройке trusted host, или при потере доступа к управляющей сети. Во-вторых, данная демонстрация - хороший повод задуматься над тем, как запретить подобные трюки там, где они неуместны. К сожалению, это не всегда просто сделать.

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

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