해커스쿨 FTZ level 1~5

이슬·2022년 10월 6일
0

1. level1

level문제에 접속하면 ID/Password를 얻을 수 있다. 여기서 ID, Password는 모두 level1.

ls -l 명령어를 이용하여 level1의 홈디렉토리의 내용을 확인하면 1개의 파일과 2개의 폴더가 존재한다는 사실을 알 수 있다.

hint를 보기 위해 cat명령어로 출력해보면, level2 권한으로 setuid가 걸린 파일을 찾아보라는 문구를 볼 수 있다.

※ setuid가 걸린 파일을 실행시키면 실행하는 그 중에는 파일의 소유주 권한을 불러오게 된다. 물론, 실행을 마친 뒤에는 자신의 권한으로 돌아온다.


리눅스에서 파일을 찾을때 fine을 사용하는데, fine 명령어는 파일을 찾을 때 파일명, 파일 권한, 파일 크기, 파일 소유주 등을 알 수 있다.

나는 그냥 fine 명령어를 수행해 보았더니 권한이 없는 파일에 대한 여러 에러 메세지가 출력되어 원하는 정보를 얻기가 어려웠다.

이때, 2>/dev/null을 이용하면 해결 가능하다. 2는 표준에러를 의미하고 /dev/null는 휴지통과 같은 의미이기에, '발생한 표준에러를 휴지통에 버림'으로서 문제를 풀 수 있다.


이처럼 실행 결과로 /bin/ExecuteMe가 도착한 것을 볼 수 있다. /bin 디렉토리로 들어가 ExecuteMe 파일을 확인해보면,

권한이 -rwsr-x--- 되어있는데, 여기서 s는 setuid가 걸려있다는 의미이다.

ExecuteMe 파일을 실행시켜보면, 위의 첫번째 사진을 몰 수 있다. 원하는 명령어 하나를 실행시켜 주겠다는 문구를 볼 수 있는데, 나는 명령어를 해석시키는 쉘인 bash쉘을 level2의 권한으로 실행시켜 보았다.

그러자 level2의 권한으로 리눅스 명령어를 사용할 수 있게 되었다. 결과적으로 나의 패스워드를 확인하는 my-pass 명령어로 level2의 패스워드를 확인할 수 있었다.


2. level2

ls -l 명령어를 이용하여 level2의 홈디렉토리의 내용을 확인하면 hint 파일과 2개의 폴더가 존재한다는 사실을 알 수 있다.

level1에서 했던 방식과 같이 cat 명령어를 이용하여 hint를 확인해보자.
hint 파일에는 테스트 파일 편집 중 쉘의 명령을 실행시킬 수 있다는 구문을 담고 있었다.

텍스트 파일 편집은 리눅스의 vi 기능을 의미하는데, vi 편집기 사용 중에는 쉘의 명령을 실행할 수 있는 방법을 찾아야 한다.


우선 파일의 소유주가 level3인 파일을 find 명령어로 찾아보았다.

그 결과, /usr/bin/editor 파일이 나왔다.

/usr/bin 디렉토리로 이동해서 editor 파일을 확인하자, editor 파일에 setuid가 걸려있고 파일의 소유주는 level3인 것을 알 수 있다.


editor 파일을 실행시켜보면 vi 편집기가 실행된다. 이는 vi editor 실행 중 셀을 실행하면 setuid가 걸려있기에 level3의 권한으로 셀이 실행될 것임을 의미한다.

※ vi 편집기 사용중에 command 상태일 때 느낌표(!)를 사용하면 리눅스 명령어가 실행된다. (예) !ls, !pwd, !bash)


command 상태에서 !pwd를 실행하면 실제로 pwd가 수행되어서 editor 파일이 위치한 디렉토리를 출력해 준다. 그 다음 bash쉘을 실행 (!bash) 시켜보면, 쉘이 성공적으로 실행되고, my-pass 명령어로 level3의 패스워드를 확인할 수 있었다.


3. level3

ls -l 명령어를 이용하여 level3의 홈디렉토리의 내용을 확인하면 hint 파일과 2개의 폴더가 존재한다는 사실을 알 수 있다.

이제는 자연스럽게 hint 파일을 cat 명령어로 확인해본다.

그러자 c언어로 이루어진 소스코드가 출력되는 것을 볼 수 있었다.

그리고 또 다른 hint 2개가 제공된다.


우선 힌트의 코드로 컴파일된 문제 파일을 찾기 위해 find 명령어를 수행시켜보았다.

/bin/autodig 파일을 찾았다. autodig 파일은 setuid가 걸려져 있고, level4의 소유주로 되어있는 것을 볼 수 있다.


autodig 파일을 실행시켜보면 인자값을 전달하지 않았기에 출력문이 몇개 출력되고 난 후에 종료된다. 자 그러면 우리는 어떤 인자값을 넣어 autodig 파일을 실행시켜야 할까?

우리는 앞서 두개의 hint를 전달받았다. 힌트를 해석해보면,

  • 동시에 여러 명령어를 사용하려면?
    리눅스에서 세미콜론(;)의 사용은 명령어를 동시에 사용 가능하다.
  • 문자열 형태로 명령어를 전달하려면?
    전달하려는 값을 큰따옴표("")로 묶으면 문자열 형태로 전달 가능하다.

level4 권한으로 setuid가 걸려져 있는 autodig 파일을 실행하면서 bash 셀과 my-pass 명령어를 세미콜론(;)으로 연결하여 동시에 실행시켜주고, "bash;my-pass"로 문자열 형태로 전달하면 되겠다는 결과를 얻었다.

실행시켜부바 bash 셀이 level4 권한으로 실행되며 my-pass 명령어가 실행되어 level4의 password를 얻을 수 있었다.


4. level4

ls -l 명령어를 이용하여 level3의 홈디렉토리의 내용을 확인하면 hint 파일과 2개의 폴더가 존재한다는 사실을 알 수 있다.

hint 파일을 cat 명령어로 확인해보면 /etc/xinetd.d/ 디렉토리에 백도어를 심어놓았다는 내용을 볼 수 있다.

※ 백도어? : 시스템이 존재하면 공격자가 일반 보안 엑세스 컨트럴을 우회하고 시스템에 엑세스 할 수 있는 악성 코드의 유형을 의미


/etc/xinetd.d/ 디렉토리를 보면 backdoor이라는 파일을 확인할 수 있다. 권한은 -r--r--r-- 읽기 권한만 주어져 있고 level4 유저가 파일의 소유주이다.

cat 명령문으로 backdoor 파일의 내용을 확인해보면,

리눅스의 사용자 정보 확인 명령어인 finger의 데몬 설정 정보가 나왔다. finger의 데몬 설정의 내용이 무엇을 의미하고 있을까?


finger를 실행하면 level5의 권한으로 서비스가 실행된다. 그러면 이 점을 이용해 level5의 셀을 알 수 있을 것 같다.

finger를 실행해 보자 xinetd에 의해 실행될 데몬파일이 /home/level4/tmp/backdoor/ 디렉토리에 위치되어 있다고 알려준다.

그런데 /home/level4/tmp/backdoor/ 디렉토리에 들어가 파일 목록을 출력해 보았는데 아무런 파일이 존재하지 않았다..


그럼 finger를 실행시 xinetd에 의해 실행될 데몬파일이 backdoor 역할을 하도록 만들어주면 되지 않을까?

그래서, system 함수를 이용해 my-pass 명령어를 통해 level5의 password를 출력하는 역할의 backdoor.c 파일을 만들어주었다.

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

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

만든 backdoor 파일을 gcc명령어로 컴파일했다.

그 다음 finger를 실행하바 level5 권한으로 my-pass 명령이 실행되어 level5의 password를 알 수 있었다.


5. level5

ls -l 명령어를 이용하여 level3의 홈디렉토리의 내용을 확인하면 hint 파일과 2개의 폴더가 존재한다는 사실을 알 수 있다.

cat 명령문으로 backdoor 파일의 내용을 확인해보면,

/usr/bin/level5 프로그램이 /tmp 디렉토리에 level5.tmp라는 임시 파일을 생성하고, 우리는 그것을 이용해 level6의 권한을 획득하는 것이 목표이다.

/usr/bin/level5 파일을 보면 level6의 권한으로 setuid가 걸려있다.

level5를 실행시키고, /tmp 디렉토리로 이동하여 level5.tmp라는 임시 파일이 생성되었는지 확인하자.


슬프게도 /tmp 디렉토리에 level5.tmp라는 임시 파일이 생성된 것을 확인할 수 없었다.

/usr/bin/level5 프로그램이 실행될 때 /tmp 디렉토리에 level5.tmp 임시 파일이 생성되지만 프로그래밍이 종료되기 전에 삭제되는 것은 아닐까? 그렇다면 level5.tmp 임시 파일이 생성되고 삭제하기 전에 이를 가로챌 수 있는 방법은 없을까?

/tmp 폴더에 test라는 파일을 만들고 /tmp/test 파일에 level5.tmp의 symbolic.link를 걸어주면 삭제되기 직전에 level5.tmp의 내용이 test 파일에 들어갈 것이다. 우리는 test 파일의 내용을 확인해서 삭제된 level5.tmp의 내용을 볼 수 있다.

※ symbolic.link : 어떤 파일을 가르키는 파일로 windows의 바로가기와 비슷한 개념이다.

touch 명령어로 크기가 0바이트인 test 파일을 생성했다.

symbolic.link를 걸어주는 명령어인 ln을 이용해 test 파일에 level5.tmp 파일의 symbolic.link를 걸어주고 ls 명령어로 확인하면 우리는 symbolic.link를 이용한 파일 가로채기의 준비가 끝났다. 이제 /usr/bin/level5 프로그램을 실행시켜 보자.

level5.tmp 파일은 삭제되었지만 symbolic.link로 test 파일에 level5.tmp 파일의 내용이 저장되어있는 것을 확인 가능하다. (0바이트에서 31바이트로 증가함)

이제 test 파일를 확인하면 level6의 password를 확인 가능하다.

profile
Cybersecurity

0개의 댓글