HTB Mirai
Resumen
Mirai es una máquina muy divertida. Para comenzar, es necesario realizar un reconocimiento para darse cuenta de que se está enfrentando a una Raspberry Pi. Con eso en mente, se pueden probar credenciales por defecto para luego ingresar y descubrir que se puede ejecutar cualquier comando con el usuario root, lo que permite escalar privilegios. Sin embargo, al buscar la bandera de root, no se encuentra en el sistema, sino en una USB; precisamente, la USB en la que la borraron. Pero al investigar sobre esto, se descubre que la información aún sigue almacenada en la porción de memoria que fue asignada a la USB. Es una máquina bastante divertida y con una temática totalmente interesante.
Reconocimiento
Para empezar se realiza un ping para ver si hay conectividad con la máquina:
1
2
3
4
5
6
7
8
❯ ping -c 1 10.10.10.48
PING 10.10.10.48 (10.10.10.48) 56(84) bytes of data.
64 bytes from 10.10.10.48: icmp_seq=1 ttl=63 time=206 ms
--- 10.10.10.48 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 206.463/206.463/206.463/0.000 ms
Escaneo de Puertos
Con esto en mente, se puede realizar un escaneo de puertos con nmap para ver qué puertos se encuentran abiertos:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
❯ nmap -p- --min-rate 2000 10.10.10.48 -Pn -oG ports
Connect Scan Timing: About 98.95% done; ETC: 15:20 (0:00:00 remaining)
Nmap scan report for 10.10.10.48
Host is up (0.17s latency).
Not shown: 65527 closed tcp ports (conn-refused)
PORT STATE SERVICE
22/tcp open ssh
53/tcp open domain
80/tcp open http
1227/tcp open dns2go
3216/tcp filtered ferrari-foam
24943/tcp filtered unknown
32400/tcp open plex
32469/tcp open unknown
Ahora que se sabe qué puertos están abiertos, se puede realizar un escaneo más profundo para identificar las tecnologías que se están utilizando.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
❯ nmap -p22,53,80,1227,32400,32469 -sVC 10.10.10.48 -oN Versions
Starting Nmap 7.94SVN ( https://nmap.org ) at 2023-12-19 15:19 EST
Nmap scan report for 10.10.10.48
Host is up (0.25s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 6.7p1 Debian 5+deb8u3 (protocol 2.0)
| ssh-hostkey:
| 1024 aa:ef:5c:e0:8e:86:97:82:47:ff:4a:e5:40:18:90:c5 (DSA)
| 2048 e8:c1:9d:c5:43:ab:fe:61:23:3b:d7:e4:af:9b:74:18 (RSA)
| 256 b6:a0:78:38:d0:c8:10:94:8b:44:b2:ea:a0:17:42:2b (ECDSA)
|_ 256 4d:68:40:f7:20:c4:e5:52:80:7a:44:38:b8:a2:a7:52 (ED25519)
53/tcp open domain dnsmasq 2.76
| dns-nsid:
|_ bind.version: dnsmasq-2.76
80/tcp open http lighttpd 1.4.35
|_http-title: Site doesn't have a title (text/html; charset=UTF-8).
|_http-server-header: lighttpd/1.4.35
1227/tcp open upnp Platinum UPnP 1.0.5.13 (UPnP/1.0 DLNADOC/1.50)
32400/tcp open http Plex Media Server httpd
| http-auth:
| HTTP/1.1 401 Unauthorized\x0D
|_ Server returned status 401 but no WWW-Authenticate header.
|_http-favicon: Plex
|_http-title: Unauthorized
|_http-cors: HEAD GET POST PUT DELETE OPTIONS
32469/tcp open upnp Platinum UPnP 1.0.5.13 (UPnP/1.0 DLNADOC/1.50)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Enumeración
Al revisar la web, se ve lo siguiente:
Al revisar la información de la web con la ayuda de WhatWeb, se observa que hay un encabezado un tanto llamativo. Por lo tanto, se puede buscar información relacionada a él:
1
2
3
❯ whatweb http://10.10.10.48/
http://10.10.10.48/ [404 Not Found] Country[RESERVED][ZZ], HTTPServer[lighttpd/1.4.35], IP[10.10.10.48], UncommonHeaders[x-pi-hole], lighttpd[1.4.35]
Eso, combinado con el hecho de que se están utilizando tecnologías ligeras, como en el servidor DNS y en el servidor web, permite concluir que el dispositivo contra el que se está enfrentando es una Raspberry Pi.
Fuzzing
Al listar directorios con la ayuda de GoBuster dentro de la web, se puede ver lo siguiente:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
❯ gobuster dir -u http://10.10.10.48/ -w /usr/share/seclists/Discovery/Web-Content/big.txt -t 100
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://10.10.10.48/
[+] Method: GET
[+] Threads: 100
[+] Wordlist: /usr/share/seclists/Discovery/Web-Content/big.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/admin (Status: 301) [Size: 0] [--> http://10.10.10.48/admin/]
/versions (Status: 200) [Size: 13]
Progress: 20476 / 20477 (100.00%)
Al revisar dentro de la carpeta admin se puede ver un panel de administración
Al investigar cuáles son las credenciales por defecto para Pi-hole, se encuentra lo siguiente:
Pero al intentar probarlas dentro del inicio de sesión, no son correctas.
Pero, por otro lado, existe un servidor SSH, por lo que podría intentarse el inicio de sesión desde el mismo.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
❯ ssh pi@10.10.10.48
pi@10.10.10.48's password:
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: Tue Dec 19 18:54:07 2023 from 10.10.14.17
SSH is enabled and the default password for the 'pi' user has not been changed.
This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.
SSH is enabled and the default password for the 'pi' user has not been changed.
This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.
pi@raspberrypi:~$
Ahora que se ha obtenido acceso con las credenciales, solo hace falta buscar la bandera del usuario.
1
2
3
4
5
pi@raspberrypi:~/Desktop$ pwd
/home/pi/Desktop
pi@raspberrypi:~/Desktop$ ls
Plex user.txt
pi@raspberrypi:~/Desktop$
Escalada de Privilegios
Ahora se pueden revisar los privilegios a nivel de sudoers del usuario con el comando sudo -l
para ver si se tiene acceso a algún binario especial.
1
2
3
4
5
6
7
sudo -l
Matching Defaults entries for pi on localhost:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User pi may run the following commands on localhost:
(ALL : ALL) ALL
(ALL) NOPASSWD: ALL
Con esto, se puede ver que el usuario pi puede ejecutar cualquier comando como sudo, por lo que puede escalar privilegios de la siguiente manera.
1
2
sudo su
root@raspberrypi:/home/pi/Desktop#
Y ahora, con esto, se puede ver la bandera de root:
1
2
3
4
5
root@raspberrypi:~# ls
root.txt
root@raspberrypi:~# cat root.txt
I lost my original root.txt! I think I may have a backup on my USB stick...
root@raspberrypi:~#
Buscando la Flag
Como indica la nota, la bandera se encuentra dentro de una USB conectada al sistema, por lo que se puede revisar dentro de la carpeta ‘media’ para ver si se encuentra allí, y revisar su contenido.
1
2
3
4
5
6
7
8
9
10
11
root@raspberrypi:~# ls /media/
usbstick
root@raspberrypi:~# ls /media/usbstick/
damnit.txt lost+found
root@raspberrypi:~# cat /media/usbstick/damnit.txt
Damnit! Sorry man I accidentally deleted your files off the USB stick.
Do you know if there is any way to get them back?
-James
root@raspberrypi:~#
Pero la bandera fue eliminada, por lo que hay que lograr encontrarla. Para esto, hay que analizar un poco la montura con ayuda del comando mount o con lsblk.
1
2
3
root@raspberrypi:~# mount | grep usbstick
/dev/sdb on /media/usbstick type ext4 (ro,nosuid,nodev,noexec,relatime,data=ordered)
root@raspberrypi:~#
1
2
3
4
5
6
7
8
9
root@raspberrypi:~# lsblk -p
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
/dev/sda 8:0 0 10G 0 disk
├─/dev/sda1 8:1 0 1.3G 0 part /lib/live/mount/persistence/sda1
└─/dev/sda2 8:2 0 8.7G 0 part /lib/live/mount/persistence/sda2
/dev/sdb 8:16 0 10M 0 disk /media/usbstick
/dev/sr0 11:0 1 1024M 0 rom
/dev/loop0 7:0 0 1.2G 1 loop /lib/live/mount/rootfs/filesystem.squashfs
root@raspberrypi:~#
Por lo que la información de la USB se encuentra alojada dentro del archivo /dev/sdb, por lo que se puede buscar los elementos que sean legibles que se encuentren dentro de ese archivo.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
strings /dev/sdb
>r &
/media/usbstick
lost+found
root.txt
damnit.txt
>r &
>r &
/media/usbstick
lost+found
root.txt
damnit.txt
>r &
/media/usbstick
2]8^
lost+found
root.txt
damnit.txt
>r &
3d3e483143ff12ec505d026fa13e020b
Damnit! Sorry man I accidentally deleted your files off the USB stick.
Do you know if there is any way to get them back?
-James
Y con esto, se puede ver la bandera y se da por completada la máquina.