# SAML Attacks ## SAML Attacks {% hint style="success" %} Apprenez et pratiquez le hacking AWS :[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ Apprenez et pratiquez le hacking GCP : [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks * Consultez les [**plans d'abonnement**](https://github.com/sponsors/carlospolop) ! * **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** nous sur **Twitter** 🐩 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Partagez des astuces de hacking en soumettant des PRs aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) dĂ©pĂŽts github.
{% endhint %} ## Basic Information {% content-ref url="saml-basics.md" %} [saml-basics.md](saml-basics.md) {% endcontent-ref %} ## Tool [**SAMLExtractor**](https://github.com/fadyosman/SAMLExtractor) : Un outil qui peut prendre une URL ou une liste d'URL et renvoie l'URL de consommation SAML. ## XML round-trip 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 basĂ© sur 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 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/](<../../.gitbook/assets/image (1001).png>) Et voici comment il l'a vu aprĂšs un tour de parsing et de sĂ©rialisation : ![https://mattermost.com/blog/securing-xml-implementations-across-the-web/](<../../.gitbook/assets/image (445).png>) Pour plus d'informations sur la vulnĂ©rabilitĂ© et comment en abuser : * [https://mattermost.com/blog/securing-xml-implementations-across-the-web/](https://mattermost.com/blog/securing-xml-implementations-across-the-web/) * [https://joonas.fi/2021/08/saml-is-insecure-by-design/](https://joonas.fi/2021/08/saml-is-insecure-by-design/) ## 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 discordance entre les Ă©lĂ©ments analysĂ©s par la **logique d'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 d'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**](https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/) **et** [**ce document**](https://www.usenix.org/system/files/conference/usenixsecurity12/sec12-final91.pdf). 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 "mauvais nouveau Response -> Assertion -> Subject" 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](<../../.gitbook/assets/image (506).png>) ### 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](<../../.gitbook/assets/image (466).png>) ### 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](<../../.gitbook/assets/image (120).png>) ### 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](<../../.gitbook/assets/image (551).png>) ### 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](<../../.gitbook/assets/image (1030).png>) ### XSW #6 * **StratĂ©gie** : Insertion Ă  un emplacement similaire Ă  XSW #4 et #5, mais avec une variation. * **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](<../../.gitbook/assets/image (169).png>) ### 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](<../../.gitbook/assets/image (971).png>) ### 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](<../../.gitbook/assets/image (541).png>) ### Outil Vous pouvez utiliser l'extension Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) 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 : {% content-ref url="../xxe-xee-xml-external-entity.md" %} [xxe-xee-xml-external-entity.md](../xxe-xee-xml-external-entity.md) {% endcontent-ref %} Les rĂ©ponses SAML sont des **documents XML dĂ©compressĂ©s et encodĂ©s en base64** et peuvent ĂȘtre susceptibles 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 ]> ... ... ... [...] ``` ## Outils Vous pouvez Ă©galement utiliser l'extension Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) 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](https://www.youtube.com/watch?v=WHn-6xHL7mI) ## XSLT via SAML Pour plus d'informations sur XSLT, allez Ă  : {% content-ref url="../xslt-server-side-injection-extensible-stylesheet-language-transformations.md" %} [xslt-server-side-injection-extensible-stylesheet-language-transformations.md](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md) {% endcontent-ref %} 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, sur la page hacktricks mentionnĂ©e au dĂ©but de cette section, vous pouvez trouver des payloads. ```xml ... ... ``` ### Outil Vous pouvez Ă©galement utiliser l'extension Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) 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](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](<../../.gitbook/assets/image (457).png>) ### Outil Vous pouvez Ă©galement utiliser l'extension Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e). 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](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) : 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-LĂ©gitime). DeuxiĂšmement, le Fournisseur de services ciblĂ© (SP-Cible) doit accepter des jetons du mĂȘme fournisseur d'identitĂ© qui sert SP-LĂ©gitime. Le processus d'attaque est simple dans ces conditions. Une session authentique est initiĂ©e avec SP-LĂ©gitime via le fournisseur d'identitĂ© partagĂ©. La rĂ©ponse SAML du fournisseur d'identitĂ© Ă  SP-LĂ©gitime est interceptĂ©e. Cette rĂ©ponse SAML interceptĂ©e, initialement destinĂ©e Ă  SP-LĂ©gitime, est ensuite redirigĂ©e vers SP-Cible. Le succĂšs de cette attaque est mesurĂ© par l'acceptation de l'assertion par SP-Cible, accordant l'accĂšs aux ressources sous le mĂȘme nom de compte utilisĂ© pour SP-LĂ©gitime. ```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](https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/). 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 ``` Lors de l'accĂšs Ă  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. En tenant compte de cela, 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](https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/): L'outil [**SAMLExtractor**](https://github.com/fadyosman/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 pour 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 * [https://epi052.gitlab.io/notes-to-self/blog/2019-03-07-how-to-test-saml-a-methodology/](https://epi052.gitlab.io/notes-to-self/blog/2019-03-07-how-to-test-saml-a-methodology/) * [https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/](https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/)\\ * [https://epi052.gitlab.io/notes-to-self/blog/2019-03-16-how-to-test-saml-a-methodology-part-three/](https://epi052.gitlab.io/notes-to-self/blog/2019-03-16-how-to-test-saml-a-methodology-part-three/) * [https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/](https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/) {% hint style="success" %} Apprenez et pratiquez le hacking AWS :[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ Apprenez et pratiquez le hacking GCP : [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Soutenir HackTricks * Consultez les [**plans d'abonnement**](https://github.com/sponsors/carlospolop)! * **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** nous sur **Twitter** 🐩 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Partagez des astuces de hacking en soumettant des PRs aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) dĂ©pĂŽts github.
{% endhint %}