Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-11374-check — Script de detección para CVE-2026-11374 | Kitploit
Herramientas/GitHubGitHub/bishopfox/cve-2026-11374-check
Herramientas DefensivasEscáneres de VulnerabilidadesExplotaciónSeguridad WebPruebas de PenetraciónInteligencia de Amenazas
GitHubbishopfox/cve-2026-11374-check

CVE-2026-11374-check

Script de detección para CVE-2026-11374

Ver Repositorio
1161hace 3 mesesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir
# CVE-2026-11374 Script de Detección de Precondición para ManageEngine AD360

Un script de detección para la precondición de explotación de CVE-2026-11374, una falla predecible de tickets SSO que permite la toma de control de cuentas sin autenticación en la suite ManageEngine AD360. Los cuatro productos dentro del alcance comparten el `ManageEngineADSFramework`:

| Producto | Compilación afectada | Compilación corregida |
|---|---|---|
| ADSelfService Plus | ≤ 6528 | 6529 |
| RecoveryManager Plus | ≤ 6320 | 6321 |
| M365 Manager Plus | ≤ 4816 | 4817 |
| ADAudit Plus | ≤ 8702 | 8703 |

En las compilaciones afectadas, el ticket SSO es simplemente `System.currentTimeMillis()` (una marca de tiempo predecible) muestreada en el inicio de sesión de la víctima, por lo que puede reproducirse mediante la cookie `CUSTOM_SSO_TICKET` para secuestrar esa sesión. La corrección reemplaza el ticket con `UUID.randomUUID()` (un identificador suficientemente aleatorio). La ruta de reproducción solo es alcanzable cuando el producto está integrado con AD360: `ADSFilter` la condiciona con `isProductIntegrated()`. Esa condición es la precondición que esta herramienta comprueba.

> **NOTA:** este detector confirma la precondición, no la vulnerabilidad en sí. Un resultado `POTENTIALLY_AFFECTED` no es un veredicto de vulnerable confirmado; consulte más abajo para más información.

## ¿Es seguro ejecutarlo?

Sí. Está diseñado para uso en producción y en evaluaciones.

- No se explota nada. La sonda envía un ticket SSO no válido (`1700000000000`, un valor en milisegundos lo suficientemente lejano en el pasado como para que nunca pueda estar en caché), por lo que nunca se recupera ninguna sesión. El servidor solo nos indica que borremos las cookies que enviamos.
- No hay cambios de estado en el objetivo. Cada solicitud es un `GET` simple, y las únicas cookies afectadas son las desechables que envía la herramienta.
- No hay fuerza bruta ni resolución de sesiones. La herramienta no intenta la resolución activa de tickets por marca de tiempo que probaría la explotabilidad; eso es explotación más que detección, y queda fuera del alcance aquí (consulte [Limitaciones](#limitaciones)).

## Lo que esto puede y no puede decirle

El parche de CVE-2026-11374 solo cambió la forma en que se genera el ticket (milisegundos a UUID); no cambió la ruta de reproducción de cookies que esta sonda ejercita. Como resultado, una instalación parcheada responde byte por byte de manera idéntica a una vulnerable para cualquier solicitud no autenticada.

Lo que la herramienta puede hacer, sin autenticación y de forma no destructiva:

- Confirmar que un producto dentro del alcance y alcanzable tiene activa la ruta de reproducción de cookies CustomSSO (es decir, está integrado con AD360), que es la precondición de explotación de CVE-2026-11374.
- Identificar cuál de los cuatro productos es, a partir de la cookie de sesión específica de cada producto.
- Hacer una lectura de mejor esfuerzo del número de compilación del activo como pista. Esto está disponible en ADSelfService Plus, ADAudit Plus y M365 Manager Plus; no está disponible en RecoveryManager Plus.

Lo que no puede hacer:

- Distinguir vulnerable de parcheado. No existe una señal segura, pasiva y no autenticada para ello. Un resultado `POTENTIALLY_AFFECTED` significa que la precondición se cumple y que debe verificar el nivel de parche, no que el host esté confirmado como vulnerable.
- Confirmar la explotabilidad. Demostrar que un host es realmente explotable requiere observar el formato de un ticket emitido (un número de 13 dígitos es vulnerable, un UUID está parcheado; ambos requieren visibilidad autenticada o en el propio host), leer `conf/product.conf` localmente, o resolver activamente un ticket en vivo (explotación real, intencionalmente no implementada aquí).
- Confiar plenamente en un número de compilación de ADSelfService Plus inferior a la corregida. El `?build=` de ADSSP a veces es la compilación real y a veces un marcador congelado que lee por debajo de la compilación corregida, por lo que un valor inferior al corregido es ambiguo y la herramienta lo marca como no concluyente. Un valor igual o superior a la compilación corregida sigue siendo una señal confiable de parcheado, ya que el marcador siempre es demasiado bajo para alcanzarlo.

## Requisitos

- Python 3.7+ y la biblioteca [`requests`](https://pypi.org/project/requests/). Instale con
  `pip install requests`.

## Uso

```bash
# un solo host (prefiera una URL o host:puerto; los puertos difieren según el producto)
./cve_2026_11374_check.py https://adssp.example.com:8888

# múltiples hosts (el esquema es opcional: se prueba https primero, luego http)
./cve_2026_11374_check.py host-a:8081 host-b:8365

# escanear una lista, un objetivo por línea (se permiten comentarios con '#'), salida compacta
./cve_2026_11374_check.py -f targets.txt --brief

# salida legible por máquina para canalizaciones
./cve_2026_11374_check.py -f targets.txt --json > results.json
```

Los puertos predeterminados difieren según el producto (ADSelfService Plus 8888, ADAudit Plus 8081, M365 Manager Plus 8365, RecoveryManager Plus 8090), así que pase una URL o `host:puerto`. Un host sin puerto usa 8888 por defecto.

### Opciones

| Bandera | Descripción |
|------|-------------|
| `targets` | Uno o más `host`, `host:puerto` o `https://host:puerto` |
| `-f, --targets-file ARCHIVO` | Leer objetivos desde un archivo (uno por línea; comentarios con `#`) |
| `--brief` | Una línea alineada por objetivo, útil para escanear muchos hosts |
| `--json` | Emitir resultados JSON estructurados |
| `--timeout SEGS` | Tiempo de espera por solicitud (predeterminado: 15) |
| `--no-build` | Omitir la solicitud adicional de número de compilación en un hallazgo positivo |
| `--no-color` | Deshabilitar la salida de color (también respeta `NO_COLOR` y no-TTY) |

### Ejemplos

Una consola integrada con AD360 (verboso, el predeterminado). La segunda línea aclara que esto es la precondición y no un veredicto de vulnerable; la tercera es la pista de compilación de mejor esfuerzo:

```console
$ ./cve_2026_11374_check.py https://adssp.example.com:8888
[!] https://adssp.example.com:8888: POTENTIALLY_AFFECTED
      ADSelfService Plus: integrado con AD360, ruta de reproducción CustomSSO activa - precondición cumplida. No confirmado como vulnerable; verifique el nivel de parche (compilación corregida 6529).
      compilación: 6519 (por debajo de la corregida 6529 - no concluyente: ?build= puede ser un marcador obsoleto o un hotfix)
```

Una instalación independiente del mismo producto, donde la ruta de reproducción no está activa:

```console
$ ./cve_2026_11374_check.py https://adssp.example.com:8888
[+] https://adssp.example.com:8888: UNAFFECTED
      ADSelfService Plus: independiente / no integrado con AD360 (sin limpieza), por lo que la ruta de reproducción no es alcanzable aquí. Verifique build >= 6529 de todos modos.
```

Escaneo de una lista con una línea alineada por host (`--brief`). El estado de salida es `1` si algún host es `POTENTIALLY_AFFECTED`; de lo contrario `0`, lo cual es útil en scripts. La nota final muestra el producto identificado, además del número de compilación en un hallazgo:

```console
$ ./cve_2026_11374_check.py -f targets.txt --brief; echo "exit: $?"
POTENTIALLY_AFFECTED  https://host-a:8888  ADSelfService Plus 6519
POTENTIALLY_AFFECTED  http://host-b:8081   ADAudit Plus 8530
UNAFFECTED            http://host-c:8365   M365 Manager Plus
UNAFFECTED            https://host-d:443
INCONCLUSIVE          http://host-e:8888   ADSelfService Plus
ERROR                 host-f:8888  timeout
exit: 1
```

Salida legible por máquina (`--json`). Cada resultado incluye el `verdict`, el `state` y `detail` que lo respaldan, el `product` identificado y, en un hallazgo, un objeto `build`: `build` es el número encontrado, `fixed_build` el umbral para ese producto, `patch_hint` la llamada direccional (`likely_patched` si es igual o superior a la compilación corregida, de lo contrario `inconclusive`), y `note` una breve explicación:

```console
$ ./cve_2026_11374_check.py https://host-b:8081 --json
[
  {
    "target": "https://host-b:8081",
    "state": "potentially_affected",
    "detail": "ADAudit Plus: integrado con AD360, ruta de reproducción CustomSSO activa - precondición cumplida ...",
    "product": "ADAudit Plus",
    "build": { "build": "8530", "fixed_build": "8703", "patch_hint": "inconclusive", "note": "por debajo de 8703 - no concluyente: puede ser un hotfix" },
    "verdict": "POTENTIALLY_AFFECTED"
  }
]
```

## Veredictos

| Veredicto | Significado |
|---------|---------|
| `POTENTIALLY_AFFECTED` | Producto dentro del alcance integrado con AD360; la ruta de reproducción de cookies CustomSSO está activa, por lo que se cumple la precondición de explotación de CVE-2026-11374. Esto no es un veredicto de vulnerable confirmado; verifique el nivel de parche (consulte los siguientes pasos). |
| `UNAFFECTED` | La ruta de reproducción no es alcanzable. Cualquiera de: un producto dentro del alcance independiente (no integrado con AD360 — aunque sería alcanzable si se integrara más tarde, así que verifique la compilación de todos modos); un producto del framework ADS de ManageEngine que no sea uno de los cuatro dentro del alcance; o ningún producto dentro del alcance en la respuesta (no uno de los cuatro productos de CVE-2026-11374, o un proxy que elimina la cookie de sesión). |
| `INCONCLUSIVE` | Un `HTTP 400` — probablemente el bloqueo por límite de velocidad de IAM enmascarando la señal; reintente después de ~60 s. |
| `ERROR` | Fallo de conexión/timeout/TLS. |

## Códigos de salida

| Código | Significado |
|------|-------------|
| `0` | Ningún objetivo devolvió `POTENTIALLY_AFFECTED` |
| `1` | Al menos un objetivo es `POTENTIALLY_AFFECTED` |
| `2` | Error de uso (argumentos incorrectos / archivo de objetivos ilegible) |

## Cómo funciona

Envíe un ticket no válido más una etiqueta de aplicación a cualquier URL CustomSSO (`*.do`):

```text
GET /AppsHome.do
Cookie: CUSTOM_SSO_TICKET=1700000000000; CUSTOM_SSO_APP_TAG_NAME=AD360
```

En una instalación integrada con AD360, la cadena `ADSFilter → CustomSSOFilter → CookieSSOImpl` ejecuta su rama de resolución (la etiqueta nombra un producto diferente, por lo que `appName != prodName`), falla al resolver el ticket falso y emite encabezados de respuesta de limpieza de cookies:

```text
Set-Cookie: CUSTOM_SSO_TICKET=removed; Max-Age=0; ...
Set-Cookie: CUSTOM_SSO_APP_NAME=removed; Max-Age=0; ...
Set-Cookie: CUSTOM_SSO_APP_TAG_NAME=removed; Max-Age=0; ...
```

Una instalación independiente nunca ejecuta esa ruta y no emite limpieza. El producto se identifica por su cookie de sesión Tomcat fija específica del producto (`JSESSIONIDADSSP` para ADSelfService Plus, y así sucesivamente), que se establece en cada respuesta. La comprobación se basa en los encabezados y no en el código de estado, ya que un ADSSP integrado devuelve un `302` mientras que ADAudit, M365 y RMP devuelven `200` ante la misma sonda.

| Respuesta de la sonda | Veredicto |
|----------------|---------|
| encabezados de limpieza y una cookie de producto conocida dentro del alcance | `POTENTIALLY_AFFECTED` |
| cookie de producto, sin limpieza, estado ≠ 400 | `UNAFFECTED` (independiente / no integrado) |
| sin cookie de producto dentro del alcance, estado ≠ 400 | `UNAFFECTED` (no es uno de los cuatro productos) |
| encabezados de limpieza pero cookie de producto no reconocida | `UNAFFECTED` (ManageEngine, fuera del alcance) |
| `HTTP 400` | `INCONCLUSIVE` (probablemente el bloqueo por límite de velocidad de IAM; consulte Limitaciones) |

## Limitaciones

- `POTENTIALLY_AFFECTED` no es "vulnerable confirmado". Es la precondición de explotación. Debido a que el parche no tocó esta ruta de código, una compilación parcheada responde de manera idéntica, por lo que debe confirmar el nivel de parche fuera de banda (consulte los siguientes pasos). Ese es el techo de lo que un observador no autenticado puede saber.
- Sin confirmación activa. La herramienta nunca intenta resolver un ticket real con la hora actual. Esa técnica puede probar positivamente que un host es vulnerable, pero es explotación activa (secuestra una sesión en vivo), está limitada por throttling y es probabilística, y necesita una sesión de víctima activa, por lo que queda excluida de este detector.
- `HTTP 400` puede ser un bloqueo por límite de velocidad en lugar de una respuesta real. Zoho IAM aplica un throttling rotatorio de URL que limita una IP de origen a alrededor de 40 solicitudes por 60 s, y luego bloquea esa ruta durante ~60 s. Durante un bloqueo, las solicitudes devuelven `HTTP 400` y la señal de integración queda enmascarada. La herramienta las reporta como `INCONCLUSIVE`; reintente desde esa IP después de aproximadamente un minuto.
- Detrás de un proxy inverso, una consola que elimina o reescribe la cookie de sesión puede ser reportada incorrectamente como `UNAFFECTED`. Confirme directamente si espera un producto ManageEngine allí.
- Los números de compilación son pistas, no veredictos. ADAudit (`?v=`) y M365 (`?bN=`) siempre exponen la compilación real; el `?build=` de ADSSP a veces es real y a veces un marcador congelado que lee por debajo de la compilación corregida, por lo que un valor de ADSSP inferior al corregido es ambiguo; RMP no expone ninguno. En todos los casos, una compilación igual o superior a la corregida indica fuertemente que está parcheado, y por debajo de ella es no concluyente.

## Siguientes pasos para defensores

Si un objetivo devuelve `POTENTIALLY_AFFECTED`, trátelo como expuesto y digno de confirmación, luego:

1. Confirme el nivel de parche directamente (la herramienta no puede). Lea `conf/product.conf` (`build_number`) en el host y compárelo con la compilación corregida para ese producto (ADSelfService Plus 6529, RecoveryManager Plus 6321, M365 Manager Plus 4817, ADAudit Plus 8703). Interprételo direccionalmente: una compilación igual o superior a la corregida es un fuerte indicador de que el host está parcheado, ya que la corrección UUID está en ese árbol. Una compilación por debajo de la corregida es no concluyente más que prueba de vulnerabilidad, porque hotfixes fuera de banda y backports pueden aplicar la corrección UUID sin aumentar el número de compilación; en ese caso, recurra a la verificación del formato del ticket a continuación.
2. Verifique el formato del ticket emitido si puede iniciar sesión. La cookie `CUSTOM_SSO_TICKET` no es `HttpOnly`, por lo que después de autenticarse puede leer su valor: un número de 13 dígitos significa vulnerable, un UUID significa parcheado. Esta es la verificación positiva más clara.
3. Actualice a la compilación corregida (o posterior) en cualquier host que sea vulnerable o que no pueda confirmar como parcheado. La corrección reemplaza el ticket predecible con un UUID aleatorio.
4. Busque intentos de explotación. En el host, `serverOut_<fecha>.txt` registra el throttling como ráfagas de:

   ```text
   IAMSecurityException ErrorCode: URL_ROLLING_THROTTLES_LIMIT_EXCEEDED,
   RequestURI: "/showLogin.cc", RemoteAddr: <IP de origen>
   ```

   Un pico de `URL_ROLLING_THROTTLES_LIMIT_EXCEEDED` en rutas de despacho de SSO/inicio de sesión desde una única IP de origen es un fuerte indicador de fuerza bruta de tickets. También revise los inicios de sesión exitosos recientes y la actividad de sesiones para detectar señales de toma de control.
5. Reduzca la exposición mientras tanto. Restrinja el acceso de red a la suite AD360 (no debería estar expuesta a internet), y si la ruta de reproducción no es necesaria, deshabilitar la integración CustomSSO elimina la precondición por completo.

## Remediación

Actualice el producto afectado al menos a la compilación corregida (ADSelfService Plus 6529, RecoveryManager Plus 6321, M365 Manager Plus 4817, ADAudit Plus 8703) o posterior. La corrección reemplaza el ticket SSO predecible `System.currentTimeMillis()` con `UUID.randomUUID()`.

## Licencia

Este código se distribuye bajo una [licencia MIT](https://github.com/bishopfox/cve-2026-11374-check/blob/main/LICENSE).

## Aviso legal

El uso de esta herramienta para atacar objetivos sin consentimiento mutuo previo es ilegal. Es responsabilidad del usuario final cumplir con todas las leyes locales, estatales y federales aplicables. Los desarrolladores no asumen ninguna responsabilidad y no son responsables por cualquier uso indebido o daño causado por este programa.

## Véase también

- [NVD: CVE-2026-11374](https://nvd.nist.gov/vuln/detail/CVE-2026-11374)
- Service packs de ManageEngine:
  [ADSelfService Plus](https://www.manageengine.com/products/self-service-password/service-pack.html) ·
  [RecoveryManager Plus](https://www.manageengine.com/ad-recovery-manager/service-pack.html) ·
  [M365 Manager Plus](https://www.manageengine.com/microsoft-365-management-reporting/service-pack.html) ·
  [ADAudit Plus](https://www.manageengine.com/products/active-directory-audit/service-pack.html)
- [Blog de Bishop Fox: Análisis técnico completo](https://bishopfox.com/blog/millisecond-of-predictability-why-cve-2026-11374-hard-to-exploit)
Descargar herramienta