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 🐳
Descargamos una imagen de Ubuntu:
docker pull ubuntu:latest
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
- Ejecutamos el contenedor haciendo Local Port Forwarding: **docker run -dit -p 80:80
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
- Ejecutamos este contenedor con la imagen de ubuntu que nos descargamos al inicio: **docker run -dit
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
- 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