Bash

Bash 從哪個版本刪除特權?

  • September 20, 2019

我一直在嘗試進行一些緩衝區溢出攻擊,並且我認為我可以使用system("/bin/bash")它來獲取 root shell。

然後我閱讀system().

它說:

system()事實上,在/bin/shbash 版本 2 的系統上,具有 set-user-ID 或 set-group-ID 特權的程序無法正常工作,因為 bash 2 在啟動時會放棄特權。

我正在攻擊的系統有一個 bash 版本 4.3,當我使用 a 時system("/bin/bash"),我沒有獲得 root 權限(當然我正在攻擊的初始程序以 root 權限開始)。我的問題是:系統會僅在 bash 版本 2 上放棄特權,還是會為任何版本 > 2 的 bash 放棄特權?

編輯:/bin/bash只是放棄特權,而/bin/dash/bin/sh不。

閱讀@StéphaneChazelas 的評論後,EDIT2:

  • 檢查此連結以獲取有關 bash 刪除權限的更多解釋和準確性。
  • -p選項可用於確保在 bash 生成時保持特權。

目前版本

最新版本的 bash 將放棄特權,除非它以-p. 從描述特權模式的bash(1)部分:

如果 shell 以不等於實際使用者(組) id 的有效使用者(組) id 啟動,並且未提供**-p選項,**

$$ … $$有效使用者 id 設置為真實使用者 id。如果在啟動時提供了**-p**選項,則不會重置有效使用者 ID。關閉此選項會導致有效使用者和組 ID 設置為真實使用者和組 ID。

歷史版本

你問“從哪個版本……?”。自活動 git 儲存庫(版本 1.70)中可用的最早修訂版以來,您引用的部分system()一直沒有改變。這是在 2004 年簽入的,評論表明它最後一次修改是在 2001 年。

Bash 版本 3 於 2004 年發布。這意味著 bash 2 將是當時的目前/最新版本。如此有效,它在說“…bash 版本 2 或更高/更新”,即。第 2 版開始就是這種情況。

為了自己確認,你可以嘗試建構一些中間版本並測試它們,或者查閱 bash git 儲存庫。負責的線路是:

 if (running_setuid && privileged_mode == 0)
   disable_priv_mode ();

這些從2.0 版開始就存在了。回顧1.14.7 版本,bash 只會在特權模式被顯式禁用時放棄特權+p

   case 'p':
     if (on_or_off == '+')
     {
       setuid (current_user.uid);
       setgid (current_user.gid);
       current_user.euid = current_user.uid;
       current_user.egid = current_user.gid;
     }

引用自:https://unix.stackexchange.com/questions/451048