> For the complete documentation index, see [llms.txt](https://4lec4st.gitbook.io/4lec4st/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://4lec4st.gitbook.io/4lec4st/writes-ups/hackmyvm/easy/friendly.md).

# Friendly

## Información de la máquina

<figure><img src="/files/EgGQQ6NeIMXUGZHDif3y" alt=""><figcaption></figcaption></figure>

Esta máquina Linux de nivel fácil permite la ejecución remota de comandos (RCE) mediante la subida de una webshell a través de un servidor FTP con acceso anónimo. Tras obtener acceso inicial y una reverse shell, exploramos el sistema y descubrimos que el binario `vim` puede ejecutarse como root sin contraseña mediante sudo. Aprovechamos esta configuración para escalar privilegios y acceder a la flag final ubicada en un directorio inusual del sistema.

***

## Reconocimiento

La fase de **reconocimiento** es el primer paso a la hora de resolver una máquina. Su objetivo es recopilar la mayor cantidad de información posible sobre el sistema objetivo, permitiendo entender su estructura, tecnología y posibles vectores de ataque.&#x20;

Empezaremos haciendo un ping a la máquina víctima para ver si está encendida y ante que nos enfrentamos.

<figure><img src="/files/SFM6mRfbdSr3poqWcXSQ" alt=""><figcaption></figcaption></figure>

Si recibimos respuesta, significa que la máquina está en línea. Además, observamos que el **TTL** (Time To Live) es **64**, lo que indica que es un sistema **Linux** (normalmente, los sistemas Windows tienen un TTL de 128).&#x20;

Empezaremos haciendo un primer reconocimiento para ver los puertos abiertos en el sistema.

<figure><img src="/files/wcsHTB5Ig4ZS7SqHnaux" alt=""><figcaption></figcaption></figure>

**1. `-p-` → Escaneo de todos los puertos (1-65535)**

Por defecto, `nmap` solo escanea los **1000 puertos más comunes**.\
Con `-p-`, forzamos a que escanee **los 65,535 puertos** de la máquina objetivo, lo que puede ser útil para encontrar servicios que corren en puertos poco convencionales.

**2. `--open` → Filtrar solo los puertos abiertos**

Cuando escaneamos un sistema, muchos puertos pueden estar cerrados o filtrados por un firewall.\
Este parámetro hace que `nmap` **solo muestre los puertos abiertos**, reduciendo el ruido y facilitando el análisis.

**3. `-sS` → Stealth Scan (Escaneo Sigiloso con SYN)**

Es conocido como **"TCP SYN Scan"**, y funciona de la siguiente manera:

* `nmap` envía un paquete **SYN** (solicitud de conexión).
* &#x20;Si el puerto está abierto, el servidor responde con **SYN-ACK**.
* En lugar de completar la conexión con un **ACK**, `nmap` responde con un **RST (Reset)**, interrumpiendo la comunicación.

**4. `--min-rate 5000` → Velocidad mínima de paquetes (5000 por segundo)**

Por defecto, `nmap` ajusta dinámicamente la velocidad de los paquetes según la respuesta de la red.\
Con `--min-rate 5000`, obligamos a `nmap` a **no enviar menos de 5000 paquetes por segundo**, acelerando el escaneo.

**5. `-n` → Deshabilitar resolución DNS**

Normalmente, `nmap` intenta resolver el nombre de dominio de las IPs escaneadas (DNS lookup).\
Con `-n`, evitamos esta resolución de nombres, lo que **acelera el escaneo** y evita que los servidores DNS registren nuestra actividad.

**6. `-Pn` → Omitir detección de host (Host Discovery Off)**

Por defecto, `nmap` envía paquetes ICMP (ping) para ver si un host está activo antes de escanearlo.\
Si un firewall bloquea los pings, `nmap` puede marcarlo como "host down" y no escanearlo.

**7. `-on`** **→ Exportar el contenido en formato normal**

Todo el resultado del escaneo lo exportaremos en un archivo llamado **`allPorts` .**

El escaneo revela que los puertos **21 (FTP)** y 80 **(HTTP)** están abiertos. Ahora realizamos un escaneo más detallado:

<figure><img src="/files/L1TFMUmqmMmFdaG7pl5f" alt=""><figcaption></figcaption></figure>

**1. `-p21,80` → Escaneo de puertos específicos**

Con `-p21,80`, le indicamos que **solo** escanee los puertos **21 (FTP)** y 8**0** (HTTP).

**2. `-sCV` → Escaneo de versiones y scripts básicos**

Este parámetro en realidad es **dos combinaciones en una**:

* **`-sC`** → Activa los **NSE scripts por defecto** en `nmap` (similar a usar `--script=default`).\
  🔹 Ejecuta scripts básicos para enumerar información del servicio detectado, como banners, versiones, etc.
* **`-sV`** → Realiza **fingerprinting de versiones**, intentando identificar la versión exacta del software en cada puerto abierto.

**3. `-oN` → Guardar el resultado en formato Normal**

Por defecto, `nmap` muestra los resultados en pantalla, pero con **`-oN targeted`**, guardamos el resultado en un archivo en **formato legible para humanos**.

***

## Enumeración y escaneo de vulnerabilidades

Empezamos realizando un escaneo de puertos para ver qué servicios están abiertos. Uno de los resultados interesantes es el puerto **FTP**, el cual permite acceso anónimo. Esto quiere decir que podemos conectarnos como `anonymous` sin necesidad de contraseña.

Una vez dentro del FTP, encontramos un archivo llamado `index.html`. Esto sugiere que estamos viendo los archivos de la página web servida por Apache, probablemente la página por defecto.

<figure><img src="/files/FTkclXwHFCMDoqWkdjjK" alt=""><figcaption></figcaption></figure>

Esto es lo que vemos en la web

<figure><img src="/files/NPOS2mk6JeIKrV4KJgBW" alt=""><figcaption></figcaption></figure>

***

## Explotación de las vulnerabilidades

Sabiendo que podemos subir archivos al FTP, aprovechamos esta funcionalidad para subir un archivo **PHP malicioso** que nos permita ejecutar comandos en el servidor de forma remota. Este tipo de archivo suele contener una pequeña webshell con funciones como `system($_GET['cmd'])` o similares.

<figure><img src="/files/s74oTMqJ4acUWfRpXMVK" alt=""><figcaption></figcaption></figure>

Subimos el archivo PHP al servidor a través del FTP, y luego lo accedemos desde el navegador apuntando a su ruta dentro del sitio web.

<figure><img src="/files/7dRrLSJlmtrZzLKTSPfd" alt=""><figcaption></figcaption></figure>

hacerlo, confirmamos que tenemos **RCE (Remote Command Execution)**, ya que el servidor ejecuta comandos que le pasamos por la URL.

<figure><img src="/files/0r5RvKFL1sLABc5D855D" alt=""><figcaption></figcaption></figure>

Para obtener una **reverse shell**, codificamos adecuadamente los caracteres especiales (como `&`) en la URL, usando **URL encoding**, y ejecutamos una carga útil que hace que la máquina víctima se conecte de vuelta a nuestro listener.

<figure><img src="/files/Az7VNRqbOFNDUmjEkT48" alt=""><figcaption></figcaption></figure>

Con esto, obtenemos una shell remota completamente funcional dentro del sistema.

<figure><img src="/files/FHoKQkBE2lkcR5DQdqYt" alt=""><figcaption></figcaption></figure>

Ya con acceso como un usuario normal en la máquina, navegamos por el sistema de archivos y localizamos la **primera flag.**

<figure><img src="/files/n6qDoACNxgbPajBQDloT" alt=""><figcaption></figcaption></figure>

***

## Post Explotación y escalada de privilegios

Durante la enumeración post-explotación, revisamos los privilegios del usuario actual y vemos que puede ejecutar el comando `vim` con permisos de **sudo** sin necesidad de contraseña.

<figure><img src="/files/3cOAUHXGP7Fr2vyjf19F" alt=""><figcaption></figcaption></figure>

Buscamos este binario en GTFOBins, una base de datos de métodos de escalada de privilegios usando binarios comunes. Según GTFOBins, podemos usar `vim` para escapar a una shell con privilegios de **root** ejecutando un comando específico desde el propio editor.

<figure><img src="/files/ivrDz35OgtSdwfTAyw8U" alt=""><figcaption></figcaption></figure>

Ejecutamos ese comando y conseguimos acceso como **root**.

<figure><img src="/files/wsNVddmkXyVV7Kty5iCO" alt=""><figcaption></figcaption></figure>

Buscando la flag de root, vemos que el típico archivo `/root/root.txt` no es el correcto, ya que nos dicen que busquemos **otro** archivo llamado `root.txt`.

<figure><img src="/files/UdmqvIuq9Nz5DEeGsVPf" alt=""><figcaption></figcaption></figure>

Con el uso de find y grepeando por root, encontramos otro archivo root.txt en el directorio /var/log/apache2, lo leemos y tenemos la flag de root.

Leemos su contenido… ¡y ahí está la flag final de root!

<figure><img src="/files/j6j1btjRMvYUyvKEWpzF" alt=""><figcaption></figcaption></figure>

***

## Conclusión

Esta máquina nos enseña a explotar un servidor FTP con acceso anónimo para lograr RCE mediante la subida de una webshell en PHP, y a escalar privilegios abusando de la configuración de sudo para el binario `vim`. Ambas técnicas nos permitieron obtener acceso completo al sistema y leer la flag de root.
