私はバッファオーバーフロー攻撃を試みていましたが、ルートシェルを取得するために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からのコメントを読んだ後:
-p
_オプションを使用すると、bashが起動したときに特権を確実に保持できます。最近のバージョンの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;
}
_