Iptables: ICMP, Брутфорс, Спуфинг, ПолезностиПодписка на Комментарии к "Iptables: ICMP, Брутфорс, Спуфинг, Полезности"

Аватар 555

Запрет Icmp-сообщений.
Хорошей практикой также является запрет ICMP-сообщений, которые могут выдать дополнительную информацию о хосте или быть использованы для выполнения различных злонамеренных действий (например, модификации таблицы маршрутизации). Ниже приведена таблица со списком возможных типов ICMP-сообщений:

Типы ICMP-сообщений.

0echo reply (echo-ответ, пинг)
3 — destination unreachable (адресат недосягаем)
4source quench (подавление источника, просьба посылать пакеты медленнее)
5 — redirect (редирект)
8echo request (echo-запрос, пинг)
9 — router advertisement (объявление маршрутизатора)
10 — router solicitation (ходатайство маршрутизатора)
11 — time-to-live exceeded (истечение срока жизни пакета)
12 — IP header bad (неправильный IPзаголовок пакета)
13 — timestamp request (запрос значения счетчика времени)
14 — timestamp reply (ответ на запрос значения счетчика времени)
15 — information request (запрос информации)
16 — information reply (ответ на запрос информации)
17 — address mask request (запрос маски сети)
18 — address mask reply (ответ на запрос маски сети)

Как видишь, ответ на некоторые ICMP-сообщения может привести к разглашению некоторой информации о хосте, в то время как другие — привести к модификации таблицы маршрутизации, поэтому их необходимо запретить.

Обычно выход во внешний мир разрешают ICMP-сообщениям 0, 3, 4, 11 и 12, в то время как на вход принимают только 3, 8 и 12. Вот как это реализуется в различных брандмауэрах:

Запрет опасных ICMP-сообщений.

iptables -A INPUT -p icmp --icmp-type 3,8,12 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 0,3,4,11,12 -j ACCEPT

При желании ты можешь запретить весь ICMPтрафик, включая пинг-запросы, но это может повлиять на корректность работы сети.

Брутфорс.

Разведав информацию об открытых портах и ОС, взломщик предпринимает попытки проникновения в систему, которые могут быть основаны на эксплуатации дыр в сервисах, либо на подборе паролей. Предотвратить возможность взлома сервисов брандмауэр нам не поможет, однако затормозить процесс перебора паролей — легко. Для этого применяются возможности по ограничению количества пакетов, пришедших на машину с одного IP-адреса. Вот как это можно сделать с помощью iptables:

Защита от брутфорса с помощью iptables.

# Цепочка для проверки соединений
iptables -N brute_check
# Блокировка адреса, если за 60 секунд он инициировал более 2-х соединений
iptables -A brute_check -m recent --update --seconds 60 --hitcount 3 -j DROP
# Если нет — разрешаем соединение и заносим адрес в список
iptables -A brute_check -m recent --set -j ACCEPT
# Очищаем цепочку INPUT
iptables -F INPUT
# Отправляем в цепочку brute_check всех, кто пытается подключиться к 22-му порту
iptables -A INPUT -m conntrack --ctstate NEW -p tcp --dport 22 -j brute_check
iptables -P INPUT DROP

Спуфинг.

Спуфинг (подмена адреса отправителя пакета) может быть использован для осуществления DoS-атак или обхода брандмауэра. В первом случае спуфинг дает огромное преимущество атакующему, так как существенно затрудняет реакцию на атаку (пакеты, приходящие с совершенно разными адресами отправителя, не так просто классифицировать и заблокировать) и затягивает процесс закрытия новых соединений (обычно поддельный адрес недостижим, поэтому закрытие соединения происходит лишь по истечению таймаута). Спуфинг, осуществляемый для обхода системы защиты, менее опасен и в большинстве случаев поддается контролю.

Достаточно часто, блокируя внешние сетевые сервисы хоста, системные администраторы оставляют их открытыми для определенного диапазона адресов (например, для подключения со своей домашней машины). Вычислив один из этих адресов, взломщик может сформировать пакет, указав этот адрес в качестве обратного, и таким образом «проскользнуть » через брандмауэр. Далее он может угадать номера последовательности TCP-пакетов и сделать так, чтобы доверяющий обратному адресу сервис выполнил нужное ему действие. Это очень трудная в реализации атака, которая, тем не менее, может быть выполнена грамотным специалистом, а если речь идет о протоколе UDP, то это под силу и кулхацкеру.

К счастью, защититься от подобных атак легко. Достаточно не открывать порты незащищенных сервисов во внешний мир, а в случае резкой необходимости использовать защитные системы самих сервисов (например, сертификаты ssh) или механизм «стука в порты» (о нем рассказано в конце статьи).

Ситуация становится более сложной, когда дело касается сетевого моста, разделяющего внутреннюю и внешнюю сети (или две локальных сети). Доверительные отношения внутри локальной сети — обычное дело. Сервисы доступны всем, никакой аутентификации, шифрования и т.д. — просто лакомый кусочек для взломщика. Находясь во внешней сети, он может узнать сетевую маску внутренней сети и сформировать пакеты с соответствующим ей обратным адресом, что приведет к получению доступа ко всем ресурсам локалки. Это действительно опасная ситуация, но ее легко предотвратить с помощью правильной настройки брандмауэра или ОС.

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

iptables -A INPUT -i $outif -s 192.168.1.0/24 -j DENY

В качестве альтернативы или дополнительной меры защиты можно (и даже нужно) использовать специальные директивы ipfw и pf и настройки ядра Linux:

echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter

Эти три команды приводят к одинаковым результатам. Все пакеты, обратные адреса которых соответствуют маске сети другого интерфейса, отбрасываются.

Полезности IPTABLES.

В конце статьи мы рассмотрим несколько интересных возможностей iptables/netfilter, которые могут оказаться полезными при защите сервера от проникновений. Начнем с механизма удаленного управления брандмауэром, получившего имя «стук в порты» (port knoking). Суть его заключается в том, чтобы заставить файервол выполнять определенные действия после подключения к заданному порту. Ниже приведен пример правил, открывающих порт SSH на 10 секунд после «стука» в 27520-ый порт:

iptables и port knocking.

# Цепочка для проверки соединений на защищаемый порт
iptables -N knock
# Разрешаем соединение, если стук был в течение последних 10 секунд
iptables -A knock -m recent --rcheck --seconds 10 -j ACCEPT
# Очищаем INPUT
iptables -F INPUT
# Разрешаем все, что относится к уже установленным соединениям
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Все попытки открыть соединение с 22-м портом отправляем на проверку в цепочку knock
iptables -A INPUT -m conntrack --ctstate NEW -p tcp --dport 22 -j knock
# Заносим адрес стучащегося в 27520-й порт в список
iptables -A INPUT -m conntrack --ctstate NEW -p tcp --dport 27520 -m recent --set
# При стуке в соседние порты удаляем адрес из списка
iptables -A INPUT -m conntrack --ctstate NEW -p tcp -m multiport --dport 27519,27521 -m recent --remove
# Запрещаем все
iptables -P INPUT DROP

Третье с конца правило добавляет адрес стучащегося в список. Если та же машина в течение 10 секунд после стука обратится к 22-му порту, соединение будет установлено. Предпоследнее правило — защита от «перебора стука». Если злоумышленник попытается стучать последовательно во все порты с надеждой, что один из них откроет 22-й порт, сработает это правило, и его адрес будет удален из списка сразу после попадания в него.

Вторая полезность iptables распространяется в пакете xtables-addons (patch-o-matic) и носит имя TARPIT. Это действие (такое же, как ACCEPT или DENY), которое «подвешивает» соединение, не позволяя атакующей стороне его закрыть. Соединение, пакеты которого попадают в TARPIT, будет благополучно установлено, однако размер окна будет равен нулю, благодаря чему удаленная машина не сможет отправлять данные, расходуя свои ресурсы, а соединение будет закрыто только по истечению таймаута. TARPIT можно использовать в экстренных случаях для защиты от DoS:

iptables -A INPUT -p tcp -m tcp -dport 80 -j TARPIT

Или же для введения атакующего в заблуждение и борьбы против сканеров портов (только обычное TCP-сканирование, '-sT'):

iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -j TARPIT

Эти правила создают видимость системы, в которой открыты все порты, однако при попытке подключения к любому из них (кроме 80 и 25) соединения будут «подвисать». Того же результата, но без «провисших» соединений, можно добиться с помощью действия DELUDE, которое правильно отвечает на все попытки инициации соединения, но посылает RST-пакет в ответ на все остальные пакеты. Для еще большего запутывания атакующего ты можешь использовать действие CHAOS, которое случайным образом активирует одно из двух описанных выше действий.

Похожие материалы:
Аватар Igor

Замечательная стать но есть ошибочка (возможно просто форматирование Drupal так отображает)
но в :
Запрет опасных ICMP-сообщений. должно быть
iptables -A INPUT -p icmp --icmp-type 3,8,12 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 0,3,4,11,12 -j ACCEPT

а не
iptables -A INPUT -p icmp -icmp-type 3,8,12 -j ACCEPT
iptables -A OUTPUT -p icmp -icmp-type 0,3,4,11,12 -j ACCEPT

Аватар zenon

Спс. Поправил, наверное при форматировании потерялось.

Аватар anonym

# Блокировка адреса, если за 60 секунд он инициировал более 2-х соединений
iptables -A brute_check -m recent --update --seconds 60 --hitcount 3 -j DROP

Похоже ошибка, т.к. при такой записи он разрешит сделать 3 подключения за 60 сек.

Аватар Igor

Если дать команду
iptables -A INPUT -p icmp --icmp-type 3,8,12 -j ACCEPT
то получим в ответ
iptables v1.4.7: Invalid ICMP type `0,3,4,11,12'

Try `iptables -h' or 'iptables --help' for more information.

а если указывать правило вот так то все ок
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT

B в INPUT добавить 8 а в OUTPUT 0 что бы пинг работал сервера на ружу....

Аватар zenon

Да, Igor, этот синтаксис неверный, по одному типу на правило на до указывать. Тут указано вероятно для краткости.
Те правильной будет запись:

# iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type 12 -j ACCEPT

Вот пара нужных ссылок:

Advanced ICMP Filtering with iptables
Протокол передачи команд и сообщений об ошибках (ICMP)

Аватар mureevms

>> iptables -A brute_check -m recent --update --seconds 60 --hitcount 3 -j DROP
>> iptables -A brute_check -m recent --set -j ACCEPT
>> iptables -A INPUT -m conntrack --ctstate NEW -p tcp --dport 22 -j brute_check

При такой конструкции Iptables блочит все соединения по IP, а не только 22 порт. Лучше защищать от брутфорса так:

iptables -A brute_check -p tcp --syn --dport 22 -m recent --name radiator --set
iptables -A brute_check -p tcp --syn --dport 22 -m recent --name radiator --update --seconds 120 --hitcount 2 -j DROP
iptables -A INPUT -j brute_check

Аватар Sergey

iptables -A INPUT -p icmp --icmp-type 3,8,12 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 0,3,4,11,12 -j ACCEPT

После этих правил нужно делать drop icmp пакетов или этого хватит?
Аватар mureevms

Sergey написал:

После этих правил нужно делать drop icmp пакетов или этого хватит?

Если политика DROP, то не надо.
А на OUTPUT советую не ограничивать, много глюков словите
Аватар UZVER

Для будущего поколения - автор очень не прав блокируя icmp type 3 (destination unreachable (3) — destination unreachable (адресат недосягаем). Код 3/4 уведомляет о необходимости фрагментации сообщения, отправитель получает его, меняет свой MSS на еще более меньший.) О том, что происходит можно почитать здесь (https://habrahabr.ru/post/136871/ ) Всем удачи!

Добавить комментарий