
Entorno de laboratorio basado en Docker para verificar y explotar dos vulnerabilidades de API no autenticadas (CVE-2026-42221, CVE-2026-42238) en nginx-ui, con comparación de versiones parcheadas y un informe educativo.
Este repositorio es para verificar realmente dos CVEs reportados para nginx-ui (herramienta de administración GUI web de Nginx) en un entorno Docker.
Descargo de responsabilidad
El contenido de verificación de este repositorio está destinado únicamente a un entorno local aislado que usted administra.
Usar métodos similares en sistemas de terceros no autorizados viola la Ley de Prohibición de Acceso No Autorizado.
El proceso de verificación, las consideraciones y lo aprendido se resumen en un artículo de Qiita.
Probé realmente el CVE de nginx-ui: resultó ser una cuestión de diseño, no una vulnerabilidad
| CVE | Descripción | Versión afectada | Versión corregida |
|---|
| CVE-2026-42221 | /api/install antes de la configuración es accesible sin autenticación. Un atacante puede registrar primero una cuenta de administrador. | v2.3.7 y anteriores | v2.3.8 |
| CVE-2026-42238 | /api/restore antes de la configuración es accesible sin autenticación. Mediante la inyección de un app.ini malicioso, se puede ejecutar cualquier comando como root. | v2.3.7 y anteriores | v2.3.8 |
Los dos CVEs tienen la misma causa raíz (la ventana API antes de la configuración no está protegida) y en v2.3.8 se corrigieron ambos con la adición de un único middleware mediante la introducción de un método de secreto de instalación.
.
├── nginx_lab/ # 脆弱バージョン (v2.3.7) の検証環境 → port 8080
│ ├── Dockerfile # 起動ループ回避のための初期設定を含むイメージ定義
│ ├── docker-compose.yml
│ ├── nginx.conf # sites-enabled / stream ブロック修正済みの設定
│ ├── init-app.ini # app.ini の初期テンプレート
│ └── entrypoint.sh # コンテナ起動時の初期化スクリプト
├── nginx_lab_patched/ # 修正済みバージョン (v2.3.8) の検証環境 → port 8081
│ ├── Dockerfile
│ ├── docker-compose.yml
│ ├── nginx.conf
│ ├── init-app.ini
│ └── entrypoint.sh
├── scripts/
│ ├── exploit_42221.py # CVE-2026-42221 の攻撃スクリプト
│ ├── encrypt_password.py # RSA 暗号化のユーティリティ
│ └── test_patched.py # v2.3.8 (port 8081) でパッチ適用を確認するスクリプト
├── Qiita.md # Qiita 投稿原稿
└── 学習プラン.md
pycryptodomepip install pycryptodome
cd nginx_lab
docker compose build
docker compose up -d
Verificar inicio:
curl http://localhost:8080/api/install
# → {"lock":false,"timeout":false} が返れば OK
Punto problemático: La imagen base
uozi/nginx-ui:v2.3.7entra en un bucle de inicio tal cual. Esto se debe a que no existen directorios comosites-enabled. En el Dockerfile de este repositorio, estos se preparan de antemano.
cd scripts
python exploit_42221.py
Si tiene éxito, podrá iniciar sesión en http://localhost:8080 con la cuenta attacker.
cd nginx_lab_patched
docker compose build
docker compose up -d
En v2.3.8, la configuración inicial requiere un secreto de instalación. Después de iniciar el contenedor, verifique el secreto.
docker exec nginx-ui-patched cat /etc/nginx-ui/.install_secret
Registre un administrador usando este valor en la pantalla de configuración http://localhost:8081.
cd scripts
python test_patched.py
Si se imprime [OK] 攻撃失敗(修正済み), el parche funciona correctamente.
# 脆弱バージョン
cd nginx_lab
docker compose down -v
# 修正済みバージョン
cd nginx_lab_patched
docker compose down -v