Доброго времени суток, Хабр! Сейчас у меня творческие каникулы и я решил немного вернуться к теме, которой занимался большую часть своей жизни, поиску информации. Хотя последние пару лет я старался максимально отойти от прошлого, углубившись в разработку серверной части сложных приложений, машинное обучение, агентных систем на LLM, и всего такого «гражданского».
Но недавно наткнулся на новость о том, как мошенники использовали старую как мир схему «Мамонт» и вымышленный бренд «Топливо24», предлагая бензин, газ, и дизельное топливо на 20–30% дешевле рынка через фишинговые сайты. И самое печальное, что за неделю жулики заработали не менее 3.7 млн. рублей. А ведь у всех таких сайтов есть определенные метрики, технические характеристики, по которым можно выявить риски, и более того, собрать полезную информацию для дальнейшего расследования.
На этом моменте я вспомнил про свои наработки для тестирования веб‑приложений и решил доработать до инструмента анализа доменов, и оценки фишингового риска.
Получилось легковесное приложение на Python, не требующее в стандартной комплектации ничего, кроме стандартных библиотек. И чтобы получить первый отчет достаточно скачать репозиторий с GitHub, перейти в директорию, и запустить scan.py:
git clone https://github.com/Bednyakov/PhishIntel.git cd PhishIntel/ python3 scan.py объект_проверки.com
Через несколько секунд в директории /reports появится отчет в виде структурированного JSON файла.
Что входит в стандартную проверку:
Анализ домена. Проверяет структуру доменного имени: TLD, отдельные labels, длину домена и наличие подозрительных слов вроде
login,secure,verify,wallet. Также определяет, является ли адрес поддоменом. В отчёт попадают нормализованный домен, список меток, длина, найденные подозрительные термины и признакis_subdomain.DNS анализ. Получает основные DNS‑записи домена средствами стандартной библиотеки и системной утилиты
nslookup. Проверяются A/AAAA, CNAME, MX, NS, TXT, CAA и SOA‑записи. В отчёт включаются найденные IP‑адреса, DNS‑записи и статус доступности проверки.Анализ IP и reverse DNS. Использует IP‑адреса, полученные на этапе DNS, и выполняет обратное разрешение имени через reverse DNS. Для выбранного адреса указывается версия IP, hostname обратной записи и список всех адресов. Поля ASN, организации, страны и города предусмотрены контрактом отчёта, но остаются
null, если внешний GeoIP/ASN‑провайдер не подключён.RDAP. Получает регистрационные данные домена через RDAP: сначала определяется сервер по TLD через IANA Bootstrap, затем выполняется запрос к RDAP‑серверу. Отчёт содержит регистратора, даты создания, изменения и окончания регистрации, статусы домена и приблизительный возраст домена с категорией
new,recentилиold.WHOIS. Запрашивает регистрационные сведения через системную команду
whoisлибо напрямую по TCP‑порту 43. Модуль извлекает регистратора, даты регистрации и окончания, статусные коды, name‑серверы и признаки WHOIS privacy/redaction. В отчёте также сохраняются сервер WHOIS, источник данных и количество необработанных строк ответа.TLS‑сертификат. Устанавливает TLS‑соединение с портом 443 и проверяет параметры сертификата и протокола. В отчёт попадают версия TLS, используемый cipher, subject, issuer, даты начала и окончания действия сертификата. При ошибке соединения раздел получает статус
unavailable.HTTP‑анализ. Загружает главную страницу домена по HTTPS с ограничением размера ответа. Фиксирует итоговый URL, HTTP‑код, заголовки, Content‑Type и размер тела ответа. Само содержимое временно используется другими анализаторами, но не сохраняется в итоговом отчёте.
Анализ цепочки перенаправлений. Открывает страницу и записывает все HTTP‑перенаправления от исходного URL до конечного адреса. В отчёт включаются пары
from/to, HTTP‑коды редиректов, конечный URL и общее количество переходов. Это позволяет выявлять подозрительные внешние переходы и промежуточные домены.Анализ содержимого страницы. Разбирает HTML и извлекает заголовок страницы, язык, формы, поля ввода, скрипты, ссылки и внешние домены. Дополнительно ищет фишинговые ключевые слова, упоминания известных брендов, признаки технологий, mixed content, опасные ссылки на загрузки и чувствительные параметры в URL. Для форм определяются методы отправки, внешний
action, чувствительные поля, тип транспорта и потенциальные проблемы вроде передачи данных через GET или отсутствия CSRF‑индикатора.Анализ HTTP‑заголовков. Проверяет наличие защитных заголовков: HSTS, CSP, X‑Content‑Type‑Options, Referrer‑Policy и Permissions‑Policy. Также анализирует CORS‑политику и атрибуты cookies —
Secure,HttpOnly,SameSite. В отчёт попадают отсутствующие заголовки, список проблем, сведения о cookies и CORS‑заголовках.Проверка служебных ресурсов. Запрашивает
robots.txtи.well-known/security.txt. Для каждого ресурса сохраняются статус, итоговый URL, HTTP‑код и ограниченное содержимое ответа. Это помогает обнаружить правила индексации и опубликованный security‑контакт домена.WHOIS/RDAP‑история. Сохраняет локальную историю DNS‑ и TLS‑наблюдений в JSONL‑файл
data/history.jsonl. При новом запуске сравнивает текущий снимок с предыдущим и фиксирует изменения DNS‑записей, TLS‑сертификата или параметров соединения. В отчёт попадают записи истории, количество наблюдений и список измененийbefore/after.Обнаружение поддоменов. Использует два активных источника: Certificate Transparency через
crt.shи перебор распространённых имён изwordlists/subdomains.txtс DNS‑проверкой. Результаты группируются по источникам:certificate_transparency,brute_force,passive_dnsиdns; passive DNS пока предусмотрен только в структуре отчёта и требует внешнего API. В отчёт включаются объединённый список найденных поддоменов и их количество.Анализ sitemap. Загружает
https://<domain>/sitemap.xmlи поддерживает форматыurlsetиsitemapindex. Для sitemap‑индексов модуль рекурсивно обрабатывает дочерние файлы, собирая URL страниц. Предусмотрены ограничения: до 10 sitemap‑файлов, 2 МБ на файл и 10 000 URL; в отчёт попадают обработанные sitemap‑файлы, их типы, количество записей и список URL.Статический анализ JavaScript. Загружает ограниченное число внешних JavaScript‑файлов и анализирует их без выполнения. Для каждого скрипта сохраняются URL, домен, same‑origin‑признак, HTTP‑статус, размер и SHA-256-хеш; также ищутся эвристические признаки
eval,fetch,XMLHttpRequest, доступ к cookies, редиректы, динамическая загрузка и обфускация. Найденные паттерны являются индикаторами для дальнейшего анализа, но не доказывают наличие вредоносного кода.Скоринг фишингового риска. Агрегирует результаты остальных модулей и формирует объяснимые индикаторы риска. Учитываются комбинации ключевых слов с формами входа, брендов с login‑формами, внешних form actions, небезопасной передачи данных, mixed content, проблем CORS, репутационных срабатываний, подозрительного JavaScript и результатов активных сканеров. В отчёт попадают числовой балл, уровень (
informational,low,medium,high,critical), причины и доказательства по каждому индикатору.
Если же у вас установлены активные сканеры, например nmap, а так же Playwright, и есть, напрмер, ключи от VirusTotal, Google Safe Browsing, или URLhaus, отчет можно значительно расширить, выполнив команду запуска с дополнительными параметрами.
Сейчас поддерживаются следующие CLI‑параметры:
— domain — домен или URL для проверки;
— --timeout — таймаут сетевых операций в секундах, по умолчанию 8.0;
— --compact — вывести компактный JSON без отступов (по умолчанию отчёт форматированный);
— --no-progress — отключить индикатор прогресса;
— --output-dir — директория для JSON‑отчётов, по умолчанию reports;
— --stdout — вывести JSON в stdout вместо сохранения в файл;
— --active-tool — явно запустить установленный активный сканер (nmap, nuclei или zap);
— --dynamic — запустить изолированный браузерный анализ через Playwright, если установлен Playwright и Chromium/Chrome;
— --search — запросить поисковую видимость через настроенный Bing Web Search API; результат не влияет на оценку риска.
В случае прменения последних трех флагов отчет бует так же содержать:
Проверка репутации. Проверяет домен, URL, IP‑адреса, конечные адреса редиректов, form actions, скрипты и внешние ресурсы через подключённые сервисы. Поддерживаются VirusTotal, Google Safe Browsing и опционально URLhaus; query‑параметры URL удаляются перед отправкой, чтобы не передавать потенциальные токены. Отчёт содержит проверенные сущности, результаты каждого провайдера, время проверки и сводку по malicious/suspicious/clean/unavailable источникам.
Динамическйи браузерный анализ. Опционально запускает страницу в изолированном Chromium через Playwright. Фиксирует конечный URL, заголовок страницы, HTTP‑код, количество запросов, внешние домены, браузерные редиректы и события загрузки файлов. Анализ запускается только с флагом
--dynamic, запрещает загрузки и не отправляет формы.Активное сканирование. Опционально запускает явно указанные внешние инструменты: Nmap, Nuclei или ZAP. Nmap проверяет наиболее распространённые порты и выделяет потенциально опасные открытые сервисы; Nuclei возвращает JSONL‑результаты шаблонных проверок; ZAP требует предварительно настроенного daemon/API. В отчёт входят статусы инструментов, параметры области, найденные порты/уязвимости, stdout и stderr; без явного флага активное сканирование отключено.
Поисковая видимость. Опционально выполняет запрос
site:<domain>через Bing Web Search API. В отчёт попадают примерное количество результатов и список найденных страниц с названиями и URL. Этот модуль предназначен для OSINT‑оценки присутствия домена в поиске и не влияет на итоговый риск‑скоринг.
Отдельно проговорю, для чего вычисляется хэш из контента страницы, и скриптов. При длительном наблюдении за объектом именно по изменению хэша будет понятно, что и когда менялось. Данная информация может быть очень полезна, однако сейчас отчет не включает сохранение полного HTML, это необходимо реализовать отдельно, вслучае необходимости.
Как читать отчет?
Документ отчета, особенно в расширенном виде, выглядит достаточно громоздко.

Однако для его чтения никаких особых навыков не нужно, все поля содержат данные по своим категориям, и легко читаются. Но если с этим возникнут проблемы, его можно просто скормить LLM, и получить человекочитаемый отчет с таким же понятным выводом о результатах проверки, и рекомендациями по дальнейшим шагам, в случае необходимости. Примперный промпт может выглядеть так:
Изучи технический отчет домена и дай оценку потенциальному фишинговому риску, составь краткий человекочитаемый отчет
Мной предполагалось, что формат отчета в виде структурированного JSON является наиболее оптимальным для хранения иформации и использования в дальнейшей автоматизации углубленного изучения данных. Да и несложно дописать модуль для визуализации этих данных, чтобы было нагляднее.
Хотел бы объяснить, что я вовсе не хакер, не кибербез, и даже на OSINT‑специалист. Даже не разработчик по образованию, поэтому хотелось бы узнать мнение о проекте настоящих специалистов из перечисленных сфер. А следующие четыре абзаца можно пропустить, там информация обо мне, если кому вдруг интересно.
Темы разработки ПО и уязвимостей в глобальной сети интересуют меня с самого детства, так как оно совпало с детством рунета. Еще в школьные годы на меня сильное влияния произвел фильм «Хакеры» с Анджелиной Джоли (мне было 7, простите). Тогда я начал изучать Basic, а позже Pascal, тему вредоносов, и разной инженерии. В старших классах были кое‑какие успехи по получанию разных доступов в раннем рунете. Например, нашел способ открывать чужие почтовые ящики в недавно запущенном mail.ru, даже принимал заказы от одноклассников. Но по завершению школы я ушел совсем в иное направление, аж в правоохранительную деятельность.
Тем не менее, уже получая высшее образование, я продолжил изучать разные типы уязвимостей, и опять делал некоторые успехи по получению доступов, особенно в только созданной социальной сети Вконтакте. Максимально плотно поэкспериментировал в 2008 году, в связи с некоторыми событиями, посчитав, что должен в них поучаствовать хотя бы виртуально. И я именно что экспериментировал, никаких мыслей по монетизации этой деятельности у меня не было, только научный интерес.
Именно тогда я хорошо разобрал тему «фишинговых» страничек. Если помните, в ВК ранней стадии на странице регистрации крутился счетчик новых пользователей. Собственно, эта же страница регистраций крутилась на моих доменах, немного схожих по написанию с оригинальным. А дальше было дело техники, как подсунуть такой домен жертве, чтобы «разлогин» не вызывал подозрений. И мое исследование этих техник показало очень хорошие результаты, если измерять строками в БД.
А в настоящую разработку я попал лишь через много лет. Сначала закончил службу, организовал свое дело в сфере обеспечения экономической безопасности коммерческих структур, потом руководил СБ в структуре крупного холдинга, а потом понял, что все это мне уже невозможно надоело. И перекатился в бэкенд, отчего кайфую по сей день.
Так вот, насчет совета. Я постарался написать максимально простой код, чтобы кто угодно мог быстро допилить его под собственные нужды. Но был бы очень признателен за любой совет по исправлению существующего функционала или добавлению новых фич. Судить можете строго.
Благодарю за внимание.

