✅ SetUID
root 계정에서 permission 변경 후 원래는 사용자가 접근할 수 없었던 파일에 접근하는 과정을 알아보자
만약 사용하던 계정이 root 계정이었다면 su - user를 통해 계정을 일반 사용자로 변경한다.
whoami를 통해 계정 정보를 확인하면 user라고 뜨는 것을 확인할 수 있고 user의 id는 1000임을 알 수 있다.
이후, 'passwd' 명령어를 통해 패스워드를 변경하려고 하면 변경 가능한것을 확인할 수 있다.
사용자들의 passwd는 일반적으로 /etc/shadow 에 적혀있는데 이를 ls -l 명령어로 확인해보면
일반 사용자에게는 쓰기 권한이 부여되어 있지 않은 것을 확인할 수 있다.
/usr/bin/passwd 에는 패스워드를 변경하기 위해 사용하는 명령어인 passwd가 명령어 형태로 존재한다.
이 명령어는 계정을 가진 사용자라면 누구나 사용 가능하다.
user 계정으로 more 명령어를 사용하여 etc/shadow에 접근하면 "허가 거부"라고 뜨는 것을 확인할 수 있다.
root 계정으로 로그인을 한 후 chmod u+s /usr/bin/more 명령줄을 통해 /usr/bin/more 의 퍼미션을 변경한다.
이때 chmod u+s [파일명] 은 SetUID를 설정한다는 뜻이다.
다시 user 계정으로 돌아와서 more 명령어를 이용하여 /etc/shadow의 내용을 확인하면
이번에는 "허가 거부" 대신 내용을 확인할 수 있다.
정리해보면, 계정 사용자의 정보를 보관하는 파일인 passwd 파일은 거의 대부분 /etc/passwd 에 존재하며,
이 파일의 퍼미션은 644이다. 즉 누구나 읽어볼 수 있다는 것이다.
단, 수정 가능한 사용자는 이 파일의 소유자인 root 계정만이 가능하다.
그러나 계정을 가진 사용자라면(여기서는 user) 누구나 이 파일에 있는 자신의 패스워드를 변경가능하다.
위에서부터 차근히 읽으면 앞뒤가 안맞는다는 느낌이 든다.
644 퍼미션과 일반 계정 사용자 사이의 모순을 해결하는 것이 SetUID라는 것이다.
✅ 명령어 실행 절차
일반적으로 시스템 사용자가 명령어를 실행시켰을 때 명령어를 찾아서 실행시키는 경로와 절차는 다음과 같다.
1. 현재 작업 디렉토리에서 찾음
2. $PATH에서 찾음
3. 찾은 후에 실행 권한을 체크
4. 권한이 있다면 실행시킨 사용자의 UID로 실행
5. 권한이 없다면 이 파일이 SetUID bit가 있는지를 확인
6. SetUID bit가 있다면 소유주의 UID(Effective UID = EUID)로 실행
✅ SetUID 파일 찾기
일반적으로 시스템에서 SetUID로 실행 가능한 명령어는 몇 개로 제한이 되어있다.
이미 설정되어있는 명령어 외에 새롭게 생성된 SetUID 파일(명령어)가 있나를 정기적으로 체크해 봐야 한다.
다음과 같은 find 명령어로 SetUID 파일을 찾을 수 있다.
find / -user root -perm -4000 -print -xdev
그리고 /usr/bin/passwd 라는 파일의 퍼미션 정보를 보면 s라는 것이 있다. 이것이 바로 SetUID bit이다.
일반 사용자가 자신의 패스워드를 변경하기 위해 'passwd'라는 명령어를 사용했을 때 s라는 퍼미션 때문에
root 권한으로 실행이 되는 것이다.
따라서 /etc/passwd 파일이 root 소유임에도 불구하고 일반 사용자가 변경이 가능하게 되는 것이다.
이를 악용하여 SetUID 퍼미션이 설정되어 있으면서 root 소유로 되어있는 명령어들을 해킹에 이용하게 되며
그 대표적인 명령어가 지금까지 실습했던 'passwd' 라는 명령어이다.
✅ SetUID 파일 설정하기
SetUID를 지정하기 위해서는 '4755'나 u+s을 통해 가능하다.
'Linux' 카테고리의 다른 글
[Linux] 리눅스 명령어 - 파일 이동, 삭제 명령어 (0) | 2022.02.21 |
---|---|
[Linux] 리눅스 명령어 - 파일, 디렉토리 (0) | 2022.02.17 |
[Linux] 리눅스 명령어 - 파일 생성 (0) | 2022.02.16 |
[Linux] 리눅스 명령어 - 파일 보기(cat, more, less, head, tail, grep ..) (0) | 2022.02.16 |
[Linux] 리눅스 명령어 - ls (0) | 2022.02.15 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!