이번에는 SUID에 대해 잘못알고 있었던 내용으로 인해 꽤 오래 삽질했다....


환경

1. /bin/sh 파일 ( rws r-x r-x root root ...)

2. vi /etc/shadow 명령어를 통해서 변경을 하려함.

3. 변경 불가



잘못알고있던 내용 

1. SUID가 걸려있으므로 실행 시 process 소유주 권한으로 파일이 실행될 것이다.

2. vi /etc/shadow 하면 현재 root권한이므로 수정가능할 것이다.




지금부터 정리하겠습니다.




SUID 동작 과정


SUID가 걸린 프로세스를 실행하면 바뀌는것은 EUID가 바뀌는것이다. RUID(즉, uid)는 변함없다. 

자, 지금부터 A(/bin/sh)  B(vi /etc/shadow)라고 가정하자. 물론 A는 SUID걸린 프로그램이다.


1. user1계정이 A를 실행하면 (EUID: root // RUID: user1) 이다.

2. 이때 새로운 프로세스 B를 실행시키면 EUID는 RUID에 맞춰 변경한다. (최근커널에는 보안상)

   (EUID: user1 // RUID: user1)

3. 결국 /etc/shadow는 root파일인데 user1권한으로 vi를 하게 되는 꼴이된다.

4. 결국 수정 불가!!!



하지만 RUID를 못바꾸는 것은 아니다. 아래 예제를보자

-----------------------------------------------------------------------

#include<stdio.h>
int main()
{ 

setreuid(0 , 0);

system("/bin/sh");

return 0;

}

-----------------------------------------------------------------------


이번에는 A라는 프로세스를 위 예제라고 가정하자. 여기서도 마찬가지로 

(rws r-x r-x) 권한을 가지고 있다.


1. user1계정이 저 프로그램을 실행하면 EUID: root // RUID: user1 일 것이다.

2. 그 후 setreuid(0,0)로 인해 현재 EUID:root이니까 RUID도 user1 -> root로 바뀐다.

3. system("/bin/sh")을 실행하면 EUID,RUID 모두 root로 /bin/sh를 실행하게된다.

4. RUID가 root인 쉘 실행 성공!!!!!

5. 프로그램이 종료되면 setreuid의 효력은 없어지고 원래대로 돌아옴



[참고]

https://kldp.org/node/69198

http://idkwim.tistory.com/78




마지막으로 정리를 하자면

일반적으로 EUID와 RUID는 같다. 그렇지만 Setuid가 걸린 프로세스를 실행하게 된다면 EUID는 실행시킨 프로세스의 소유주 권한으로 변경이 된다.

그러다가 실행시킨 프로세스 내부에 어떤 동작을 하는 코드를 만난다? --> ruid가 euid로 변경되는 함수가 없는 한 ruid권한으로 실행된다.  
setuid가 걸린 프로세스 소유주 권한으로 동작시키고 싶으면 ruid를 setuid(geteuid())이런식으로 ruid를 euid로 맞춰줘야함.



'System Hacking > 정리' 카테고리의 다른 글

IDA 리모트 디버깅 설정  (0) 2015.11.11
소멸자(.dtors) +4 하는 이유  (0) 2015.11.10
FSB 소멸자 주소가 아닌 ret주소를 이용한 공격  (0) 2015.11.10
/proc/pid/maps  (0) 2015.11.09
; cat 을 쓰는 이유  (0) 2015.11.03

+ Recent posts