SSRF

web hacking

SSRF, o Falsificación de Solicitudes del Lado del Servidor, es una vulnerabilidad de seguridad que permite a un atacante engañar a un servidor para que envíe solicitudes a una ubicación no deseada. A través de la manipulación de una funcionalidad de la aplicación web, el atacante puede hacer que el servidor realice peticiones a sistemas internos que no están expuestos al público.

Explicación del SSRF:

  • escaneamos un objetivo y encontramos el puerto 80 (HTTP) abierto

  • identificamos que en esta web hay una ruta parecida a esta: http://example.com/path?url= mediante este parámetro se indica una URL

  • si como atacantes, intentamos poner algo no esperado como: http://example.com/path?url=http://localhost:80 la propia maquina estará consultándose a ella misma para ver el contenido en el puerto especificado, con esto podemos enumerar puertos que de primeras solo eran accesibles internamente también podemos hacer un poco de pivoting con esto al permitirnos acceder a dispositivos en la red interna ya que estamos enviando solicitudes desde la maquina propia:

http://example.com/path?url=http://1.1.1.1:5000

si no sabemos las IPs, podemos hacer fuerza bruta para conseguir las IPs. el SSRF no solo se puede presentar en la URL, también en algunos parámetros los cuales solicitan contenidos de URLs probablemente de redes internas al enviar requests, los cuales podemos buscar interceptando las solicitudes.

de igual manera podemos acceder a directorios internos de la web que tal ves no podrían estar a nuestro acceso de primeras:

http://example.com/path?url=http://localhost/admin

y si es posible, tramitar peticiones por GET que hagan cambios.

  • recordemos que, aparte de localhost podemos usar 127.0.0.1

Fuerza bruta SSRF para enumerar equipos internos

desde burpsuite, debemos interceptar la solicitud donde esta el parámetro de request o URL, lo mandaremos al intruder, aplicando fuerza bruta al ultimo octeto

nuestro payload será de tipo Numbers: con un rango del 1 al 255, de preferencia eliminando el URL encode de ciertos caracteres.

al enumerar las IPs, debemos centrarnos en las que preferiblemente no den un 500 en status code.

también podemos usar los ataques del intruder para enumerar subdirectorios en el localhost o en las maquinas de la red interna

SSRF bypasseando filtros blacklist

La aplicación impide directamente ciertas direcciones como 127.0.0.1, localhost y rutas sensibles, podemos pensar que estamos perdidos, pero tenemos varias formas de evadir estos filtros si están basados en una lista negra de bloqueos:

  • 127.0.0.1 acortado (direcciones IP alternativas): en vez de referirse al localhost como 127.0.0.1 también es valido hacerlo como 127.0.1 o 127.1

  • Variantes de la IP de loopback: en vez de 127.0.0.1 (la ip del loockback) podemos utilizar http://127.0.0.2, 127.0.0.3 y así consecutivamente ya que todas estas siguen apuntando hacia nuestro dispositivo (o el dispositivo victima mejor dicho)

  • Codificación en hexadecimal de IPs: codificamos en hexadecimal la IP del localhost (127.0.0.1): http://0x7f000001

  • Codificación a decimal: 127.0.0.1 > 2130706433

    contra bloqueos de directorios: ahora, puede ser también que este bloqueando nombres de directorios como /admin, para esto podemos hacer doble URL encode:

  • seleccionamos una sola letra: le hacemos URL encode: volvemos a hacer URL encode ahora al porcentaje

SSRF contra filtros whitelist

imaginemos que tenemos en la web una implementación se seguridad SSRF basada en whitelist, si en un parámetro posiblemente vulnerable intentamos apuntar a un dominio que no esta en la whitelist, nos va a decir algo parecido a esto:

significa que solo nos permite hacer la request desde ese host

para intentar evadir esto, vamos a jugar con el URL authentication: estas son credenciales que podemos introducir dentro de la misma URL, por ejemplo:

http://usuario:password@ejemplo.com

si en la web probamos algo como esto en el parámetro vulnerable:

vemos ahora solo este error, mas no el bloqueo de la whitelist. si probamos en credenciales algo como:

http://localhost:80@vulnerable.com

el :80 cuenta como la password. pero solo autenticarnos asi no nos sirve: lo que haremos sera bastante interesante:

http://localhost:80#@vulnerable.com

al poner el hashtag, lo del otro lado se convertirá en un elemento al que se intentara hacer un autoscroll. este hashtag lo doble URL encodeamos (primer url encode entero y luego url encode al porcentaje).

despues de eso ya podremos ver la pagina como si estuviéramos en el localhost, lo que pasa aquí es que la parte del lado del hashtag url encodeado no resuelve nada, se ignora, pero la whitelist piensa que nos referimos al dominio, pero ahora en realidad esto vale localhost:80. si queremos visitar directorios los ponemos hasta el final de la cadena incluyendo la barra diagonal obviamente

SSRF bypasseando seguridad mediante Open redirect (exploit chaining)

  • podemos aprovechar un parámetro vulnerable a Open redirect y derivarlo a un SSRF accediendo a la red interna

Last updated