3

Linux システムでは、setuid プログラムが存在するディレクトリのアクセス許可は、カーネルがプロセスを起動する方法に影響しますか? 私が尋ねる理由は、2 つの異なるディレクトリで同一の setuid プログラムをコンパイルしたときに、実際には 1 つのディレクトリのユーザー権限しか想定していなかったからです。コンパイルしましたが、アクセスしようとしているユーザー アカウントはどこに/tmpありますか。から実行すると、期待どおりに権限がエスカレートされませんでしたが、下では機能しました。/home/flag03flag03/tmp/home


問題の背景:

私は、exploit-exercises.com /nebula のレベル 03 に取り組んでいます。flag03この演習では、ユーザー アカウントへのアクセス権を取得する必要があります。この演習は、flag03ユーザーが特定のディレクトリでスクリプトを実行できるようにする cronjob を定期的に実行するように設定されています。私の計画は、それ自体が bash シェルを起動する setuid プログラムをコンパイルする単純な bash スクリプトを作成し、次に setuid ビットを で設定することchmod +sでした。アイデアは、setuid プログラムがコンパイルされるときに、flag03cronjob を介してユーザーによってコンパイルされるというものです。この新しくコンパイルされたプログラムが実行されると、シェルが user として起動されますflag03。これが目標です。

以下は単純な setuid プログラムです (l3.c、レベル 1 + 2 に基づく):

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

int main(int argc, char **argv, char **envp)
{
  uid_t uid;
  gid_t gid;

  uid = geteuid();
  gid = getegid();

  setresuid(uid,uid,uid);
  setresgid(gid,gid,gid);
  printf("uid: %d\n", getuid());
  printf("gid: %d\n", getgid());
  system("/bin/bash");

  return 0;
}

これを機能させるために、bash スクリプトはプログラムをユーザーとしてコンパイルし、flag03次に setuid ビットを chmod します。

#!/bin/bash

#gcc -o /tmp/l3 /tmp/l3.c
#chmod +s,a+rwx /tmp/l3
gcc -o /home/flag03/l3 /tmp/l3.c
chmod +s,a+rwx /home/flag03/l3

で生成された実行可能ファイル/tmpは権限を期待どおりにエスカレートしませんが、で生成されたもの/home/flag03は期待どおりに機能します。

/tmp: にコンパイルされた setuid プログラムのバージョンを に移動し/home/flag03、setuid ビットをリセットする新しい bash スクリプトを作成しました。そこから実行すると、そのバージョンも機能しました。そのため、setuid プログラムが存在するディレクトリのアクセス許可は、プロセスの起動方法に何らかの影響を与えているようです。多分これは/tmp、やや「特別な」ディレクトリであることに関連していますか?

この長ったらしい質問に関心をお寄せいただきありがとうございます。

4

1 に答える 1

3

ファイルシステムがnosuidオプションでマウントされている場合、そこにあるファイルを実行するときに suid ビットは無視されます。私が理解しているように、/tmp通常はオプションtmpfsでマウントされた別のファイルシステム(多くの場合)です。この構成の動機は、 (たとえば)nosuid以外に書き込み可能なストレージを持たない侵害されたアカウントがsuid バイナリを生成できないようにすることです。suid バイナリは、特定の精巧な多段階攻撃で特権を昇格するために使用される可能性があります。/tmpnobody

于 2014-07-16T21:15:16.417 に答える