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 파일을 출력할 수 있다.
사실 정말 문제가 의도한대로 푼건지 아니면 문제가 너무 쉬운 나머지 구멍이 있었던건지는 모르겠다.