# SAML Attacks {{#include ../../banners/hacktricks-training.md}} ## Osnovne informacije {{#ref}} saml-basics.md {{#endref}} ## Alat [**SAMLExtractor**](https://github.com/fadyosman/SAMLExtractor): Alat koji može uzeti URL ili listu URL-ova i vratiti SAML consume URL. ## XML povratna veza U XML-u, potpisani deo XML-a se čuva u memoriji, zatim se vrši neka kodiranje/dekodiranje i potpis se proverava. Idealno, to kodiranje/dekodiranje ne bi trebalo da menja podatke, ali na osnovu tog scenarija, **proveravani podaci i originalni podaci ne mogu biti isti**. Na primer, proverite sledeći kod: ```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 ``` Pokretanje programa protiv REXML 3.2.4 ili ranijeg rezultiraće sledećim izlazom umesto toga: ``` First child in original doc: Y First child after round-trip: Z ``` Ovo je kako je REXML video originalni XML dokument iz gornjeg programa: ![https://mattermost.com/blog/securing-xml-implementations-across-the-web/](<../../images/image (1001).png>) I ovo je kako ga je video nakon obrade i serijalizacije: ![https://mattermost.com/blog/securing-xml-implementations-across-the-web/](<../../images/image (445).png>) Za više informacija o ranjivosti i kako je iskoristiti: - [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/) ## XML Signature Wrapping Attacks U **XML Signature Wrapping napadima (XSW)**, protivnici koriste ranjivost koja nastaje kada se XML dokumenti obrađuju kroz dve različite faze: **validacija potpisa** i **poziv funkcije**. Ovi napadi uključuju menjanje strukture XML dokumenta. Konkretno, napadač **ubacuje lažne elemente** koji ne kompromituju validnost XML potpisa. Ova manipulacija ima za cilj da stvori razliku između elemenata koje analizira **aplikaciona logika** i onih koje proverava **modul za verifikaciju potpisa**. Kao rezultat, dok XML potpis ostaje tehnički validan i prolazi verifikaciju, aplikaciona logika obrađuje **lažne elemente**. Kao posledica, napadač efikasno zaobilazi **zaštitu integriteta** i **autentifikaciju porekla** XML potpisa, omogućavajući **ubacivanje proizvoljnog sadržaja** bez otkrivanja. Sledeći napadi se zasnivaju na [**ovom blog postu**](https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/) **i** [**ovoj studiji**](https://www.usenix.org/system/files/conference/usenixsecurity12/sec12-final91.pdf). Zato proverite te izvore za dodatne detalje. ### XSW #1 - **Strategija**: Dodaje se novi korenski element koji sadrži potpis. - **Implikacija**: Validator može biti zbunjen između legitimnog "Response -> Assertion -> Subject" i napadačevog "zlog novog Response -> Assertion -> Subject", što dovodi do problema sa integritetom podataka. ![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-1.svg](<../../images/image (506).png>) ### XSW #2 - **Razlika od XSW #1**: Koristi odvojeni potpis umesto obavijenog potpisa. - **Implikacija**: "Zla" struktura, slična XSW #1, ima za cilj da prevari poslovnu logiku nakon provere integriteta. ![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-2.svg](<../../images/image (466).png>) ### XSW #3 - **Strategija**: Kreira se zla Assertion na istom hijerarhijskom nivou kao originalna assertion. - **Implikacija**: Ima za cilj da zbuni poslovnu logiku da koristi maliciozne podatke. ![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-3.svg](<../../images/image (120).png>) ### XSW #4 - **Razlika od XSW #3**: Originalna Assertion postaje dete duplicirane (zle) Assertion. - **Implikacija**: Slično XSW #3, ali agresivnije menja XML strukturu. ![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-4.svg](<../../images/image (551).png>) ### XSW #5 - **Jedinstveni aspekt**: Ni potpis ni originalna Assertion ne pridržavaju se standardnih konfiguracija (obavijen/obavijajući/odvojeni). - **Implikacija**: Kopirana Assertion obavija potpis, menjajući očekivanu strukturu dokumenta. ![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-5.svg](<../../images/image (1030).png>) ### XSW #6 - **Strategija**: Slična lokacijska umetanja kao XSW #4 i #5, ali sa preokretom. - **Implikacija**: Kopirana Assertion obavija potpis, koji zatim obavija originalnu Assertion, stvarajući ugnježdenu obmanjujuću strukturu. ![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-6.svg](<../../images/image (169).png>) ### XSW #7 - **Strategija**: Element Extensions se umetne sa kopiranom Assertion kao detetom. - **Implikacija**: Ovo koristi manje restriktivnu šemu elementa Extensions da zaobiđe mere validacije šeme, posebno u bibliotekama kao što je OpenSAML. ![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-7.svg](<../../images/image (971).png>) ### XSW #8 - **Razlika od XSW #7**: Koristi drugi manje restriktivni XML element za varijantu napada. - **Implikacija**: Originalna Assertion postaje dete manje restriktivnog elementa, preokrećući strukturu korišćenu u XSW #7. ![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-8.svg](<../../images/image (541).png>) ### Alat Možete koristiti Burp ekstenziju [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) da parsirate zahtev, primenite bilo koji XSW napad koji odaberete i pokrenete ga. ## XXE Ako ne znate koji su to napadi XXE, molimo vas da pročitate sledeću stranicu: {{#ref}} ../xxe-xee-xml-external-entity.md {{#endref}} SAML odgovori su **deflacionirani i base64 kodirani XML dokumenti** i mogu biti podložni napadima XML External Entity (XXE). Manipulacijom XML strukture SAML odgovora, napadači mogu pokušati da iskoriste XXE ranjivosti. Evo kako se takav napad može vizualizovati: ```xml ]> ... ... ... [...] ``` ## Alati Možete koristiti Burp ekstenziju [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) za generisanje POC-a iz SAML zahteva kako biste testirali moguće XXE ranjivosti i SAML ranjivosti. Pogledajte i ovaj govor: [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI) ## XSLT putem SAML Za više informacija o XSLT idite na: {{#ref}} ../xslt-server-side-injection-extensible-stylesheet-language-transformations.md {{#endref}} Ekstenzibilne transformacije stilskih jezika (XSLT) mogu se koristiti za transformaciju XML dokumenata u različite formate kao što su HTML, JSON ili PDF. Ključno je napomenuti da se **XSLT transformacije vrše pre verifikacije digitalnog potpisa**. To znači da napad može biti uspešan čak i bez važećeg potpisa; samopotpisani ili nevažeći potpis je dovoljan za nastavak. Ovde možete pronaći **POC** za proveru ovakvih ranjivosti, na hacktricks stranici pomenutoj na početku ovog odeljka možete pronaći payload-e. ```xml ... ... ``` ### Alat Možete takođe koristiti Burp ekstenziju [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) za generisanje POC-a iz SAML zahteva kako biste testirali moguće XSLT ranjivosti. Pogledajte takođe ovaj govor: [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI) ## Isključenje XML potpisa **Isključenje XML potpisa** posmatra ponašanje SAML implementacija kada element Potpis nije prisutan. Ako je ovaj element nedostajući, **verifikacija potpisa možda neće biti izvršena**, što ga čini ranjivim. Moguće je testirati ovo menjajući sadržaj koji se obično verifikuje potpisom. ![https://epi052.gitlab.io/notes-to-self/img/saml/signature-exclusion.svg](<../../images/image (457).png>) ### Alat Možete takođe koristiti Burp ekstenziju [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e). Presretnite SAML odgovor i kliknite `Remove Signatures`. Na taj način **svi** elementi potpisa se uklanjaju. Sa uklonjenim potpisima, dozvolite zahtevu da nastavi ka cilju. Ako potpis nije potreban od strane Servisa ## Lažiranje sertifikata ## Lažiranje sertifikata Lažiranje sertifikata je tehnika za testiranje da li **Provajder usluga (SP) pravilno verifikuje da je SAML poruka potpisana** od strane pouzdane Identitetske provajder (IdP). Uključuje korišćenje \***samo-potpisanog sertifikata** za potpisivanje SAML odgovora ili potvrde, što pomaže u evaluaciji procesa verifikacije poverenja između SP i IdP. ### Kako sprovesti lažiranje sertifikata Sledeći koraci opisuju proces korišćenja [SAML Raider](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) Burp ekstenzije: 1. Presretnite SAML odgovor. 2. Ako odgovor sadrži potpis, pošaljite sertifikat u SAML Raider Certs koristeći dugme `Send Certificate to SAML Raider Certs`. 3. U SAML Raider Certificates tabu, izaberite uvezeni sertifikat i kliknite `Save and Self-Sign` da biste kreirali samo-potpisanu kopiju originalnog sertifikata. 4. Vratite se na presretnuti zahtev u Burp-ovom Proxy-ju. Izaberite novi samo-potpisani sertifikat iz XML Signature padajuće liste. 5. Uklonite sve postojeće potpise pomoću dugmeta `Remove Signatures`. 6. Potpišite poruku ili potvrdu novim sertifikatom koristeći dugme **`(Re-)Sign Message`** ili **`(Re-)Sign Assertion`**, kako odgovara. 7. Prosledite potpisanu poruku. Uspešna autentifikacija ukazuje da SP prihvata poruke potpisane vašim samo-potpisanim sertifikatom, otkrivajući potencijalne ranjivosti u procesu verifikacije SAML poruka. ## Zbunjenost primaoca tokena / Zbunjenost cilja provajdera usluga Zbunjenost primaoca tokena i Zbunjenost cilja provajdera usluga uključuju proveru da li **Provajder usluga pravilno verifikuje nameravanog primaoca odgovora**. U suštini, Provajder usluga bi trebao odbiti odgovor na autentifikaciju ako je bio namenjen drugom provajderu. Ključni element ovde je polje **Recipient**, koje se nalazi unutar elementa **SubjectConfirmationData** SAML odgovora. Ovo polje specificira URL koji ukazuje gde potvrda mora biti poslata. Ako stvarni primalac ne odgovara nameravanom Provajderu usluga, potvrda bi trebala biti smatrana nevažećom. #### **Kako to funkcioniše** Da bi napad na SAML Zbunjenost primaoca tokena (SAML-TRC) bio izvodljiv, određeni uslovi moraju biti ispunjeni. Prvo, mora postojati važeći nalog na Provajderu usluga (nazvanom SP-Legit). Drugo, ciljani Provajder usluga (SP-Target) mora prihvatati tokene od iste Identitetske provajder koja služi SP-Legit. Proces napada je jednostavan pod ovim uslovima. Autentična sesija se pokreće sa SP-Legit putem zajedničkog Identitetskog provajdera. SAML odgovor od Identitetskog provajdera ka SP-Legit se presreće. Ovaj presretnuti SAML odgovor, prvobitno namenjen SP-Legit, se zatim preusmerava ka SP-Target. Uspeh u ovom napadu meri se time što SP-Target prihvata potvrdu, omogućavajući pristup resursima pod istim imenom naloga korišćenim za 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 u funkcionalnosti odjave Originalno istraživanje može se pristupiti preko [this link](https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/). Tokom procesa brute force napada na direktorijume, otkrivena je stranica za odjavu na: ``` https://carbon-prototype.uberinternal.com:443/oidauth/logout ``` Kada je pristupljeno ovom linku, došlo je do preusmeravanja na: ``` 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 ``` Ovo je otkrilo da `base` parametar prihvata URL. Uzimajući to u obzir, pojavila se ideja da se URL zameni sa `javascript:alert(123);` u pokušaju da se pokrene XSS (Cross-Site Scripting) napad. ### Masovno Eksploatisanje [Iz ove studije](https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/): Alat [**SAMLExtractor**](https://github.com/fadyosman/SAMLExtractor) korišćen je za analizu poddomena `uberinternal.com` za domene koji koriste istu biblioteku. Nakon toga, razvijen je skript koji cilja stranicu `oidauth/prompt`. Ovaj skript testira XSS (Cross-Site Scripting) unosom podataka i proverava da li se oni odražavaju u izlazu. U slučajevima kada se unos zaista odražava, skript označava stranicu kao ranjivu. ```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) ``` ## Reference - [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/) {{#include ../../banners/hacktricks-training.md}}