
Автоматизированный инструмент эксплуатации уязвимости форматной строки для обнаружения утечек stack, PIE и canary с возможностью поиска флага через спецификаторы %s или %p.
.d8888b. 888 888 888 8888888888 .d8888b.
d88P Y88b 888 888 888 888 d88P Y88b
888 888 888 888 888 888 Y88b.
888 888 888 888 8888888 "Y888b.
888 88888 888 888 888 888 "Y88b.
888 888 888 888 888 888 "888
Y88b d88P 888 Y88b. .d88P 888 Y88b d88P
"Y8888P88 88888888 "Y88888P" 888 "Y8888P"
By: DiegoAltF4
GLUFS позволяет автоматизировать утомительный процесс поиска утечек с помощью уязвимостей форматной строки. Он позволяет находить стековые утечки, утечки PIE и canary-утечки, в каждом случае указывая полезную нагрузку, обеспечивающую утечку. Кроме того, он включает режим, позволяющий искать строку "flag" в утечках. Для этого режима можно использовать спецификаторы %s или %p.
| Параметр | Информация |
|---|---|
| -b | Выберите этот параметр, чтобы указать эксплуатируемый бинарный файл. |
| -max | Выберите этот параметр, чтобы указать максимальное тестируемое значение. Диапазон: (min, max). По умолчанию max = 40 |
| -min | Выберите этот параметр, чтобы указать минимальное тестируемое значение. Диапазон: (min, max). По умолчанию min = 1 |
| -ip | Выберите этот параметр, чтобы указать IP-адрес удалённого сервера. |
| -port | Выберите этот параметр, чтобы указать порт удалённого сервера. |
| -flag | Выберите этот параметр, чтобы указать начало искомого флага. |
| -arch | Выберите этот параметр, чтобы задать архитектуру (32 или 64). |
| --s | Выберите этот параметр, чтобы использовать %s вместо %p. |
| --canary | Выберите этот параметр, чтобы найти позицию, где находится canary-утечка. |
| --leaks | Выберите этот параметр, чтобы вывести все найденные утечки. |
| --pie | Выберите этот параметр, чтобы найти позицию, где находится PIE-утечка. |
| --stack | Выберите этот параметр, чтобы найти позицию, где находится стековая утечка. |
| --v | Выберите этот параметр, чтобы включить подробный режим. |
Для этого примера мы воспользуемся GLUFS, чтобы получить PIE- и canary-утечку.
Бинарный файл, который мы возьмём в качестве примера, соответствует заданию 7 комнаты TryHackMe pwn101 TryHackMe room pwn101.
Мы используем опцию -b для указания бинарного файла, -min для указания начального значения итерации и -max для указания конечного значения итерации. Кроме того, мы хотим получить информацию о canary и PIE.
./glufs.py -b ./pwn107.pwn107 -min 5 -max 15 --pie --canary

Для этого примера мы воспользуемся GLUFS, чтобы получить флаг.
Задача, которую мы решаем — Confused environment read с платформы 247CTF.
В этом примере мы не используем бинарный файл. У нас есть только IP и порт. Поэтому мы используем опцию -ip для указания адреса, -port для указания порта, -flag для указания начала искомого флага. Кроме того, так как у нас нет бинарного файла, нужно указать архитектуру, в данном случае x86-64 (-arch 64). Мы также укажем начало итерации с помощью -min и конец итерации с помощью -max. Кроме того, мы используем опцию -s, чтобы использовать %s вместо %p.
./glufs.py -ip 3bcbadabd1a7e914.247ctf.com -port 50387 -flag 247CTF -arch 64 -min 1 -max 200 --s

Для этого примера мы воспользуемся GLUFS, чтобы получить флаг.
Задача, которую мы решаем — flag leak с платформы PicoCTF.
В этом примере мы используем опцию -ip для указания адреса сервера, -port для указания порта сервера, -b для указания бинарного файла, -flag для указания начала флага и, наконец, указываем начало и конец итерации с помощью -min и -max. Если не указать опцию --s, по умолчанию будет использоваться формат %p.
./glufs.py -ip saturn.picoctf.net -port 50563 -b ./vuln -flag picoCTF -min 20 -max 200

git clone https://github.com/Diego-AltF4/GLUFS.git
cd GLUFS/
pip3 install -r requirements.txt
chmod +x ./glufs.py
Очень важно изменить код, чтобы адаптировать его под ваш бинарный файл/задачу. Для этого в коде есть два размеченных раздела, в которых необходимо внести изменения, чтобы получить утечку форматной строки, а также настроить момент отправки полезной нагрузки.
Примеры: Для задачи picoCTF, описанной выше, используется следующая конфигурация:
#######################################################################
# This is the part that you must modify to fit your binary. #
#######################################################################
p.sendlineafter(b'>>', payload)
p.recvuntil(b'-')
leak = p.recv().strip(b'\n')
#print(leak) ## For debugging errors
#######################################################################