본문 바로가기

Pwnable/FTZ

[ProjectH4C] [Write-up] 해커스쿨 FTZ Training 6~10

 

 

 

#Trainer 6

 

6단계에서는 패스워드 파일을 분석하는 방법에 대해서 배운다. 먼저 cat /etc/passwd 를 입력하면 서버에 저장된 사용자들의 목록이 전부 나온다. 맨 위의

root:x:0:0:Admin:/root:/bin/bash

사용자의 정보는 콜론(:)을 기준으로 7개의 필드로 나누어져 저장되어 있다.

먼저 첫 번째 필드의 문자열은 로그인 할 때 사용하는 아이디를 뜻한다.

두 번째 필드는 패스워드가 적혀있는 부분인데, 처음에는 암호화 된 패스워드를 저장했는데 크래커들이 이를 악용하는 사례가 계속해서 발생했기에 해당 필드에 비밀번호를 저장하지 않는 대신 x라는 문자를 채우게 되었다고 한다. 현재에는 비밀번호를 etc 디렉토리에 shadow라는 파일을 만들어서 따로 보관한다. 

세 번째 필드는 해당 사용자를 컴퓨터가 인식할 수 있도록 숫자로 표현한 것이며, 네 번째 필드는 해당 사용자가 속해있는 그룹을 뜻한다.

다섯 번째 필드는 사용자의 이름을 알려준다. 

여섯 번째 필드는 해당 사용자가 로그인에 성공 했을 시 최초에 위치하게 되는 디렉토리가 저장되어 있다.

일곱 번째 필드는 처음 로그인 했을 때 실행할 프로그램이 저장되어 있다. 기본적으로 /bin/bash로 설정되어서 로그인에 성공하면 쉘이 실행된다.

 

 

 

#Trainer 7

7단계에서는 파일의 압축과 해제에 대해 배운다.

흔히 사용하는 운영체제인 window에서의 압축파일은 보통 *.zip, *.rar 등의 확장자로 이루어져 있는데, 리눅스에서의 압축파일은 *.gz 확장자로 이루어져 있다. gz는 gzip의 약자이다. 압축하기 전에 먼저 tar를 사용해야 한다.

- tar cvf 합친이름 합칠파일들 : 합칠 파일들을 하나의 "합친이름".tar로 묶어준다.

- tar xvf 해제할파일 : tar로 묶여있던 파일을 각각의 파일로 해제해준다.

 

현재 디렉토리에는 3개의 노래 가사 파일이 들어있다. 이 들 3개를 tar 명령어로 묶어서 songs.tar 파일을 생성해야 한다. 합칠 파일 3개의 이름을 전부 써도 되지만 해당 디렉토리 내의 모든 파일을 묶기 위해선 파일들 이름 대신 *을 입력하면 된다. 그 후에 ls -al 을 입력하면 songs.tar 파일이 생성된 것을 볼 수 있다.

 

 이 때, songs.tar의 크기는 오히려 각각의 가사 파일들의 크기를 더한것보다 크다. 압축을 하면 용량이 더 작아져야 하는데 오히려 더 커져있기 때문에 .tar 파일은 압축파일이라고 할 수 없다. 용량이 더 커짐에도 불구하고 tar 파일을 생성하는 이유는, 리눅스의 압축 프로그램인 gzip은 여러개의 파일을 하나로 압축할 수 없고, 하나의 파일 당 하나의 압축파일로 만들어야 하기 때문이다. 여러 파일을 하나로 압축하기 위해서는 먼저 tar 명령어를 이용해 하나의 파일로 묶어준 다음에 gzip을 이용해 tar 파일을 압축해야 한다. 그렇기에 tar 명령어와 gzip 명령어는 항상 세트로 사용하게 된다. gzip 사용법은 다음과 같다.

gzip 	파일이름	//선택된 파일을 압축한다.
gzip -d 파일이름	//선택된 파일을 압축 해제한다.

songs.tar 파일을 압축하는 명령어는 gzip songs.tar 이다.

압축 후에 ls -al을 입력하면 압축파일이 생성된 것을 볼 수있는데, 압축파일의 용량을 보면 3개의 파일의 용량을 더한 것보다 작다.

 

압축을 해제할 때는 압축하는 과정의 반대로 실행되는데, 먼저 tar -d 명령어를 이용해 tar파일의 압축을 해제하고, tar 파일로 묶여있던 파일들을 각각의 파일들로 만들어주어야 한다.

 

위의 과정을 거치고 나면 가사 파일 3개가 모두 압축 해제되어 디렉토리 안에 생성된다.

 

 

#Trainer 8

해당 단계에서는 파일을 만들고, 컴파일하고, 실행하는 방법에 대해 배운다. 리눅스 사용자가 만드는 파일에는 크게 텍스트 파일과 소스 파일 두 가지가 있다. 텍스트 파일을 출력하는 법은 [cat 파일이름]이다. 프로그램 소스 파일도 cat 명령어를 통해 내용을 볼 수 있지만, 프로그램이 실행되게 하려면 해당 소스 파일을 컴파일한 후에 생성되는 실행 파일을 실행해야한다. 

텍스트 파일을 만드는 방법은 먼저 [cat > 파일이름.txt] 명령어를 실행한 후에, 작성하고자 하는 내용을 쓰고 나서 Ctrl+D 키를 이용해 빠져나오면 된다. 이 때 사용되는 꺽쇠(>)를 "리다이렉션" 이라고 하는데, 기본적으로 cat 명령어만 입력한 후에 내용을 쓰면 입력한 내용이 다음줄에 바로 출력 되는데, 리다이렉션을 사용해서 결과가 모니터에 출력되는게 아닌 파일의 내용으로 저장되게끔 해주는 역할을 한다.

 

 

 

 

cat을 통해 입력 받은 문자열을 test.txt 파일에 저장했다. 이후에 cat test.txt 명령어를 사용하면 입력했던 문자열이 그대로 출력된다.

 

 

 

리다이렉션을 하나만 사용해서 텍스트 파일에 내용을 저장하면 기존의 내용은 모두 사라지고 새로운 내용으로 채워지게 되는데, 기존의 내용을 유지하고 새로운 내용을 추가하기 위해선 리다이렉션을 두개 사용해서 [cat >> test.txt] 로 사용해야 한다.

 

 

텍스트 파일은 .txt의 확장자로 만들었고, 소스파일을 만들 땐 .c 확장자로 만들면 된다. 만든 소스파일은 컴파일이란 과정을 통해 실행파일을 생성하게 되는데 리눅스에선 gcc 라는 프로그램을 이용해 컴파일을 한다.

gcc -o 프로그램이름 소스파일.c

생성된 실행 파일을 실행할 땐 절대 경로를 모두 적어주어서 실행하거나, 해당 디렉토리로 이동해서 [./실행파일] 을 입력하면 된다.

 

 

 

#Trainer 9

해당 단계에서는 권한에 관련된 것들을 배운다. 리눅스의 한 서버에 개인 아이디를 가지고 그 공간에 필요한 문서를 올리고 홈페이지도 만드는 등 여러가지 파일들을 저장하게 될 것이다. 파일을 저장하다 보면 남들이 보거나 수정하지 말아야 할 중요 문서들도 존재 할텐데, 이 때 필요한 개념이 바로 권한이다. 만약 사용자가 해당 파일에 대해 권한 밖의 행위를 하면 Permission Denied가 출력된다. 리눅스에는 루트 계정을 포함한 유저, 그룹, 아더(Other) 총 네 종류의 사용자가 있다. 유저는 자기 자신을 말하며, 모든 유저가 하나 이상의 그룹에 속하게 되고, 해당 유저의 기준으로 같은 그룹에 포함되어 있지 않은 모든 사용자들을 아더로 정의한다. 자신의 이름이 무엇이며 어느 그룹에 속해있는지는 [id] 명령어를 통해 확인 가능하다.

 

 id는 trainer9이고 컴퓨터는 해당 사용자를 2009라는 숫자로 인식한다. gid는 해당 유저가 가지고 있는 그룹의 아이디로, 해당 id를 통해 다른 유저가 자신의 그룹에 들어올 수 있다. groups는 자신이 속해있는 그룹을 나타내는데, 기본값으로 uid가 저장되어진다.

 

 

[ls -al 파일이름] 을 통해 해당 파일의 권한을 확인할 수 있다. 맨 앞은 파일인지 디렉토리인지를 나타내는 부분이고, 뒤의 9자리를 3자리씩 끊어서 보면 rwx rwx rwx 가 된다. 이 때, 앞의 3자리가 유저의 권한, 중간의 3자리가 그룹의 권한, 뒤의 3자리가 아더의 권한을 나타낸다. r, w, x는 각각 읽기(read), 쓰기(write), 실행(execute)을 뜻하며, 뒤에 보이는 trainer9와 trainer10이 각각 유저 이름과 그룹 이름을 뜻한다.

 

 

test2 파일의 권한을 뒤의 9자리를 3자리씩 끊어서 보면 rwx r-x --x이다. 이를 보면 해당 파일에 대해 guest 유저는 읽기, 쓰기, 실행을 모두 할 수 있고, trainer1 그룹에 속한 유저는 읽기, 실행만 가능하며 그 외의 유저는 실행만 가능하다는 것을 알 수 있다. 읽기 권한이란 cat 명령어를 이용해 파일을 읽을 때 필요한 권한이고, 쓰기 권한은 해당 파일을 수정하는 데 필요한 권한이며 실행 권한은 [./파일이름]으로 실행 시킬 때 필요한 권한이다.

파일 권한의 맨 앞자리가 d이면 디렉토리, -이면 파일인 것을 알 수 있듯이, 실행 권한이 들어갈 자리가 x이면 실행파일, -이면 실행파일이 아닌 그 외의 파일임을 알 수 있다.

 

 

#Trainer 10

트레이닝의 마지막 단계로, SetUID에 대해 배운다.

해킹에는 local 해킹과 Remote 해킹이 있다. local 해킹은 해킹하고자 하는 서버에서 일반 계정을 통해 root 권한을 취득하는 것을 뜻하며, Remote 해킹은 서버에 아이디를 가지고 있지 않은 상태에서 아이디를 얻고자 하는 것을 뜻한다. local 해킹을 할 때, SetUID가 걸린 파일을 조작해서 루트 권한을 얻어낼 수 있다. SetUID란 Set UID를 합쳐놓은 말로, 유저 아이디를 변경한다는 의미를 가진다. 이를 이용한 예시는 다음과 같다. 

 

누군가가 내가 로그인하는 걸 뒤에서 지켜봐서 비밀번호를 알게 되었다. 그래서 passwd 명령을 이용해 비밀번호를 바꾸었는데, 패스워드는 etc/shadow 파일에 저장되어 있고, 결과적으로 passwd 명령을 통해 루트에게만 수정권한이 있는 shadow 파일을 일반 유저가 수정한 것이 된다. -> ??????

 

이것이 가능한 이유가 setUID이다. passwd 파일에 setUID가 걸려있어서, 일반 사용자가 passwd 파일을 실행할 때 일시적으로 사용자가 루트가 되는 것이며, 실행이 끝나면 다시 원래로 돌아오게 된다.

파일에 SetUID가 설정되었는지는 ls -al 명령어를 이용하면 알 수 있다.

 

위의 콘솔을 보면, passwd의 권한에 r, w, x가 아닌 s라는 권한이 존재한다. 이 것이 바로 SetUID이다. x가 있는 곳은 원래 유저의 실행권한 x가 들어가야 하는 곳인데 s가 들어가 있다. 그렇다고 실행 권한이 없어지는 것은 아니고, s는 해당 위치의 원래 권한을 포함하고 있기 때문에, 유저의 실행권한이 s에 포함 되어 있는 것이다. 위의 권한을 해석하면, 유저(해당 파일의 유저는 루트)는 읽기와 실행, 그룹 유저에게는 실행, 나머지 유저에게는 실행 권한만 있는데, 실행 권한이 있는 유저들이 해당 파일을 실행할 때 root의 권한을 가지게 된다는 의미가 된다. 모든 디렉토리를 지나다니면서 -ls al 명령어로 SetUID가 설정된 파일을 찾을 수는 없기 때문에, [find / -perm -4000] 명령어를 이용하면 SetUID가 걸린 모든 파일을 찾을 수가 있다.

 

위의 명령어에서 -perm은 "권한을 찾는다" 라는 옵션이고 뒤의 -4000 에서 "4"가 바로 SetUID를 의미하며 아래의 "000"은 전체 권한을 숫자로 바꾸어 놓은 것을 의미한다. find 명령에서 자주 쓰이는 옵션은 다음과 같다.

 

  • -perm : 권한과 일치하는 파일을 찾는다.
    ex) find / -perm 4
  • -name : 이름과 일치하는 파일을 찾는다.
    ex) find / -name cat
  • -user : 유저와 일치하는 파일을 찾는다.
    ex) find / -user mmung2
  • -group : 그룹과 일치하는 파일을 찾는다.
    ex) find / -group guta

위의 옵션을 서로 조합해서 한번에 사용할 수도 있다. ( ex) find / -user root -perm -4000  :  루트의 권한으로 SetUID가 걸려있는 파일을 찾아라.)

 

마지막으로 해커스쿨의 레벨별 해킹을 통과하는 방법이다.

1. 자신의 아이디가 예를 들어 level1이다.

2. level2로 넘어가기 위해 level2의 권한으로 SetUID가 걸린 파일을 찾는다. ( ex) find -user level2 -perm 4000)

3. 발견 된 파일을 이용하여 level2의 쉘을 얻어낸 후에 my-pass 명령어를 입력하면 패스워드가 출력된다.