Tip

AWS ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°:HackTricks Training AWS Red Team Expert (ARTE)
GCP ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°: HackTricks Training GCP Red Team Expert (GRTE) Azure ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks μ§€μ›ν•˜κΈ°

SAML κ°œμš”

**Security Assertion Markup Language (SAML)**λŠ” 아이덴티티 제곡자(IdP)κ°€ μ„œλΉ„μŠ€ 제곡자(SP)μ—κ²Œ κΆŒν•œ λΆ€μ—¬ 자격 증λͺ…을 전솑할 수 μžˆλ„λ‘ ν•˜μ—¬ 단일 둜그인(SSO)을 μ΄‰μ§„ν•©λ‹ˆλ‹€. 이 μ ‘κ·Ό 방식은 μ—¬λŸ¬ μ›Ήμ‚¬μ΄νŠΈμ—μ„œ 단일 자격 증λͺ…을 μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•˜μ—¬ μ—¬λŸ¬ 둜그인 관리λ₯Ό κ°„μ†Œν™”ν•©λ‹ˆλ‹€. IdP와 SP κ°„μ˜ ν‘œμ€€ν™”λœ 톡신을 μœ„ν•΄ XML을 ν™œμš©ν•˜λ©°, μ‚¬μš©μž μ‹ μ›μ˜ 인증과 μ„œλΉ„μŠ€ κΆŒν•œ λΆ€μ—¬λ₯Ό μ—°κ²°ν•©λ‹ˆλ‹€.

SAMLκ³Ό OAuth 비ꡐ

  • SAML은 기업이 SSO 둜그인 λ³΄μ•ˆμ„ 보닀 잘 μ œμ–΄ν•  수 μžˆλ„λ‘ λ§žμΆ€ν™”λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
  • OAuthλŠ” λͺ¨λ°”일 μΉœν™”μ μœΌλ‘œ μ„€κ³„λ˜μ—ˆμœΌλ©°, JSON을 μ‚¬μš©ν•˜κ³  Google 및 Twitter와 같은 νšŒμ‚¬μ˜ ν˜‘λ ₯으둜 κ°œλ°œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

SAML 인증 흐름

μžμ„Έν•œ λ‚΄μš©μ€ https://epi052.gitlab.io/notes-to-self/blog/2019-03-07-how-to-test-saml-a-methodology/의 전체 κ²Œμ‹œλ¬Όμ„ ν™•μΈν•˜μ„Έμš”. λ‹€μŒμ€ μš”μ•½μž…λ‹ˆλ‹€:

SAML 인증 ν”„λ‘œμ„ΈμŠ€λŠ” μ—¬λŸ¬ λ‹¨κ³„λ‘œ κ΅¬μ„±λ˜μ–΄ 있으며, μŠ€ν‚€λ§ˆμ— μ„€λͺ…λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€:

https://epi052.gitlab.io/notes-to-self/img/saml/saml-flow.jpg

  1. λ¦¬μ†ŒμŠ€ μ ‘κ·Ό μ‹œλ„: μ‚¬μš©μžκ°€ 보호된 λ¦¬μ†ŒμŠ€μ— μ ‘κ·Όν•˜λ €κ³  ν•©λ‹ˆλ‹€.
  2. SAML μš”μ²­ 생성: SPλŠ” μ‚¬μš©μžλ₯Ό μΈμ‹ν•˜μ§€ λͺ»ν•˜κ³  SAML μš”μ²­μ„ μƒμ„±ν•©λ‹ˆλ‹€.
  3. IdP둜 λ¦¬λ””λ ‰μ…˜: μ‚¬μš©μžλŠ” IdP둜 λ¦¬λ””λ ‰μ…˜λ˜λ©°, SAML μš”μ²­μ€ μ‚¬μš©μžμ˜ λΈŒλΌμš°μ €λ₯Ό 톡해 μ „λ‹¬λ©λ‹ˆλ‹€.
  4. IdPκ°€ μš”μ²­ μˆ˜μ‹ : IdPλŠ” SAML μš”μ²­μ„ μˆ˜μ‹ ν•©λ‹ˆλ‹€.
  5. IdPμ—μ„œ 인증: IdPλŠ” μ‚¬μš©μžλ₯Ό μΈμ¦ν•©λ‹ˆλ‹€.
  6. μ‚¬μš©μž 검증: IdPλŠ” μš”μ²­λœ λ¦¬μ†ŒμŠ€μ— μ ‘κ·Όν•  수 μžˆλŠ” μ‚¬μš©μžμ˜ 정당성을 κ²€μ¦ν•©λ‹ˆλ‹€.
  7. SAML 응닡 생성: IdPλŠ” ν•„μš”ν•œ μ£Όμž₯을 ν¬ν•¨ν•œ SAML 응닡을 μƒμ„±ν•©λ‹ˆλ‹€.
  8. SP의 ACS URL둜 λ¦¬λ””λ ‰μ…˜: μ‚¬μš©μžλŠ” SP의 Assertion Consumer Service (ACS) URL둜 λ¦¬λ””λ ‰μ…˜λ©λ‹ˆλ‹€.
  9. SAML 응닡 검증: ACSλŠ” SAML 응닡을 κ²€μ¦ν•©λ‹ˆλ‹€.
  10. λ¦¬μ†ŒμŠ€ μ ‘κ·Ό ν—ˆμš©: 처음 μš”μ²­ν•œ λ¦¬μ†ŒμŠ€μ— λŒ€ν•œ 접근이 ν—ˆμš©λ©λ‹ˆλ‹€.

SAML μš”μ²­ μ˜ˆμ‹œ

μ‚¬μš©μžκ°€ https://shibdemo-sp1.test.edu/secure/μ—μ„œ λ³΄μ•ˆ λ¦¬μ†ŒμŠ€μ— 접근을 μš”μ²­ν•˜λŠ” μ‹œλ‚˜λ¦¬μ˜€λ₯Ό κ³ λ €ν•΄ λ³΄μ„Έμš”. SPλŠ” 인증이 μ—†μŒμ„ μΈμ‹ν•˜κ³  SAML μš”μ²­μ„ μƒμ„±ν•©λ‹ˆλ‹€:

GET /secure/ HTTP/1.1
Host: shibdemo-sp1.test.edu
...

μ›μ‹œ SAML μš”μ²­μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

<?xml version="1.0"?>
<samlp:AuthnRequest ...
</samlp:AuthnRequest>

이 μš”μ²­μ˜ μ£Όμš” μš”μ†ŒλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

  • AssertionConsumerServiceURL: IdPκ°€ 인증 ν›„ SAML 응닡을 보낼 μœ„μΉ˜λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.
  • Destination: μš”μ²­μ΄ μ „μ†‘λ˜λŠ” IdP의 μ£Όμ†Œμž…λ‹ˆλ‹€.
  • ProtocolBinding: SAML ν”„λ‘œν† μ½œ λ©”μ‹œμ§€μ˜ 전솑 방법을 μ •μ˜ν•©λ‹ˆλ‹€.
  • saml:Issuer: μš”μ²­μ„ μ‹œμž‘ν•œ μ—”ν„°ν‹°λ₯Ό μ‹λ³„ν•©λ‹ˆλ‹€.

SAML μš”μ²­ 생성 ν›„, SPλŠ” 302 redirect둜 μ‘λ‹΅ν•˜μ—¬ λΈŒλΌμš°μ €λ₯Ό SAML μš”μ²­μ΄ HTTP μ‘λ‹΅μ˜ Location 헀더에 μΈμ½”λ”©λœ IdP둜 μ•ˆλ‚΄ν•©λ‹ˆλ‹€. RelayState λ§€κ°œλ³€μˆ˜λŠ” 거래 μ „λ°˜μ— 걸쳐 μƒνƒœ 정보λ₯Ό μœ μ§€ν•˜μ—¬ SPκ°€ SAML 응닡을 μˆ˜μ‹ ν•  λ•Œ 초기 λ¦¬μ†ŒμŠ€ μš”μ²­μ„ μΈμ‹ν•˜λ„λ‘ ν•©λ‹ˆλ‹€. SAMLRequest λ§€κ°œλ³€μˆ˜λŠ” μ›μ‹œ XML 쑰각의 μ••μΆ• 및 μΈμ½”λ”©λœ λ²„μ „μœΌλ‘œ, Deflate μ••μΆ• 및 base64 인코딩을 μ‚¬μš©ν•©λ‹ˆλ‹€.

SAML 응닡 μ˜ˆμ‹œ

전체 SAML 응닡은 μ—¬κΈ°μ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. μ‘λ‹΅μ˜ μ£Όμš” ꡬ성 μš”μ†ŒλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

  • ds:Signature: 이 μ„Ήμ…˜μ€ XML μ„œλͺ…μœΌλ‘œ, μ–΄μ„€μ…˜ λ°œν–‰μžμ˜ 무결성과 진정성을 보μž₯ν•©λ‹ˆλ‹€. μ˜ˆμ‹œμ˜ SAML μ‘λ‹΅μ—λŠ” λ©”μ‹œμ§€μš©κ³Ό μ–΄μ„€μ…˜μš© 두 개의 ds:Signature μš”μ†Œκ°€ ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
  • saml:Assertion: 이 뢀뢄은 μ‚¬μš©μžμ˜ 신원 및 기타 속성에 λŒ€ν•œ 정보λ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€.
  • saml:Subject: μ–΄μ„€μ…˜μ˜ λͺ¨λ“  μ§„μˆ μ˜ μ£Όμš” 주체λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.
  • saml:StatusCode: ν•΄λ‹Ή μš”μ²­μ— λŒ€ν•œ μž‘μ—…μ˜ μƒνƒœλ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
  • saml:Conditions: μ–΄μ„€μ…˜μ˜ μœ νš¨μ„± 타이밍 및 μ§€μ •λœ μ„œλΉ„μŠ€ μ œκ³΅μžμ™€ 같은 쑰건을 μžμ„Ένžˆ μ„€λͺ…ν•©λ‹ˆλ‹€.
  • saml:AuthnStatement: IdPκ°€ μ–΄μ„€μ…˜μ˜ 주체λ₯Ό μΈμ¦ν–ˆμŒμ„ ν™•μΈν•©λ‹ˆλ‹€.
  • saml:AttributeStatement: μ–΄μ„€μ…˜μ˜ 주체λ₯Ό μ„€λͺ…ν•˜λŠ” 속성을 ν¬ν•¨ν•©λ‹ˆλ‹€.

SAML 응닡 ν›„, IdPμ—μ„œ 302 redirectκ°€ ν¬ν•¨λœ ν”„λ‘œμ„ΈμŠ€κ°€ μ§„ν–‰λ©λ‹ˆλ‹€. μ΄λŠ” μ„œλΉ„μŠ€ 제곡자의 μ–΄μ„€μ…˜ μ†ŒλΉ„μž μ„œλΉ„μŠ€(ACS) URL둜의 POST μš”μ²­μœΌλ‘œ μ΄μ–΄μ§‘λ‹ˆλ‹€. POST μš”μ²­μ—λŠ” RelayState 및 SAMLResponse λ§€κ°œλ³€μˆ˜κ°€ ν¬ν•¨λ©λ‹ˆλ‹€. ACSλŠ” SAML 응닡을 μ²˜λ¦¬ν•˜κ³  κ²€μ¦ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€.

POST μš”μ²­μ΄ μˆ˜μ‹ λ˜κ³  SAML 응닡이 κ²€μ¦λœ ν›„, μ‚¬μš©μžκ°€ 처음 μš”μ²­ν•œ 보호된 λ¦¬μ†ŒμŠ€μ— λŒ€ν•œ 접근이 ν—ˆμš©λ©λ‹ˆλ‹€. μ΄λŠ” /secure/ μ—”λ“œν¬μΈνŠΈμ— λŒ€ν•œ GET μš”μ²­κ³Ό λ¦¬μ†ŒμŠ€μ— λŒ€ν•œ 성곡적인 접근을 λ‚˜νƒ€λ‚΄λŠ” 200 OK μ‘λ‹΅μœΌλ‘œ μ„€λͺ…λ©λ‹ˆλ‹€.

XML μ„œλͺ…

XML μ„œλͺ…은 전체 XML 트리 λ˜λŠ” κ·Έ μ•ˆμ˜ νŠΉμ • μš”μ†Œμ— μ„œλͺ…ν•  수 μžˆλŠ” λ‹€μž¬λ‹€λŠ₯ν•œ κΈ°λŠ₯을 κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€. 응닡 μš”μ†ŒλΏλ§Œ μ•„λ‹ˆλΌ λͺ¨λ“  XML 객체에 μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜λŠ” XML μ„œλͺ…μ˜ μ£Όμš” μœ ν˜•μž…λ‹ˆλ‹€:

XML μ„œλͺ…μ˜ κΈ°λ³Έ ꡬ쑰

XML μ„œλͺ…은 ν•„μˆ˜ μš”μ†Œλ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€:

<Signature>
<SignedInfo>
<CanonicalizationMethod />
<SignatureMethod />
<Reference>
<Transforms />
<DigestMethod />
<DigestValue />
</Reference>
...
</SignedInfo>
<SignatureValue />
<KeyInfo />
<Object />
</Signature>

각 Reference μš”μ†ŒλŠ” URI μ†μ„±μœΌλ‘œ 식별할 수 μžˆλŠ” μ„œλͺ…λœ νŠΉμ • λ¦¬μ†ŒμŠ€λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

XML μ„œλͺ…μ˜ μœ ν˜•

  1. Enveloped Signature: 이 μœ ν˜•μ˜ μ„œλͺ…은 μ„œλͺ…λœ λ¦¬μ†ŒμŠ€μ˜ μžμ†μœΌλ‘œ, μ„œλͺ…이 μ„œλͺ…λœ μ½˜ν…μΈ μ™€ λ™μΌν•œ XML ꡬ쑰 내에 ν¬ν•¨λ˜μ–΄ μžˆμŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€.

μ˜ˆμ‹œ:

<samlp:Response ... ID="..." ... >
...
<ds:Signature>
<ds:SignedInfo>
...
<ds:Reference URI="#...">
...
</ds:Reference>
</ds:SignedInfo>
</ds:Signature>
...
</samlp:Response>

enveloped μ„œλͺ…μ—μ„œ ds:Transform μš”μ†ŒλŠ” enveloped-signature μ•Œκ³ λ¦¬μ¦˜μ„ 톡해 enveloped됨을 μ§€μ •ν•©λ‹ˆλ‹€.

  1. Enveloping Signature: enveloped μ„œλͺ…κ³Ό λŒ€μ‘°μ μœΌλ‘œ, enveloping μ„œλͺ…은 μ„œλͺ…λ˜λŠ” λ¦¬μ†ŒμŠ€λ₯Ό κ°μŒ‰λ‹ˆλ‹€.

μ˜ˆμ‹œ:

<ds:Signature>
<ds:SignedInfo>
...
<ds:Reference URI="#...">
...
</ds:Reference>
</ds:SignedInfo>
<samlp:Response ... ID="..." ... >
...
</samlp:Response>
</ds:Signature>
  1. Detached Signature: 이 μœ ν˜•μ€ μ„œλͺ…ν•˜λŠ” μ½˜ν…μΈ μ™€ λΆ„λ¦¬λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. μ„œλͺ…κ³Ό μ½˜ν…μΈ λŠ” λ…λ¦½μ μœΌλ‘œ μ‘΄μž¬ν•˜μ§€λ§Œ, 두 μ‚¬μ΄μ˜ λ§ν¬λŠ” μœ μ§€λ©λ‹ˆλ‹€.

μ˜ˆμ‹œ:

<samlp:Response ... ID="..." ... >
...
</samlp:Response>
<ds:Signature>
<ds:SignedInfo>
...
<ds:Reference URI="#...">
...
</ds:Reference>
</ds:SignedInfo>
</ds:Signature>

결둠적으둜, XML μ„œλͺ…은 XML λ¬Έμ„œλ₯Ό λ³΄ν˜Έν•˜λŠ” μœ μ—°ν•œ 방법을 μ œκ³΅ν•˜λ©°, 각 μœ ν˜•μ€ μ„œλ‘œ λ‹€λ₯Έ ꡬ쑰적 및 λ³΄μ•ˆ μš”κ΅¬λ₯Ό μΆ©μ‘±ν•©λ‹ˆλ‹€.

References

Tip

AWS ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°:HackTricks Training AWS Red Team Expert (ARTE)
GCP ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°: HackTricks Training GCP Red Team Expert (GRTE) Azure ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks μ§€μ›ν•˜κΈ°