Today

003 — OSINT: полная карта открытых источников

Всё, что можно узнать о человеке, фирме, месте и объекте — без единого запроса в закрытые базы

Часть 1: Философия

Ты оставляешь след везде. Каждый пост, фото, заказ, логин, маршрут. Эти данные уже публичны — просто разложены по сотням мест.

OSINTискусство собирать эти куски в единую картину.

  • Фрагмент 1: ник на форуме
  • Фрагмент 2: почта в утечке
  • Фрагмент 3: фото с геолокацией
  • Фрагмент 4: номер телефона в объявлении
  • Фрагмент 5: коммент в соцсети

По отдельности — мусор.
Вместе — досье.


Часть 2: Классификация

OSINT делится на дисциплины. У каждой свои инструменты и методы.


Часть 3: SOCMINT — человек через соцсети

Метод 1: Пивот от ника

Один ник почти всегда используется на десятках площадок. Это точка входа.

Инструменты:

  • WhatsMyName (web) — 600+ площадок
  • Sherlock (CLI) — быстрый перебор
  • Maigret (CLI) — Sherlock на стероидах
  • Nexfil (CLI) — фокус на стриминг и киносайты
  • Blackbird (CLI) — быстрый + поиск аккаунтов
  • ID Crawl — веб-интерфейс

Sherlock в действии:

# Установка
pip install sherlock-project

# Поиск ника на 400+ сайтах
sherlock vatican --timeout 10

# Результат:
# [+] GitHub: https://github.com/vatican
# [+] Telegram: https://t.me/vatican
# [+] Steam: https://steamcommunity.com/id/vatican
# [+] Reddit: https://reddit.com/user/vatican
# [+] SoundCloud: https://soundcloud.com/vatican

Maigret — глубже:

# Поддерживает больше сайтов + вытаскивает доп. инфо
maigret vatican --html report

# Парсит аватарки, био, количество постов
# Генерирует HTML-отчёт со всеми найденными аккаунтами

Метод 2: Пивот от email

Почта — ключ к большинству сервисов.

Как пример:

  • Email → leaks → пароли
  • Email → GitHub → код, коммиты, юзернейм
  • Email → Gravatar → аватар
  • Email → соцсети → восстановление → маска номера

Агрегаторы email:

  • Epieos — покажет где зарегистрирован email
  • EmailRep — репутация и возраст почты
  • Holehe — проверка регистрации на 120+ сайтах

Holehe — где зарегистрирована почта:

pip install holehe
holehe target@example.com

# [+] Instagram — зарегистрирован
# [+] Twitter — зарегистрирован
# [+] Spotify — зарегистрирован
# [+] Discord — зарегистрирован

Метод 3: Пивот от телефона

Номер телефона — это оператор, регион, и часто — имя.
  • Номер → оператор/регион → гео
  • Номер → Telegram → аватар, юзернейм, био
  • Номер → мессенджеры (WhatsApp, Viber)
  • Номер → объявления (Avito, Юла)
  • Номер → утечки

Определение оператора и региона:

Портация номеров между операторами делает определение оператора неточным

import phonenumbers
from phonenumbers import carrier, geocoder, timezone

def analyze_phone(number_str):
    try:
        number = phonenumbers.parse(number_str, "RU")
        
        if not phonenumbers.is_valid_number(number):
            return {"valid": False}
        
        return {
            "valid": True,
            "country": geocoder.description_for_number(number, "ru"),
            "carrier": carrier.name_for_number(number, "ru"),
            "timezone": str(timezone.time_zones_for_number(number)),
            "type": phonenumbers.number_type(number),
            "formatted": phonenumbers.format_number(
                number, phonenumbers.PhoneNumberFormat.INTERNATIONAL
            )
        }
    except Exception as e:
        return {"error": str(e)}

Telegram как OSINT-инструмент:

  • Метод 1: Добавление в контакты
    Telegram покажет: аватар, имя, юзернейм, био, последний раз онлайн
  • Метод 2: через Telegram API
    даже без сохранения контакта можно получить:
    - аватар
    - юзернейм
    - last seen
    - статус (был недавно/онлайн/офлайн)

Пример использования:

api id и api hash можно получить тут
https://my.telegram.org/auth

from telethon.sync import TelegramClient

api_id = API_ID
api_hash = "API_HASH"

with TelegramClient("session", api_id, api_hash) as client:
    # Поиск по номеру
    contact = client.get_entity("+79991234567")
    
    print(f"Имя: {contact.first_name} {contact.last_name}")
    print(f"Юзернейм: @{contact.username}")
    print(f"Телефон: {contact.phone}")
    print(f"Статус: {contact.status}")
    
    # Скачать аватар
    client.download_profile_photo(contact, file="avatar.jpg")
    
    # Получить био
    full = client.get_entity(contact)
    print(f"Био: {full.about}")

Определение наличия в мессенджерах:

  • truecaller — имя по номеру (платно, но есть триал)
  • eyecon — то же
  • GetContact — показывает как записан в контактах других
  • NumBuster — аналогично

Метод 4: Кросс-корреляция

Самое мощное — когда данные из разных источников сходятся.

Пример пайплайна:

Ник "vatican"
→ Sherlock находит Twitter, GitHub, Telegram
→ GitHub → email в коммите → vatican@example.com
→ Holehe → почта зарегистрирована в VK, Avito
→ VK → настоящие имя и фамилия, город
→ Avito → телефон → пробив в Telegram
→ Telegram → настоящее фото → Google Images
→ Google Images → LinkedIn → место работы

Итого: полное досье за 30 минут.


Часть 4: GEOINT — геолокация

Метод 1: EXIF данные

Каждое фото с телефона содержит метаданные — если автор их не вычистил.
from PIL import Image
from PIL.ExifTags import TAGS, GPSTAGS
import requests

def extract_exif(image_path):
    image = Image.open(image_path)
    exif_data = image._getexif()
    
    if not exif_data:
        return {"error": "EXIF данные удалены или отсутствуют"}
    
    data = {}
    for tag_id, value in exif_data.items():
        tag = TAGS.get(tag_id, tag_id)
        data[tag] = value
    
    # GPS координаты
    if "GPSInfo" in data:
        gps_info = data["GPSInfo"]
        gps = {}
        for key in gps_info:
            decode = GPSTAGS.get(key, key)
            gps[decode] = gps_info[key]
        
        # Конвертация в десятичные градусы
        def dms_to_decimal(dms, ref):
            degrees = float(dms[0])
            minutes = float(dms[1])
            seconds = float(dms[2])
            decimal = degrees + minutes/60 + seconds/3600
            if ref in ["S", "W"]:
                decimal = -decimal
            return decimal
        
 lat = dms_to_decimal(gps["GPSLatitude"], gps.get("GPSLatitudeRef", "N"))
 lon = dms_to_decimal(gps["GPSLongitude"], gps.get("GPSLongitudeRef", "E"))
        
        return {
            "coordinates": (lat, lon),
            "maps_link": f"https://maps.google.com/?q={lat},{lon}",
            "camera": data.get("Model"),
            "date": data.get("DateTimeOriginal"),
            "software": data.get("Software")
        }
    
    return {"gps": "нет GPS данных", "meta": data}

# Что даёт EXIF:
# точные координаты съёмки
# модель телефона/камеры
# дату и время
# настройки съёмки
# иногда — серийный номер устройства

Проверка онлайн (без установки):

  • exif.tools — просто загрузил увидел всё
  • fotoforensics.com — анализ + детект фотошопа
  • metapicz — аналогично

Метод 2: Геолокация по фото без EXIF

Когда метаданные вычищены — включается дедукция. Это уже ремесло.

Что смотреть на фото:

  • Таблички (названия улиц, номера домов)
  • Вывески (магазины, рестораны, названия)
  • Язык надписей и шрифты
  • Номерные знаки машин (формат, цвет, регион)
  • Сторона движения (левостороннее/правостороннее)
  • Архитектурный стиль
  • Тип фонарей и разметки
  • Положение солнца (время + полушарие)
  • Провода (есть/нет, над/под землёй)
  • Горы/море/рельеф на горизонте
  • Как уложена плитка/тротуар (положение/форма/материал/узор)

Пошаговый процесс:

  1. Обрати внимание на уникальные объекты
  2. Обратный поиск через Google Lens
  3. Открой Google Maps в этом регионе
  4. Включи Street View
  5. Совмещай панорамы с фото
  6. Ищи совпадения по ориентирам

Инструменты:

  • Google Lens — распознавание объектов и мест
  • Yandex Images — часто лучше Google для СНГ
  • Bing Visual Search — третий источник
  • GeoGuessr — тренировка навыка (игра)
  • Mapillary — краудсорсинговый street view
  • OpenStreetMap — детальные карты
  • Sentinel Hub — спутниковые снимки
  • SunCalc — положение солнца по времени/месту

Пример метода "солнце + тень":

Дано: фото без гео, с тенью от столба

  1. Замерь угол тени относительно объекта
  2. Солнце движется с востока на запад
  3. Угол тени + время на фото (если есть) = широта
  4. Сверяешь с картой

Пример метода "вывески":

Фото ресторана изнутри

  1. Читаешь название на стакане "Coffee Like"
  2. Ищешь "Coffee Like" на 2GIS в городе из контекста
  3. Открываешь панораму у каждого филиала
  4. Ищешь совпадение интерьера
  5. Совпало → точная локация

Метод 3: Геолокация через поведение

Не фото, а цифровой след человека в пространстве.

Источники:

  • Strava Heatmap — маршруты бегунов (палит военные базы)
  • Instagram локации — чекины
  • Fitness-трекеры — маршруты
  • Фото по тегам города — где бывает
  • Отзывы на картах — Google/Yandex отзывы = места посещения
  • Объявления — геолокация на Avito

Strava Heatmap — классический пример:

Сервис публикует тепловую карту всех маршрутов пользователей. Через неё нашли:

  • Секретные военные базы
  • Маршруты охраны
  • Личные адреса (дом → работа)

Метод 4: Спутниковые снимки

Инструменты:

  • Google Earth Pro — бесплатно, история снимков
  • Sentinel Playground — свежие снимки (обновление каждые 5 дней)
  • Bing Maps — иногда снимки лучше Google
  • Yandex Maps — для СНГ
  • Terraserver — исторические снимки

Что можно определить по спутнику:

  1. Размер объекта и планировку
  2. Теневую сторону в разное время суток
  3. Историю (Google Earth хранит архив за 20+ лет)
  4. Транспорт и технику
  5. Недавние изменения (стройка, снос)

Часть 5: IMINT — изображения

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

Движки и их сильные стороны:

  • Google Images — Универсальный, глобальный
  • Yandex Images — СНГ, лица, лучше всех ищет по людям
  • Bing Visual — Промтовары, продукты
  • TinEye — Точное совпадение, история
  • PimEyes — Поиск по лицу (найти все фото человека)
  • FaceCheck.ID — Поиск по лицу в криминальном контексте
  • 百度 (Baidu) — Азия

PimEyes — поиск лица:

Загружаешь фото человека

  1. движок сканирует веб
  2. показывает ВСЕ фото этого лица в открытом доступе
  3. даже те, где нет тега или имени
Это самый мощный инструмент деанона через визуал. Есть и обратная сторона — работает в обе стороны.

Автоматизация обратного поиска:

# Яндекс Images — автоматический обратный поиск
import requests
from io import BytesIO

def yandex_reverse_search(image_path):
    url = "https://yandex.ru/images/search"
    
    files = {"upfile": ("image.jpg", open(image_path, "rb"), "image/jpeg")}
    params = {"rpt": "imageview", "cbird": "77"}
    
    session = requests.Session()
    response = session.post(url, params=params, files=files)
    
    
    return response.url  # ссылка на результаты поиска

# Для продакшена лучше использовать:
# - SerpAPI (платно, стабильно)
# - Browser automation (Playwright)

Часть 6: TECHINT — инфраструктура

Домены и IP

Инструменты:

  • whois — владелец домена, регистратор
  • DNSDumpster — вся DNS-структура
  • Shodan — поисковик по устройствам в сети
  • Censys — аналог Shodan
  • SecurityTrails — история DNS, субдомены
  • crt.sh — SSL сертификаты и субдомены
  • ViewDNS — обратный IP (кто ещё на этом IP)
  • Hunter.io — email на домене

Shodan — поиск устройств:

import shodan

api = shodan.Shodan("API_KEY")

# Поиск открытых камер
results = api.search('webcam city:Moscow')

for result in results['matches']:
    print(f"IP: {result['ip_str']}")
    print(f"Port: {result['port']}")
    print(f"Org: {result.get('org')}")
    print(f"Location: {result['location']}")
    print("---")

# Поиск незащищённых баз данных
results = api.search('mongodb port:27017')

# Поиск по IP — вся информация об устройстве
host = api.host('8.8.8.8')
print(host)

crt.sh — скрытые субдомены через SSL:

# Все SSL сертификаты, выданные для домена
curl -s "https://crt.sh/?q=%25.example.com&output=json" | \
  jq -r '.[].name_value' | sort -u

# Результат — все субдомены, которые когда-либо выпускали серт

Полный OSINT по домену:

import requests
import whois
from dns import resolver

def full_domain_recon(domain):
    report = {}
    
    # WHOIS
    try:
        w = whois.whois(domain)
        report["registrar"] = w.registrar
        report["created"] = str(w.creation_date)
        report["owner"] = w.name  # если не скрыт privacy
    except:
        pass
    
    # DNS записи
    for record_type in ["A", "MX", "NS", "TXT"]:
        try:
            answers = resolver.resolve(domain, record_type)
            report[record_type] = [str(r) for r in answers]
        except:
            pass
    
    # Субдомены через crt.sh
    try:
        resp = requests.get(
            f"https://crt.sh/?q=%25.{domain}&output=json",
            timeout=10
        )
        subdomains = set()
        for entry in resp.json():
            for name in entry["name_value"].split("\n"):
                if domain in name:
                    subdomains.add(name.strip())
        report["subdomains"] = list(subdomains)
    except:
        pass
    
    # Email через Hunter.io
    # (нужен API ключ, бесплатный тариф — 25 запросов/мес)
    
    return report

Часть 7: Утечки данных

Проверка своих данных

  • HaveIBeenPwned — email + пароли (проверка по K-Anonymity)
  • DeHashed — полный поиск по утечкам (email, имя, IP, телефон)
  • LeakCheck — email/телефон/ник
  • Snusbase — самый быстрый (платный)
  • Intelligence X — darknet + утечки

Что дают утечки:

  • Email + пароль → доступ к аккаунтам (если пароль не уникальный)
  • Email + телефон → связка для деанона
  • Email + адрес → физическая локация
  • Email + паспортные данные → полный профиль

Пример работы с DeHashed API:

import requests
import base64

def dehashed_search(query, email, api_key):
    # Поиск по всем утечкам
    auth = base64.b64encode(f"{email}:{api_key}".encode()).decode()
    
    headers = {
        "Accept": "application/json",
        "Authorization": f"Basic {auth}"
    }
    
    # Поиск можно вести по:
    # email, username, name, address, phone, ip, hash
    
    response = requests.get(
        f"https://api.dehashed.com/search?query=email:{query}",
        headers=headers
    )
    return response.json()

# Результат содержит:
# - все пароли (в чистом/хешированном виде)
# - все email
# - имена
# - адреса
# - телефоны
# - IP

Часть 8: Транспорт и физический мир

Номера автомобилей

Формат российского номера:
А123ВС77 регион 77, Москва

Источники:

  • ГИБДД (гибдд.рф) — история ДТП
  • Автокод (avtocod.ru) — платный агрегатор
  • Номер-база — платные Telegram-боты
  • Реестр залогов (reestr-zalogov.ru) — залог
  • ФССП — если есть долги владельца

Авиация

  • Flightradar24 — все рейсы в реальном времени
  • ADS-B Exchange — без фильтров (в отличие от FR24)
  • OpenSky Network — открытое API

Отслеживание частного борта:

import requests

def track_aircraft(callsign):
    response = requests.get(
        f"https://opensky-network.org/api/states/all?callsign={callsign}"
    )
    data = response.json()
    
    if data.get("states"):
        for state in data["states"]:
            return {
                "callsign": state[1],
                "latitude": state[6],
                "longitude": state[5],
                "altitude": state[13],
                "velocity": state[9],
                "heading": state[10],
                "on_ground": state[8]
            }
    return None

Морской транспорт

  • MarineTraffic — все суда
  • VesselFinder — аналог

Часть 9: Автоматизация — фреймворки

SpiderFoot — автоматический OSINT-скан

# Установка
pip install spiderfoot

# Запуск веб-интерфейса
sf -l 127.0.0.1:5001

# Скан по email
sf -s target@example.com -t all

# Скан по IP
sf -s 8.8.8.8 -t all

# Скан по домену
sf -s example.com -t all
SpiderFoot автоматически прогоняет цель через 200+ модулей и собирает всё в один отчёт.

Maltego — визуальный OSINT

Построение графов связей:
Цель → запросы к разным источникам → визуальные связи

Пример графа:
  Email
  ├── Twitter аккаунт
  │   └── Подписки → другие аккаунты
  ├── Домены (whois)
  │   └── Другие домены на тот же whois
  ├── Утечки
  └── Соцсети

Платный, но Community-версия достаточна для старта.

TheHarvester — сбор email/субдоменов

# Сбор email с домена из публичных источников
theHarvester -d example.com -b all

# Источники:
# - поисковые системы
# - LinkedIn
# - сертификаты
# - DNS

Часть 10: OpSec исследователя

Пока ты копаешь — тебя тоже могут копать.

Правила гигиены:

  • Никогда не логинься в свои аккаунты при исследовании
  • Используй отдельный браузер (профиль) для OSINT
  • SOCKS5 / VPN — не для анонимности, для смены IP
  • Виртуалка для рискованных сайтов
  • Не открывай ссылки напрямую — скрин через сервисы
  • Не переходи по ссылкам из подозрительных сообщений
  • Отключи синхронизацию браузера
  • Отдельная почта для регистраций при исследовании

Инструменты безопасного просмотра:

  • urlscan.io — скриншот сайта без захода на него
  • archive.org — просмотр старой версии
  • proxy — через прокси для смены IP
  • whonix — виртуалка с Tor

Часть 11: Как НЕ надо

  • Сталкинг бывших/близких — это незаконно и аморально XD)
  • Скачивание данных из взломанных баз (кроме проверки своих)
  • Попытки взлома на основе собранной информации
  • Публикация собранных данных без согласия
  • Пробив через "серые" Telegram-боты (палевно и небезопасно)
  • Использование OSINT для шантажа
OSINT — это про понимание системы. Будь умнее чем просто шантажировать и публиковать просто так)
By Vatican