Pull to refresh

Наносим удар по ddos ботнету своими силами

Reading time 7 min
Views 34K


Доброго времени суток уважаемое хабрасообщество, по просьбам хабровчан решил поделится некоторыми своими наработками борьбы с ддосом на основании личного практического опыта отражения атак.
В данной статье не будет очередного нового способа, как защититься от ддоса своими силами, информации по этому предостаточно. Мы зайдем немного с другой стороны.
Как говорится лучшая защита — нападение. Вот мы и будем с вами наносить удар по самому больному месту ддосеров — по ботам. Дополнительным приятным бонусом для нас будет то, что мы сделаем доброе дело и освободим хоть какую-то часть зараженных машин из плена злых ботнетчиков.
Понятно, что ботнет нам не убить, однако нанести порой вполне существенный удар можно, особенно если основную часть ботнета составляют дедики с руткитами, которые порой создают основную проблему при отражении атаки. Ну и кулхацкеру васе с его сотней кровью и потом добытых ботов тоже можно очень неплохо напакостить. Ибо боты, особенно на хороших каналах и из хороших регионов, стоят денег и порой немалых. Если они начнут дохнуть от посыпавшихся абуз, ддосерам может быть накладно продолжать ддосить вас и они могут повысить цену для заказчика или вообще приостановить атаку. Намного проще ддосить того, от кого не будет лишнего шума.


Как убить бота?



Итак, как же нам убить бота, ну или по крайней мере попытаться освободить его душу от вселившихся злых сил?

Для этого необходимо:

1). Определить ip адреса атакующих ботов
2). Определить кому принадлежат данные ip адреса (вышестоящая организация: ДЦ, провайдер, учереждение ...), из whois получить список контактных abuse email, на которые будем слать жалобы
3). Подготовить логи, подтверждающие факт проведения атаки.
4). Отправить лог по спискам abuse email

Если ботов немного, можно конечно все это сделать руками, но мы автоматизируем этот процесс.

Ддос бывает разный


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

В общем это тема для отдельной статьи, я же постараюсь для понимания выбрать простой и доступный всем способ.
Итак, допустим, мы имеем TCP/UDP flood по разным портам, какие-то методы ддос сдерживают, доступ к машине есть, но мы хотим снизить мощность атаки и не допустить ее увеличение, ну или просто напакостить ддосерам.
Задача — нанести контрудар, лишить ботнетчиков самых активных ботов.

Собираем логи


Вариантов много, опять-таки тема для отдельной статьи. Есть много разных способов логирования трафика например tcpdump, iptrtaf, netflow…
У меня как-то исторически сложилось большинство логов было снято с использованием iptraf, который использовался для наблюдения за атакой и все скрипты были настроены на их распарсинг. Решение может не самое красивое, но достаточно универсальное. При самой минимальной модификации можно использовать любые логи и проделывать все нижеперечисленные манипуляции в реальном времени.

Итак, начался ддос, мы запускаем iptraf, в настройках (Configure) влючаем логирование (Logging), теперь когда мы запустим IP traffic monitor, оно спросит в какой файл сохранять лог, например
/var/log/iptraf/iptraf.log
Теперь iptraf для нас будет записывать основную информацию о каждом пакете (в т.ч. и дропнутом).
По личному наблюдению хуже серверу от этого не станет, данное логирование почти не тратит полезных ресурсов сервера.

Отправляем абузы


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

Скрипты


Все скрипты можно скачать тут: github.com/Ajex/AntiDdosAbuse

Ниже опишу каждый.

1). show_ips.sh — выводит список ip адресов из лога и количество пакетов, которые прошли за интервал сбора.

Параметры запуска:
./show_ips.sh iptraf.log "Dec 12" > ddos_ips.txt

После этого скрипт распарсит файл, используя в качестве исходного лога файл iptraf.log и фильтра «Dec 12», и выведет результат в файл ddos_ips.txt для последующего анализа другими скриптами.

* Можно применять и любые свои фильтры, выбирая данные к примеру за конкретный час

Вывод его будет такого вида:

     3 1.1.1.1.
     3 1.1.1.2.
     3 1.1.2.1.
   10 2.3.2.2.
   10 2.3.2.2.
....
7833 x.x.x.x
19343 y.y.y.y
58234 z.z.z.z


Учитывая, что данный лог будет сделан в момент атаки, будет очень сильный разрыв между наименьшими и наибольшими значениями. Порой в тысячи и десятки тысяч раз. Тут, опять-таки, нет универсальных алгоритмов по какому признаку считать трафик аномальным, нужно смотреть и думать головой.
Но как правило в файле будет очень хорошо видно, ибо нормальный пользователь не может отправить несколько десятков тысяч запросов за несколько минут.
На основании этого лога определяем границу с которой считать айпишники ботами. Можно дополнительно провести ручную проверку некоторых адресов из топов по логам apache/nginx и логу иптрафа.
Например бот ломился по UDP, а у вас только webserver или TCP долбился по каким-то левым портам, кои у вас наглухо закрыты.
Голову на данном шаге очень важно включать, ибо повторюсь универсальных методов нет, все зависит от того что за сервер под атакой, какие сервисы запущены, какая нагрузка.
Можно доработать скрипт и вместе с количеством выводить например еще регион адреса и считать количество закрытых портов, по которым ломился бот, дополнить информацию из логов вэб сервера…
Тут целое поле для мыслительной деятельности, которые выходит за рамки данной статьи.

2). get_info.sh — извлекает abuse email из whois информации для каждого айпишника, полученного скриптом show_ips.sh на шаге 1.
Параметры запуска:
./get_info.sh ddos_ips.txt > abuse_email.txt

где, ddos_ips.txt это файл созданный на шаге 1
После этого abuse_email.txt будет содержать список email адресов для отправки писем.

Вывод его будет такого вида:

x.x.x.x abuse@aaa.com master@aaa.com
y.y.y.y abuse@bbb.com
z.z.z.z abuse@ccc.com
....


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

3). get_logs.sh — скрипт извлекает из лога iptraf информацию по каждому конкретному ip адресу, сохраняет в отдельный файл и упаковывает в Gzip

Параметры запуска:

./get_logs.sh ddos_ips.txt iptraf.log "Nov 20" pref

где, pref префикс создаваемых логов для удобства их сортировки

В параметрах обязательно указать th_limit, это опять число коннектов из файла ddos_ips.txt отделяющих хорошие ip адреса от ботов.
На выходе в текущей папке будут созданы Gzip файлы содержащие логи по каждому отдельному ипу.

4). mail_send.sh — скрипт рассылающий абузы по спискам полученным из шага 2. скриптом get_info.sh

Параметры запуска:

./mail_send.sh abuse_email.txt pref


где abuse_email.txt файл полученный на шаге 2

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

echo "Hi, today, our server x.x.x.x was attacked from your or your c$ip
Here are the logs yourcompany.com/abuse$pref$ip.txt.gz (TZ - Europe/Moscow) ... bla bla bla ... The Company Name Ltd." | mail -s "[Abuse] ddos attack from your $ip" $email_row

(свой текст специально не привожу, чтобы не слали по шаблону и не попало в спамфильтр)

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

do_all.sh — данный скрипт выполняет все действия последовательно, но сделан больше для демонстрации, ибо перед тем как его запустить, нужно оттюнинговать параметры скриптов, особенно th_limit под свой случай

Вот его параметры:

parse_date — по этому выражению будет делаться Grep лога, если нужно отобрать записи за определенное число или час
pref — префикс для создаваемых файлов, например та же дата
iptraf_raw_file — откуда брать лог iptrafa

Понятно что можно было сделать скрипты через потоки, но для статьи и понимания работы сделал так, как есть, простор для фантазии бесконечный. Можно доработать и автоматизировать все процессы, например автоматом включать логирование после начала атаки, сделать более точный анализатор для шага 1.

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

И что в результате? Неужели это подействует?


Что произойдет с полученной абузой? Возможно конечно ее проигнорируют, но, например, на следующий день айпишник опять попадет в черный список и опять уйдет абуза и т.д., возможно когда-то отреагируют.
Если ип это какой-то впс/вдс сервер и абуза попадет например в ДЦ с подробными логами, нормально оформлена, то она скорее всего будет изучена, а если логи будут очень вескими и сойдутся со статистикой ДЦ, то может и будет блок. Тут где-то 50/50, что в общем тоже неплохо.
Если подобное придет провайдеру, он скорее всего уведомит абонента (общался с некоторыми знакомыми, сказали что поступят именно так), а если жалоб придет несколько и опять-таки аргументированных, то может и заблочат до тех пор, пока клиент не поставит нормального антивируса.

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

Спасибо за внимание, это моя первая статья на хабре, просьба сильно не ругать если что не так. Если же тематика будет интереса, поделюсь практическим опытом, как не обладая серьезными ресурсами, имея 3 рубля за пазухой можно своими силами противостоять достаточно сильным атакам. Порой хитрость и смекалка могут дать больше, чем мощное железо или широкий канал.

UPD: Кстати, бывают случаи, когда способ, описанный в статье, может стать реальным спасением от ддоса. Например если завалили всю ширину порта со сравнительно небольшого числа ботов на широких каналах или сетевая не справляется с потоком запросов. В таком случае помогут или блок на стороне вышестоящего маршрутизатора, что очень часто не представляется возможным во многих ДЦ, или борьба при помощи абуз. Последнее кроме своей простоты и доступности, дает возможность неплохо так напакостить ддосерам и разоружить их.
Tags:
Hubs:
+149
Comments 61
Comments Comments 61

Articles