본문으로 바로가기

[pwnable.kr] cmd1 풀이, write-up

category Wargame/pwnable.kr 2018. 11. 16. 14:02

pwnable.kr --- cmd1




ssh cmd1@pwnable.kr 2222 (pw:guest)로 접속하면 cmd1 문제를 만날 수 있다.


windows 환경의 cmd로 접속한것이 아니라 xshell5로 접속했다.


windows 환경의 cmd로 접속하려면 ssh cmd1@pwnable.kr -p2222와 같이 접속해야한다.



우선 현재 디렉터리에 어떤 파일이 있는지 확인해보자.







우리가 원하는 파일은 flag이고 현재 id가 cmd1이기 때문에 flag를 볼 수 있는 권한이 없다.


cmd1 파일은 setgid가 cmd1_pwn의 권한으로 걸려있다.


cmd1 elf 파일을 통해 cmd1_pwn의 권한으로 flag를 볼 수 있을것 같다.


cmd1.c를 가지고 cmd1 elf 파일을 만들었을 확률이 높으므로 cmd1.c를 분석해보자.






환경변수 PATH를 /thankyouverymuch로 설정한다.

filter() 함수를 호출한다.



1
2
3
int main(int argc, char* argv[], char** envp) {                                        
        putenv("PATH=/thankyouverymuch");
        if(filter(argv[1])) return 0;
cs




filter() 함수로 들어온 인자 cmd에 "flag", "sh", "tmp" 문자가 들어있으면 0이 아닌값을 return 한다.



1
2
3
4
5
6
7
int filter(char* cmd){
    int r=0;
    r += strstr(cmd, "flag")!=0;                                                    
    r += strstr(cmd, "sh")!=0;
    r += strstr(cmd, "tmp")!=0;
    return r;
}
cs



filter() 함수가 0이 아닌 값을 출력하면 return 0을 하고 0이 아닌 값이 들어오면, system(argv[1])을 하고 return 0



1
2
3
4
        if(filter(argv[1])) return 0;                                                
        system( argv[1] );
        return 0;
}
cs




우리가 cmd1을 공격하기 위해서 Linux의 환경변수인 PATH가 하는 작업을 생각 해야한다.


PATH는 리눅스 상에서 파일의 위치를 알려준다고 생각하면 된다.

우리가 이렇게 파일의 위치를 환경변수 PATH에 정의하는 이유는 뭘까?


Linux에서 사용하는 명령어(cat, ls ...etc) 모두 bin이라는 디렉토리에 존재한다.

하지만 우리는 /bin/cat, /bin/ls를 사용하는 대신. cat, ls만 입력하도 명령어를 사용할 수 있다


이것은 PATH에 미리 /bin이라고 명시되어 있기 때문에 사용자가 cat만 입력해도 환경변수 PATH를 참조해 /bin/cat을 실행하는 것이다.


PATH에 있는 경로를 따라가면 명령을 실행할 수 있다고 얘기하는것과 같다.



하지만 putenv를 통해 PATH를 초기화 하기 때문에 단지 명령어 만으로 명령을 실행할 수 없어 절대경로를 적어줘야한다. 

또한 필터링을 하기 때문에 *(wild card)를 사용하여 bypass를 진행했다.

*을 사용하여 한번에 여러 파일들에 접근할 수 있다.


예를들어 fl*라고 지정을 하면 앞 두글자가 "fl"인 모든 파일에 접근하는 것이다.





위와 같이 쉽게 공격에 성공 가능하다.


또한 환경변수를 통해 *(wild card)를 사용하지 않고 접근 가능하다.




성공!!!!!!