Systemhacking/FTZ

[FTZ] level12

レ(゚∀゚)ヘ=3 2021. 5. 23. 20:43
728x90

level 12

(password : it is like this)

level12에 접속을 해서 'ls -l' 를 통해 level13 권한이 걸려 있는 'attackme' 라는 setuid인 파일과 'hint' 파일이 존재하는 것을 확인하였다.

'cat' 명령어를 통해 'hint' 파일의 내용을 확인하였다.

 

더보기

 

'hint' 파일 해석

 

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

int main( void )
{
        char str[256];                                              (1)

        setreuid( 3093, 3093 );                                  (2) 
        printf( "문장을 입력하세요.\n" );                     (3)
        gets( str );                                                  (4)
        printf( "%s\n", str );                                     (5)
}

 

(1) str 배열의 크기를 256 byte로 지정

(2) level13의 사용자 ID

(3) gets() 를 통해 str 변수에 사용자 입력을 받음

(4) str 변수의 내용을 출력

 

 

'hint' 파일에서 사용된 'gets()' 는 표준 입력(stdin)으로 들어온 문자열을 C언어 스타일 문자열인 char*, char[] 타입으로 저장해 주는 함수이다.

이 함수에서도 입력 받는 문자열의 길이를 검사하지 않기 때문에 오버 플로우가 발생할 수 있다.


'strcpy' 대신에 'gets()'가 사용된 것을 제외하고는 level11과 완전히 동일한 문제이다.

똑같은 방법으로 스택의 RET를 쉘 코드가 있는 메모리의 주소로 바꿔 BOF 공격을 수행하였다.


1. './tmp' 디렉토리로 소스코드를 복사해서 'level13.c' 파일을 생성하였다.

 

2. 컴파일을 해준 다음, 'ls' 을 통해 생성된 파일을 확인해 주었다. (캡처 사진은 level12를 성공한 다음에 캡처를 해서 뒤에서 생성할 파일도 같이 나옴)

 

3. 'gdb' 명령어로 디버깅을 해 주었다.

 

4. buffer overflow의 두 가지 방법(1. NOP sled 2. 환경 변수 이용) 이 있는데, 2번 환경 변수 이용 방법으로 공격을 시도하였다.

 

5. 먼저 쉘을 실행시키기 위한 쉘 코드를 SHELLCODE라는 변수 명으로 환경 변수에 등록하고 'export | grep' 을 통해 확인해 주었다.

 

6. 그 다음, 환경 변수의 주소를 획득하기 위해 './tmp' 아래에 'getlevel13.c' 파일을 만들어 주었다.

 

7. 'getlevel13.c' 파일을 'getlevel13'로 컴파일 해주었다.

 

8. './getlevel13' 을 실행하면, 'SHELLCODE'의 주소(환경 변수의 주소)가 '0xbffffc10'인 것을 확인할 수 있다.

 

9. 환경 변수의 주소를 활용해서 페이로드를 작성하였다.

 

10. 페이로드를 실행하니 성공하였고, 'my-pass'를 통해 level13의 password인 "have no clue"를 얻을 수 있었다.

'Systemhacking > FTZ' 카테고리의 다른 글

[FTZ] level14  (0) 2021.05.25
[FTZ] level13  (0) 2021.05.23
[FTZ] level 11  (0) 2021.05.17
[FTZ] level10  (0) 2021.05.17
[FTZ] level9  (0) 2021.05.06