INTRUDED.NET - Wargames : Leviathan Level6

WarGeme/Intruded.net 2010. 10. 1. 13:27 Posted by 알 수 없는 사용자

Access: 
ssh: leviathan.intruded.net
port: 10101
username: level6

레벨 6의 홈디렉토리에는 특별한 것이 없습니다. /wargames 디렉토리로 이동해서 보면 "printfile"이라는 프로그램이 하나 보입니다. 실행 해 보니 인자로 파일이름을 쓰라고 하는군요. 프로그램의 이름으로 봤을 때 cat 명령과 같은 역할을 할 것이라 생각할 수 있습니다.


테스트를 위해 /tmp 밑에 작업 공간을 하나 만들고, "viiiin"이라는 파일을 하나 만들었습니다. 권한 등의 문제가 없기 때문에 실행이 잘 되네요. 역시 레벨 7의 홈 디렉토리에도 패스워드 파일이 있을 것입니다. 인자로 주고 실행 해보니 역시 실행되지 않습니다.


제가 만든 파일은 실행 되고, 레벨 7의 패스워드 파일은 실행되지 않은 이유를 알아내기 위해 각각 ltrace 명령으로 살펴보겠습니다. 그 결과 access() 함수에서 레벨 7의 패스워드 파일을 열지 못하게 막고 있네요. access() 함수는 지정된 파일에 대해서 읽기, 쓰기, 실행 권한을 가지고 있는지 체크합니다. 그 파일이 만약 심볼릭 링크 된 파일이라 할지라도 원본 파일을 체크하기 때문에 같은 결과를 얻을 것입니다. 그래도 한 번 해봅시다.ㅋ


역시 access() 함수에서 막히는것을 볼 수 있습니다. 그런데 위 그림에서 "viiiin"파일을 ltrace 한 결과를 보시면 snprintf() 함수 내부에서  "/bin/cat" 을 이용하여 "viiiin" 파일을 출력하고 있습니다. /bin/cat 명령은 인자를 하나만 줄 수있는게 아니라 여러개를 동시에 줄 수 도 있습니다. 한 번 테스트 해 보겠습니다.


cat 명령의 인자로 "viiiin" 파일 이름과 "test" 파일 이름을 동시에 주었습니다. 순서대로 출력되는 것을 볼 수 있습니다. 이렇게 두 개의 파일 이름이 동시에 들어갔을 때 access() 함수는 어떻게 반응할까요? 두 개의 파일 모두를 체크한 후에 통과한 파일만을 접근하도록 할까요? 확인해 보겠습니다.


테스트 해 보기 위해서 파일 이름에 공백을 준 트릭 파일을 하나 만들었습니다. 파일 이름은 "viiiin passwd" 입니다. ltrace해 본 결과 access() 함수의 리턴 값이 0으로 접근이 허용 된 것을 볼 수 있습니다. 그리고 snprintf() 함수 내부에 /bin/cat 의 인자로 "viiiin"이라는 파일 이름과 "passwd"라는 파일 이름이 각각의 인자로 들어간 것 처럼 보이네요. 그런데 그 아래에 보면 passw 파일은 "Permission denied"로 접근이 거부되고 있습니다. 하지만 실제 실행을 해 보면 정상적으로 출력이 되는 것을 볼 수 있습니다.


이렇게 레벨 7의 패스워드를 알 수 있었습니다. ^^


구글링을 좀 해서 풀었는데, 혼자 힘으로 풀었더라면 더 좋았을 텐데하는 아쉬움이 남네요...-_ㅜ
그래도 이런 경험으로 다른 워게임 문제를 풀 때 적용하면 뿌듯할 것 같습니다.!ㅋ;;
AND