{"id":14276,"url":"\/distributions\/14276\/click?bit=1&hash=721b78297d313f451e61a17537482715c74771bae8c8ce438ed30c5ac3bb4196","title":"\u0418\u043d\u0432\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043b\u044e\u0431\u043e\u0439 \u0442\u043e\u0432\u0430\u0440 \u0438\u043b\u0438 \u0443\u0441\u043b\u0443\u0433\u0443 \u0431\u0435\u0437 \u0431\u0438\u0440\u0436\u0438","buttonText":"","imageUuid":""}

Полный Кузнец, или как мы отразили DDoS-атаку и нашли дыру в WordPress

Недавно компания «Лайв Тайпинг» впервые стала жертвой DDoS-атаки, что сделало наш сайт недоступным для простых пользователей. Обошлось без утечки данных, но ситуация всё равно неприятная. Эта статья написана для всех, кто ещё не столкнулся, но может столкнуться с DDoS-атаками: для владельцев сайтов, блогов или изданий любого масштаба.

Также мы хотим обратиться к тем, чей сайт работает на WordPress, потому что принцип атаки был построен на уязвимости этой CMS. Мы считаем, что наша история дополняет карточки «Медузы» о том, что могут сделать хакеры с вашим интернет-ресурсом. Если после прочтения вы примените все новые знания, то в час Х обойдётесь без паники и траты времени. Мы вот не обошлись.

Появление Кузнеца

Всё началось с того, что нашей коллеге, ответственной за работу с клиентами, пришло вот такое сообщение в Telegram:

За этим удалённым аккаунтом стоял некто под ником Кузнец, и он не врал: нас действительно атаковали. Прежде мы не считали нужным обезопасить себя от DDoS-атак — зачем, если у нас обычный корпоративный сайт, а не сервис с высокой посещаемостью?

О Кузнеце нужно было узнать хоть что-нибудь. Для этого наш PHP-разработчик, интересующийся разного рода атаками и уязвимостями, покопался в логах сервера, на котором находится сайт livetyping.com. За пару-тройку дней набрался 800-мегабайтный архив, скрывавший в себе 11 гигабайт данных о том, кто, когда и откуда заходил на наш сайт.

Самым интересным в них оказалось то, что превалирующими были запросы через UserAgent WordPress; иначе говоря, наш сайт валил трафик с сайтов, построенных на WordPress. Их оказалось примерно три тысячи.

В результате мы обнаружили нечто более интересное, чем просто взлом.

Первая волна атак: дыра в WordPress

У каждого из сайтов был включен интерфейс для удалённого управления платформой через POST-запросы по протоколу XML-RPC. Протокол включен по умолчанию и в обычной жизни используется, допустим, для размещения и удаления постов на WordPress-сайте, когда админ-панель недоступна. Но исследования публикаций на эту тему показали, что уже несколько лет злоумышленники используют XML-RPC для DDoS-атак.

Кузнец поступил так же. Из собранных WordPress-сайтов с включенным протоколом он сделал ботнет, чтобы отправлять запросы нашему сайту. Механика такая: атакующий обращался к этим сайтам, посылая в запросе .XML-строчку с адресом livetyping.com, и после рассылки все WordPress-сайты начинали его пинговать.

Если проще, то три тысячи WP-сайтов разом посылали запросы сайту livetyping.com, сервер не выдержал постоянной активности, перестал отвечать на все приходящие запросы, и сайт оказался недоступен.

Чтобы отразить эту атаку, мы включили на сервере фильтр по UserAgent WordPress. Кузнец это понял и сменил тактику.

Вторая волна атак: запросы со всего света

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

CloudFlare пропускает трафик с сайта через свои центры данных, которые фильтруют запросы, похожие на DDoS-атаки. Под защитой у сервиса находятся данные таких компаний, как Uber, 1Password и Avito.

Атака была нарастающей — сначала из одной страны, потом из других. Фронтенд-разработчик вручную банил все подозрительные страны с большим количеством запросов, кроме России (Румыния, Бразилия, Албания, Индия, Индонезия и т.д.). Бан срабатывал по правилам, заданным в JavaScript Challenge. Это опция CloudFlare, с помощью математических операций проверяющая, кто пытается зайти на сайт — живой человек или вредный бот.

Во время проверки сайт на пять секунд блокируется такой вот заглушкой:

Через пять секунд CloudFlare делает редирект запроса на сайт при условии, что IP-адрес удачно прошёл JavaScript Challenge и признан безопасным.

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

Когда радостей бесплатного CloudFlare нам стало не хватать, мы купили тариф Pro стоимостью $20 в месяц. К защите от DDoS, пропуску трафика через CDN-сеть и бесплатному SSL-сертификату добавилась система защиты Web Application Firewall, спасающая от SQL-инъекций и прочих атак, несущих сайту неприятности.

CloudFlare: за и против

До подключения CloudFlare мы боролись с Кузнецом своими силами, но увы, сервер просто проседал от кучи запросов. DigitalOcean, на котором находится наш сайт, из коробки ничего для защиты не предоставляет; максимум, что мы могли бы сделать — это размазать нагрузку по нескольким серверам, но в любом случае это лишь помогло бы принять такой объём запросов, а не добавить защиты. Поэтому понадобился сервис узкого назначения, чья миссия — фильтровать трафик. Им и стал CloudFlare.

Но вместе с избавлением от Кузнеца CloudFlare создал нам несколько проблем:

  • если в браузере включено VPN-расширение, то зайти на livetyping.com и в административную панель не получится. Одна из точек входа для большинства VPN-сервисов — это Румыния. Она же оказалась одной из популярнейших стран в ботнете Кузнеца и расценивается CloudFlare как подозрительная;
  • пострадала конверсия сайта, ведь не всякий реальный пользователь согласен ждать пять секунд;
  • CloudFlare — не только не самая надёжная защита, но и потенциально не работающая в России: часть IP-адресов сервиса находится в реестрах Роскомнадзора, и если попасть на такие адреса, то можно оказаться под блокировкой.

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

Заключение

Посчитаем траты с нашей стороны:

  • $20 за PRO-пакет CloudFlare. По курсу доллара на 28 сентября 2018 года это 1317 рублей;
  • 13 тысяч рублей за 13 часов работы трёх сотрудников компании, ставка 1000 рублей/час.

Итого: 14 317 рублей.

$500, которые с нас запросил Кузнец — это 32 934 рубля. Отказав ему, мы сэкономили 18 617 рублей, получили новый профессиональный опыт и поделились им с вами. Сохранённое чувство собственного достоинства оценке не поддаётся.

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

Но вместо этого лучше предупредим: если ваш сайт работает на WordPress, его могут использовать во вред другим, а после он окажется заблокированным. Поэтому либо воспользуйтесь руководством о том, как отключить XML-RPC, либо делайте статичные сайты на конструкторах вроде Tilda.

Следите за собой, будьте осторожны.

0
9 комментариев
Написать комментарий...
Дмитрий Вилов

Для новичков действительно будет полезно. Функционал XML-RPC при работе с WP в моей практике приносил только беды, поэтому отключаю каждый раз при старте нового проекта.

Особенно неплохо, что ребята сразу приняли верное решение и подключили Cloudflare PRO, в итоге обошлись в общем то небольшими тратами.

Ответить
Развернуть ветку
Вячеслав Науменко

На вордпресс ставишь All In One WP Security, закручиваешь гайки, если мало, то CloudFlare.
В общем статья дилетантская. Пускай на работу меня возьмут, буду их сайт поддерживать. (шутка)

Ответить
Развернуть ветку
Bender Rodriguez

Полноценный WAF от NinjaFirewall (WP Edition) работает быстрее и из коробки закрывает львиную долю проблем с безопасностью у WP — https://wordpress.org/plugins/ninjafirewall/

Ответить
Развернуть ветку
Вячеслав Науменко

спасибо, попробую

Ответить
Развернуть ветку
Vlad Korobov

Слава, сайт Live Typing не на Wordpress. Это вы всем бедным людям помогите поддерживать их сайты, чтобы хакерам сложнее было.

Ответить
Развернуть ветку
Юрий Гребенкин

W
A aa s s za
Hello I’m

Ответить
Развернуть ветку
Артемий Егоров

Битки все равно купите)

Ответить
Развернуть ветку
Andrew Cheban

Спасибо за статью.

Ответить
Развернуть ветку
Andrei Samuilik

Кузнец, все херня. Давай по новому.

Ответить
Развернуть ветку
6 комментариев
Раскрывать всегда