Команда безопасности REG.RU в работе часто сталкивается с мошенниками, любителями спама, фишинговыми доменами, взломом аккаунтов, попытками угона доменов и т. д. На примере поиска создателя фишинговых сайтов я расскажу, как мы вычисляем подобных нарушителей с помощью Maltego. 

Заранее отмечу, что:

  • определить факт мошенничества и вынести наказание могут только правоохранительные органы. Но мы проводим и собственные расследования на основе тех данных, что у нас есть, чтобы самостоятельно принять законные меры при очевидном правонарушении;

  • статья не рекламная, все примеры, кейсы, имена (как собственные, так и доменные) вымышлены, любые совпадения случайны.

Немного о Maltego

Maltego – это программа для сбора информации из разных источников и последующего её представления в удобном виде. Активно используется в расследованиях и разведке на основе открытых и закрытых источников.

Информация в программе визуализируется в виде графа:

Граф состоит из объектов (Entities) и связей между ними (Links). В качестве объекта может выступать любая единица информации: доменное имя, IP-адрес, организация, данные клиента (ФИО и номер телефона) и др.

Добавлять объекты и связи можно вручную или автоматически при помощи трансформаций (Transforms) ― скриптов, которые находят данные о существующих объектах в разных источниках и добавляют эти данные на граф уже в виде новых объектов. Есть набор готовых трансформаций под разные задачи. Например, если нужна информация об IP-адресе, то при помощи встроенных трансформаций можно узнать данные из Whois, местоположение, репутацию адреса (Fraud-check) и проверить по нодам Tor’a.

Расширить набор трансформаций можно в Transforms Hub ― встроенном маркетплейсе.

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

Для работы с данными из внутренних источников можно создать свои трансформации.

Maltego распространяется в двух вариантах ― бесплатном и платном. Бесплатные версии ― CaseFile и Community Edition. Коммерческий вариант называется Maltego One и имеет три тарифа: Pro, Enterprise и Enterprise On-premise. Актуальные издания и их фичи доступны на официальном сайте

Кейс с фишинговыми сайтами

А теперь рассмотрим вымышленное, но вполне типичное расследование. 

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

Что у нас есть: для регистрации нового аккаунта на REG.RU нужно указать электронную почту и телефонный номер. А чтобы зарегистрировать домен, ещё и ФИО с паспортными данными (зависит от доменной зоны). В логах можно найти IP-адреса, cookie, User-Agent и другие параметры системы злоумышленника. Из всех этих данных можно составить цифровой отпечаток предполагаемого нарушителя. Чем больше входных данных, тем больше шанс найти взаимосвязи. 

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

Для начала надо создать новый граф и разместить на нем домен MOB-VTB24.RU. На панели инструментов (Entity Palette) есть объекты разных типов, которые можно переместить в рабочую область. Перетащу объект «Domain» из панели на граф и укажу нужное доменное имя.

Еще объекты можно добавлять из буфера обмена с автоматическим распознаванием типа. Если распознается неправильно, можно поправить вручную из меню «Change Type».

Добавление новых типов объектов

Теперь можно получить информацию о владельце домена, указанную при регистрации:

  • ФИО,

  • номер,

  • email,

  • логин аккаунта, в котором находится домен.

Нужно создать новый тип объекта ― «User», и написать трансформации для поиска домена по нашей базе (в статье все запросы в базу упрощены).

Во вкладке «Entities» создаю объект «User» и задаю для него основное свойство ― «user_id».

Объект создан. Пора написать трансформацию, которая выведет данные домена и аккаунта на граф в виде объектов и связей.

Создание трансформаций

Для написания трансформаций я использовал библиотеку maltego_trx для Python 3.6 и выше. Команда для ее установки:

pip install maltego-trx

Команда для создания нового проекта:

maltego-trx start new_project

Файлы трансформаций будут храниться в new_project/transforms/.

Теперь создам новый класс и унаследую его от «DiscoverableTransform». Переопределяю метод «create_entities», внутри которого будет вся логика поиска данных и добавления объектов на граф. За размещение объектов на графе отвечает метод «response.addEntity».

from maltego_trx.transform import DiscoverableTransform
import MySQLdb

# Наследуем наш класс от DiscoverableTransform
class SearchDomain(DiscoverableTransform):

   """
   Выполняет поиск домена.
   """
   
   # Переопределяем метод create_entities
   @classmethod
   def create_entities(cls, request, response):
       # Получаем входящее значение
       email = request.Value
       
       # Инициализируем подключение к базе
       db = MySQLdb.connect(host='database.host',
                           port='3306',
                           user='user',
                           passwd='password',
                           db='db',
                           charset="utf8")
       cursor = db.cursor(MySQLdb.cursors.DictCursor)
       
       # Выполняем поиск по таблице domains
       cursor.execute("""select user_id, name, phone, email
                           from domain
                           where domain = %s
           """, [domain])
           
      rows = cursor.fetchall()
      
       # В зависимости от поля добавляем на граф
       # объекты соответствующих типов
       for row in rows:
           response.addEntity('yourorganization.User', row['user_id'])
           response.addEntity('maltego.Person', row['name'])
           response.addEntity('maltego.PhoneNumber', row['phone'])
           response.addEntity('maltego.EmailAddress', row['email'])

При добавлении объекта нужно использовать тот «Unique Type Name», который указывался при создании объекта «User». В моем случае это «yourorganization.User». Классы же для встроенных объектов можно импортировать из библиотеки.

from maltego_trx.entities import Person
...
response.addEntity(Person, row['name'])

Если объектов много, можно сделать маппинг полей и объектов.

field_map = {
   'user_id': 'yourorganization.User',
   'name': 'maltego.Person',
   'phone': 'maltego.PhoneNumber',
   'email': 'maltego.EmailAddress'
}
for row in rows:
   for field in row:
       if field_map.get(field):
           response.addEntity(field_map[field], row[field])

Добавление трансформаций

Готовую трансформацию надо добавить в Maltego. Для этого во вкладке «Transforms» выбираю «New Local Transform» и заполняю поля. В поле «Input Entity Type» выбираю тип объекта, с которым работает трансформация:

Указываю путь к интерпретатору Python3:

Где:

  • project.py ― основной скрипт;

  • local ― говорит о том, что трансформация работает локально;

  • searchdomain ― имя трансформации, соответствующее названию класса.

Чтобы проверить, правильно ли создан класс, можно вывести список всех трансформаций проекта при помощи команды python3 project.py list.

Запуск трансформаций

Теперь можно запустить трансформацию:

В результате работы на графе появились объекты:

Логи работы трансформации пишутся в Output. Туда же можно вывести отладочную информацию для поиска ошибок в работе скрипта. Для этого в настройках трансформации нужно активировать «Show debug info».

Через интерфейс или код можно помечать объекты на графе и добавлять к ним комментарии:

from maltego_trx.maltego import BOOKMARK_CLRS
...           
...
           me = response.addEntity(
               'yourorganization.User', user_id
               )
           me.setBookmark(BOOKMARK_CLRS["red"]) #добавить заметку

           me.setNote("Регистрирует фишинговые домены") #добавить флажок

Тем временем уже удалось найти подозреваемого. На графе есть его ФИО, почта и телефон. По этим данным можно сделать обратный поиск. 

Обратный поиск

Для обратного поиска нужны новые трансформации. Добавляю их по аналогии с «SearchDomain» и запускаю поиск. Результат ― новые домены и аккаунт. 

Найденные доменные имена выглядят подозрительно, так как связаны с банками и сервисами BlaBlaCar и Drom.

После повторного поиска только по номеру получаю еще 88 доменов:

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

При повторных поисках с использованием новых объектов получилась вот такая сеть:

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

Осталось убрать из графа ненужные объекты и выгрузить финальный список доменов и аккаунтов. По нему уже можно работать над блокировкой аккаунтов и доменов.

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

Заключение

Maltego упрощает расследования за счет автоматизации поиска и понятной визуализации данных. Инструмент подходит как для внутренних расследований, так и для поиска информации в открытых источниках (OSINT ― Open source intelligence). Очевидно, что в статье я охватил далеко не все его возможности: тут есть удобные функции для анализа информации на графе, есть возможности экспорта данных, а поиск можно прокачать, объединив скрипты в «машины». Дайте знать, если интересно узнать о чем-то подробнее.  

А еще рекомендую цикл статей про Maltego от @Wolchara000.

Статьи цикла

Комментарии (1)


  1. dartraiden
    01.09.2022 00:46

    Писал этому регистратору когда-то, что на домене располагается фишинговый сайт, мимикрирующий под личный кабинет battle.net. Ответ был в духе «а мы чё, мы только домен предоставляем, хостеру пишите». Хостер в Китае, нетрудно догадаться, как далеко он меня пошлёт.

    Пруфов за давностью лет не будет.