web-dev-qa-db-ja.com

Bashはどのバージョンから特権を削除しますか?

私はバッファオーバーフロー攻撃を試みていましたが、ルートシェルを取得するためにsystem("/bin/bash")を使用できると思いました。

次に system() のドキュメントを読みます。

それは言う:

system()は、実際には、_/bin/sh_がbashバージョン2であるシステムで、set-user-IDまたはset-group-ID特権を持つプログラムから適切に機能しません。起動。

私が攻撃しているシステムにはbashバージョン4.3があり、system("/bin/bash")を使用すると、root権限を取得できません(もちろん、攻撃対象の初期プログラムはroot権限で始まります)。私の質問は次のとおりです。システムはbashバージョン2でのみ特権をドロップしますか、それともバージョン> 2のbashの特権をドロップしますか?

編集:_/bin/bash_は特権を削除しますが、_/bin/dash_または_/bin/sh_は削除しません。

@StéphaneChazelas、EDIT2からのコメントを読んだ後:

  • check this link より詳細な説明とbashのドロップ特権についての正確さ
  • _-p_オプションを使用すると、bashが起動したときに特権を確実に保持できます。
5
Nark

現行版

最近のバージョンのbashでは、_-p_で開始されていない限り、特権が削除されます。特権モードを説明する bash(1) のセクションから:

有効なユーザー(グループ)IDが実際のユーザー(グループ)IDと等しくない状態でシェルが起動され、-pオプションが指定されていない場合、[...]実効ユーザーIDは実際のユーザーIDに設定されます。起動時に-pオプションが指定されている場合、実効ユーザーIDはリセットされません。このオプションをオフにすると、有効なユーザーIDとグループIDが実際のユーザーIDとグループIDに設定されます。

過去のバージョン

あなたは「どのバージョンから…?」と尋ねました。引用しているsystem()の部分は、アクティブなgitリポジトリで利用可能な最も古いリビジョン (version 1.70) 以降変更されていません。これは2004年にチェックインされ、コメントはそれが2001年に最後に変更されたことを示しています。

Bashバージョン3は2004年にリリースされました 。つまり、bash 2がその時点での最新バージョンでした。つまり、「... bashバージョン2以降/新しい」ということです。これはバージョン(2)以降に該当します

自分で確認するには、いくつかの中間バージョンをビルドしてテストするか、bash git repository を参照してください。担当する行は次のとおりです。

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

それらは バージョン2. 以降存在しています。 バージョン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;
      }
_
2
JigglyNaga