
Snoopy v2.0 — модульный фреймворк цифрового наземного отслеживания
SensePost представляет:
/$$$$$$
/$$__ $$
| $$ \__/ /$$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$ /$$ /$$
| $$$$$$ | $$__ $$ /$$__ $$ /$$__ $$ /$$__ $$| $$ | $$
\____ $$| $$ \ $$| $$ \ $$| $$ \ $$| $$ \ $$| $$ | $$
/$$ \ $$| $$ | $$| $$ | $$| $$ | $$| $$ | $$| $$ | $$
| $$$$$$/| $$ | $$| $$$$$$/| $$$$$$/| $$$$$$$/| $$$$$$$
\______/ |__/ |__/ \______/ \______/ | $$____/ \____ $$
| $$ /$$ | $$
| $$ | $$$$$$/
|__/ \______/
Version: 2.0
Code: [email protected] // @glennzw
Visit: www.sensepost.com // @sensepost
License: Non-commercial use
Добро пожаловать в Snoopy версии 2.0!
Нет времени? Попробуйте это:
Установка и настройка Snoopy:
bash install.sh
Сохранение данных плагинов wireless, sysinfo и heartbeat локально:
snoopy -v -m wifi:mon=True -m sysinfo -m heartbeat -d myDrone -l London
Синхронизация данных с клиента на сервер:
Сервер:
snoopy_auth --create myDrone # Create account
snoopy -v -m server # Start server plugin
Клиент:
snoopy -v -m wifi:mon=True -s http://<server>:9001/ -d myDrone -l London -k <key>
ВВЕДЕНИЕ И ОБЗОР ============================= Snoopy — это распределённая платформа для сбора данных с датчиков, их перехвата, анализа и визуализации. Она написана в модульном формате, что позволяет собирать произвольные данные из различных источников с помощью Python-плагинов.
Архитектура
Каждый экземпляр Snoopy может запускать несколько плагинов одновременно. Плагин собирает данные, которые запрашиваются основным процессом Snoopy и записываются в локальную базу данных. Snoopy может синхронизировать данные между клиентами (дронами) и сервером, а клиенты (дроны) также могут получать копии данных с сервера. Каждый экземпляр Snoopy может запускать плагины, подходящие для его роли в общей картине. Ниже приведена диаграмма одного из возможных вариантов развёртывания:
Drone01 Server01
+---------------+ +--------------+
| Plugins: | | Plugins: |
| * WiFi | | *Server |
| * Bluetooth |====3G====>| |<=========================\
| * GSM | | | ||
| * FitBit | | | ||
+---------------+ +--------------+ ||
||
Drone02 Server02 Server03 ||
+---------------+ +--------------+ +-------------+ ||
| Plugins: | | Plugins: | | Plugins: | ||
| * WiFi | | * Server | | * Server | ||
| * Cookie |=====Xbee==>| * Heartbeat |==3G==>| * Wigle |<==\
| thief | || | | | * DataViz | ||
| * GPS | || | | | | ||
+---------------+ || +--------------+ +-------------+ ||
|| Internet
Drone03 || Laptop01 ||
+---------------+ || +--------------+ ||
| Plugins: | || | Plugins: | ||
| * Thermal | || | *RemotePull | ||
| * Camera |===/ | |====/
| * Heat | | Run: |
| | | *Maltego |
+---------------+ +--------------+
В приведённой выше иллюстрации три дрона запущены и синхронизируют свои данные с двумя отдельными серверами. Один синхронизируется через 3G, два других — через Xbee. Второй сервер синхронизирует свои данные с третьим сервером. Наконец, клиент (ноутбук) получает все данные с первого и третьего серверов и запускает Maltego для исследования данных.
Выполнение 'sh install.sh' в каталоге snoopy-ng.git установит все необходимые пакеты. Он предлагает установить aircrack из исходных кодов, что требуется для дистрибутивов без этого пакета (набор aircrack используется для беспроводных плагинов). Мы настоятельно рекомендуем Maltego для исследования данных; бесплатную версию Community Edition (с некоторыми ограничениями) можно скачать на сайте Paterva по адресу http://paterva.com.
Чтобы увидеть все доступные флаги и опции, мы подготовили для вас две команды:
root@kali:~# snoopy --help (shorthand -h)
Эта команда показывает все доступные опции, например, к какому серверу выполнять синхронизацию, имя дрона и его местоположение. Кроме того, она также объясняет, как запускать различные плагины.
root@kali:~# snoopy --list (shorthand -i)
Эта команда перечисляет все доступные плагины и параметры, необходимые каждому плагину для корректной работы. Для получения более подробной информации о каждом плагине используйте '-ii' или '-iii'. Чтобы получить информацию об одном конкретном плагине, используйте '-i -m '.
Плагины можно указывать с помощью опции --plugin (или сокращённо -m). Можно указать несколько плагинов, и они будут запускаться в порядке ввода. Каждому плагину даётся 60 секунд на сигнал о готовности, после чего наступает тайм-аут, и запускается следующий плагин. Это может быть полезно, если последующие плагины зависят от действий предыдущих.
Каждый плагин может принимать множество параметров (как указано в выводе --list) в виде разделённых запятыми пар ключ-значение. Ниже используется плагин 'example', который просто генерирует случайные числа.
snoopy --plugin example:x=1,v=True
Если опции дрона / местоположения не указаны, используются значения по умолчанию. Либо их можно задать, как показано ниже.
snoopy --plugin example:x=1,v=True --drone myDrone --location Cansas
Данные можно синхронизировать с удалённой машиной, указав опцию --server (-s). На удалённой машине должен быть запущен серверный плагин (--plugin server). Для имени дрона заранее должен быть сгенерирован ключ. Ниже показано, как это работает.
Сервер
root@server:~# snoopy_auth --create myDrone01 --verbose
[+] Creating new Snoopy server sync account
[+] Key for 'myDrone01' is 'GWWVF'
[+] Use this value in client mode to sync data to a remote server.
root@kali:~# snoopy --plugin server
[+] Running webserver on '0.0.0.0:9001'
[+] Plugin server caught data for 2 tables.
Клиент
root@client:~# snoopy --plugin example:x=1 --drone myDrone --key GWWVF --server http://<server_ip>:9001/ --verbose
[+] Starting Snoopy with plugins: example
[+] Plugin example created new random number: 21
[+] Snoopy successfully sunc 2 elements over 2 tables.
Удалённое получение данных
Данные можно получить с сервера с помощью плагина local_sync. Например, предположим, что сервер, как указано выше, запущен, и выполните эту операцию на клиенте:
root@client:~# snoopy --plugin local_sync:server_url=http://<server_ip>:9001/ --drone myDrone --key GWWVF
[+] Plugin local_sync pulled 888 records from remote server.
По умолчанию все данные сохраняются в SQLITE-файл snoopy.db. Это можно переопределить параметром --dbms. О том, как указать другие движки баз данных, читайте в документации SQL Alchemy (http://docs.sqlalchemy.org/en/rel_0_9/dialects/index.html). Например, ниже используется MySQL:
root@client:~# snoopy -v --plugin example --dbms=mysql://glenn:secret@localhost/snoopy_db
[+] Capturing local only. Saving to 'mysql://glenn:secret@localhost/snoopy_db'
Может быть полезно использовать SQLITE-хранилище на небольших устройствах, а серверный плагин пусть сохраняет данные в MySQL (или аналогичную СУБД). Дополнительный пример пригодится, когда нужно указать расположение файла для хранения данных, например на съёмном носителе:
root@client:~# snoopy -v --plugin example --dbms=sqlite:////media/USB01/snoopy.db
Существует опция --flush (-f) для "очистки" данных из локального хранилища после их синхронизации с вышестоящим сервером.
Snoopy можно запускать с помощью upstart-скрипта (см. папку ./setup/upstarts). В той же директории находятся другие примеры upstart-скриптов — например, для поднятия PPP-соединения через 3G-модем и для создания удалённого SSH-канала команд.
Похоже, системы на основе Debian (например, Kali) не поддерживают upstart. В качестве временного решения можно использовать прилагаемый файл rc.local для запуска Snoopy и связанных служб при загрузке.
Maltego — предпочтительный инструмент для визуализации. Инструкции ниже:
Это импортирует как сущности, так и трансформы. Чтобы начать, перетащите сущность 'Base of Operations' из вкладки Snoopy в меню Palette на пустой граф. Например, выполните следующие операции с сущностью:
Существуют трансформы для получения доменов и cookie-файлов (при пассивном мониторинге), поиска адресов по SSID, а некоторые являются двунаправленными (например, можно искать клиентов по Location или Locations по клиенту). Лучше всего экспериментировать.
Если вы не используете формат sqlite по умолчанию, отредактируйте следующий файл, чтобы указать расположение данных:
snoopy_ng/transforms/db_path.conf
Граф Snoopy может одновременно использоваться несколькими аналитиками с помощью функции совместной работы Maltego. Выберите Collaboration и 'Share Current Graph'.
КОММЕРЧЕСКОЕ ИСПОЛЬЗОВАНИЕ =================== Лицензия, под которой выпускается Snoopy, запрещает получение финансовой или иной выгоды от его использования (см. LICENSE.txt). У нас есть отдельная лицензия для коммерческого использования, которая включает дополнительные функции, такие как:
Свяжитесь с нами ([email protected] / [email protected]), если вы хотите с нами поработать.
О том, как следует писать плагины, читайте в файле plugins/example.py. Любой файл, помещённый в папку plugins, будет рассматриваться как плагин и должен обладать следующими свойствами:
В остальном плагин может делать всё, что угодно.
Snoopy будет работать на любом Linux-устройстве с достаточной поддержкой для установки файлов из install.sh, то есть Python и связанных пакетов. Поддержка оборудования зависит от требуемых плагинов, но для наиболее распространённого сценария — сбора WiFi-данных и загрузки через 3G — рекомендуется следующее:
Протестированы Kali 1.05 и Ubuntu 12.04. Аналогичные системы также должны работать.
Ошибка возникает при локальном сборе данных, синхронизации с удалённым сервером и последующем получении реплики с сервера. Например:
Сервер
root@kali:~# snoopy -m server -m wigle:username=u,password=p,[email protected]
[+] Running webserver on '0.0.0.0:9001'
[+] Plugin server caught data for 2 tables.
Клиент
root@client:~# snoopy -m wifi -m local_sync:server_url=http://1.1.1.1:9001/ -d myDrone -l London -k secretkey -s http://1.1.1.1:9001/