본문으로 바로가기

해커스쿨 FTZ level1

category Wargame/FTZ 2017. 7. 23. 20:14

level1 --- level1

 

우선 level1 디렉토리에 어떤 파일과 디렉토리가 있는지 확인해야 한다. 따라서 ll로 확인해보자.

(ll은 ls -l 과 같은 뜻으로 alias가 걸려 있다.)

아래와 같이 hint라는 파일과 public_html, tmp 디렉토리가 있는 것을 확일 할 수 있다. 

 

 

 

hint라는 파일은 root를 제외한 모든 사용자에게 읽기만 허용된다. 따라서 level1인 우리도 읽을 수 있다. hint를 한 번 확인해 보자.

 

 

 

 

 

hint를 보고 문제를 분석해 보면 level1과 level2와 관계가 있는 백도어를 찾아 level2의 권한을 얻으라는 것이다.

level2 권한의 백도어는 level2 계정의 소유이고 다른 계정으로 SetUID, SetGID가 설정되어 있어야 한다.

level2 권한의 SetUID가 걸린 파일을 실행 할 때 일시적으로 권한이 level2로 바뀌었을 순간 비밀번호를 알아내면 된다.

 

 

 

 

이번에는 public_html 디렉터리를 확인해 보자. public_html 디렉토리에는 index.html 파일이 있는데 level1의 사용자는 읽고 수정할 수 있다.

index.html은 웹페이지 파일로서 index.html 속 내용을 웹 브라우져에서 확인 할 수 있다.

마지막으로 tmp 디렉토리도 마찬가지로 확인해 보자. tmp디렉토리는 주로 개인적인 작업을 하는 공간이다.

 

이제 힌트를 바탕으로 문제 분석을 해보자.

우선 공격할 대상을 찾아야 하므로 find 명령어를 이용해 찾아보자.

 

 

 

 

SetUID 설정 방법은 숫자 모드로 4000이다. SetGID 설정 방법은 숫자모드로 2000이다. 따라서 SetUID, SetGID를 찾고 싶으면 숫자모드로 6000을 사용하면 된다. -perm +6000 옵션은 level2 권한과 level1의 그룹 권한 중 하나라도 SetUID, SetGID가 설정된 파일을 찾는다는 의미이다. -perm -6000은 level2 권한과 level1의 그룹 권한 모두 SetUID, SetGID가 설정된 파일을 찾는 것이다.

2>는 오류 리다이렉션이라고 한다. 형식은 [명령어] 2> [파일이름] 이다. 오류 발생 메세지를 파일로 저장한다는 의미이다.

/dev/null는 window의 휴지통이라고 생각하면 된다. 즉 오류 메세지를 /dev/null 파일로 리다이렉션하여 출력하지 않을 수 있다.

find / -perm + 6000 -user level2 라고만 명령어를 사용하면 많은 양의 오류 메세지가 발생해서 원하는 내용을 찾기 어렵다.

 

/bin/ExcuteMe 파일을 실행해서 보기만 하면 되지만 문제 분석과 풀이를 하는 과정에서 GDB를 이용해 소스코드를 분석하는 것이 도움이 된다.

따라서 바로 실행하지 않고 리버싱을 해보자.

 

 

 

 

 

gdb [파일명] 을 하면 gdb를 사용할 수 있다. disa main은 main함수를 디스어셈블 하겠다는 뜻이다.

실행의 흐름을 표시하면 아래와 같이 볼 수 있다.

(gdb) x/s [주소] : 주소에 있는 값을 문자로 출력한다.

 

 

분석해 보면 아래와 같다.

 

 

1. system()함수로 clear 명령을 실행한다.

2. chdir()함수로 /home/level2 디렉토리로 이동한다.

3. printf() 함수를 이용해 문자열을 출력한다.

여기 까지가 fgets()함수를 이용해 사용자로부터 입력을 받기 전 까지 상황이다.

 

확인 작업을 하기 위해서 /bin/ExcuteMe 파일을 실행해 보자.

 

 

 

/bin/ExcuteMe 파일을 실행하면 위와 같이 나온다. 우리가 복원한 내용과 같다는 것을 통해 분석이 맞다는 사실을 알 수 있다.

따라서 다시 분석해 나가 보자.

 

 

4.gets() 함수를 이용해서 사용자로부터 입력을 받는다.

fgets함수는 fgets(배열주소, 사이즈(0x1d = 29), STDIN) 형태의 호출이라는 것을 알 수 있다.

배열 주소에 입력 값이 정확하게 들어가는지 확인해 보기 위해서 break point를 0x080485ea로 잡고 실행을 한다.

AAAAAAAAAAAA를 입력한다. A는 아스키 코드값으로 0x41이다. 따라서 0x41414141로 입력되는것이 맞고 x/3x이기 때문에 3개가 출력된다.

 

 

5. strstr()함수를 이용하여 입력받은 문자열을 my-pass와 chmod와 비교한다.

6. setreuid(3002, 3002) 함수를 이용해 파일의 UserID 권한을 level2로 바꾼다.

셸에서 입력한 명령어가  my-pass인지 비교해서 다르면 <main+196>으로 보내지고 여기서 chmod와 비교하거나

my-pass를 입력 했다면 에러 메세지를 출력한 뒤 프로그램을 종료하는 exit()함수를 사용한다. 

 

분석이 끝났다. 주의할 점은 파일을 실행하면 level2의 권한의 셸을 획득한 것 처럼 보이지만 단지 화면에 출력된 문자임을 명시하자.

 

그러면 일시적으로 다른 계정의 권한을 얻은 상황에서 이 권한을 계속해서 유지할 수 있는 방법이 뭐가 있을까? 배시 셸을 실행하는 것이다.

/bin/ExcuteMe 파일을 실행하면 우리는 일시적으로 level2의 권한을 획득한 상황에서 단 한가지의 명령어를 입력할 수 있다.

이때 배시 셸을 실행한다면 level2의 셸에 계속 머물 수 있다.

 

 

 

백도어를 하는 대표적인 2가지 공격 기법에 대해 알아보자.

아래와 같이 level1에서 level2로 바뀌는 일시적인 상황에 level2에서 셸을 실행해 level2의 권한을 지속적으로 유지 할 수 있다.

 

 

 

vi 편집기에서 셸을 실행 할 수 있다. 위 방법과 약간 다른 방법이다.

 

 

위 두가지 방법으로 공격해 level2의 패스워드를 찾을 수 있다.

 

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

해커스쿨 FTZ level4  (0) 2017.08.01
해커스쿨 FTZ level3  (0) 2017.07.31
해커스쿨 FTZ level2  (0) 2017.07.28
해커스쿨 FTZ trainer6~trainer10  (0) 2017.07.21
해커스쿨 FTZ trainer1~trainer5  (0) 2017.07.17