저번에 리눅스에서 사용하는 권한에 관련하여 글을 작성하였다. 오늘은 저번 시간에 이어 기본 권한이 아닌 특수권한에 대해서 설명하겠다. 만약 권한에 대해서 잘 모르는 사람은 밑에 게시글을 먼저 보고오기를 추천한다.
특수권한이라고 해서 크게 다를껀 없다.
위 그림을 보면 총 9자리로 소유자 , 그룹, 다른 사용자 들에 대한 3 권한을 볼 수 가 있다. 근데 노란색 박스를 자세히 보면 소유자의 권한 부분이 조금 다르게 표시되어 있다.
rws r-x r-x
소유자의 권한 부분에서 이 s가 의미하는 것이 바로 특수한 권한을 의미한다. 소유자, 그룹, 다른 사용자에 대한 권한에 중 어떤 자리에 특정한 문자가 들어가면 특수권한이라고 하는데 여기서 말하는 s가 바로 그것이다.
이 특정 문자가 어디에 위치하냐에 따라 그 용도가 달라진다.
1. 소유자 관련 권한 부분 : SetUID
소유자만이 접근 가능한 파일을 일반 유저도 접근할 필요가 있을 때 사용한다. 소유자의 권한을 잠시 빌려오는 개념인대
쉽게 설명하면 다음과 같다.
만약 우리집에 들어가려면 경비실 아저씨에게 이 집의 주인이 바로 저에요 ~~~ 라고 말하고 확인을 받아야지만 집으로 들어갈 수 있다.
다른 사람이 우리집에 들어오려면 경비실 아저씨는 너 이 집 주인 아니자나 못들어가 꺼져~ . 즉 입 밴을 당하게 된다.
하지만 만약 내가 중요한 미팅을 앞두고 있는 상태에서 발표 자료를 집에 두고 왔다고 가정해보자.
나는 부리나케 전화를 걸어 친구에게 내 집에서 자료좀 가져다주라 경비아저씨에게 말해 놓을게! 라고 우리 집으로 들어갈 수 있는 권한을 잠시 부여해 주면, 나는 친구 집으로 들어갈 수 있게 된다.
바로 이러한 개념처럼 원래는 접근하지 못하지만 SetUID를 설정하면 일반 사용자도 해당 파일에 접근이 가능하게 된다.
즉 정리를 하자면 User 권한의 접근권한(x) 자리에 x대신 s가 들어가면 이를 SetUID라 칭한다. 만약 s가 아니라 대문자 S가 들어가면 이는 일반 권한의 - 처럼 접근 권한 없음 과 같은 의미이다.
권한을 읽을 땐 맨 앞에 숫자 4를 붙여서 읽는다.
ex) rws r-x r-x = 4755
2. 소유 그룹 관련 권한 부분 : SetGID
위와 같이 소유 그룹만 접근 가능한 파일에 일반 유저로 접근이 필요 할 때 사용한다.
그룹 권한의 접근 권한(x) 자리에 x대신 S가 들어가면 이를 SetGID라고 한다.
만약 s대신 S가 들어가면 - 과 같은 의미인 접근 권한 없음을 의미한다.
권한을 읽을 땐 맨 앞에 숫자 2를 붙여서 읽는다.
ex) rwx rws rwx = 2777
3. Sticky bit
Sticky bit란 특정 디렉토리를 누구나 자유롭게 사용할 수 있도록 하는 것을 말한다.
파일 및 디렉토리 생성은 누구나 가능하지만, 삭제는 생성한 유저와 디렉토리 소유자만 가능하다.
일반 사용자 권한의 접근 권한(x)자리에 x대신 t가 들어가면 이를 Sticky bit라 한다.
만약 t대신 T가 들어가면 이는 일반 권한의 - 과 같은 의미인 접근 권한 없음을 뜻한다.
권한을 읽을 땐 맨 앞에 숫자 1을 붙여서 읽는다.
ex) rwx rwx rwt = 1777
다음은 리눅스 특수 권한에 관련한 문제이다. 이론적으로 공부를 하는 것도 좋지만 실습을 통해서 직접 이론을 적용해 보면 공부한 것이 내것이 되보린다.
해커스쿨의 ftz 라는 워게임이 있다. 총 20개의 레벨이 있으며 다음 레벨의 비밀번호를 찾는것이 문제의 목표이다. 각 문제마다 hint 라는 파일이 있는에 여기에 다음 레벨의 비밀번호를 얻기위한 힌트를 제공하고 있다.
그럼 1번 문제를 살펴보겠다.
힌트에 " level2 권한에 setuid가 걸린 파일을 찾는다 " 라고 적혀 있다. setuid가 뭔지 모르면 1번 문제조차 풀기 힘들다. 위에서 setuid 라는 특수 권한을 설명했으므로 쉽게 풀 수 있다.
문제를 해석하자면 파일의 소유자가 level2인 파일에 setuid 즉, rws 로 설정되어 있는 파일을 찾고 실행을 시키면, 현재 level1의 사용자는 level2의 권한을 잠시 빌릴 수 있게 된다.
따라서 현재 소유자가 level2인 setuid가 설정되어 있는 파일을 찾기 위해 find 명령어를 사용하기로 하자.
find / -user level2 -perm +4000 2>/dev/null 의 의미는 다음과 같다.
1. find / : 루트 디렉토리 아래에 있는 모든 곳에서
2. -user level2 : 소유자가 level2이고
3. -perm +4000 : setuid가 설정되있으면 4로 시작하므로 권한이 4로 시작하는 권한 설정이 있는 파일을 찾아라 !
4. 2>/dev/null : 루트부터 다 검색하므로 검색 권한이 없어 허가 거부가 되는 파일은 퍼미션 거부가 뜨는데 존나게 많이 뜨므로 이러한 에러 출력들은 모두 화면에 표시안되게 하는 기능
결론적으로 하나의 파일이 나왔다. /bin 경로에 ExecuteMe 라는 파일이다. 이를 ls -l 명령어로 확인해보면 다음과 같다.
해당 파일의 권한을 확인해보면 rws r-x --- 이렇게 되어 있고 소유자는 level2이며 이는 level1 그룹에 속해 있다는 것을 알 수 있다.
따라서 해당 파일은 소유자가 level2이지만 setuid가 s로 설정되어 있기 때문에 현재 level1 사용자가 잠시 level2의 권한을 빌릴수 있게 된다.
해당 파일을 실행시키면 다음과 같이 화면이 표시가 된다. 기존에는 level1@ftz level1 이렇게 되어 있었지만 파일의 실행후 level2@ftz level2 로 변경된 것을 알 수 있다.
따라서 위에 나온 것처럼 level2의 권한으로 명령어를 실행 시킬 수 가 있다. 딱 하나의 명령어 밖에 입력을 못하는데 단순히 ls 이런거를 입력하면 바로 기존 상태로 돌아온다.
따라서 단 한번의 명령어로 임시로 얻은 level2의 권한을 상승시켜 계속 유지하려면 쉘을 띄우면 된다. (쉘에 관련해서는 추후에 따로 설명을 할께용)
ftz를 만든 사람이 my-pass 라는 명령어를 만든 거 같다. 획득한 level2 쉘에서 my-pass 명령어를 입력하면 비밀번호가 나오게 된다.
결론으로 이론적인 부분을 문제를 통해 한번더 확인하면 더욱더 내 머리에 잘 들어오는 거같다.
'보안 > Linux' 카테고리의 다른 글
리눅스 디렉토리 구조 (0) | 2019.03.22 |
---|---|
리눅스 쉘이란? (0) | 2019.03.22 |
리눅스 권한이란? (0) | 2019.03.22 |
리눅스 부팅 과정 (0) | 2019.03.21 |
xcz 17번 문제 (0) | 2019.02.23 |