본문 바로가기

3. Pwnable (포너블)/2) 개념 정리

[2021. 09. 11] 해커스쿨 F.T.Z를 통한 기초 명령어 실전 활용

팀명 : 파이브(5)너블

활동 일시 : 2021.09.11 13:35 ~ 14:55

2주차 활동 계획 : 해커스쿨 F.T.Z 리눅스 공부(2)

학습 내용: 해커스쿨 F.T.Z trainer 과정에서 습득한 리눅스 기초 명령어 실전 문제에 활용

(level과정 중 level1-level5 진행)

 

 

level1

1.ls -l 명령어 입력

2.파일 목록에 hint 파일 존재 확인

3. cat hint로 hint 내용 확인 => ‘level2 권한에 setuid가 걸린 파일을 찾는다’

4. setuid 아이디가 걸린 파일을 찾을 때 =>  find / -user level2 -perm -4000 2>/dev/null 입력 

5. permission denied 되지 않는 파일 =>  /bin/ExecuteMe 파일 존재 확인 

6. cd /bin 을 입력해 /bin에 들어감 

7. /bin에 들어있는 ExecuteMe 파일 확인

8. bash 명령어를 통해 level2의 권한을 획득한다 

9. level2 권한을 획득 후 my-pass를 입력해 level2로 가는 pw를 획득할 수 있다.

 

<key>

2>/dev/null의 역할 

/dev/null : 일종의 file, null file로 이쪽에 가는 모든 정보는 null값으로 되어버리지만 성공처리

 

>/dev/null : 보통 로그파일 내용을 지우거나(ex. cat test.log > /dev/null) echo등의 출력 내용을 지우는데 사용, (>가 다음에 나오는 파일에 기록을 남기겠다는 명령어 이나, null파일이므로 아무런 기록이 남지않게 됨)

 

2>/dev/null : 1은 standard output으로 정상 메세지 출력, 2는 standard error로 에러 메세지 출력을  의미

즉 2>/dev/null은 에러메세지를 Null로 처리하면서 기록에 남기지 않게 하는 코드 

 

level2

1.ls -l 명령어 입력

2.파일 목록에 hint 파일 존재 확인

3. cat hint로 hint 내용 확인 => ‘텍스트 파일 편집 중 쉘의 명령을 실행시킬 수 있다는데…’

4. setuid 아이디가 걸린 파일을 찾을 때 =>  find / -user level3 -perm -4000 2>/dev/null 입력 

5. permission denied 되지 않는 파일 => /usr/bin/editor 파일 존재 확인 

6. cd /usr/bin 을 입력해 /usr/bin에 들어감 

7. /usr/bin에 들어있는 editor 파일 확인

8. VIM이 뜨게 되는데  아까 힌트를 생각하면 여기서 쉘 명령 실행 가능 

9.  :! (외부 쉘 실행시켜주는 명령어) 를 사용해서 bash를 입력하면 level3 권한 획득 

 

9. level3 권한을 획득 후 my-pass를 입력해 level3로 가는 pw를 획득할 수 있다.

 

 

level3

1.ls -l 명령어 입력

2.파일 목록에 hint 파일 존재 확인

3. cat hint로 hint 내용 확인 =>  autodig의 소스 코드 주어짐 

4. 소스 코드 분석 

#include <stdio.h> 

#include <stdlib.h>

#include <unistd.h>

 

int main(int argc, char **argv){ 

 

    char cmd[100]; cmd 변수의 크기를 100으로 해주고 char형으로 선언해주기

 

    if( argc!=2 ){ argc 변수 값이 2가 아닐 시 밑 문장 실행

        printf( "Auto Digger Version 0.9\n" );

        printf( "Usage : %s host\n", argv[0] );

        exit(0);

    }

 

    strcpy( cmd, "dig @" ); cmd에 dig @를 적어준다. 

    strcat( cmd, argv[1] ); cmd  내용 뒤에 argv[1]를 붙인다 

    strcat( cmd, " version.bind chaos txt"); cmd 내용 뒤에 version.bind chaos txt 을 붙인다

 

    system( cmd ); cmd을 실행

 

}

 

5. 위에서 말한 autodig 위치 찾기 

두 방식으로 찾을 수 있는데 권한이 level4에게 있기 때문에  find / -user level4 -perm -4000 2>/dev/null 를 입력하거나 이름을 알고 있기 때문에  find / -name autodig -perm -4000 2>/dev/null을 입력해 autodig이 /bin에 위치한다는 것을 캐치

 

6. cd /bin을 통해 /bin으로 이동해준 뒤 아까 제시된 힌트를 떠올려보면

more hints.

- 동시에 여러 명령어를 사용하려면?

- 문자열 형태로 명령어를 전달하려면?

힌트가 더 주어짐

동시에 여러 명령어를 사용하려면 ; (세미콜론)을 이용해야 하고 문자열 형태로 명령어를 전달하려면 “”(큰 따옴표)로 묶어줘여함

7.  힌트를 통해 bash와 my-pass를 동시에 작동 시키면 된다는 것을 알 수 있음

8. 즉 autodig “bash;my-pass”를 입력해주면 두 명령어가 동시에 사용되고 문자열의 형태로 명령어를 autodig에 전달해주면서 level4 권한을 가진 autodig에서 pw를 얻을 수 있다

<key>

#include <stdio.h> , :#include <stdlib.h>,  #include <unistd.h> 

C 표준 라이브러리 중 하나인 헤더 파일에 선언된 내용을 포함한다는 뜻

쓰지 않으면, printf 함수의 선언을 찾을 수 없다는 컴파일 오류가 발생


 

level4

1.ls -l 명령어 입력

2.파일 목록에 hint 파일 존재 확인

3. cat hint로 hint 내용 확인 =>  누군가 /etc/xinetd.d/에 백도어를 심어놓았다.!

4. cd  /etc/xinetd.d/로 이동해 ls -l로 backdoor 파일이 있는 확인하니 존재 

5. permission denied가 걸려있지 않으니 현재 위치에서 cat backdoor 입력해 내용 확인

6. backdoor는 finger 서비스로 실행되는 곳, user는 level5, server는 /home/level4/tmp/backdoor 라는 경로를 통해 실행되었다는 것을 얻을 수 있음 

7. cd /home/level4/tmp/로 이동해 ls -al로 확인해보니 backdoor파일이 존재하지 않음 

8. 존재하지 않기 때문에 .c 형식으로 파일을 만들어 my-pass를 전달해주는 backdoor 파일 생성 

9. 파일 생성 cat > backdoor.c 후 아래와 같은 코드를 입력해줌

#include <stdio.h> 

#include <stdlib.h>

int main(void) { system({“my-pass”); return 0; }

10. gcc 명령어로 backdoor.c를 backdoor로 컴파일 시켜준 뒤 ls -l로 backdoor파일이 이제 있는지 확인해주면 존재하는 것을 알 수 있음 

11. 위에서 backdoor는 finger 서비스로 실행된다는 것을 알려주었는데 여기서 finger 명령어로 @localhost를 입력하면 level5의 pw를 얻을 수 있다 

 

<key>

finger?

리눅스에서 사용자의 계정 정보를 확인하는 명령어로 /etc/passwd 파일에서 읽어서 보여주는데

단순 finger을 입력시 현재 시스템에 로그인 되어있는 사용자들을 보여주고

finger + user명으로 입력시 host명을 명시해주지 않았기에 finger은 로컬로 접속하게 되고

finger + @host명으로 입력시 user명을 명시해주지 않았기 때문에 모든 유저 정보를 보여준다.

 

 

level5

1.ls -l 명령어 입력

2.파일 목록에 hint 파일 존재 확인

3. cat hint로 hint 내용 확인 =>  

/usr/bin/level5 프로그램은 /tmp 디렉토리에

level5.tmp 라는 이름의 임시파일을 생성한다.

 

이를 이용하여 level6의 권한을 얻어라.

4. cd /usr/bin/으로 이동해 ls -l을 확인해주면 level5 파일이 존재하는 것을 알 수 있다

5.힌트에서 level5가 실행되면 /tmp에 level5.tmp라는 임시 파일이 생긴다고 하니 확인해주면 일단 존재하지 않는다. 일시적으로 파일이 생긴 것. 파일이 존재하지 않기에 파일을 만들어 준다

6. cat > level5.tmp로 파일을 만들어 준 다음(내용 무관)  ls -l를 입력하면 이제 파일이 존재하는 것을 확인할 수 있다.

7.파일이 있으니 이제 level5를 실행시키기 다시 cd /usr/bin/으로 이동한 다음  cat 을 이용해 level5.tmp파일을 열어주면  level6에 대한 pw가 나타난다.