악용 사례 프로그램


1

setuid 바이너리에 대해 몇 가지 질문이 있습니다. 나는 그것이 위험한 프로그램 (sudo로이 프로그램을 사용할 수 있다면, ftp, gdb 또는 find와 같이 프로그램에서 빠져 나와 루트 쉘을 얻을 수 있음)을 알고 있습니다. 예를 들어 root 권한으로 sudo ftp를 만들 수 있다면! / bin / bash를 입력하고 루트 셸을 얻을 수 있습니다.

그래서 그들이 suid 비트를 가지고 있다면이 바이너리와 같은 문제라고 생각했습니다. 그래서 내 컴퓨터에서 시도하고 여기에 문제가있다. 나는 / usr / bin / netkit-ftp (/ usr / bin / ftp는 / usr / bin / netkit-ftp에 대한 심벌 링크)에 suid 권한을 넣었다. 결과는 다음과 같습니다. ls -l /usr/bin/netkit-ftp

-rwsr-xr-x 1 root root 96968 déc.   6  2016 /usr/bin/netkit-ftp

그런 다음 ftp를 사용하여 입력 해보십시오! whoami. 결과는 루트가 아닙니다 (현재 사용자 이름).

왜 이해가 안되니? / usr / bin / netkit-ftp 바이너리가 suid 비트를 얻은 경우 루트 권한으로 실행해야합니다. (왜 내 우와미가 내 뿌리를 돌려주지 않는거야?)

코디 얼 :)


(1) 올바른 실행 파일을 실행했는지 확인하십시오 ( $PATH 다른 사람을 찾는다. ftp 에있는 것 전에 /usr/bin ). (2) SUID 루트가있는 일반 프로그램에서 실제 사용자로 대체 .
Kamil Maciorowski

답변:


1

각 프로세스에는 적어도 두 개의 UID 세트 (일반적으로 세 개 이상)가 있습니다. 그 중 하나는 "실제"UID로, 어떤 사용자 소유하다 과정. 다른 하나는 "효과적인"UID로, 허가 그 과정에는있다. Linux 설명은에서 찾을 수 있습니다. 신임장 (7) .

'setuid'프로그램이 시작되면 "유효"UID 만 변경되어 새로운 권한을 갖지만 여전히 알고 있습니다. 누구 그것을 시작했다. (sudo가 setuid 임에도 불구하고 당신이 누군지 알고있는 방법입니다.)

예:

$ sudo cp /bin/id /bin/test-id
$ sudo chmod u+s,g+s /bin/test-id

$ ls -la /bin/test-id
-rwsr-sr-x 1 root root 42K Jan  4 11:59 /bin/test-id*

$ /bin/test-id
uid=1000(grawity) gid=1000(grawity) euid=0(root) egid=0(root) groups=1000(grawity),3(sys),4(adm),10(wheel),100(users)

새로 시작된 프로그램은 이미 루트 권한을가집니다. 예를 들어, setuid 비트를 cat 또는 less, 모든 사용자는 루트 전용 파일을 읽을 수 있습니다.

프로그램은 두 가지 방향으로이 상태를 바꿀 수 있습니다. 두 가지 방향 모두 UID를 EUID로 변경할 수 있습니다 (완전히 "뿌리가 됨"). 또는 그들은 실제 UID (권한을 삭제하고 "일반"사용자로 돌아가는)로 변경할 수 있습니다. 나는 생각한다. sudo 전자는 수행하지만, 종종 후자를 수행하는 많은 프로그램을 보게됩니다.

참고로 세게 때리다 쉘은 또한 후자를 수행한다. setuid 비트를 /bin/bash, 그것은 시작시 setuid 권한을 포기할 것이며, ~ 않는 한 그것은 -p (- 권한 있음) 옵션. bash에서 이걸 볼 수 있습니다. flags.c shell.c .

이것은 중요한 이유는 ! ...에서 ftp , 제공된 명령은 직접 실행되지 않습니다. 실제로 쉘을 통해 실행되며 쉘에 적용되는 것은! - 명령에도 적용됩니다. 즉, ~에 의해 시작된 프로세스 ftp 실제로 예상대로 setuid 상태 (euid = 0)를 상속 받지만 제공된 명령을 실행하기 전에 반환합니다.

(이것은 입력하는 것을 의미합니다. !/bin/bash 실제로 * 두 개의 쉘 프로세스를 실행합니다 : 첫 번째 프로세스는 올바른 euid를 가지고 있지만 두 번째 프로세스를 시작하기 전에 권한을 삭제합니다.)

이것을 테스트하여 (그리고 무시할 수 있습니다.) ftp 다른 것을 초기 쉘로 사용하려면 다음을 수행하십시오.

$ ls -l /bin/id /bin/test-ftp
-rwxr-xr-x 1 root root  42K Aug 19 12:54 /bin/id*
-rwsr-sr-x 1 root root 137K Jan  4 12:08 /bin/test-ftp*

$ SHELL=/bin/id /bin/test-ftp
ftp> !
uid=1000(grawity) gid=1000(grawity) euid=0(root) egid=0(root) groups=0(root),3(sys),4(adm),10(wheel),100(users)
ftp>

(주의 : 모든 프로그램이 $ SHELL을 보는 것은 아니며, 일부는 항상 / bin / sh를 사용하거나 전혀 쉘을 사용하지 않습니다.)


이 설명을위한 Thx! :)
madem
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.