Linux システムでは、setuid プログラムが存在するディレクトリのアクセス許可は、カーネルがプロセスを起動する方法に影響しますか? 私が尋ねる理由は、2 つの異なるディレクトリで同一の setuid プログラムをコンパイルしたときに、実際には 1 つのディレクトリのユーザー権限しか想定していなかったからです。コンパイルしましたが、アクセスしようとしているユーザー アカウントはどこに/tmp
ありますか。から実行すると、期待どおりに権限がエスカレートされませんでしたが、下では機能しました。/home/flag03
flag03
/tmp
/home
問題の背景:
私は、exploit-exercises.com /nebula のレベル 03 に取り組んでいます。flag03
この演習では、ユーザー アカウントへのアクセス権を取得する必要があります。この演習は、flag03
ユーザーが特定のディレクトリでスクリプトを実行できるようにする cronjob を定期的に実行するように設定されています。私の計画は、それ自体が bash シェルを起動する setuid プログラムをコンパイルする単純な bash スクリプトを作成し、次に setuid ビットを で設定することchmod +s
でした。アイデアは、setuid プログラムがコンパイルされるときに、flag03
cronjob を介してユーザーによってコンパイルされるというものです。この新しくコンパイルされたプログラムが実行されると、シェルが 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
、やや「特別な」ディレクトリであることに関連していますか?
この長ったらしい質問に関心をお寄せいただきありがとうございます。