FTZ Level 1

BrainInAVet·2021년 8월 8일
0

가장 먼저 ls를 입력해 현재 디렉토리에 무슨 파일이 있는지 확인한다.

hint 파일이 하나 있다. cat으로 확인한다.

setuid란, 특정 사용자의 권한으로 프로그램이 실행되도록 하는 것이다. 프로그램이 만약 지금 계정의 권한보다 상위의 권한으로 실행되고 있다면(이번 문제에서는 level2) 그 프로그램의 취약점을 이용해 상위 권한을 얻을 수 있다.

리눅스에는 파일 및 디렉토리를 찾아주는 find라는 명령어가 있다.
다양한 옵션을 적용해 내가 원하는 파일 및 디렉토리를 찾을 수 있으며, 이번 문제에서 쓸 명령어는 다음과 같다.

find / -perm -4000 -user level2 2> /dev/null

해당 명령어는 아래와 같이 해석할 수 있다.

  • find: find 명령어
  • /: 시스템 최상위 폴더 (모든 파일을 검색하라는 뜻)
  • -perm: 지정한 권한 전체를 만족하는 파일을 찾는다
  • -4000: 4000이라는 권한을 만족하는 파일을 찾는다 (권한에 대해서는 아래에서 설명)
  • -user: 지정한 유저 소유의 파일을 찾는다
  • level2: level2가 가진 파일을 찾는다
  • 2> /dev/null: find 명령어에서는 표준 오류(Permission denied, No such file or directory 등)를 정수 2로 표기하며, /dev/null은 입력된 모든 것들을 없애는 디바이스이다. 여기서는 리다이렉션 문자 >를 이용해 표준 오류를 모두 /dev/null로 보낸다.

즉, 이 명령어는 "시스템 최상위 폴더에서 4000이라는 권한을 만족하고 level2가 소유한 파일을 찾아라. 단 오류가 발생하면 /dev/null로 보내라"라는 뜻이다.

실행했더니 /bin/ExecuteMe라는 파일이 하나 나왔다.
ls -al을 통해 권한을 확인한다.

-rwsr-x---라는 권한이 나왔다.
권한은 보통 위의 표기 말고도 좀 더 범용적으로 사용되는 정수 표기법이 있는데, 다음과 같이 표기한다.

[특수 권한]
setuid: 4
setgid: 2
sticky bit: 1
[일반 권한]
r(read): 4
w(write): 2
x(execute): 1

-rwsr-x---와 같은 표기법의 경우, 구간을 4개로 나눌 수 있다.

- / rws / r-x / ---

첫 번째 구간은 해당 권한이 적용된 것이 파일인지 디렉토리인지를 구분한다.
파일일 경우 -, 디렉토리일 경우 d로 표기한다.

두 번째 구간은 user에 대해 적용되는 권한이다.
이 문제에서는 setuid가 걸린 파일을 찾았기 때문에 실행 권한 자리에 x가 아닌 s가 들어가 있다.

세 번째 구간은 group에 대해 적용되는 권한이다.
읽기와 실행 권한이 적용되어 있다.

네 번째 구간은 others에 대해 적용되는 구간이다.
아무런 권한도 적용되어 있지 않다.

이 네 개의 구간을 모두 합쳐 정수 표기법으로 바꾸면 4750이 된다.
setuid가 적용되었기 때문에 첫 자리는 4, user는 rwx 권한을 가지기 때문에 7, group은 rx를 가지기 때문에 5, others는 아무 권한도 없기 때문에 0이다.
간단한 덧셈 뺄셈이기 때문에 어렵지 않다.

권한이 4750이기 때문에 find 명령어에서도 -perm 뒤에 -4000이라는 옵션을 붙였다. find에서 권한 앞에 붙는 기호는 - 이외에도 /가 있는데, -는 지정한 권한 전체를 만족하는 것을, /는 지정한 권한의 일부라도 만족하는 것을 찾는다.
여기서는 권한의 정수 표기 4자리 중 첫번째 자리에 4를 넣어 setuid가 걸린 모든 파일을 찾도록 하였다.

찾은 파일을 실행했더니 다음과 같은 화면이 나온다.
쉘은 level2의 쉘로 바뀌어 있고, 원하는 명령어를 level2의 권한으로 실행시켜 주겠다고 한다. 여기서 실행해야 하는 명령어는 무엇일까? 패스워드를 확인하는 my-pass와 권한을 변경하는 chmod도 막혀있는데 말이다.

바로 bash다.
bash는 리눅스의 표준 쉘로, level2의 쉘에서 bash를 실행하면 level2의 쉘을 획득하게 될 것이다. 한 번 실행해보자.

예상대로, level2의 쉘을 획득했다.

0개의 댓글