이번에는 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의 효력은 없어지고 원래대로 돌아옴
[참고]
마지막으로 정리를 하자면
일반적으로 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 |