
スタック、PIE、カナリアリークを発見し、%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"
作者: DiegoAltF4
GLUFS を使用すると、フォーマット文字列の脆弱性を利用してリークを見つける面倒なプロセスを自動化できます。 これにより、スタックリーク、PIEリーク、カナリアリークを見つけることができ、それぞれの場合においてリークを提供するペイロードが示されます。 さらに、リーク内で「flag」文字列を検索できるモードも含まれています。このモードでは、%s または %p の指定子を使用できます。
| パラメータ | 情報 |
|---|---|
| -b | このオプションを選択して、悪用するバイナリを指定します。 |
| -max | このオプションを選択して、テストする最大値を指定します。範囲: (min, max)。デフォルトでは max = 40 |
| -min | このオプションを選択して、テストする最小値を指定します。範囲: (min, max)。デフォルトでは min = 1 |
| -ip | このオプションを選択して、リモートサーバーの IP を指定します。 |
| -port | このオプションを選択して、リモートサーバーのポートを指定します。 |
| -flag | このオプションを選択して、検索するフラグの先頭を指定します。 |
| -arch | このオプションを選択して、アーキテクチャ(32 または 64)を設定します。 |
| --s | このオプションを選択して、%p の代わりに %s を使用します。 |
| --canary | このオプションを選択して、カナリアリークが存在する位置を見つけます。 |
| --leaks | このオプションを選択して、見つかったすべてのリークを出力します。 |
| --pie | このオプションを選択して、PIEリークが存在する位置を見つけます。 |
| --stack | このオプションを選択して、スタックリークが存在する位置を見つけます。 |
| --v | このオプションを選択して、冗長モードを設定します。 |
この例では、GLUFS を使用して PIE とカナリアのリークを取得します。
例として使用するバイナリは、TryHackMe ルーム pwn101 のチャレンジ 7 に対応するものです TryHackMe ルーム pwn101。
バイナリを指定するために -b オプション、反復の開始値を指定するために -min オプション、反復の終了値を指定するために -max オプションを使用します。さらに、カナリアと PIE に関する情報を取得したいと考えています。
./glufs.py -b ./pwn107.pwn107 -min 5 -max 15 --pie --canary

この例では、GLUFS を使用してフラグを取得します。
解決するチャレンジは 247CTF プラットフォームの Confused environment read です。
この例ではバイナリを使用しません。IP とポートのみがあります。そのため、アドレスを指定するために -ip オプション、ポートを指定するために -port オプション、検索するフラグの先頭を指定するために -flag オプションを使用します。また、バイナリがないため、アーキテクチャを指定する必要があります。この場合は x86-64 です(-arch 64)。反復の開始を -min、終了を -max で指定します。さらに、%p の代わりに %s を使用するために -s オプションを使用します。
./glufs.py -ip 3bcbadabd1a7e914.247ctf.com -port 50387 -flag 247CTF -arch 64 -min 1 -max 200 --s

この例では、GLUFS を使用してフラグを取得します。
解決するチャレンジは PicoCTF プラットフォームの flag leak です。
この例では、サーバーアドレスを指定するために -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
コードを変更してバイナリ/チャレンジに適合させることが非常に重要です。そのために、コード内に区切られた 2 つのセクションがあり、フォーマット文字列のリークを取得するため、およびペイロードを送信するタイミングを設定するために変更を加える必要があります。
例: 上記の 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
#######################################################################