Как подготовить фишинговую атаку через рассылку и получить учётные данные сотрудников
ВСЕМ ПРИВЕТ!На связи bugaga — специалист по анализу защищённости внутренней инфраструктуры в Singleton Security.
Хочу рассказать, как готовил инфраструктуру для фишинговых атак в одном из проектов. Цель — получить учётные данных сотрудников организации, которую мы проверяли. Для этого делаем поддельную страницу с формой, рассылаем письма и собираем сливки — данные работников.
От кого письмо.Легенду можно связать с инфраструктурой заказчика, но тогда придётся регистрировать домен, похожий на основной.
Это не проблема, но встаёт другой вопрос: плашка «Внешний отправитель», которая автоматически вставляется на Exchange-сервере. Письма с ней от домена, похожего на основной, вызывают подозрение. Но в письме от внешнего источника она выглядит вполне логично, так что у получателей может вообще не возникнуть сомнений.
Что предложить в письме. Дальше надо выбрать, на какое чувство жертвы будет воздействовать фишинговая рассылка. Обычно они играют на страхе, любопытстве или любви к халяве. Мы выбрали третий вариант.
“
Как было у нас
В итоге получилась такая легенда: организация заключила договор с известной компанией, которая продаёт подписку на музыку и кино, и теперь сотрудники могут воспользоваться ей бесплатно.
Легенда есть — начнём готовить инфраструктуру.
СДЕЛАЕМ САЙТ-ПРИМАНКУ
Сначала клонируем сайт. Для этого я использую wget:
wait=2 — ждём указанное количество секунд между загрузками.
limit-rate=20K — ограничиваем скорость загрузки количеством байтов в секунду.
recursive — включаем рекурсивную загрузку.
page-requisites — загружаем файлы для корректного отображения HTML-страницы, в том числе встроенные изображения, звуки и ссылки на таблицы стилей.
user-agent=Mozilla — указываем user-agent.
no-parent — не поднимаемся выше указанного URL в структуре сайта.
convert-links — после загрузки преобразуем ссылки в документе, чтобы они подходили для локального просмотра.
adjust-extension — если загружается файл типа application/xhtml+xml или text/html, и URL-адрес не заканчивается регулярным выражением \.[Hh][Tt][Mm][Ll]?, эта опция добавит суффикс .html к локальному имени файла.
no-clobber — при запуске wget с параметром -r повторная загрузка файла приведёт к тому, что новая копия просто перезапишет старую. Добавление параметра no-clobber предотвратит это, вместо этого сохраняя исходную версию и игнорируя любые более свежие копии на сервере.
e robots=off — игнорируем правила из robots.txt.
level — указываем максимальную глубину рекурсии: установили inf в качестве значения для бесконечности.
При таком способе клонирования могут загрузиться не все требуемые файлы. Для этого я обычно делаю тестовый запуск с «python3 -m http. server 80» и смотрю лог. Если встречается ошибка 404, заново скачиваю недостающие файлы, используя wget:
“
wget -x https://example.com/file
Эта команда позволяет загрузить файл и сохранить иерархию директорий. Бывает, что ошибки 404 сохраняются, но если это визуально не влияет на функциональность сайта, на это можно закрыть глаза.
СОЗДАДИМ ФОРМУ ДЛЯ ВВОДА ДАННЫХ. Лень никто не отменял: делать целую страницу трудозатратно, поэтому давайте лучше создадим всплывающее окошко. Оно появится через несколько секунд после перехода на сайт и не закроется, пока человек не введёт данные. Основная страница останется на фоне. Такое решение экономит время, при этом сохраняется визуальная идентичность.
Чтобы сверстать всплывающее окно, можно использовать вайбкодинг. Языковые модели успешно с этим справляются, только придётся повозиться с дебагом, потому что не всё получается с первого раза.
Обычно для готового кода я использую место сразу после тега head в начале body, а блок стилей оставляю в head. Так удобно сразу получить доступ к коду, если нужно по-быстрому что-то изменить. В итоге форма получилась такой:
После открытия сайта всплывает окошко, а на заднем фоне — клонированное приложение
Так выглядит само окошко с формой
В форме есть проверка ввода данных: если доменное имя в поле e-mail не совпадает с тем, что нам нужно, выдаётся ошибка. В итоге данные отправляем на свой сервер, а пользователя редиректим на оригинальный сайт.
Если ввести личную почту, форму отправить не получится
ОБРАБОТАЕМ ПОЛУЧЕННЫЕ ДАННЫЕ НА БЭКЕ. Для этого я обычно использую связку flask + uwsgi + nginx.
За предоставление статических данных основного сайта будет отвечать nginx. Также он выступает фильтром: запросы, не связанные с определённой директорией, будут редиректиться на реальный сайт.
Итак, flask приложение app. py будет следующего вида:
“
from flask import Flask, request, send_from_directory, jsonify import os import json
app = Flask(__name__)
@app.route('/api/v1/registration', methods=['POST']) def registration(): try: data = request.get_json() if notdata: return jsonify({"success": False, "message": "Нет данных"}), 400
with open("/app/results/res.jsonl", "a", encoding="utf-8") as f: f.write(json.dumps(data, ensure_ascii=False) + "\n")
Выпущенный сертификат с ключом будут лежать в папке: «etc/letsencrypt/live/example.com». У некоторых доменных регистраторов есть опция бесплатного получения сертификата, в таком случае можно воспользоваться ей.
Для этого мы использовали «Яндекс для Бизнеса». Регистрируем аккаунт, создаём организацию и нового пользователя. Дальше нужно завести домен и подтвердить, что он ваш. Есть несколько способов: самый быстрый — через мета-тег на странице.
Подтверждаем, что домен принадлежит нам
Копируем предлагаемый HTML-код и создаём index. html с этим содержимым. Запускаем «python3 -m http. server 80» и подтверждаем владение доменом.
Теперь всё в порядке
Дальше нужно добавить MX запись и записи DKIM, SPF. Здесь всё понятно: копируем данные из админ-панели и добавляем в DNS.
Создаём фишинговое письмо. Я обычно делаю его в виде HTML-страницы, — так выходит красивее. Но не нашёл, как корректно и без костылей импортировать HTML-код в самой почте Яндекса. Проблему решили с помощью стороннего почтового клиента — Thunderbird.
После подключения создаем новое письмо и вставляем HTML-код:
Вставляем код в письмо
ПРОВЕРЯЕМ ПИСЬМО НА РАЗНЫХ ПОЧТОВЫХ КЛИЕНТАХ. Из опыта скажу, что в Outlook письма могут отображаться некорректно: иногда пропадает целый элемент. Это происходит из-за различий в обработке писем. Зато в других клиентах всё выглядит шикарно. Поэтому стоит путём тестов и дебага прийти к приемлемому результату, сохраняя работоспособность и визуальную красоту.
Так выглядит наша рассылка
ПИСЬМО ГОТОВО, ТЕПЕРЬ ДЕЛАЕМ РАССЫЛКУ. Подружить Gophish с STMP-сервером Яндекса не получилось, но для поштучной отправки есть другой вариант. Можно использовать плагин Thunderbird «Mail Merge» — он позволяет отправлять письма поштучно с определёнными таймаутами. Работает на основе шаблона. Например, вот как можно разослать письма по адресам из CSV-файла, где название столбца «e-mail»:
Также этот плагин позволяет устанавливать таймауты:
ЕСТЬ НЕСКОЛЬКО ВАРИАНТОВ ОТПРАВИТЬ ПИСЬМА:
Save As Draft — сохранить в черновиках. Создаёт отдельные письма для всех адресатов и помещает их в папку «Черновики», не посылая.
Send Later — отправить позже. Письма помещаются в папку «Исходящие».
Send Now — отправить сразу.
Если решили послать на несколько адресов одним залпом, то при отправке с самой Яндекс почты можно воспользоваться опцией «Скрытые копии». Туда вписываются все пользователи, а в поле «Кому» можно указать любое общее название, например «workers@example.com». Даже если такого адресата нет — письма всё равно дойдут, и конечный пользователь будет видеть только «workers@example.com», а имена других получателей не увидит.
ПОДВЕДЁМ ИТОГИ
Как сработала рассылка:
200 адресов получили письма
12 пользователей оставили данные
Во сколько обошлась инфраструктура:
Домен — 119 ₽
VPS — 285 ₽
«Яндекс для Бизнеса» — 302 ₽
Всего — 706 ₽
Какой вывод можно сделать. Фишинг остаётся эффективной атакой и не требует больших финансовых затрат, а благодаря LLM подготовить её стало легче.
Изучить больше методов атак с использованием социальной инженерии можно на курсе «Пентестер»
Как подготовить GoPhish для фишинговой атаки
Пошаговый гайд от bugaga по подготовке фреймворка, который помогает создавать шаблоны писем и фишинговые страницы