문제분석 & 풀이
level1으로 로그인을 하고 ls-al 명령어로 파일들을 확인했다.
파일 중에 hint라는 파일이 있는 것을 확인할 수 있다.
cat 명령어를 이용해서 hint 파일의 내용을 확인해보니 setuid가 level2인 파일을 찾으라는 내용이다.
파일을 찾기 위해서는 find 명령어를 사용해야한다.
find / -user level2 -perm -4000
명령어를 분석해보면 다음과 같다.
1. "/" = 모든 디렉토리에서 검색한다.
2. "-user level2" = user가 level2인 파일을 찾는다.
3. "-perm -4000" = setuid가 걸린 파일을 찾는다.
3번에 대해 추가적으로 설명을 간단하게 해보겠다.
리눅스에서 기본적으로 파일은 rwx 3가지의 권한이 있다.
rwx를 숫자로 표현하면 r=4, w=2 , x=1 이 되며, 만약 read, write 권한이 있다는 것을 숫자로 표현한다면 4+2=6이 되는 것과 같은 형태다.
위 사진을 보면 총 10자리로 표현되어있는데, 맨 앞은 파일인지 디렉토리인지 구분해주는 것이며, 그 후 3자리씩을 각각 소유자, 그룹, other 유저의 권한으로 분류할 수 있다.
ex) 위 예제의 경우 소유자는 rw 권한, 그룹은 r 권한, other 유저들은 rx 권한을 가진 것이다.
이것을 숫자로 표현하면 645 가 된다.
문제로 돌아가서 find 명령어 부분을 보면 "-perm -4000" 이라는 옵션이 있는 것을 알 수 있다.
분명 위에서 설명한 숫자로 표현한 예제대로라면 3자리가 나와야되는데?
왜 4000이지?라는 의문이 생길 수 있다.
여기서 000앞의 4는 setuid가 걸린 파일을 의미한다.
즉, 우리는 setuid가 level2인 파일을 찾아야 하기 때문에 -4000이라는 옵션을 붙여줬다.
이제 find 명령어를 입력해보자.
입력결과 수 많은 "permission denied"가 뜬다.
접근 권한이 없는 파일들에 접근해서 생긴 오류인 것 같다.
보기가 힘들기 때문에 find 명령어에 2> /dev/null 를 붙여서 표준에러가 출력되는 것을 제거해주는 방식으로 바꾸자.
○ /dev/null
1) 1은 표준 출력(정상적인 메시지), 2는 표준 에러를 출력하는 것 의미한다.
2) [숫자]> /dev/null 은 출력값을 null로 리다이렉트하는 것을 의미한다.
→ 즉, 2> /dev/null 이면 표준 에러 메시지를 null로 리다이렉트한다는 의미다.
명령어를 다시 입력해보자.
"/bin/ExecuteMe" 라는 파일이 나왔다.
bin 디렉토리로 이동해 ExecuteMe 파일을 실행해보자.
실행하면 level2의 권한으로 명령어를 하나만 실행시켜준다고 한다.
"/bin/bash"를 실행해서 쉘을 획득해보자.
level2 권한으로 쉘이 실행됐다.
이제 level2의 권한을 얻었으니 my-pass를 이용해 비밀번호를 구해보자.