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 |