Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2021-21239 — CVE-2021-21239 익스플로잇: pysaml2/Redash의 SAML 서명 검증 우회. 공개 키를 내장한 SAML 응답을 위조하여 사용자를 가장하고 JIT 프로비저닝을 통해 권한을 상승시킵니다. | Kitploit
도구/GitHubGitHub/illera88/cve-2021-21239
Vulnerability AnalysisExploitationWeb Application ExploitationPenetration TestingAuthenticationLearning & Education
GitHubillera88/cve-2021-21239

CVE-2021-21239

CVE-2021-21239 익스플로잇: pysaml2/Redash의 SAML 서명 검증 우회. 공개 키를 내장한 SAML 응답을 위조하여 사용자를 가장하고 JIT 프로비저닝을 통해 권한을 상승시킵니다.

저장소 보기
0년 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2021-21239에 관한 기술 보고서: Redash SAML 인증 취약점

SAML 소개

SAML(Security Assertion Markup Language)은 연합 ID 시스템에서 당사자 간 인증 및 권한 부여 데이터를 교환하기 위한 개방형 표준입니다. 이를 통해 도메인 간 SSO(Single Sign-On)가 가능합니다. 주요 구성 요소는 다음과 같습니다.

  • IdP(Identity Provider): 사용자를 인증하고 SAML 어설션을 발급하는 서비스입니다(예: Google의 SAML IdP). 개인 키로 어설션에 서명하여 무결성과 신뢰성을 보장합니다.
  • SP(Service Provider): 인증을 위해 IdP에 의존하는 애플리케이션입니다(예: Redash). SP는 IdP의 공개 키나 인증서를 사용하여 서명을 확인하고 어설션을 신뢰합니다.

일반적인 SAML 흐름에서 SP는 사용자를 IdP로 리디렉션하여 인증을 수행합니다. IdP는 사용자에 대한 어설션(예: 이메일, 이름)이 포함된 서명된 SAML 응답을 반환합니다. SP는 서명을 확인하고 사용자를 프로비저닝하거나 로그인시킵니다.

취약점 설명

CVE-2021-21239는 Redash <=10.1.0에서 SAML SSO에 사용되는 pysaml2 라이브러리(버전 < 6.5.0)의 서명 검증 우회 취약점입니다. 높은 수준에서 보면, 공격자가 임의의 내장 공개 키를 사용하여 SAML 응답을 위조할 수 있어 JIT(Just-In-Time) 프로비저닝을 통해 사용자 impersonation 및 권한 상승이 가능합니다.

이 취약점은 pysaml2가 SAML 서명을 확인하기 위해 xmlsec1을 호출하는 방식에서 비롯됩니다. Xmlsec1은 기본적으로 구성된 IdP 인증서보다 SAML 응답의 <ds:KeyInfo>에 포함된 공개 키를 선호합니다. 공격자는 자체 생성한 RSA 키 쌍으로 SAML 응답을 제작하고, 공개 키를 <ds:RSAKeyValue>에 포함시킨 후 개인 키로 어설션에 서명할 수 있습니다. pysaml2가 xmlsec1이 신뢰된 IdP 인증서만 사용하도록 제한하지 않기 때문에 위조된 서명이 유효한 것으로 간주되어 공격자가 모든 사용자(예: admin)로 로그인하고 최고 권한을 획득할 수 있습니다.

코드 수준에서 이 취약점은 pysaml2의 sigver.py(check_signature 함수)에 존재합니다. xmlsec1 명령 목록에 --enabled-key-data raw-x509-cert 옵션이 누락되어 있어 xmlsec1이 신뢰되지 않은 내장 키를 사용할 수 있습니다.

root@kitploit:~
com_list = [
    self.xmlsec, '--verify', '--enabled-reference-uris', 'empty,same-doc',
    '--pubkey-cert-pem', cert_file_name,
    '--id-attr:%s' % id_attr, node_name,
    '--node-id', nodeid, '--output', output_file_name, xml_file_name
]

이로 인해 공격자가 <saml:NameID>의 이메일을 수정하여 JIT 프로비저닝을 이용해 모든 사용자로 impersonation할 수 있습니다.

익스플로잇 테스트를 위한 설정

익스플로잇을 테스트하기 위해 Docker Compose를 사용하여 로컬 Redash 인스턴스(v10.1.0 이하)를 구동합니다. 설정 과정은 Google IdP와 SAML SSO를 구성하는 것을 포함합니다.

  • Docker Compose로 Redash 설치: Redash 리포지토리를 클론하고 취약한 태그(예: v10.1.0)를 체크아웃한 후 docker-compose up 실행.
  • Redash 환경 변수에서 SAML 구성(예: REDASH_SAML_LOGIN_ENABLED=true, Google IdP의 REDASH_SAML_METADATA_URL=...).
  • 테스트를 위해 Google SAML IdP 사용: Google Workspace SAML 앱을 Redash 콜백 URL로 설정.
  • Ngrok을 사용하여 로컬 Redash 인스턴스를 Google IdP에 노출.

이 설정을 통해 Python 스크립트 또는 Burp Suite로 전송된 위조 SAML 응답을 테스트하여 권한 상승을 확인할 수 있습니다.

기술적 설명 및 수정

이 취약점은 pysaml2의 xmlsec1 호출에서 내장 키를 검증에 사용할 수 있도록 허용하여 신뢰된 IdP 인증서를 우회하기 때문에 발생합니다. 공격자는 RSA 키 쌍을 생성하고, SAML 응답에 공개 키를 <ds:RSAKeyValue>에 포함시키고 속성(예: 이메일을 관리자 이메일로)을 수정한 후 어설션에 서명합니다. Xmlsec1은 내장 키를 사용하여 검증하고 유효한 것으로 간주합니다. 수정은 pysaml2 v6.5.0(초기 커밋, 2021년 1월 17일)에서 src/saml2/sigver.py에 구현되었습니다. xmlsec1 명령 목록에 --enabled-key-data raw-x509-cert가 추가되어 구성된 IdP 인증서로만 검증을 제한합니다.

root@kitploit:~
com_list = [
    self.xmlsec, '--verify', '--enabled-reference-uris', 'empty,same-doc',
    '--pubkey-cert-pem', cert_file_name,
    '--enabled-key-data', 'raw-x509-cert',
    '--id-attr:%s' % id_attr, node_name,
    '--node-id', nodeid, '--output', output_file_name, xml_file_name
]

이를 통해 신뢰 체인 검증이 강제되어 내장 키 사용이 방지됩니다. Redash는 이후 버전(예: v11+)에서 pysaml2를 업그레이드하여 이 문제를 수정했습니다. 취약한 버전에서는 --insecure를 사용하지 않았으며, 버그는 제한 옵션이 누락된 것이었습니다.

익스플로잇 코드

익스플로잇 코드는 cve-2021-21239.py에 구현되어 있습니다. 이 Python 스크립트는 CVE-2021-21239(Redash <=10.1.0)를 악용하여 SAML 응답을 위조하는 과정을 자동화하며, JIT 프로비저닝을 통해 사용자 impersonation 및 권한 상승을 가능하게 합니다. 이 익스플로잇은 Google Workspace SAML IdP를 대상으로 하지만, 다른 IdP(keycloak)에서도 테스트되었습니다. 스크립트는 다음 단계를 수행합니다.

  1. 명령줄 인수 파싱: SAML 템플릿 파일, Redash URL, IdP ID, 어설션 ID, 이메일, 이름, 성을 입력받으며, 테스트용 기본값(예: email="[email protected]")을 제공합니다.
  2. IdP ID 확인: 제공되지 않은 경우 Redash의 SAML 로그인 엔드포인트에서 idpid를 가져와 대상 구성과의 호환성을 보장합니다.
  3. XML 템플릿 채우기: 이메일, 이름, 타임스탬프, 어설션 ID에 대한 플레이스홀더가 있는 템플릿(SAMLResponseTempalte.xml)을 사용합니다. 동적 UTC 타임스탬프가 5분 유효 기간으로 생성되어 Redash의 검증을 통과합니다.
  4. RSA 키 쌍 생성: SAML 어설션 서명을 위한 2048비트 RSA 개인 키를 생성합니다.
  5. XML 서명: xmlsec Python 라이브러리를 사용하여 <saml:Assertion> 요소를 RSA-SHA256으로 서명하고, 공개 키를 <ds:RSAKeyValue>에 포함시켜 취약점을 악용합니다.
  6. 서명 확인: 서명을 검증하여 위조된 SAML 응답이 구조적으로 유효한지 확인합니다.
  7. SAMLResponse 전송: 서명된 XML을 Base64 및 URL 인코딩하여 Redash의 SAML 콜백 엔드포인트(/saml/callback?org_slug=default)로 전송합니다.
  8. 세션 쿠키 추출: 응답에서 세션 쿠키를 가져와 공격자가 대상 사용자를 impersonate할 수 있게 합니다.
  9. 사용자 목록 확인: 사용자의 그룹 멤버십과 함께 Redash 사용자 목록을 가져옵니다. 이를 통해 관리자 사용자를 식별하고 대상으로 삼을 수 있습니다.

익스플로잇의 어려움 및 우회 방법

CVE-2021-21239를 악용하려면 Redash가 JIT 프로비저닝을 통해 수락하는 위조된 SAML 응답을 제작해야 했습니다. 주요 어려움과 우회 방법은 다음과 같습니다.

  • 서명 검증 우회: Pysaml2가 내장 키를 허용했으므로, RSA 키 쌍을 생성하고 공개 키를 <ds:RSAKeyValue>에 포함시킨 후 개인 키로 서명하여 우회했습니다.
  • XML 서명 문제: 초기 시도에서는 xmlsec1 바이너리가 작동했지만 Python xmlsec 라이브러리는 공백/정규화 문제로 인해 다이제스트 불일치가 발생했습니다. 서명하기 전에 XML을 한 줄로 직렬화(etree.tostring(..., pretty_print=False))하여 우회했습니다.
  • 타임스탬프 검증: 먼 미래의 NotOnOrAfter는 거부되었습니다. 동적 UTC 타임스탬프를 사용하여 5분 유효 기간으로 우회했습니다.
  • HTTP 헤더 불일치: Requests 라이브러리가 SAMLResponse를 이중 인코딩하여 파싱 오류가 발생했습니다. 원시 폼 데이터를 전송하여 우회했습니다.
  • Redash 설정: 로컬 Redash는 Google IdP를 위해 Ngrok이 필요했습니다. Ngrok으로 터널링하고 SAML을 적절히 구성하여 우회했습니다.

이러한 어려움은 취약점을 효과적으로 악용하기 위해 정확한 XML 조작과 환경 설정이 필요함을 강조합니다. 제공된 익스플로잇 코드는 이를 성공적으로 시연하며, SAML 응답을 위조하여 사용자를 impersonate하고 접근 권한을 얻습니다.

도구 다운로드