Боевой OSINT s01e01 - OSINT & RDP

Боевой OSINT s01e01 - OSINT & RDP

Moody

Это первая часть учебных пособий по Offensive OSINT, которая охватывает подготовку (техническую и интеллектуальную) и рассказывает, как настроить мониторинг уязвимости Bluekeep в больницах с использованием баз данных Shodan и Elasticsearch.

Вступление

Эти учебные пособия дадут вам представление о методах OSINT, используемых киберпреступниками для нацеливания на различные организации и людей с целью мошенничества и взлома. Это не будет другой сайт с кучей ссылок и описанием того, что они делают, а скорее технические знания для профессиональных аналитиков безопасности, обладающих хотя бы некоторыми навыками программирования и аналитическим умом. Я хотел бы показать каждую категорию OSINT - социальные сети, темные сети, утечки, промышленный / корпоративный шпионаж и другие подобные.

Подробнее о наступательных OSINT здесь

Эта первая статья серии посвящена правильной подготовке, то есть настройке среды, объединению нескольких инструментов и установке базы данных. Каждая представленная методика будет поддерживаться исследованиями, и в этой части мы рассмотрим открытые протоколы удаленных рабочих столов с уязвимостью Bluekeep с акцентом на медицинские и финансовые учреждения.

В дополнение к статье я покажу некоторые приемы OSINT & RDP, чтобы найти конкретные машины для конкретных шпионских целей, используя заполнение учетными данными и обратный поиск изображений, так что давайте начнем.

Подготовка

Я чувствую, что все уже было сказано о психологической подготовке к расследованиям OSINT и о том, как вы должны иметь аналитический ум, документировать все и строить отношения. Конечно, каждое задание требует определенного мышления, но в конце концов это тот же подход. Лично для меня лучше всего подходит нисходящий подход, исходя из общей идеи, разделить основную цель на более мелкие задачи и сосредоточиться на деталях в конце.

В этом случае основная цель состоит в том, чтобы найти уязвимые службы RDP в медицинских / финансовых учреждениях, которые могут содержать конфиденциальную информацию, и никто не нашел ее раньше. Чтобы достичь этого, нам нужно разбить его на более мелкие задачи:

  • Получить информацию об открытых RDP
  • Храните данные
  • Запускать периодические проверки
  • Сравнить свежие данные с базой данных

Выяснение небольших задач позволяет выбрать конкретные технологии для исследования, а также источники данных. Сейчас мы можем подумать о технических аспектах, таких как тип базы данных (тип, облачная / локальная), язык программирования (включая IDE), сервисы или операционная система. Имея это в виду, мы можем перевести наши цели в технические требования

  • Используйте Python и Shodan API для загрузки информации о незащищенных RDP
  • Установите Elasticsearch для хранения данных
  • Используйте задание cron для периодических задач
  • Опять же, используйте Python для сравнения новых результатов с базой данных

Конечно, есть нечто большее, следующий шаг - определить лучший запрос Шодана, периодическое время и настроить Elasticsearch. Это всего лишь пример, но я использовал этот подход много раз во время исследований или разработки инструментов.

И теперь у нас все разобрано и мы можем перейти к техническому аспекту.

Техническая подготовка

Эта часть требует базовых навыков работы с терминалом Linux и Python, но все будет объяснено, теперь мы можем начать с настройки нашей базы данных.

Elasticsearch - это механизм поиска и анализа с открытым исходным кодом для всех типов данных, включая текстовые, числовые, геопространственные, структурированные и неструктурированные.

Документация делает процесс установки очень простым; сначала нам нужно скачать и установить ключ подписи

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

Установить https-транспорт

sudo apt-get install apt-transport-https

Сохранить определения

echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list

и установить его из репозитория

sudo apt-get update && sudo apt-get install elasticsearch

разжечь

sudo systemctl enable elasticsearch.service –now

для теста перейдите к

http://localhost:9200

Конфигурацию и дальнейшее управление вы можете найти здесь

https://www.elastic.co/guide/en/elasticsearch/reference/current/deb.html

Python является одним из лучших языков для такого рода задач сценариев, и хорошая IDE может ускорить весь процесс разработки и сделать нашу жизнь намного проще. Не то, чтобы люди, пишущие в блокноте, были неэффективными, но IDE очень помогает свободно перемещаться по коду и быстро управлять вашим хранилищем. Мой любимый - Pycharm, он создает отдельную виртуальную среду для каждого проекта, поддерживает раскраску, несколько терминалов, локальную историю и много других функций.

Что вы должны знать об этой IDE, так это горячие клавиши. Иногда, когда я работаю с Pycharm, я часами не касаюсь своей мыши, все может управляться с помощью специальных ярлыков, и это делает работу чрезвычайно простой. Я выбираю пару наиболее полезных для повседневной жизни.

2x shift – search everywhoere
Ctrl + / - Comment text
Ctrl + Shift + / - uncomment text
Shift + f10 – run
Shift + f9 – debug
Ctrl + r – Replace/Find
Ctrl + h – history
Alt + f12 – open terminal

Вы можете найти их все на сайте Jetbrains

OSINT & Bluekeep

Импортируем необходимые пакеты в наш проект

from elasticsearch import Elasticsearch
import requests
import json
import email.message
import smtplib

Сначала нам нужно создать индекс под названием rdp-monitor, где мы будем хранить все данные.

es.indices.create(index='rdp-monitoring', ignore=400)

и теперь мы можем получить информацию RDP от Shodan.

Пара вещей, которые мы должны включить

SHODAN_API_KEY = ""
query = "port:3389 org:hospital"
endpoint = "https://api.shodan.io/shodan/host/search?key="+SHODAN_API_KEY+"&query="+query+"&page="
cve = "CVE-2019-0708"
fresh = []

Fresh - это новый пустой список, который будет содержать новые (свежие) IP-адреса.

И код для извлечения хостов, уязвимых для Bluekeep

try:
    shodan_request = requests.get(endpoint)
    shodan_json = json.loads(shodan_request.text)
    for result in shodan_json['matches']:
        if not exists(result['ip_str']):
            check_each_host = requests.get("https://api.shodan.io/shodan/host/" + result['ip_str'] + "?key=" + SHODAN_API_KEY)
            check_each_host_json = json.loads(check_each_host.content)
            if 'vulns' in check_each_host_json:
                if cve in check_each_host_json['vulns']:
                    fresh.append(result['ip_str'])
                    print("New IP:" + result['ip_str'])
                    es.index(index="rdp-monitoring", id=check_each_host_json['ip_str'], body={"organization": check_each_host_json['org']})
        else:
            print("IP exists")

    if fresh:
        send_notification(fresh)

except Exception as e:
    print(e)

Он отправляет API-запрос в Shodan с запросом «port: 3389 org: hospital» (я не нашел точного придурка для Bluekeep), перебирает результаты, а затем делает еще один запрос для проверки каждого хоста на наличие CVE-2019-0708. Shodan не всегда возвращает vulns в общих результатах поиска, поэтому мы должны проверять каждый IP отдельно (check_each_host).

После этого мы проверяем, есть ли какие-либо уязвимости (уязвимости) и содержит ли этот список наш CVE-2019-0708. Если да, мы добавляем его в Elasticsearch.

es.index(index="rdp-monitoring", id=check_each_host_json['ip_str'], body={"organization": check_each_host_json['org']})
Я использую IP-адрес в качестве поля идентификатора, я делаю это для простоты и упрощения поиска без использования фильтрации источников.

Есть около 70 результатов, он проверяет только первую страницу, вы можете написать код для разбивки на страницы для получения дополнительных результатов.

Пока что мы сохранили IP-адреса и связанные с ними организации в Elasticsearch, но если скрипт будет запущен в следующий раз, он должен распознать, какие записи еще не находятся в базе данных. Для этого мы можем написать дополнительную функцию «Существует», которая используется в строке 5 приведенного выше фрагмента.

def exists(ip):
    try:
        es.get(index='rdp-monitoring', id=ip)
        return True
    except:
     return False

Он просто пытается получить документ на основе индекса и идентификатора, который в нашем случае является IP-адресом. Если запись не существует, она выдает ошибку 404, то есть, как мы можем «искать» без фильтров.

Последняя часть состоит в том, чтобы быть в курсе событий и получать почту каждый раз, когда появляется новое сообщение, для достижения этого нам нужно написать еще одну функцию, которая использует учетную запись Gmail для уведомления нас о новых машинах.

def send_notification(ips):
    body = "<h1>New IPs in hospitals with Bluekeep</h1><br>"
    ips_text = ""
    for ip in ips:
        ips_text = ips_text + "https://beta.shodan.io/host/" + ip + "<br>"
    
    msg = email.message.Message()
    msg['Subject'] = 'RDP Monitoring'
    msg['From'] = "@gmail.com"
    msg['To'] = "@gmail.com"
    msg.add_header('Content-Type', 'text/html')
    msg.set_payload(body + ips_text)
    gmail_user = "@gmail.com"
    gmail_password = ""        
        
        
    try:
        server = smtplib.SMTP_SSL('smtp.gmail.com', 465)
        server.ehlo()
        server.login(gmail_user, gmail_password)
        server.sendmail(msg['From'], [msg['To']], msg.as_string())
        server.close()
        print('Email sent!')
        except Exception as e:
        print(e)
        print('Something went wrong...')
    pass

Это самый простой код, найденный где-то в сети и модифицированный для поддержки текстового / html-контента. По сути, сначала мы создаем информационный текст с нашими свежими IP-адресами (сохраненными в новом списке) и отправляем его на определенный адрес электронной почты. Вы должны ввести свой адрес электронной почты и пароль в коде, а также войти в свою учетную запись Gmail в браузере с того же компьютера, чтобы он работал.

После запуска новые записи появятся в Elasticsearch, и это должно выглядеть так

Вы можете поместить скрипт в cron, добавить его в свой мониторинг или объединить с другим в вашем арсенале.

Не только больницы являются ценной целью, запрос «port: 3389 org: bank» перечислит вам все RDP через порт 3389 в финансовых учреждениях, в названии которых есть «bank». Если пойти еще дальше, то использование свободного текстового поиска и таких слов, как «scada», покажет потенциальные системы промышленного контроля, а компрометация этого блока бесценна для некоторых участников угрозы.

Credential stuffing & RDP

Заполнение учетными данными обычно напоминает доступ к другим службам из-за скомпрометированных учетных данных жертвы. В большинстве случаев после массового сброса пароля киберпреступники проверяют эту же пару имени пользователя и пароля на других популярных платформах, таких как Facebook, Spotify, Netflix и т. Д. Это было предметом моего исследования в прошлом году, вы можете прочитать больше о заполнении учетных данных ниже.

https://www.offensiveosint.io/advanced-credential-stuffing-with-pepe/

Протокол удаленного рабочего стола не отличается, если кто-то использует один и тот же пароль в каждой службе, он должен знать, что он влияет на каждую личность и учетную запись в Интернете, даже самые личные, такие как доступ к персональному компьютеру через открытую RDP. Shodan использует OCR (оптическое распознавание символов) для извлечения текста из изображений, в некоторых случаях он включает имена пользователей и версию Windows.

Когда вы ищете RDP для конкретной компании и вам не повезло в их сети, не забудьте использовать метод свободного текстового поиска, компьютер может находиться в облаке и отображать имя организации в поле имени пользователя или в предупреждении безопасности.

APT используют две тактики для получения доступа к сети - нацеливание на персонал без технических знаний и знаний в области безопасности, таких как отдел кадров, для выполнения скрытой вредоносной нагрузки без обнаружения, а затем для повышения разрешений.

Ориентация на высокопоставленных лиц (генеральный директор, CISO, старшее руководство) для почти автоматического получения доступа к конфиденциальным документам зависит от разрешений жертв. Часто киберпреступники отправляют фишинговые электронные письма высшему руководству, например старшим аналитикам и инженерам, в точных секторах - медицине, правительстве, образовании или технике, но только в случае целенаправленных атак и использования фишинга.

HaveIBeenPwned & RDP

Чтобы проверить, стоит ли взламывать какой-либо RDP, основываясь на открытом имени пользователя, нам нужно запустить OSINT и навыки работы с электронной почтой.

Во-первых, давайте найдем RDP с электронной почтой в качестве учетной записи, вы можете использовать запрос «port: 3389 has_screenshot: true« gmail »» и изменить gmail на любого другого провайдера электронной почты или компанию. К сожалению, по неизвестным причинам вы не можете найти символ «@», который бы указывал весь потенциальный адрес электронной почты.

Следующий код извлекает адреса электронной почты Gmail из открытых RDP

query = "port:3389 has_screenshot:true gmail"
endpoint = "https://api.shodan.io/shodan/host/search?key="+SHODAN_API_KEY+"&query="+query+"&page="

req = requests.get(endpoint)
req_json = json.loads(req.text)

for match in req_json['matches']:
    text = match['opts']['screenshot']['text'].split("\n")
    for line in text:
        if "@" in line:
            print(line)

Быстрый поиск одного из адресов электронной почты из возвращенного списка (и снимок экрана выше) показывает, что он был скомпрометирован в 7 различных нарушениях.

Это много, и даже если пароль уникален, но не сгенерирован случайным образом, можно найти схему и угадать его доступ к RDP.

Но стоит ли эксплуатировать эту машину для каких-либо конфиденциальных материалов? Нам нужно выяснить, кто является владельцем адреса электронной почты. Быстрый поиск в Google показывает, что он [УДАЛЕНО] инженер и окончил [УДАЛЕНО].

Reverse Image search & RDP

Это также необычная техника, которую я никогда не слышал, это утомительная работа, но она может окупиться и подтвердить окончательные сомнения. Если на машине не обнаружен какой-либо адрес электронной почты и она не связана с какой-либо организацией, изображение профиля пользователя может помочь вам определить владельца машины и потенциальную ценность с точки зрения секретных документов или доступа.

Нам нужно отрезать изображение профиля от скриншота RDP и запустить его на одном из сервисов обратного поиска изображений.

В этом случае мне пришлось проверить пару сервисов для разных результатов. Люди, как и пароли, часто используют свою фотографию в различных сервисах, особенно в LinkedIn. Это один из методов отслеживания пользователей, но на этот раз он помогает сузить наш поиск до конкретных целей.

Имена пользователей RDP в формате имени и фамилии легче исследовать, вы должны искать учетные записи в социальных сетях и упоминания в Интернете об этом человеке, однако имя и имя не всегда уникальны, но изображения профиля. В этих двух случаях изображения были повторно использованы во многих социальных сетях, поэтому было легко определить, кто за этими учетными записями является старшим владельцем продукта и генеральным директором финансовой компании.

Заключение

OSINT широко используется не только правоохранительными органами и исследователями, но и киберпреступниками. Под киберпреступниками я подразумеваю актеров, которые нацелены на конкретных людей и компании, чтобы получить как можно большую прибыль - конфиденциальные документы, данные клиентов, интеллектуальную собственность или просто деньги. Зная их методы, вы можете защитить себя и не стать легкой целью, по крайней мере.

Для исследователей мониторинг незащищенных машин Bluekeep позволяет взглянуть на следующие потенциальные скомпрометированные компании и предсказать заголовки газет.

Предоставляя учебные пособия и делясь знаниями, я надеюсь частично покрыть свои медицинские счета. Если вам нравится моя работа и вы используете мои инструменты, пожалуйста, пожертвуйте.

https://www.offensiveosint.io/offensive-osint-s01e01-osint-rdp/

Report Page