• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Статья Offensive OSINT часть 1 - OSINT & RDP

Статья является переводом, оригинал вот

1590673463859.png


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


Введение

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

Подробнее об Offensive OSINT здесь



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

В дополнение к статье я покажу некоторые трюки с OSINT и RDP для поиска определенных компьютеров для шпионских целей с помощью сredential stuffing, а также поиска по фото.

1590673683107.png

Фото /


Подготовка

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

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

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

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

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

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

И сейчас, когда мы выяснили, мы можем перейти к техническому аспекту.


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

Следующий шаг требует базовых навыков программирования в терминале Linux и в python, но я все буду объяснять. Теперь мы можем начать с настройки нашей базы данных.


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


Документация очень облегчает процесс установки. Для начала нам необходимо скачать и установить ключ подписи.

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


Установим https-transport

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


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



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

2x shift – поиск по всем файлам
Ctrl + / - закомментировать
Ctrl + Shift + / - удалить комментарий
Shift + f10 – запустить
Shift + f9 – дебагнуть
Ctrl + r – заменить/найти
Ctrl + h – истори
Alt + f12 – открыть терминал


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

Все сочетания можете на сайте Jetbrains.



OSINT & Bluekeep

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

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

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

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

1590674190856.png

Pycharm (слева) Elasticsearch (справа)

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

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

Python:
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.

Python:
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" (к сожалению, я не нашел правильный dork для Bluekeep), выполняет итерацию по результатам, а затем создает еще один запрос на проверку каждого хоста на CVE-2019-0708. Shodan не всегда выдает vulns в общих результатах поиска, поэтому мы должны проверять каждый IP отдельно (check_each_host).

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

Python:
es.index(index="rdp-monitoring", id=check_each_host_json['ip_str'], body={"organization": check_each_host_json['org']})


Я использую IP-адрес в качестве поля ID, и делаю это для легкости и удобства поиска без фильтрации.


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

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

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


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

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

Python:
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 появятся новые записи, которые должны выглядеть следующим образом

1590674339680.png

Рабочий пример для больниц

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

1590674346895.png

Электронная почта из функции send_notification

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


Credential stuffing и RDP


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


Протокол Remote Desktop Protocol ничем не отличается, и если кто-то использует один и тот же пароль в каждой службе, то должен знать, что тем самым подвергает свои аккаунты атаке. Shodan использует OCR (Optical Character Recognition, Оптическое Распознавание Символов) для извлечения текста из изображений, в некоторых случаях он включает имена пользователей и версии windows.

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

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

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


HaveIBeenPwned & RDP

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

1590674419937.png

Адрес электронной почты в качестве имени пользователя



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

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

Python:
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 раз.

1590674450584.png



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

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

1590674460766.png

Публичное резюме включает в себя электронную форму RDP

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


Поиск изображений и RDP

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

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

1590674478619.png



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

1590674492557.png

То же самое изображение профиля Twitter и RDP аккаунт выше.

1590674509273.png

Пример результатов поиска обратного изображения лица с учетной записи RDP

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


Заключение

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

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

stok

One Level
19.10.2020
6
3
BIT
0
Материал дающий пищу для размышлений на досуге :)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!