pwn

pwnable.kr - cmd1

ray3708 2020. 7. 16. 16:42

해설

Mommy! what is PATH environment in Linux?

 

ssh로 접속하여 cmd1.c 코드를 확인해보자

 

#include <string.h>

int filter(char* cmd){
    int r = 0;
    r += strstr(cmd, "flag")!=0;
    r += strstr(cmd, "sh")!=0;
    r += strstr(cmd, "tmp")!=0;
    
    return r;
}
int main(int argc, char* argv[], char** envp){
    putenv("PATH=/thankyouverymuch");
    if(filter(argv[1])) return 0;
    system( argv[1] );
    return 0;
}

코드를 보면 main에서 putenv 함수를 통해 PATH 환경 변수를 날려버리고, 입력 인자를 필터링한 후 system 함수를 통해 실행 시킨다. PATH를 날려버리기 때문에 ls, cat 같은 바이너리를 바로 실행할 수 없는데, 사실 /bin/ls, /bin/cat처럼 절대 경로를 지정해주면 충분히 실행할 수 있다. 거기에 필터링에 flag 문자열이 있기 때문에 ./cmd1 "/bin/cat flag"와 같은 명령어는 필터링에 걸리게 된다. 그러나 이것도 문제가 되지 않는게 cat은 와일드카드 입력을 받을 수 있다. 즉, 현재 디렉토리 내의 모든 파일을 출력하고싶다면 cat *을 하면 되므로, ./cmd1 "/bin/cat *"을 통해 필터링에 걸리지 않고 flag 파일을 출력할 수 있다.

 

사실 정말 문제가 의도한대로 푼건지 아니면 문제가 너무 쉬운 나머지 구멍이 있었던건지는 모르겠다.