2人のユーザーがいますace
。ej
aceのホームディレクトリには、次の権限セットを持つシェルスクリプトであるファイルがあります(私はsetuidを使用しました)。
-rwsr--r-x 1 ace ace 15 Jan 20 05:18 /home/ace/myshellscript
スクリプトの内容は非常に簡単で、次のようになります。
echo "`whoami`"
cat ./testPrevEsc
ところで(testPrevEsc)が所有している他のファイルを読み取ろうとすれば$1を渡せばace
できそうですcat filename
。ところでわかりません、なぜですか?
setuidの私の理解は、プログラムまたはシェルが実行ユーザー(私の場合はej)ではなく所有者によって実行されることです。それでは、ファイルを読んで代わりにwhoaiを取得できないのはなぜej
ですかace
?一方sudo whoami
、実行中のユーザーではなく root 権限を付与するのに有効です。ここで何か抜けたようです。
答え1
これはbashインタプリタがそうでないために発生し、setuid
まだユーザーのuidとして実行され、ej
このような操作を実行するにはインタプリタのuidを変更する必要があります。
次の動画が役に立ちます。https://youtu.be/iv5gflNM7rc?si=o-Ren0ow-nmojgAk
上記のビデオ方法は、取得した権限に同意した場合にのみ機能しますroot
。/usr/bin/bash
どのシェルを使用しても、ルート自体が所有していますが、私たちの場合はルートではありませんace
。以下のもの。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char const *argv[])
{
printf("euid is set to %u\n", geteuid());
FILE* f = fopen("/home/ace/testPrevEsc", "r");
if(!f){
perror("File open failed");
return 1;
}else{
int c;
while ((c =fgetc(f)) != EOF)
{
putchar(c);
}
fclose(f);
}
return 0;
}
この呼び出しは、system
有効なユーザーIDを私たちの場合、権限のないユーザーにリセットするため、戻り値をasとnotでej
取得する理由です。whoami
ej
ace