본문으로 바로가기

글을 시작하기전에.. 제가 이 해커스쿨 ftz를 푸는이유는 단순히 그냥 문제를 풀어보고싶어서가아니라 스스로 이문제를 풀면서 여러가지 기본 지식들을 익히고 배우기 위해서이므로 제가 어떤생각을했는지 어떻게풀려고 시도했는지 그런식의 스토리 방식으로 글을 쓰려고합니다. 간혹 문제와 전혀 관련없는 지식들이 나올 수 있습니다.


[ ID : level1 | PW : level1 ]


가장 처음에 ls로 파일을 확인하고 그중에 hint파일을 cat명령어로 열어보았다.



힌트의 내용은 이러한데 여기서 setuid와 권한에 관련된 내용은 아래에 정리해두었다.


 퍼미션

일반적인 의미 

파 일 

디 렉 토 리 

r

읽기(read)권한 

 파일의 내용을 읽을 수 있음.

 ls로 디렉토리내용 확인가능

쓰기(write)권한

 파일에 저장할 수 있고, 파일을 삭제할 수 있음.

 디렉토리에 파일저장, 디렉토리이름변경, 디렉토리 삭제등이 가능

 x

실행(execution)권한

 파일을 실행할 수 있음

 cd로 디렉토리에 접근가능

(ls로 디렉토리의 내용을 확인할 수 있는 것은 아님)

 s

SetUID, SetGID권한

 SetUID : 파일의 소유자 권한으로 실행됨

 SetGID : 파일의 그룹권한으로 실행됨

 t

Sticky Bit권한 

 공유디렉토리로 사용됨 


권한예시)

-rwxr-xr-x  2  root  root  4096 Apr 22 16:59 conory

파일Type 퍼미션정보 링크수 소유자 소유그룹 용량 생성날짜 파일이름

  • 파일 Type : - 파일유형
  • 퍼미션정보 rwx 소유자권한 | r-x 그룹권한 | r-x 그외일반사용자 (이떄 - 기호는 그 권한이 없다는뜻)
  • 링크수 : 해당 파일이 링크된 수 링크는 윈도우의 "바로가기"와 같음 (in [대상파일] [링크파일]" -> 링크파일 생성)
  • 소유자 : 해당 파일의 소유자이름
  • 소유그룹 : 해당 파일을 소유한 그룹이름 특별한 변경이 없을 경우 소유자가 속한 그룹이 소유그룹으로 지정됩니다.
  • 용량 : 파일의 용량
  • 생성날짜 : 파일이 생성된 날짜 
  • 파일이름 : 파일이름

  파일유형

 -

 일반 파일임을 의미함. 

 블록형 특수 장치파일(주로 디스크, 예: /dev/sda, /dev/hda등) 

 문자형 특수 장치파일(주로 입출력에 사용되는 특수파일, 예 : /dev/console등) 

d

 디렉토리를 의미함 

l

 심볼릭 링크 파일임을 의미함 

 파이프 파일임을 의미함 

 소켓 파일임을 의미함. (예 : /tmp/mysql.sock등) 


☆ 퍼미션을 변경할떄


chmod [ 변경될 퍼미션 값] [ 변경할 파일 ]


- 퍼미션값 : 각퍼미션 값을 숫자로변환해서 합한값. (r = 4 , w = 2, x = 1)

ex) r-x = 4 + 0 + 1 = 5 


☆ 소유자를 변경할떄


chown [ 변경할 소유자 ] [ 변경할 파일 ]


☆ SetUID,SetGID,StickyBit


 SetUID

 일반적으로는 파일을 실행시키면, 실행시킨 사용자의 권한으로 실행이 되지만,
SetUID가 설정된 파일을 실행하면 파일의 소유자 권한으로 실행이됨.

 SetGID 

 일반적으로는 파일을 실행시키면, 실행시킨 소유그룹의 권한을 가지게 되지만,
SetGID가 설정된 파일을 실행하면 파일의 소유그룹권한을 가지게됨.

 StickyBit 

 공유디렉토리의 의미임. StickBit이 설정된 디렉토리에 파일을 생성하면
생성한 사람의 소유로 생성됨. 삭제 또한 생성한 사람과 root만이 가능함.
한마디로 공유디렉토리로 사용하기 위한 용도임.


< SetUID > - 4000

- setuid는 실행순간만 그파일의 소유자권한을 빌려온다고생각하면 된다.

- 매번 슈퍼유저 root가 어떤 행위를 해주지 않아도 되고, 일반 사용자에게 root권한을 주지 않아도 되기때문에 setuid 비트를 적용하는것이 시스템 운영면에서 효율적이다.

- SetUid 비트 설정 시 취약점은 root권한이 필요없는 프로그램에 소유주가 root로 되어 있고 setuid가 설정된 경우는 보안상으로 매우 취약하다.

- 일반사용자로 접근하는 경우도 setuid 설정으로 실행 가능해지기 때문이다.

- 권한 상승 우려때문에 setuid 프로그램의 수는 반드시 최소화해야한다.

- 그룹 소유주의 퍼미션 값에 실행의 값인 'x'가 아닌 's'기호가 대신 명시된다.

- 절대 모드 표현에서 일반 퍼미션에 4000을 더하거나 뺄 수 있다

 

< SetGID > - 2000

- 파일 및 명령어가 실행되는 동안에는 그룹 소유주의 권한을 갖게 되는 퍼미션 값

- 실행 파일 뿐만 아니라 디렉토리에도 명시 될 수 있다.

- 그룹 소유그룹의 퍼미션 값에 실행의 값인 'x'가 아닌 's'기호가 대신 명시된다.

- 절대 모드 표현에서 일반 퍼미션에 2000을 더하거나 뺄 수 있다.

 

< Sticky bit > - 1000

- 모든 사용자가 읽고, 쓰고, 실행이 가능한다.

- 단 Sticky bit 퍼미션이 적용된 디렉토리에서는 누구나 파일을 스고 실행할 수 있지만, 파일 삭제는 오직 소유주만 할 수 있다.

- 나머지 사용자의 퍼미션 값에 실행의 값인 'x'가 아닌 't'기호가 대신 명시된다.

- 절대모드 표현에서 일반 퍼미션에 1000을 더하거나 뺄 수 있다.


이제 Setuid가 걸린 파일을 찾아보려 ls -al을 해보면 level1 홈 디렉토리에는 없는것을 확인할 수 있다. 그러면 이제 find를 사용하여 찾아야한다.

,



find [찾을 디렉토리 경로]  [찾기옵션]


위 방식으로 사용하는건데, 경로설정은


/ 

 루트에서부터 검색 

. 

 현재 디렉토리부터 하위 디렉토리까지 검색 

/디렉토리 

 지정한 디렉토리까지 검색 


이며, 옵션에종류는


-name [파일이름]   :  파일이름과 일치
  파일명 또는 확장자를 기준으로 검색할 수 있다.

-perm [권한]  :  권한과 일치하는 파일

-user [유저]  :  유저와 일치

-group [그룹] :  그룹과 일치하는 파일

-empty : 비어있는 파일이나 디렉토리를 검색

-size [+파일크기/-파일크기/파일크기][bckw중 택1] : 파일크기와 일치하는 파일

  b : 블록단위 512kb
  c : byte
  k : kbyte
  w : 2byte 워드
  아무런 단위를 붙이지 않은 경우 : 디폴트 값 b

  파일크기에 +1024k 이렇게 +를 붙이는 경우에는 크기가 1024kbyte 이상인 것을 찾고, -는 그 이하, +,-를 붙이지 않는 경우에는 그 크기의 파일을 찾는다.

-type [파일타입] : 파일의 타입을 지정하여 검색한다.

  b : 블록 특수 파일(block device)
  c : 캐릭터 특수 파일 (character deice)
  d : 디렉토리(directory)
  f : 일반파일(file)
  l : 심볼릭 링크(link)
  p : 파이프 (pipe)
  s : 소켓 (socket)

-print : 찾은 파일들을 표준출력(stdout)으로 출력한다. 기본으로 설정되어 있다.

-nouser : 소유자가 없는 파일을 검색(/etc/passwd 파일에 없는 사용자의 소유자로 되어 있는 파일을 검색)

-nogroup : /etc/groups파일에 없는 그룹의 소유인 파일을 검색한다.

-fprint [임의파일명] : 검색된 파일을 `임의파일명'으로 출력한다.(`임의파일명'이 존재 하지 않을 경우에는 새로 생성되고, 존재할 경우에는 기존의 파일은 없어짐)

-exec command {} \; : 파일이 검색되었을 경우, 검색된 파일들에 대해 특정 명령을 수행 할 때 사용한다.

  {} : 검색된 파일들을 의미한다. 여러개의 파일이 검색되면 하나씩 치환되면서 해당명령이 실행되는 것이다. 
  ; : 검색된 결과가 여러개인 경우 하나의 행에 여러 명령을 사용하기 위함이다.
  \ : ;이 특수 문자이기 때문에 문자로 ;라는 것을 알려 주기 위함이다..

-ok : -exec와 동일한 작업을 한다. 다른 점은, 명령을 실행할 때마다 실행 의사를 물어본다.

-newer file1 file2
`file1' 보다는 이후에 `file2' 보다는 이전에 생성되거나 변형된 파일들을 찾을 경우에 사용한다.

-cnewer 파일명 : '파일명' 부분에 적어준 파일보다 더 최근에 수정된 파일들을 찾아준다.

-atime +n/-n/n : 최근 n일 이전에 액세스된 파일을 찾아준다.(accessed time)
   +n : n일 또는 n일 이전에 액세스된 파일
   -n : 오늘 부터 n일 전 사이에 액세스 된 파일
    n : 정확히 n일 전에 액세스된 파일

-ctime +n/-n/n : ctime은 파일의 퍼미션을 마지막으로 변경시킨 날짜를 의미한다. (changed time)
   +n : n일 또는 n일 이전에 퍼미션이 변경된 파일
   -n : 오늘 부터 n일 전 사이에 퍼미션이 변경된 파일
    n :  정확히 n일 전에 퍼미션이 변경된 파일

-mtime +n/-n/n : mtime은 파일내의 data를 마지막으로 변경한 날짜를 의미한다.(modified time)
    +n : n일 또는 n일 이전에 수정된 파일
    -n : 오늘 부터 n일 전 사이에 수정된 파일
      n : 정확히 n일 전에 수정된 파일

-mount 현재의 파일 시스템과 동일한 타입의 파일 시스템에서만 검색을 할 경우에 사용한다.

-maxdepth n : 0이 아닌 정수값으로 경로 깊이를 지정하여 검색을 할 경우에 사용한다. 예를들어, '-maxdepth 1'은 시작위치로 지정한 디렉토리만 검색하고 하위 디렉토리는 찾지 않는다.

-mindepth n : 0이 아닌 정수값으로 지정된 숫자만큼의 깊이에서부터 그 하위 디렉토리를 검색한다. (GNU find 버전)

-follow : 심볼릭 링크된 디렉토리도 검색을 할 경우에 사용한다.

-regex : 정규표현식(regular expression)을 이용하여 파일들을 찾을 경우에 사용한다. `-iregex'는 대소문자를 구별하지 않을 경우에 사용한다. (GNU find 버전)
action은 test에서의 조건과 일치하는 파일들에 대해 수행할 작업을 명시하는 것으로 다음과 같은 방법들이 있다.

-ls : `ls -dils' 형식으로 찾은 파일들의 정보를 출력할때 사용한다.

-fls [임의파일명] : `ls'와 동일하게 동작하며 결과를 [임의파일명]로 출력한다.


< 위내용은 퍼왔습니다. 출처는 글의 끝에 위치합니다. >


그래서 SetUID의 권한은 4000이므로 이에대해 검색을 해보았다. (사용한 명령어 find / -user level2 -perm 4000)



여기서 찾아보려하니 모든파일이 Permission denied이며 원하는 파일을 찾을 수 없었다. 

문제는 find명령에 대한 이해가 부족하다고 생각하고 man find를 쳐보았다.



근데 새로운게 있었으며 이것은 포함을 설정해주는 -와 + 옵션이었다.


find / -perm -4000 (4000을 포함하는 퍼미션을 검색)
find / -perm +4000 (4000의 일부만이라도 포함되있는 퍼미션 검색)
find / -perm  4000 (4000과 똑같은 퍼미션을 검색)


나는 권한에 4000이 포함만되있으면 되기떄문에 이번엔 명령을 find / -user level2 -perm -4000으로 해보았다.



이제보니 하나가 검색이 된다. (/bin/ExecuteMe)

bin 디렉토리에 들어가서 Execute Me에 대한 정보를 보았다.



아까 배운걸로 퍼미션을 분석해보면

- : 파일

rws : SetUID가 설정되어 있기때문에, 실행 권한이 있는 사용자가 어떤 파일을 실행했을 때, 마치 level2(소유자) 인 것처럼 해주는 권한

r-x : 그룹 권한, (level1)이 읽고 실행할수 있게 되있다.

--- : 일반 사용자는 이파일에 아무것도 할 수 없다.


여기서 이파일을 어떻게 사용해야할지 몰라서 한번 파일을 열어보았다.(cat)



매우 이상했으며 한글로알아볼수있는건 저기 "레벨2의 권한을 당신이 원하는 명령어를 한가지 실행시켜 드리겠습니다.(단, mypass와 chmod는 제외) 어떤 명령을 실행시키겠습니까?" 와 이아래있는 그한글뺴고 나머지내용은 전부 알아볼 수 없는 내용이였다. 그래서 파일을 cat으로 여는것은 아니라고 생각해서 파일을 실행시켜 보았다.



이것을보면 level2의 권한으로 어떤 명령어하나를쳐서 level2의 권한을 따야하는것같은데 해커스쿨에 제공하는 패스워드를 보여주는 명령어인 my-pass 와 권한을 부여하는 명령인 chmod가 되지않는다. 여기서나는 트레이너를 보지않고 level1을 시작했기떄문에 막혔다. 만약 혼자서 level1을 풀고있는 사람이라면 리눅스 쉘에대한 이해가 있는사람을제외하고 여기서 막혔을꺼라고 생각한다. 일단 문제는 bash를 치면 level2의 권한을 얻을 수 있다. 이에대한것은 트레이너을 풀고나서 추가하겠다.



+ 6/11

현재는 트레이너를 푼상태인데 만약에 트레이너를 보고나서 이 레벨1을 풀었다면 엄청 쉽게 풀었을거라고 생각한다. (10분도 채 되지않아서 풀 수 있었을것같다.) 어쩃든 아래에 bash쉘에대한 내용을 추가한다.



먼저 리눅스는 하드웨어, 커널, 쉘, 응용프로그램으로 이루어져있다.

커널

1. 하드웨어를 직접 제어하고, 프로세스관리, 메모리관리, 파일시스템 관리 등을 수행하는 운영체제의 핵심

2. 사용자가 실행시키는 응용프로그램(어플리케이션)과 하드웨어 사이의 관리자 역할을 수행

3. 쉘과 연관되어 쉘에서 지시하는 작업을 수행하고 그결과를 쉘로 보내는일.


1. 사용자가 입력한 명령어를 해석하여 커널에 전달하는 명령어 해석기.

2. 유닉스, 리눅스에서 대화형 사용자 인터페이스를 부르는 용어로서, 쉘은 사용자가 입력한 명령어를 이해하고 실행하는 역할을 수행

3. 쉘은 사용자가 입력한 문자열을 해석하고 그것에 타당한 명령어를 찾아서, 커널에 그에따른 작업을 요청하게 된다. 그리고 커널에서 작업을 수행한 결과를 다시 쉘로 보내면 쉘은 그것들을 유저에게 알려주게된다.


여기서 bash는 쉘에 해당하는데 이미 현재 level1의 쉘이 돌아가고있는상태에서 level2의 권한으로 쉘을실행시키면 level1의 권한의 쉘에서 level2권한의 쉘이 덮어씌어진다. 그러면서 권한이 상승된다.



- 글을 처음썻을때 후기 // 중간 까지만해도 혼자힘으로 풀 수 있다는것에 매우좋았는데 결국 끝에가서 방법을 못찾았네요.. 저는 포스팅을하면서 문제를 계속풀었기떄문에 읽은 자료들은 전부 올려두었습니다. 출처는 아래에있구요. 실제적으로 제가 아무것도 모르는상태에서 이 문제를 반이라도 풀게되서 기쁩니다. 이 포스팅 중간중간에 자료를제외한것은 제가 그때 직접 그문제를풀면서 느낀 생각들위주로 적었습니다. 그리고 그렇게해서 문제가 풀린다는것도 엄청신기합니다. 해커스쿨 ftz 트레이닝이라는게 있다는걸 지금알아서 트레이닝부터 푸려고합니다. 이문제를 푸는데 6~8시간은 걸린것 같아요. 다음에 문제를풀떄는 더더 줄일 수 있었으면 좋겠습니다.

출처 : https://www.conory.com/note_linux/19194 | https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=1286&sca=10414# | http://eunguru.tistory.com/115 | http://hack.pe.kr/292 | http://geundi.tistory.com/37 | http://www.logonluv.com/2015/02/hacker-school-ftz-level1.html


+ 7/25

- 글을 수정한 후 후기 // 위에 후기랑 글의 내용이랑은 글을 수정했기때문에 다른부분이 있습니다. 지금와서 저때 쓴 글을 보면 많이못썻고 정리도안되있고 너무 번잡한느낌으로 그떄의 감정이나 아니면 세부사항 하나하나를 전부다 블로그에 적었기떄문에 조금 불필요했던것같아서 지금 글을다시 수정합니다.