Создание собственного трансформера для MaltEgo
Для работы мы используем инструмент Sherlock — еще один OSINT-фреймворк, который позволяет искать онлайн-аккаунты по имени пользователя в сотнях социальных сетей. Maltego предлагает отличное руководство по созданию пользовательских интеграций, а также официальную библиотеку Python, так что обязательно ознакомьтесь с ними. Чтобы начать, установим библиотеку maltego-trx и создадим новый проект под названием maltego_sherlock:
pip install maltego-trx
maltego-trx start maltego_sherlock
Созданный проект будет содержать несколько примеров трансформеров (Maltego использует термин "трансформер" для обозначения кода, который извлекает связанное с введенными данными), и мы добавим новый файл Sherlock.py в каталог transforms, который будет содержать логику для получения данных из Sherlock и передачи их в Maltego в требуемом формате. В корневой директории проекта также нужно клонировать инструмент Sherlock:
git clone https://github.com/sherlock-project/sherlock.git
В файле Sherlock.py начнем с импорта необходимых классов из maltego-trx и sherlock и создадим класс для нового трансформера:
Python:
from extensions import registry
from maltego_trx.maltego import MaltegoMsg, MaltegoTransform, UIM_TYPES
from maltego_trx.transform import DiscoverableTransform
import sys
from os import path
sys.path.append(path.join(path.dirname(path.dirname( path.abspath(__file__))), "sherlock", "sherlock"))
from sherlock import sherlock
from result import QueryStatus
from notify import QueryNotify
from sites import SitesInformation
Декоратор @registry.register_transform указывает, что наш входной элемент — это Alias (псевдоним) в Maltego, а выходной элемент (тип данных, который мы возвращаем в Maltego) — это Affiliation (принадлежность).
В теле метода create_entities мы сначала получаем имя пользователя, используя свойство request.Value. Затем создаем словарь сайтов для поиска, используя JSON-файл, который поставляется вместе с Sherlock:
Python:
@classmethod
def create_entities(cls, request: MaltegoMsg, response: MaltegoTransform):
username = request.Value
sites = SitesInformation(
path.join(path.dirname(path.dirname(__file__)), 'sherlock', 'sherlock', 'resources', 'data.json')
)
site_data = {site.name: site.information for site in sites}
Для выполнения самого поиска мы вызываем функцию sherlock, передавая ей имя пользователя и словарь сайтов для поиска (а также пустой класс QueryNotify, о котором поговорим позже):
Python:
results = sherlock(
username,
site_data,
QueryNotify()
)
Наконец, мы преобразуем список результатов и, для каждого из них, если найден положительный результат, создаем сущности типа Affiliation, которые ожидает Maltego:
Python:
for website_name, result in results.items():
if result.get("status").status == QueryStatus.CLAIMED:
entity = response.addEntity('maltego.affiliation', website_name)
entity.addProperty('affiliation.network', displayName='Network', value=website_name)
entity.addProperty('affiliation.uid', displayName='UID', value=username)
entity.addProperty('affiliation.profile-url', displayName='Profile URL', value=result['url_user'])
Это и есть основная логика трансформера. Мы могли бы импортировать этот трансформер в клиент Maltego и запустить его, но есть еще один момент, который сделает его более полезным, — логирование. Помните класс QueryNotify, который мы передавали в функцию sherlock? Это базовый класс для логирования, от которого мы можем унаследоваться, чтобы выводить логированные данные в нашем клиенте Maltego. Мы назовем наш производный класс QueryNotifyMaltego и будем использовать глобальную переменную для подсчета количества положительных результатов:
Python:
# Глобальная переменная для подсчета количества результатов
count = 0
class QueryNotifyMaltego(QueryNotify):
def __init__(self, response, result=None, print_all=True):
super().__init__(result)
self.response = response
self.print_all = print_all
def start(self, message):
self.response.addUIMessage(f'[*] Проверка имени пользователя {message} с помощью Sherlock')
def update(self, result):
self.result = result
if result.status == QueryStatus.CLAIMED:
self.countResults()
self.response.addUIMessage(f'[+] {result.site_name}: {result.site_url_user}')
elif result.status == QueryStatus.AVAILABLE:
if self.print_all:
self.response.addUIMessage(
f'[-] {result.site_name}: Не найдено!',
UIM_TYPES['debug']
)
elif result.status == QueryStatus.UNKNOWN:
if self.print_all:
self.response.addUIMessage(
f'[-] {result.site_name}: {result.context}',
UIM_TYPES['debug']
)
elif result.status == QueryStatus.ILLEGAL:
if self.print_all:
self.response.addUIMessage(
f'[-] {result.site_name}: Недопустимый формат имени пользователя для этого сайта!',
UIM_TYPES['partial']
)
else:
self.response.addUIMessage(
f'Неизвестный статус запроса {result.status} для сайта {result.site_name}',
UIM_TYPES['partial']
)
def finish(self, message=None):
self.response.addUIMessage(f'[*] Поиск завершен с {self.countResults() - 1} результатами')
def countResults(self):
global count
count += 1
return count
Чтобы использовать этот новый класс, мы обновляем вызов функции sherlock() в методе create_entities и передаем ей параметр response:
Python:
results = sherlock(
username,
site_data,
QueryNotifyMaltego(response)
)
Добавление трансформера в Maltego
Maltego поддерживает два типа трансформеров: трансформеры TDS (работающие на сервере) и локальные трансформеры. Трансформеры TDS выполняются на сервере трансформеров, к которому подключается клиент Maltego для получения новых данных. Локальные трансформеры, с другой стороны, выполняются непосредственно на том же компьютере, где работает клиент Maltego. Хотя локальные трансформеры проще в настройке, они требуют указания пути к правильному интерпретатору Python, который должен иметь установленные все необходимые зависимости, а также рабочего каталога для проекта трансформера.
Чтобы упростить этот процесс, мы создадим Docker-образ, который будет содержать наш трансформер вместе с инструментом Sherlock и всеми его зависимостями.
Для этого создаем Dockerfile в корневой директории проекта с содержимым:
Код:
FROM python:3.10-slim
RUN apt-get update && apt-get install -y \
curl \
&& apt-get upgrade -y \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app/sherlock/
ENV SHERLOCK_VERSION 55c680fde1d6eb94e55870e1be6243c88732cea8
RUN curl -sSL https://github.com/sherlock-project/sherlock/archive/$SHERLOCK_VERSION.tar.gz \
| tar -v -C /app/sherlock/ -xz --strip-components=1
RUN pip install --no-cache-dir --upgrade -r requirements.txt
WORKDIR /app/
COPY . .
RUN pip install --no-cache-dir --upgrade -r requirements.txt
ENTRYPOINT ["python3", "project.py", "local", "sherlock"]
После этого строим Docker-образ:
Bash:
docker build -t maltego_sherlock .
Тестирование
Чтобы протестировать наш новый трансформер, создайте новый граф и добавьте сущность Alias с именем пользователя, который нужно найти. Затем щелкните правой кнопкой мыши на сущности Alias и выберите наш новый трансформер «To Social Media Accounts [Sherlock]».
Заключение
Надеюсь, что эта статья помогла вам понять, как создать пользовательские интеграции для фреймворка MaltEgo для улучшения ваших расследований. Полный исходный код из этого поста доступен на нашем GitHub.
Источник: https://netragard.com/osint-framework-custom-maltego-transform/