Post

Laboratorio - SSRF

Esta vulnerabilidad nos permite realizar consultas desde un servidor autorizado a un dominio arbitrario elegido por el atacante. Esto es útil para el atacante ya que externamente no tendrá visibilidad con otros dominios internos en la red.

Laboratorio de Prácticas 🐳

  1. Descargamos una imagen de Ubuntu: docker pull ubuntu:latest

  2. Ahora creamos una subred en la que estarán dos máquinas desplegadas con Docker

  • Comando: docker create --driver=bridge subredtest --subnet=10.10.10.0/24
    • –driver=bridge: Hacemos que el controlador sea de tipo puente para que por DCHP se le asigne una IP automática a las máquinas que formen parte de la subred.

Configurando Máquina 1 🐋

  • Pasos
    • Ejecutamos el contenedor haciendo Local Port Forwarding: **docker run -dit -p 80:80 **
    • Conectamos el contenedor a la subred que creamos previamente: **docker network connect subretest **
    • Generamos una shell para interactuar con el contenedor: **docker exec -dit bash**
    • Instalamos: apt update && apt install apache2, php, nano y net-tools -y
  • Listamos las interfaces de red

    1
    2
    3
    4
    5
    6
    7
    
      root@db924b41270f:/# ifconfig
      eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
          inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
      <SNIP>
      eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
          inet 10.10.10.2  netmask 255.255.255.0  broadcast 10.10.10.255
      <SNIP>
    

    eth1 pertenece a la subred previamente creada. 🔨

  • Modificamos la línea (allow_url_include = On) del archivo /etc/php/8.1/apache2/php.ini

  • Eliminamos el archivo index.html del directorio /var/www/html/ y creamos un archivo index.php con el siguiente contenido
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
if (isset($_GET['url'])) {
    $url = $_GET['url'];
    $content = file_get_contents($url);

    if ($content !== false) {
        echo '<div class="content-container">';
        echo $content;
        echo '</div>';
    } else {
        echo "No se pudo cargar el contenido de la URL.";
    }
}
?>

<form method="GET" action="">
    <input type="text" name="url" placeholder="Ingresa la URL">
    <input type="submit" value="Mostrar URL">
</form>
  • Habilitamos el servicio de apache2: service apache2 start. Vamos a nuestro navegador en la máquina host y vemos una página web, la cual nos pedirá una url para mostrar el contenido.

Configurando Máquina 2 🐋✌

  • Pasos
    • Ejecutamos este contenedor con la imagen de ubuntu que nos descargamos al inicio: **docker run -dit **.
    • Ahora le asignamos la subred: **docker network connect subredtest **
    • Ejecutamos el contendor haciendo que se conecte únicamente a la subred: docker run -dit –network subredtest
    • Generamos una shell para interactuar con el contenedor: **docker exec -dit bash**
    • Instalamos: apt update && apt install apache2, php, nano y net-tools -y
  • Listamos las interfaces de red

    1
    2
    3
    4
    
      root@cd1c6e919bcb:/# ifconfig
      eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
              inet 10.10.10.3  netmask 255.255.255.0  broadcast 10.10.10.255
      <SNIP>
    

    eth0 pertenece a la subred previamente creada. 🔨

  • Eliminamos el archivo sindex.htmls del directorio /var/www/html/ y creamos un archivo index.php con el siguiente contenido
1
2
3
<?php
    echo "flag{C0Ngr47u14t10ns}";
?>
  • Habilitamos el servicio de apache2: service apache2 start
  1. En nuestra máquina host configuramos las siguiente reglas de iptables
    1
    2
    
    └─$ iptables -A INPUT -s 10.10.10.0/24 -j DROP
    iptables -A OUTPUT -d 10.10.10.0/24 -j DROP
    

SSRF en escena 🌟

Como vemos en el esquema del laboratorio, la Máquina 1 y Máquina 2 tienen conectividad entre sí, nuestro objetivo como atacantes 🎩, es acceder a la Máquina 2.

Si desde nuestra Máquina hosts realizamos un ping al host 10.10.10.3 veremos que no tenemos conexión.

1
2
3
4
5
└─$ ping -c 1 10.10.10.3 
PING 10.10.10.3 (10.10.10.3) 56(84) bytes of data.

--- 10.10.10.3 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

En la Máquina 1 tendremos que realizar un escaneo de la interfaz eth1 ya que vemos que es una subred.

1
2
3
4
5
6
7
8
#!/bin/bash
for host in $(seq 1 255); do
    timeout 1 bash -c "ping -c 1 10.10.10.$host" &>/dev/null && echo "[+] Activo: 10.10.10.$host" &
done; wait

-$ ./hosts.sh
[+] Activo: 10.10.10.3
<SNIP>
  • Como ahora ya conocemos el host dentro de la subred lo que haremos, es introducir la url http://10.10.10.3/ en la página web que tenemos en la Máquina host y así poder ver el contenido

This post is licensed under CC BY 4.0 by the author.