2017-11-25 20 views
-1

root로 bash를 열 수있는 C 프로그램을 작성하고 싶지만 암호는 입력하지 마십시오.암호없이 root로 C 프로그램 실행하기

#include <unistd.h> 
#include <stdio.h> 

int main(void) 
{ 
    char *argv[] = { "/bin/bash","-c","sudo /bin/bash",0 }; 
    execve(argv[0], &argv[0],0); 
    return 0; 
} 

내 시스템은 리눅스 민트 18.2 소냐이고, 나는이 2 개의 명령

chown root:root a.out 
chmod u=srwx,go=xr a.out 

하지만 난 이것을 실행하려고 할 때 아직도, 그것은 암호를 묻습니다을 설정합니다. 다른 옵션이 있으면/etc/sudoers를 편집하고 싶지 않습니다.

+3

루트의 암호를 지정하지 않고 (sudoers 또는 다른 수단을 통해 명시 적으로 권한을 부여하지 않고) 실행중인 프로그램을 루트 권한으로 허용하면 보안 취약점처럼 들릴지 모르겠다 고 생각하지 않습니까? –

+0

일부 특정 경우에는 그렇지 않습니다. 전체 그림을 알 때까지 판단 할 수 있습니까? OP *는 위험에 대해 경고를 받거나 전체 그림이 무엇인지 설명해야합니다. 많은 프로그램 (특히 데몬)에는 setuid 비트가 있고 루트로 실행되며 대개 일반 사용자로 setuid()를 수행 한 다음 초기화합니다. –

+0

@DanielKamilKozar OP에는 소유자를 루트로 설정하고 SETUID를 설정할 수있는 기능이 있습니다. – iBug

답변

0

작성중인 거대한 보안 구멍입니다. 네가 알고있는 한 오래. 사실 sudoers를 편집하고 싶지 않은 이유를 이해할 수는 없지만 단순히 sudoers를 실행하면 루트 셸을 만드는 프로그램이있는 것이 좋습니다. 이제 당신이 할 일은, 컴파일 루트에 실행 파일의 파일 소유자를 설정하고 SUID 권한을 설정입니다

#include <unistd.h> 
#include <stdio.h> 

int main(int argc, char *argv[], char *envp[]) { 
    char *args[] = { "/bin/bash", NULL }; 
    execve(args[0], args, envp); 

    perror("Running bash failed"); 
    return 1; 
} 

: 그렇게 말

, 여기에 프로그램입니다.

코드가 실패한 이유는 SUID가 UID로 설정했기 때문입니다. 실제 UID는 여전히 사용자이므로 sudo은 암호를 묻습니다.

위와 같이 명령을 실행하면 쉘을 유효한 루트로 실행할 필요가 없습니다. 위의 코드와 같습니다.

이 코드의 하나의 단점은이 루트에 실제 UID를 설정하지 않고,에 로그를 수행하지 않는 당신을 위해 문제의 경우, 원래의 프로그램을 유지, 그러나 그것의 시작 부분에 추가하는 것입니다

:.

setresuid(0, 0, 0); 
setresgid(0, 0, 0);