이곳이 맞는지 아닌지를 몰라서 죄송합니다. 나는 시간에 쫓기며 서두르고 있다. Linux 시스템에 다음 속성을 가진 파일이 있습니다. (커널 2.6.26)
-rwxrwxrwx 1 root root 25 2015-06-01 08:08 /usr/bin/runme
컴퓨터에 루트 권한이 없고 루트 비밀번호도 모릅니다. 이 스크립트를 소유자로 실행할 수 있습니까? 다른 파일에 일부 C 코드를 작성하고 컴파일했지만 작동하지 않았습니다. 내가 사용한 코드;
#include <unistd.h>
#include <errno.h>
int main(void) {
setuid(0);
system("/bin/bash /usr/bin/runme");
}
그런 다음 누군가 execve를 사용한다고 말했지만 결과는 변경되지 않았습니다. execve를 사용할 때의 코드는 다음과 같습니다.
#include <unistd.h>
#include <errno.h>
int main(void) {
extern char * const environ[];
char * const command[] = {"runme", NULL, NULL, NULL, NULL,NULL, NULL};
execve("/usr/bin/runme", command, environ);
}
답변1
가능하지만 매우 조심해야 하는 것은 스크립트에 전역 읽기-쓰기 권한이 있다는 것입니다.누구나그것을 바꿀 수 있었고, 따라서 할 수 있었다아무것루트로.
그것은 일종의 보안 허점입니다. 당신이정상사용자로 실행하려면 바이너리를 사용하여 setuid
바이너리에 플래그를 추가해야 합니다 chmod g+s
. 이 작업은 루트로 수행해야 합니다. 그렇게 하지 않으면 엄청난 보안 허점이 생기기 때문입니다.
스크립트로 작업하려는 경우... 스크립트 언어에 따라 다릅니다. 일부(실제로 많은)는 구현 방식, 즉 보안 위험 때문에 작업을 거부합니다.
여기에 갈 루트(원문)는 sudo
"수퍼유저가 수행하는 작업"이며 권한이 없는 사용자가 권한 있는(또는 루트) 계정으로 명령을 실행할 수 있도록 허용하는 것입니다. 그런 다음 일단 구성되면 다음을 수행할 수 있습니다.
sudo /path/to/script
하지만 나는 여전히 그 스크립트 세계를 쓰기 가능한 상태로 두지 않을 것입니다. 이는 여전히 보안 위험입니다.
루트도 없고, 루트 비밀번호도 없고, 관리자 액세스 권한도 없다면... 그 이유는 해당 시스템이 귀하의 시스템이 아니기 때문이라고 생각하며, 이 작업을 중단하는 것이 컴퓨터 오용일 가능성이 높으며 위치에 따라 범죄가 될 수 있기 때문입니다. 당신은 살고 있습니다.
답변2
해당 사용자가 특정 시점에 해당 권한을 부여하지 않는 한 다른 사용자로서 스크립트(또는 실행 파일)를 실행할 수 있는 방법은 (취약성을 사용하지 않고) 없습니다.
"실제" 실행 파일의 경우 파일 소유자가 설정할 수 있는 setuid 비트를 사용하여 이를 수행할 수 있습니다. 스크립트의 경우 최신 환경은 일반적으로 setuid 비트를 무시하므로 일종의 래퍼(사용자 지정 래퍼 또는 sudo)가 필요합니다. 보다https://unix.stackexchange.com/questions/364/allow-setuid-on-shell-scripts자세한 내용은
귀하의 구체적인 사례는 setuid 비트가 어떻게 위험할 수 있는지 보여주는 훌륭한 예입니다. 누구나 쓰기 및 실행이 가능한 파일에 setuid 비트가 있으면 파일 소유자로서 모든 명령을 실행할 수 있습니다. 파일 소유자는 실제로 루트이므로 해당 파일의 내용을 예를 들어 bash의 내용으로 바꾸면 루트 쉘이 부여됩니다.