두 명의 사용자가 있는데 첫 번째는 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
에 실행 중인 사용자가 아닌 루트 권한을 부여하는 데는 효과적입니다. 여기서 뭔가 빠진 것 같습니다.
답변1
이는 bash 인터프리터가 그렇지 않기 때문에 발생하며 setuid
여전히 사용자의 uid로 실행되며 ej
이와 같은 작업을 수행하려면 인터프리터의 uid를 변경해야 합니다.
다음 비디오가 도움이 될 수 있습니다 -https://youtu.be/iv5gflNM7rc?si=o-Ren0ow-nmojgAk
위의 비디오 방법은 얻은 권한에 동의하는 경우에만 작동합니다 root
. /usr/bin/bash
어떤 쉘을 사용하든 루트 자체가 소유하지만 우리의 경우 ace
루트가 아니므로 다음과 같은 ac 프로그램을 통해 방법을 사용합니다. 아래 것.
#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