티스토리 뷰

반응형

이번 문제는 전에 풀었던 cmd1 의 심화 버전으로 필터가 더 많이 걸려 있다.

1을 풀었으니 2도 풀 수 있겠지? 함께 풀어보자. 




문제는 다음과 같다. 이때 주의 할 점은 cmd2의 비밀번호는 cmd1의 플래그 라는 것!

1을 풀어야 2를 풀 수 있다.



접속해서 확인 해 보면 다음과 같이 cmd2 cmd2.c flag 파일이 나온다.




#include<stdio.h>
#include <string.h>

int filter(char* cmd){
        int r=0;
        r += strstr(cmd, "=")!=0;
        r += strstr(cmd, "PATH")!=0;
        r += strstr(cmd, "export")!=0;
        r += strstr(cmd, "/")!=0;
        r += strstr(cmd, "`")!=0;
        r += strstr(cmd, "flag")!=0;
        return r;
}

extern char** environ;
void delete_env(){
        char** p;
        for(p=environ; *p; p++) memset(*p, 0, strlen(*p));
}

int main(int argc, char* argv[], char** envp){
        delete_env();
        putenv("PATH=/no_command_execution_until_you_become_a_hacker");
        if(filter(argv[1])) return 0;
        printf("%s\n", argv[1]);
        system( argv[1] );
        return 0;
}




cmd2.c 파일을 읽어보면 다음과 같은 소스코드가 나온다. 

cmd1보다 훨씬 더 많은 필터가 걸려 있고, 환경변수를 이용한 필터 우회를 사용 할 수 없도록 delete_env라는 환경변수를 없애는 함수가 있다.


따라서 이번에는 1과 다른 방법을 사용 해야 하는데 command  함수를 사용한 우회 방법이 있다.


이번 문제를 풀면서 풀다가 막막할 때는 help 명령어를 쳐서 사용 가능한 명령어들을 쭉 보는 것도 문제를 푸는 것에 도움이 된다는 것을 알게 되었다.


command 의 옵션을 보면 다음과 같다. 


command: command [-pVv] command [arg ...]

    Execute a simple command or display information about commands.


    Runs COMMAND with ARGS suppressing  shell function lookup, or display

    information about the specified COMMANDs.  Can be used to invoke commands

    on disk when a function with the same name exists.


    Options:

      -p        use a default value for PATH that is guaranteed to find all of

        the standard utilities

      -v        print a description of COMMAND similar to the `type' builtin

      -V        print a more verbose description of each COMMAND


    Exit Status:

    Returns exit status of COMMAND, or failure if COMMAND is not found.


여기서 우리가 사용 할 것은 -p 옵션인데 PATH를 현재 프로그램의 PATH를 기본값으로 사용 하는 옵션이다.

이것을 사용하면 cat함수의 경로를 입력 할 필요 없이 바로 "cat flag"를 실행 해 줄 수 있다. 

이때 flag라는 문자는 필터가 걸려 있기 때문에 이를 우회 해 줘야 하는데 이를 우회 할 수 있는 방법이 바로 *이다. 


-*

아스테리스크 라고 불리고 b*라고 사용 하면 b를 포함하는 모든 문자열들을 지정하는 연산자이다.





./cmd2 "command -p cat fl*"
command -p cat fl*
플래그값이 나옴^^


-필터 우회 다른 방법(아스키로 우회)


이렇게 command 함수를 이용해서 문제를 쉽게 풀 수 있는데 이것 말고도 다르게 풀 수 있는 방법이 또 존재한다.

바로 문자의 아스키로 막혀있는 문자를 우회하는 것인데 



./cmd '$(echo "\57")bin$(echo "\57")cat fla*'

bash 말고 프로그램안에서 실행될때는 해당 방법이 사용 가능하다.

"\57"=\이고 이를 온전하게 보내기 위해서 "(더블쿼터)로 감싸주고 전체 명령도 '로 감싸 주면 된다. 



-flag 필터 우회 다른 방법


해당 문자열을 *말고 다른 우회 방법도 존재하는데 symbolic linkalias 이다.

그런데 이 문제에서는 두개는 막혀 있어서 사용하지 못한 방법이다.

반응형
Comments
댓글쓰기 폼