CurlAsAService
2 minutos de lectura
Se nos proporciona esta página web, que nos permite ejecutar curl
:
Análisis de código fuente
También tenemos el código fuente en PHP. Esto es index.php
:
<?php
date_default_timezone_set('UTC');
spl_autoload_register(function ($name){
if (preg_match('/Controller$/', $name))
{
$name = "controllers/${name}";
}
else if (preg_match('/Model$/', $name))
{
$name = "models/${name}";
}
include_once "${name}.php";
});
$router = new Router();
$router->new('GET', '/', 'CurlController@index');
$router->new('POST', '/api/curl', 'CurlController@execute' );
$response = $router->match();
die($response);
Aquí solo vemos dos rutas. La que es más interesante se gestiona con CurlController.php
:
<?php
class CurlController
{
public function index($router)
{
return $router->view('index');
}
public function execute($router)
{
$url = $_POST['ip'];
if (isset($url)) {
$command = new CommandModel($url);
return json_encode([ 'message' => $command->exec() ]);
}
}
}
Aquí vemos que llama a CommandModel
con nuestro parámetro ip
de POST:
<?php
class CommandModel
{
public function __construct($url)
{
$this->command = "curl --proto =http,https -sSL " . escapeshellcmd($url) . " 2>&1";
}
public function exec()
{
$output = shell_exec($this->command);
return $output;
}
}
Nuestro parámetro POST ip
se escapará con escapeshellcmd
. Sin embargo, se concatena directamente al comando de curl
. No podremos realizar una inyección de comandos debido a escapeshellcmd
, Pero podemos agregar más parámetros a curl
.
Inyección de parámetros
Por ejemplo, podemos anular --proto =http,https
y poner --proto =file
, y así usar curl
para leer la flag como un archivo local.
Sabemos que la flag está en /flag
, se muestra en el Dockerfile
:
# Install PHP dependencies
RUN apt update && apt install -y php7.4-fpm
# Configure php-fpm and nginx
COPY config/fpm.conf /etc/php/7.4/fpm/php-fpm.conf
COPY config/supervisord.conf /etc/supervisord.conf
COPY config/nginx.conf /etc/nginx/nginx.conf
# Copy challenge files
COPY challenge /www
# Copy flag
COPY flag /
# Setup permissions
RUN chown -R www:www /www /var/lib/nginx
# Expose the port nginx is listening on
EXPOSE 80
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"]
Flag
Bien, aquí está la flag:
HTB{f1l3_r3tr13v4l_4s_4_s3rv1c3}