
Snoopy: распределённый фреймворк для отслеживания и перехвата данных
| || | | || || || || | | |
| _____|| |_| || _ || _ || _ || |_| |
| |_____ | || | | || | | || |_| || |
|_____ || _ || |_| || |_| || ___||_ _|
_____| || | | || || || | | |
|_______||_| |__||_______||_______||___| |___|
V0.1
"Amy, технологии не являются по своей сути хорошими или плохими. Всё зависит от того, как их использовать. Как с Лучом смерти."
-Профессор Фарнсворт
Добро пожаловать в Snoopy; распределённый фреймворк для отслеживания и профилирования. Snoopy находится в разработке, так что не стесняйтесь присылать предложения и/или исправления. В этом документе описывается базовое использование. Чтобы лучше понять предысторию, взгляните на следующее:
Клиентское ПО работает на устройствах, которые мы называем «Дроны». Дроном может быть любое устройство на базе Linux, имеющее Wi-Fi-интерфейс (с драйверами для инжекции) и исходящее подключение к интернету. Snoopy тестировался на Nokia N900 и ноутбуке с BackTrack. Дроны выполняют следующие две операции:
Собранные зондирующие запросы (например, iPhone Боба, ищущий BTHomeHub-4123) загружаются на сервер Snoopy через регулярные промежутки времени. Все устройства, которые подключаются к Rogue AP, получают доступ в интернет через сервер Snoopy.
Сервер помещает все зондирующие запросы в базу данных, использует Wigle для определения координат GPS, а Google Maps — для определения почтовых адресов (и фотографий с улиц). Это означает, что если вы отправляете зондирующие запросы для своей домашней сети, я могу получить фотографию вашего дома.
Каждый Дрон подключается к серверу через OpenVPN и имеет свою подсеть. Подключившиеся клиенты получают IP-адрес от Дрона и маршрутизируют трафик через него. Это значит, что на сервере мы можем сопоставить IP-адреса клиентов (и, следовательно, MAC-адреса) с их интернет-активностью.
На сервере происходит следующее:
Схема сети выглядит следующим образом:
Client1 Drone1 Snoopy Server
+----------+ +-----------------------+ +-----------------------+
| wlan0-|<---WiFi--->|-at0 | | eth0|<-squid-sslstrip-mitmproxy->Internet
| | | | 10.2.0.1 | | 11.22.33.44| |
| dhclient | | | | | | Traffic inspection
| | | | tap0-|<-openvpn----->|-tap0 | Social media analysis
+----------+ | | 192.168.42.2 | +--/| 192.168.42.1 |
10.2.0.2 | +-----------------------+ | +-----------------------+
| |
| | route 10.2.0.0 via 192.168.42.2
| | route 10.3.0.0 via 192.168.42.3
Client2 | |
+----------+ | |
| wlan0-|<---+ |
| | |
| dhclient | |
| | |
+----------+ |
10.2.0.3 |
|
|
|
Client3 Drone2 |
+----------+ +-----------------------+ |
| wlan0-|<---WiFi--->|-at0 | |
| | | | 10.3.0.1 | |
| dhclient | | | | |
| | | | tap0-|<-openvpn--+
+----------+ | | 192.168.42.3 |
10.3.0.2 | +-----------------------+
|
|
|
Client4 |
+----------+ |
| wlan0-|<---+
| |
| dhclient |
| |
+----------+
10.3.0.3
Уолтер написал веб-интерфейс для Snoopy. К нему можно получить доступ по адресу http://your-snoopy-server.com:5000/
Существует несколько трансформов Maltego для графического исследования собранных данных (см. ниже для получения дополнительной информации).
УСТАНОВКА ================ Установка сервера должна быть простой. Она тестировалась только на чистой установке Ubuntu 12.04 LTS 32bit. Вносятся изменения в несколько компонентов сервера, поэтому настоятельно рекомендуется запускать скрипт установки на базовой установке и не запускать ничего другого на этом компьютере (если только это не необходимо). Если сомневаетесь, просмотрите файл install.sh и внесите изменения вручную. В противном случае просто запустите установщик (./install.sh).
ИСПОЛЬЗОВАНИЕ ======== После завершения установки вы сможете просто набрать 'snoopy', чтобы загрузить меню сервера. Если этого не произошло (или если сомневаетесь), перейдите в домашний каталог пользователя, созданного во время установки. Внутри каталога 'snoopy/server/' находится файл 'snoopy.sh', который вы можете запустить. Ниже представлено меню:
+---------------------------------------------------------------+
| Welcome to Snoopy V0.1 |
| SERVER SIDE |
| |
| SensePost Information Security |
| [email protected] / www.sensepost.com |
+---------------------------------------------------------------+
Date: Thu Nov 1 16:37:08 CET 2012
Snoopy Server Status: Stopped
Connected Drones: 0
Wigle User: setYourWigleAccount
Would you like to:
[1] (Re)Start Snoopy server components
[2] Stop Snoopy server components
[3] Manage drone configuration packs
[4] Configure server options
[5] Set web traffic injection string
[6] Observe logs
[X] Exit
[?] Help
Создание пакетов для дрона Опция [3] в меню позволит вам создать клиентские «пакеты» для ваших устройств-дронов. Каждый дрон получает свои собственные ключи OpenVPN и SSH, диапазоны DHCP и таблицы маршрутизации. Вам будет предоставлен URL-адрес для загрузки для каждого устройства-дрона. Убедитесь, что на вашем сервере и дроне установлено правильное время, иначе VPN-соединение не установится.
К каждой сущности Snoopy можно применить различные трансформы. Перетащите сущность «Snoopy» на свой граф, чтобы начать. Если не указать дату начала или окончания в свойствах сущности, по умолчанию будут получены результаты за последние 5 минут (это значение можно изменить в меню конфигурации сервера).
Машины Snoopy позволяют автоматически последовательно выполнять трансформы, а также фильтровать/удалять узлы на основе требований. Исходный код/комментарии должны достаточно ясно описывать, как они работают.
ПРАВОВЫЕ СООБРАЖЕНИЯ ======================= Все или некоторые компоненты Snoopy могут быть незаконными в вашей стране. Пожалуйста, узнайте об этом перед использованием программного обеспечения. В Соединенном Королевстве компонент сбора зондирующих запросов легален из-за широковещательного характера трафика. Однако компонент мошеннической точки доступа, скорее всего, незаконен в большинстве регионов. SensePost не несет ответственности за ваши проблемы, возникшие в результате использования этого инструмента.
СООБРАЖЕНИЯ ПО БЕЗОПАСНОСТИ ========================== Каждый «пакет дрона» содержит ключи OpenVPN и SSH. Если дрон будет скомпрометирован (например, украден или иным образом), это может создать угрозу безопасности вашего сервера. Настоятельно рекомендуется, чтобы ваш сервер Snoopy работал исключительно для этой цели. Пользователь, созданный на сервере, имеет следующую запись, автоматически добавленную в файл .ssh/authorized_hosts для дополнительной безопасности:
"no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="/usr/bin/rsync ${SSH_ORIGINAL_COMMAND#* }""
ПЛАНИРУЕМЫЕ РАБОТЫ =============== Есть еще много вещей, которые нужно сделать/добавить. Эта версия скорее PoC (доказательство концепции).
Спасибо за помощь/советы/вклад от:
В. Мы знаем, что иностранный шпион прибывает в Хитроу 11 ноября, но не знаем, когда и каким рейсом. Наши разведданные предполагают, что после прибытия он остановится в отеле Hilton, а 14-го вылетит из аэропорта Лутон (опять же, мы не знаем время и направление). Он мастер маскировки. Как мы можем его опознать?
О. Разверните дроны Snoopy в Хитроу, Hilton и Лутоне. Трансформ Maltego «CommonLocation» отметит пересечение всех устройств, присутствующих в этих трех местах. Надеемся, что будет только один результат — наша цель-человек. После обнаружения мы можем изучить карты Google и фотографии улиц мест, которые посетил наш шпион. Его личность может быть раскрыта, если его устройство(а) будут обманом подключены к мошеннической точке доступа Snoopy (например, его Facebook, Twitter или электронная почта).
Попросите Snoopy отметить всех лиц, которые подключались к Wi-Fi-точке в определенных песчаных^W нежелательных странах.
Разверните Snoopy в ваших 10 универмагах. Отмечайте потоки людей, повторных клиентов, типы клиентов.
Внедряйте вредоносный код для захвата устройств клиентов и установки вредоносного ПО. Эксплойты могут быть запущены напрямую с сервера на подключенных жертв благодаря таблицам маршрутизации.
TFL (Transport for London) могла бы развернуть дрон Snoopy в каждой линии лондонского метро. Они могли бы отслеживать потоки людей, отмечать пиковые и спадающие часы/дни и соответствующим образом назначать/сокращать персонал.
Разверните 500 дронов Snoopy по всему Лондону. Отслеживайте перемещения людей, когда они проходят мимо дрона. Интересные закономерности движения людей обязательно проявятся, если это будет применяться в течение недель/месяцев.
Для настольного ПК/ноутбука на Linux карта Alfa AWUS036H показывает средние результаты. Более надежной картой является Ubiquity SR-71. Буду признателен за любые отзывы о том, что у вас работает/не работает в плане поддержки драйверов инжекции.
Для N900 вы заметите, что загрузка драйверов инжекции значительно сокращает время работы от батареи. Аккумуляторный блок TecNet 6600mAh в тестах давал около 6-8 часов. Однако вам понадобится адаптер, чтобы подключить N900 к любому аккумуляторному блоку. Уменьшение (или отключение) частоты опроса GPS также продлит время работы от батареи.
Советы по подключению N900 к ноутбуку через USB (для SSH) можно найти здесь
В настоящее время я тестирую RaspberryPi, Alfa R36 mini AP и SheevaPlug. Результаты последуют.
Вы можете создавать свои собственные трансформы Maltego для исследования собранных данных. Прилагаемые трансформы в основном предназначены для демонстрации возможностей. Ознакомьтесь с исходным кодом и прочитайте:
Свяжитесь с [email protected], если у вас есть вопросы (или спросите у потрясающих ребят из Maltego).
Код веб-интерфейса доступен по адресу ~user/snoopy/server/bin/snoopy/src/snoopy/
Плагины состоят из двух частей:
Плагин — это вызываемый объект, который динамически загружается приложением Snoopy. Давайте начнем с примера:
from snoopy import db, pluginregistry
@pluginregistry.add('client-data', 'ssidlist', 'SSID List', js='/static/js/ssidlist.js')
def ssid_list(mac):
with db.SessionCtx() as session:
query = session.query(
distinct(db.Probe.probe_ssid) # SELECT DISTINCT probe_ssid FROM probes
).filter_by(
device_mac=mac # WHERE device_mac=$mac
).order_by(
db.Probe.probe_ssid # ORDER BY probe_ssid
)
return query.all()
Теперь подробно...
from snoopy import db, pluginregistry
Нам нужен db для доступа к базе данных Snoopy и pluginregistry для регистрации нашего
плагина.
@pluginregistry.add('client-data', 'ssidlist', 'SSID List', js='/static/js/ssidlist.js')
Таким образом мы регистрируем наш плагин (которым может быть любой вызываемый объект). Первый
аргумент указывает имя группы, в которую входит этот плагин. Мы
указали client-data, поскольку этот плагин принимает MAC-адрес и возвращает
данные для отображения в окне данных клиента. Кроме client-data,
существует также группа плагинов session-data, которые работают с сеансами
близости. Второй параметр — имя плагина. Это имя используется
только внутри и должно быть JSON-совместимым. Третий параметр — заголовок плагина.
По сути, он совпадает с именем, но заголовок отображается в графическом интерфейсе.
Точнее, это заголовок раздела данных в окне данных клиента.
Все аргументы ключевых слов после заголовка сохраняются как опции. Хотя система
плагинов не требует каких-либо опций, Snoopy поддерживает опцию js. Эта опция
указывает URL (со стороны браузера, а не со стороны Snoopy/сервера)
JavaScript-компонента этого плагина.
def ssid_list(mac):
Этот плагин — простая функция. Он принимает строку MAC-адреса, как
и определено для плагинов client-data. Имя вызываемого объекта не используется.Тело этого примера плагина просто выполняет запрос SQLAlchemy, который по сути делает SELECT DISTINCT probe_ssid FROM probes WHERE device_mac=$mac и возвращает результаты в виде списка. Возвращаемые значения плагинов обычно добавляются как часть JSON-ответа. Поэтому результаты должны быть JSON-совместимыми (как поддерживается функцией Flask jsonify()).
Вот так всё просто!
Фронтенд-плагины для данных клиента называются обработчиками данных клиента. Они регистрируются с помощью функции Snoopy.registerPlugin(sectionName, dataHandler). sectionName — это имя раздела данных, который обработчик хочет обрабатывать. Это имя совпадает с именем бэкенд-плагина, который сгенерировал данные. dataHandler должна быть функцией со следующей сигнатурой: function($section, clientData) {...}. $section — это jQuery-объект элемента div, в котором обработчик может отображать данные или вносить изменения. Данные клиента (сгенерированные бэкенд-плагином) передаются в параметре clientData.
Поскольку единственным разрешенным выводом обработчика данных являются изменения в переданном div ($section), возвращать значение не требуется.
Установка и запуск Snoopy на дроне Вы можете иметь до 100 дронов (если нужно больше, проверьте исходный код или напишите мне, фактического ограничения нет). Установка состоит из загрузки конфигурационного пакета из предыдущего шага и запуска соответствующего скрипта настройки. Для Nokia N900 на рабочем столе будет размещена иконка. Например:
haxor@drone001# wget http://snoopy-server.com/secretdir/drone001.tar.gz
haxor@drone001# tar xzvf drone001.tar.gz
haxor@drone001# cd snoopy && ./setup_n900.sh
Поиск местоположений SSID Создайте учетную запись на www.wigle.net и укажите свои учетные данные через «Configure server options»
Веб-интерфейс Вы можете получить доступ к веб-интерфейсу по адресу http://your-snoopy-server:5000/. Вы можете написать свои собственные плагины для просмотра и отображения данных. Уолтер сделал это для вас простым (см. приложение к этому документу).
Исследование данных с помощью Maltego В меню сервера Snoopy перейдите в «Configure Server Options» > «Maltego». Здесь вы увидите URL-адреса для загрузки сущностей Snoopy, машин и URL-адреса для трансформов. Для использования трансформов Maltego вам потребуется: