티스토리 뷰

HackerSchool FTZ WARGAME Solution

 

Start : 15.07.03

 

LEVEL3

 

[그림 1]

 

hint 파일을 열어 보면 [그림 1]과 같이 autodig 에 대한 소스 코드가 출력되고, 아래에 문제를 풀기 위한 힌트가 제공된다.

 

 

소스 코드를 분석해보면 autodig 프로그램의 인자 값은 프로그램 이름 포함 2개가 필요하며, cmd 배열에 'dig @[인자 값] version.bind chaos txt' 를 저장하고 cmd 배열에 있는 값을 system 함수에 전달해서 실행한다.

 

[그림 2]

 

find 명령어를 이용해 autodig 의 위치를 찾는다.

[그림 3]

 

autodig을 그냥 실행시켜 보면 [그림 3]과 해당 서버를 찾을 수 없다는 내용이 출력되고 실행이 되지 않는다.

[그림 4]

 

hint의 more hint 에서 동시에 여러 명령어를 실행 시키는 방법이 힌트로 주어 졌는데 리눅스에서 명령어를 연속해서 실행시킬 때는 세미콜론(;) 을 명령어 옆에 입력하고 이어서 다른 명령어를 입력 하면 세미콜론 앞 명령어가 먼저 실행되고 실행이 끝나면 세미콜론 뒤 명령어를 실행한다. 그래서 우선 [그림 4]와 같이 /bin/autodig asdf;/bin/bash 를 입력하면 dig @asdf 가 실행되고 /bin/bash 가 실행되는 것을 예상하고 실행을 했으나 level4의 쉘이 떨어지지 않았다. /bin/autodig asdf;my-pass 를 하면 level3의 패스워드가 출력 되었다.

 

그 이유를 생각 해 보면 세미콜론은 앞에서 설명했던 것처럼 세미콜론 앞의 명령어가 실행이 완료되면 이어서 뒤에 명령어가 실행이 되는데 ';/bin/bash' 부분이 autodig 프로그램의 변수로 전달된 것이 아니라 그냥 명령어 상에서 바로 동작이 되버렸다.

[그림 5]

 

그래서 이번엔 more hint의 두번 째 힌트를 보고 프로그램 인자 값으로 구분된 문자를 문자열로 전달하는 방법에 대해 생각 해 보았다. 이는 쌍따옴표(") 로 해당 부분을 감싸주면 되는 부분이다. 그래서 /bin/autodig "asdf;/bin/bash" 로 실행시켜 보았으나 또 실행이 되지 않았고, 'version.bind: version.bind: 그런 파일이나 디렉토리가 없음' 이라는 에러가 출력되었다.

 

왜 저런 에러가 출력 되었는지를 생각해 보니 실제 내가 입력한 값이 배열에 들어갈 때 'dig @asdf;/bin/bash version.bind chaos txt' 로 들어 간다. 그래서 system 함수에서 실행될 때 'dig @asdf'가 먼저 실행이 되고 '/bin/bash version.bind chaos txt' 가 실행이 되버린 것이다. 그래서 bash 쉘로 version.bind를 실행시키려고 하다 보니 [그림 5]와 같은 에러가 출력이 된 것이다.

 

이를 해결하는 방법은 금방 생각해낼 수 있었다. '/bin/bash' 부분과 'version.bind' 부분을 또 구분을 시켜주면 되는 문제였다. 그래서 /bin/autodig "asdf;/bin/bash;" 로 명령어를 전달하면 문제가 해결 되었다.

 

[그림 6]

※ /bin/autodig "asdf;my-pass;" 를 하면 level4 의 권한으로 my-pass가 실행되므로 level4 의 패스워드가 실행된다.

※ /bin/autodig "asdf;my-pass" (맨 끝 세미콜론이 빠짐)를 해도 마찬가지로 level4의 패스워드가 출력되는데 이는 my-pass는 뒤에 인자 값이 있든 없든 실행이 되기 때문에 가능하다.

※ 일부 환경에서는 autodig 를 실행했을 때 속도가 느린 이유로 바로 에러가 출력이 안되거나 종료가 안되고 실행되는 경우가 있는데 이 때는 컨트롤-c 를 눌러 강제로 종료를 시켜주면 된다.

 

신고
댓글
댓글쓰기 폼