MITM атака на сегодняшний день является одной из самых эффективных атак направленных на кражу идентификационных данных для входа в различные web сервисы. Как ни парадоксально но это также является одной из самых легко реализуемых атак. Тем более с таким отличным инструментов как реверс-прокси Evilginx 2. Который был разработан польским этичным хакером Куба Грецки kgretzky.
Как работает Evilginx 2
Для защиты аккаунтов крупные онлайн-сервисы используют двухфакторную аутентификацию (2FA). Обычно ее реализация сводится к тому, что помимо логина и пароля необходимо ввести одноразовый код, присылаемый в SMS или push-уведомлении на номер мобильного, указанный при регистрации. До недавнего времени подобная защита считалась сравнительно надежной, но последнее время начали появляться готовые инструменты, позволяющие легко обходить ее.
Один из них — Evilginx 2, о котором мы и поговорим. Это обратный прокси-сервер и готовый фреймворк для выполнения MITM-атаки с целью обхода двухфакторной аутентификации. В нем автоматизировано все, что только можно. Как же он работает?
В общем случае для удачной атаки фишеру необходимо вклиниться между жертвой и запрашиваемым ей сайтом, перехватить учетные данные, а заодно распознать и сохранить cookies сессии. Сделать это при обычной авторизации по HTTP было сравнительно просто, но с переходом сайтов на HTTPS и 2FA потребовало концептуально других методов.
У Evilginx 2 есть суперспособность создавать подписанный сертификат для фишингового сайта при помощи клиента бесплатного и полностью автоматизированного удостоверяющего центра Let’s Encrypt. Это помогает атакующей стороне использовать HTTPS и украсить фейковый сайт зеленым замочком в адресной строке. В итоге подделка получается визуально неотличимой от оригинала (по крайней мере, на первый взгляд). Плюс к этому Evilginx 2 самостоятельно определяет и перехватывает валидные кукисы, а это — главная составляющая успешного взлома.
Дальше уже вопрос смекалки. Например, получив доступ к одному аккаунту, вы создаете от его имени группу или рассылку с просьбой проголосовать в каком-нибудь конкурсе. Друзья переходят по вашей ссылке, а вы собираете учетки голосующих — и площадь атаки растет в геометрической прогрессии.
Как создавался злой прокси Evilginx 2
Автор описываемого софта — польский этичный хакер Куба Грецки. Первое упоминание об Evilginx (на тот момент еще первой версии) в его блоге датировано 6 апреля 2017 года.
Первоначально за основу он взял два модуля популярного веб-сервера Nginx: sub_filter и proxy_pass. В Evilginx первый модуль блокирует доступ жертвы к реальному ресурсу, а второй передает перехваченные запросы на необходимый сервер и обратно. Уже на тот момент инструмент представлялся как инструмент, который способен обойти защиту 2FA.
Кубу Грецки пригласили для выступления на конференцию WarCon 2018, где его заметил знаменитый хакер Кевин Митник. Он написал про Evilginx в своем твиттере, что послужило отличной рекламой. Evilginx начал быстро набирать популярность. К июню того же года уже было выпущено два релиза Evilginx — 1.0 и 1.1.
На все том же WarCon 2018 Куба Грецки познакомился с ведущим специалистом по информационной безопасности итальянской фирмы Zimperium — «этичным хакером» Симоне Маргарителли, публикующим свои исследования под псевдонимом evilsocket. Маргарителли показал ему все прелести языка Go и вдохновил переписать Evilginx. Год спустя вышел полностью переработанный Evilginx 2. Проект эволюционировал от идеи MITM through Nginx до «Evilginx 2 w/o Nginx. Pure Go, and pure evil». Это был первый переломный момент.
Второй наступил, когда свет увидел опенсорсный проект Modlishka. На тот момент сложность использования Evilginx 2 заключалась в проксировании трафика. Необходимо было писать множество фильтров, которые динамически заменяли ссылки на фишинговые. Делалось это методом проб и ошибок, что сильно усложняло код.
Затем разработчик увидел, как реализована подмена URL в Modlishka. Оказалось, что не обязательно писать тонны своих фильтров — достаточно один раз добавить домен сайта и прописать общие правила подмены трафика. Это было рождение компонентов phishlets — готовых скриптов для имитации структуры популярных сайтов. На данный момент мы можем воспользоваться Evilginx версии уже 2.3.1.
Что лучше Evilginx 2 или Modlishka?
В Modlishka не было автоматизированного решения проблемы с HTTPS и сертификатом, так что закручивать эту гайку приходится самому. Да и запустить на нем можно лишь один фишинговый сайт, что снижает практический эффект атаки.
Evilginx 2 лишен этих недостатков. На таком «комбайне для фишинга» можно запустить перехват учетных данных с нескольких сайтов одновременно (подробнее об этом ниже). К тому же готовое решение с сертификатом сильно развязывает руки. На мой взгляд, Evilginx 2 опережает своего конкурента Modlishka на несколько шагов из-за грамотного подхода и максимального удобства использования.
На сегодняшний день проект претерпел несколько релизов и продолжает развиваться. К примеру, в последних обновлениях были добавлены JS-инъекции. Они позволяют внедрять в трафик свои скрипты на JS, которые выполнятся на машине жертвы.
Я привык, что весь хакерский софт пишут для Linux, однако Evilginx 2 доступен и в Windows, и в виде контейнера Docker. К моему удивлению, на винде он работает ничуть не хуже, а его установка оказалась даже проще, чем на Linux. Просто скачиваем архив, распаковываем его в любой каталог и запускаем экзешник. Да, это портейбл-утилита, которую не нужно устанавливать и можно записать хоть на флешку и запускать даже в Windows 7 и выше. Кроме того утилита не оставляет следов в реестре.
Редактировать файл .yml можно прямо из «Блокнота».
Вижу, как у вас зачесались руки, давайте перейдем от слов к делу. Только я буду заниматься этим все же в Linux.
Подготовка стенда
Задача такая: поднять в интернете сервер с Evilginx 2 и в качестве эксперимента перехватить несколько экземпляров учетных данных от популярной социальной сети.
Начнем с того, что нам понадобится VDS с минимальными системными требованиями. У меня были одно ядро с гигабайтом оперативной памяти и 30 Гб жесткого диска плюс белый IP-адрес. На борту — Ubuntu 16.04. Конечно же, нужно зарегистрировать домен, привязанный к этому IP. Вот только сделать это на халяву в излюбленном месте халявщиков — freedom — не получится. Необходимо иметь не одно доменное имя, а доменную зону, которую вам делегируют. Ее можно купить у провайдера, например REG.RU. При покупке домена в комплекте идет управление DNS, где вы и можете записью DNS А прикрепить доменное имя к IP-адресу или наделать поддоменов, которые могут пригодиться для развития атаки.
Теперь идем на новоиспеченный сервер и первым делом ставим среду разработки для языка Go, так как второй Evilginx написан именно на нем.
sudo add-apt-repository ppa:longsleep/golang-backports sudo apt-get update sudo apt-get install golang-go export GOPATH=$HOME/go export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin
Проверяем, все ли работает:
go env
Должен быть явно указан путь GOPATH.
Теперь устанавливаем сам Evilginx 2
apt-get install git make go get -u github.com/kgretzky/evilginx2 cd $GOPATH/src/github.com/kgretzky/evilginx2 make make install
Перед запуском необходимо проверить, не заняты ли у вас порты 80 и 443. Они нужны для проксирования трафика. Я подумал, что в чистой ОС они должны быть свободны, и ошибся. В 80 порт занял предустановленный Apache, поэтому не смог автоматом сгенерироваться сертификат.
netstat –antp
После того, как необходимые порты освобождены, будем запускать сам сервер, просто написав его имя в консоли — evilginx.
Если после запуска сразу перейти на фишинговый сайт по его доменному имени, то утилита просто перенаправит посетителя на видеохостинг Youtube. Это действие задано по умолчанию, а нужное вам вы можете выставить в настройках. Чтобы увидеть настройки, введите config.
В конфиге поле domain должно соответствовать вашему фишинговому домену, IP — его IP-адресу. Параметр redirect_url — это домен, на который будет переброшена жертва, которая перейдет по чистой ссылке. Задать настройки можно следующими командами:
config domain yourDomain.com config ip yourIP
Теперь немного об устройстве всей этой станции. Опираться придется на две сущности.
Phishlets — это конфигурационные файлы, задающие правила основной работы Evilginx. В них указывается, по каким параметрам определять авторизацию, как выглядят cookie-сессии и все остальные данные для удачного фишинга. Находятся они в одноименном каталоге рядом с программой и имеют расширение .yaml . Всего их уже написано 13 штук для разных популярных сайтов, а скоро наверняка появятся еще. Главное, что можно написать свои. Есть две версии формата написания: для релиза 2.2.0 и для версии 2.3.0, принимаются пока обе. Они слегка отличаются синтаксисом и возможностями. Для каждой из них имеется очень подробное описание.
Кроме фишлетов, в Evilginx есть набор ловушек (lures). Это программные функции, которые генерируют ссылки, разруливая подмену трафика и его движение внутри самой хост-машины в зависимости от того, куда мы хотим перенаправить жертву.
Перед тем как перейти к работе, стоит уточнить еще один момент: в домашнем каталоге должна появиться скрытая директория с названием утилиты. В ней находится основной конфиг (параметры, которые мы указывали), база данных (там будут пойманные креды и сессии) плюс сертификат с ключом. Если залезть в потроха сертификата, то станет видно, что он корневой, выдан сроком на 10 лет и подписан как Evilginx Super-Evil Root CA. Чтобы вывести информацию о нем, необходимо воспользоваться командой
openssl x509 -in ca.crt -text
Переходим к основной работе. Первым делом нам нужно настроить фишлеты. Я буду использовать фишлет для Instagram. Чтобы увидеть все конфиги, просто вводим команду phishlets. Пока они пустые. Добавляем свой домен к выбранному конфигу:
phishlets hostname instagram yourDomain
Теперь создаем ловушку для пользователей «Инстаграм»:
lures create instagram
В итоге все должно выглядеть как на скриншоте ниже.
Запускаем один или несколько фишлетов:
phishlets enable Instagram
Что происходит? Во-первых, генерируется сертификат (это как раз тот момент, когда все может рассыпаться как карточный дом, если будут заняты 80 или 443 порты). Генерируется он при помощи встроенной программы Let’s Encrypt, так что получается, что на фишинговый домен вам выдан валидный сертификат! Это решает проблему с HTTPS-соединением и правдоподобностью всего происходящего.
Во-вторых, происходит запуск самого прокси-сервера, изначально построенного на популярном веб-сервере Nginx. Сейчас он переписан на Go, однако символическое название осталось. Начинается прослушка трафика и фильтрация содержимого по заданным конфигурациям фишлетов.
Чтобы увидеть все ловушки, надо набрать: lures. Обратите внимание на таблицу и столбец id. Для получения готовой фишинговой ссылки вводим lures get-url id, где id — это цифра из таблицы.
Проверка сервера
Перед тем как заманивать жертву по ссылке, надо протестировать сервер и уточнить некоторые детали. Заходим сами по фишинговой ссылке и видим перед собой страницу с предложением авторизоваться в Instagram. Все выглядит правдоподобно. Вводим логин, пароль и код из SMS. Отлично, роль жертвы исполнена!
В это же время на сервере происходит вот что: в терминале будет хорошо видно, что кто-то посещал вашу страницу. При перехвате аутентификационных данных они сразу отобразятся. Как только креды перехвачены, они записываются в базу данных. Увидеть их можно, введя команду sessions.
Но как же быть с 2FA? В тот момент, когда жертва вводит пароль из SMS-сообщения, Evilginx 2 перехватывает еще и сессию авторизации, или cookie. Если в терминале Evilginx появилась строка: «all authorization tokens intercepted!», это как раз говорит об успешном захвате сессии. Увидеть статус перехвата можно, набрав команду session id.
Вы можете импортировать сессию в браузер с помощью плагина EditThisCookie. Все, теперь мы авторизованы в Instagram от имени жертвы, а логин и пароль нам вообще не нужны!
Использование Evilginx 2 для mitm атак.
Остается последний этап — проверка боем. Я разослал двадцати знакомым из своего списка контактов сообщение с фишинговой ссылкой и фразой «Прикольно придумали!».
Эти люди меня знали, а большинство автоматически доверяют знакомым. К тому же есть элемент интриги. Интересно же узнать, что там такого придумано? Тем более в WhatsApp автоматически добавилось превью веб-страницы с логотипом Instagram.
Эти два аспекта я брал как опорные точки атаки. В итоге из 20 человек 16 перешли по ссылке и трое решились ввести логин и пароль. Скорее всего, остальные поленились их вспомнить, так как пользуются «Инстаграмом» через приложение и не авторизуются в нем каждый раз. Никаких вопросов меня не спрашивали и сомнений в безопасности процедуры не выражали.
Когда три человека слили свои креды и ничего необычного по ссылке не обнаружили, они спросили: «Что же там такого?». Я просто ответил: «Уже ничего. Наверное, это была тестовая штуковина». На этом все сомнения развеялись. Во все три аккаунта я мог войти без пароля, используя сессии. Так что 2FA больше не защищала их.
Важный момент: поскольку большинство пользователей смотрят Instagram через приложение, после фишинговой атаки у меня остается длительный доступ. Сессия авторизации живет до того момента, пока пользователь заново не зайдет по фишинговой ссылке или не выйдет из аккаунта. Обе ситуации маловероятны. Учитывая эти практические аспекты, держать виртуальную свечку у жертвы над головой можно очень и очень долго.
Защита от Mitm атаки Evilginx 2
У меня был тестовый стенд, поднятый с целью демонстрации возможностей Evilginx 2. Поэтому я не стал заморачиваться с обфускацией атаки и накладывать дополнительные слои для запутывания — все было поднято на раз и на голом скелете. Как показала практика, даже в таком виде атака успешно работает.
Какие-либо технические меры для защиты от подобных атак придумать сложно. Тем более что авторизация через соцсети может быть встроена на любой сайт. Поэтому главным «антивирусом» будет обычный принцип разумного сомнения. Если вы переходите по присланной ссылке, а в итоге открывается приглашение ввести данные своей учетки в Instagram (или другом сервисе), в голове должен раздаваться тревожный звонок.