По словам представителей американской разведки, около восьмидесяти процентов полезной информации приходит из общедоступных источников. И лишь небольшая часть — это разведданные, добытые непосредственно агентурой. Разница огромна, но нельзя забывать, что именно полученные разведкой детали позволяют подтвердить и верифицировать общую картину.
Это хорошо иллюстрирует история о том, как в ЦРУ в советское время восстановили на основе фотографии из журнала схему электрификации Урала и предприятий ядерной промышленности. Аналитики разведки зацепились за одно заретушированное изображение панели мониторинга, а потом проделали огромную работу, собирая данные из советских газет, журналов и отчетов дипмиссий. Но решающими оказались снимки местности с разведывательных аэростатов, потому что иначе невозможно было подтвердить правомерность выводов о расположении линий энергопередач и заводов.
Не менее важно уметь достать «разведданные», когда речь заходит про сбор информации о людях. Это может быть расследование заражения и поиск виновника или идентификация личности для уточнения поверхности атаки. Далее рассмотрим неординарные случаи получения информации тогда, когда сбор из открытых источников не дает нужного результата.
Пробиваем бота Telegram
Как ты знаешь, у Telegram широкая функциональность для работы с ботами. Ничего не стоит создать нового, получить токен для управления и использовать в готовом скрипте с GitHub. Так же легко токены от ботов и утекают: найти их можно по элементарным доркам. А иногда в руки просто попадается малварь, которая использует функции Telegram как пульт управления, — знал бы ты, сколько архивов стиллеров хранится в облаке мессенджера!
Что останавливает от вытаскивания всей информации бота через утекший токен? Конечно, это API Telegram, в котором ограничиваются множественные подключения для ботов из разных мест. А даже если бот не работает или его владелец проигнорирует ошибки подключения, то мы все равно сможем получать только новые, не обработанные ранее сообщения. Наконец, бот не обладает знанием о том, с кем он общался в прошлом. Таким образом, прочитать историю не получится — нужно тихо ждать, пока кто-то напишет, чтобы перехватить сообщение.
К счастью, HTTP API для работы с ботами — это только надстройка над оригинальным MTProto API, который позволяет взаимодействовать с ними, как с человеческими аккаунтами. А для работы с этим протоколом уже есть готовые библиотеки! Лично я советую Telethon, в котором не так давно была реализована прослойка для управления ботами.
Как ты понимаешь, возможности при таком способе увеличиваются на порядок. Теперь мы можем подключиться незаметно для владельца бота и вытащить историю сообщений. А первый диалог, очевидно, будет с его хозяином. Я написал простой скрипт, который тащит переписки, сохраняет медиаконтент, имена и фотографии собеседников.
И кстати, ты наверняка помнишь, что недавно в Telegram добавили функцию удаления своих сообщений у собеседника. Так вот, если удалить сообщение из диалога с ботом, то у него оно останется.
Узнаем номер телефона в ноль касаний
Представь, что тебе нужно узнать номер телефона, лежащего в кармане другого человека. И при этом не привлекать внимания! Конечно, для этого есть масса способов, начиная от брутального перехвата через IMSI catcher и заканчивая социальной инженерией. А до 2018 года Wi-Fi в московском метро легко отдавал по MAC номер телефона и рекламный профиль его владельца.
Исследователи из Hexway недавно опубликовали информацию о том, как устройства Apple общаются между собой через Bluetooth LE. Для взаимной идентификации они используют хеши от данных аккаунта человека: три байта от SHA-256 номера телефона, Apple ID и почтового ящика. Да-да, айфоны, макбуки и даже наушники буквально кричат в радиоэфир вокруг, кто они и в каком режиме работы находятся.
К счастью, хеши отсылаются не всегда, а только в конкретных случаях: например, при открытии экранов ввода пароля от беспроводной сети. Но этого достаточно: предложи человеку подключиться к Wi-Fi — и хеши от его данных у тебя.
Кроме того, вспомним, что российский номер состоит из одиннадцати цифр и по трем байтам фактически будет лишь несколько десятков коллизий. И даже еще меньше, если мы точно знаем регион и оператора. Авторы исследования сделали удобный скрипт, который позволяет сгенерировать хеши по нужным диапазонам. Отдельные энтузиасты уже создали готовую базу, вычистив несуществующие коды операторов. Так что после получения списка номеров остается только сузить количество «подозреваемых» с помощью запросов HLR для пробива активности абонента и проверки наличия у него аккаунтов мессенджеров. Пара итераций — и у тебя в руках номер нужного мобильника.
Также не стоит забывать об Apple ID и почтовом ящике! Теперь у тебя есть все данные для проверки информации об аккаунтах человека, которую ты найдешь в открытых источниках.
Поиск email через сетевой ханипот
А теперь предположим, что мы находимся в противоположной ситуации: можем контактировать с человеком только через сеть, например мессенджер Jabber. Мы знаем, что он занимается разработкой малвари, но ведет двойную жизнь и имеет официальную работу. Нам бы очень хотелось выяснить его личность, но использует он исключительно Tor и VPN. За что мы можем зацепиться в этом случае?
Как у каждого человека есть характерный почерк, так и код разных людей часто различается в мелких деталях. Что, если у нас на руках скрипт от субъекта поиска? Да, мы можем поискать по ключевым строкам в открытых репозиториях в надежде на то, что и в настоящей жизни он где-то писал или повторно использовал свой код. Таким образом мы выйдем на аккаунт, скачаем из него все доступные репозитории и получим список людей и почтовых адресов с помощью простой команды.
$ git log —pretty=»%an %ae%n%cn %ce» | sort | uniq
Знал бы ты, как часто люди по невнимательности делают коммит под одним аккаунтом, а пушат под другим!
Но поиск таким методом выходит неточный, да и наверняка есть другие способы. Что может выдать активного пользователя репозитория Git? Даю наводку: публичный ключ, через который тебя идентифицирует сервер! Часто это тот же ключ SSH, который генерируется в id_rsa, но двойная жизнь предполагает несколько личностей и несколько аккаунтов. И наверняка какой-нибудь используется для подключения к серверам. Понимаешь, к чему я клоню?
Для полноты картины уточним еще две вещи. Первая: все публичные ключи пользователей GitHub и GitLab хранятся в открытом виде и общем доступе, достаточно добавить .keys к URL твоего профиля. Вторая: клиент SSH при подключении перебирает все ключи, которые явно указаны для сервера либо добавлены в агент. Здесь и кроется вся суть нашей авантюры.
Мы даем человеку подключиться к нашему серверу с запатченным SSH, который отсылает нам все ключи. А затем ищем его по базе всех пользователей открытых репозиториев! Идея проста и гениальна и уже в каком-то виде реализована. Набери в консоли
$ ssh whoami.filippo.io
Cервер попытается найти твой GitHub, а заодно проверит на CVE-2016-0777.
Код сервера открыт, а в его основе — база для исследования надежности ключей пользователей GitHub. Сами данные не публиковались, но другие люди впоследствии повторяли сбор самостоятельно. Впрочем, напомню, что актуальные пользовательские данные лучше собирать самому: аккаунты переименовывают, создают новые, а некоторые даже меняют пароли.
Скелеты в шкафу Telegram
Как часто тебе приходилось пытаться выяснить информацию об аккаунте в Telegram? Мне так слишком, слишком часто. Иногда происхождение проясняет метаинформация вроде юзернейма (когда он похож на имя и фамилию реального человека) или фотографии из аккаунта и дата их установки. Но порой и этой информации нет, только First и Last name, абсолютно неинформативные.
Вот как выглядит установление личности при реальных поисках. Во-первых, прежде всего выясняем идентификатор аккаунта. В официальных клиентах он скрыт, но некоторые неофициальные отображают ID при открытии профиля. Удобнее переслать сообщение от человека боту @userinfobot, и тот выдаст заветные цифры.
Впрочем, иногда метод может и не сработать из-за настроек приватности аккаунта. Но есть выход: через скрипты можно использовать API для отслеживания системных полей в сообщениях и событиях. Впоследствии мы идентифицируем человека, если он сменит имя, уйдет из общих чатов или на время потеряется.
Далее ищем данные по специальным поисковикам. Для Telegram полезнее всего будет search.buzz.im, который индексирует все открытые чаты. Он даже позволяет искать по автору сообщения! Но для нас это будет бесполезно, если владелец аккаунта недавно сменил имя. Большого везения требует поиск по ID — теоретически, он мог промелькнуть текстом в открытых чатах и проиндексироваться, но на практике такая вероятность низка.
Также выполняем поиск по ID. К сожалению, Telegram не позволяет получить данные аккаунта, если есть только идентификатор, — это базовый уровень приватности. Потому и инструментов для прямого «пробива» нет, разве что только базы, делающие реверсивный поиск по ID для аккаунтов, данные о которых собраны «законным» образом (то есть тогда, когда можно получить данные через API, имея общие чаты с человеком).
Кто же располагает подобными базами информации по аккаунтам? Очевидно, что это боты, которые обслуживают огромное количество открытых чатов, закрытых чатов и личек. И ничто не запрещает их разработчикам сохранять все имеющиеся данные аккаунтов. 🙂
А дальше остается рассказать только практическую часть. Например, в одном из моих кейсов поиск источника информации привел к групповому боту для накопления кармы. Разумеется, для обновления и синхронизации значений по каждому аккаунту использовалась база данных. И конечно, разработчики не устояли перед искушением написать простой веб-интерфейс на PHP для проверки кармы по нику, имени и ID пользователя.
Поиск необходимой информации оказался даже проще, чем ожидалось: при запросе выдавался список подходящих аккаунтов с именем и ID (то есть работало автодополнение). При вводе идентификатора появлялась первая запись из БД, то есть первое имя пользователя, под которым бот его увидел. Бинго!
Но если думаешь, что на этом все, то ты сильно ошибаешься. В запросе для автодополнения нашлась SQL-инъекция, через которую можно было выкачать базу всех пользователей: аккаунты, которые хотя бы однажды вступали в группы, где есть бот. Вместе с историей изменения имени, датой вступления и другой информацией. Думаю, мораль здесь озвучивать не требуется.
Скрытые данные с форума
Что, если известен только один аккаунт человека на сайте, а поиск по нику ничего не дает? Факт регистрации подразумевает, что некто оставил там свои личные данные и как минимум ввел email — для дальнейшего расследования он нам и нужен. Только вот незадача: уровень приватности выставлен на максимум, все данные видит только сам пользователь.
Давай тогда дополнительно выкрутим и уровень нашей скрытности на максимум: нельзя применять методы СИ на человеке, так как он может что-то заподозрить в аккаунте-наживке и зачистить следы в других важных местах. Конечно, можно попытаться утащить куки администратора или модератора форума, получить расширенные права и прямой доступ к базе…
Однако я приведу более изящный пример решения такой задачи. Но прежде чем продолжить, предупреждаю тебя: повторять эти действия не рекомендую, как минимум потому, что они выходят за рамки пассивного сбора информации.
В популярных движках форумов в наше время уже сложно найти уязвимость XSS. Но значит ли это, что их там точно нет? Так подумал и автор этого кейса, и не ошибся: эксплоит был обнаружен в поле телефона в профиле пользователя, страница которого открыта для всех. Что это для нас значит?
Как ты мог догадаться, это позволяет похитить сессию пользователя, но даже это будет излишним. Зачем входить на форум, чтобы посмотреть данные, которые уже в руках? Да, верно, просто внедрим в страницу скрипт на JS, который запросит по AJAX информацию активного пользователя, а потом перешлет к нам на сервер.
Но, как помнишь, мы договорились не привлекать внимание объекта нашего расследования. Тогда давай создадим условия, при которых наш XSS дойдет к нему через чужие руки. Например, через аккаунты его знакомых. Нужен еще один небольшой штрих: кроме непосредственного запроса на получение информации, будем отсылать через JS дополнительный запрос на сохранение XSS в поле пользователя. Уже начинаешь видеть всю картину?
Создадим максимально привлекающий внимание аккаунт и напишем эпатажное сообщение на форуме. Додумывать нюансы конкретной реализации оставляю твоему воображению. Нам не так важно, кто это прочтет и заблокируют ли нас вообще, — аккаунт станет нулевым пациентом. Кто-нибудь зайдет в наш профиль посмотреть информацию и начнет распространять вирус сборщика данных. Этот скрипт будет внедряться широкой волной, заражая поочередно знакомых, знакомых знакомых и просто случайных собеседников.
Так и случилось. Через короткое время на командный сервер пришли данные нужного пользователя, включая и интересующий email. Вместе со сведениями о доброй половине остальных форумчан. Жаль, что не было подсчитано, через какое рукопожатие «награда нашла героя», иначе можно было бы попутно написать исследование о социальных графах на форумах.
Напомню, кстати, что похожая схема была недавно использована в ВК, причем напоказ, а не в целях сбора. А представь, как долго злоумышленники могут эксплуатировать подобные уязвимости скрыто, собирая наши данные?
Заключение
Здесь мы рассмотрели только пять нестандартных способов достать информацию, до которой нельзя дотянуться из открытых источников. Всегда есть трюки и хаки, но имей в виду, что кто-то мог пройти этот путь до тебя: выложить базу в Сеть, найти утечку на сайте, создать бота в Telegram для проверки. Так что рекомендую составить для себя список самых полезных источников открытой информации и проходиться по нему, прежде чем начинать копать глубже. Для OSINT в рамках Рунета рекомендую бота с исчерпывающим набором инструментов на все случаи жизни — HowToFind bot.
И еще: не забывай систематизировать полученные данные. Часто элементарный mindmap позволит увидеть не самые очевидные связи и отсечь лишнее. Может статься, тебе и не понадобится использовать хитрые приемы, чтобы узнать желаемое.