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

INTRUDED.NET - Wargames : Leviathan Level5

WarGeme/Intruded.net 2010. 9. 1. 00:47 Posted by 알 수 없는 사용자

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

레벨 5에는 "Trash"라는 숨겨진 디렉토리가 존재하는군요. 그 안을 살펴보니 "bin"이라는 실행파일이 하나 보입니다. 실행파일을 실행해 보겠습니다.


2진수로 된 바이너리 값이 9바이트 출력 되었습니다. 지금까지의 모든 패스워드가 마지막 개행문자를 포함하여 모두 9바이트였던 것을 기억 한다면 이 값들이 아마도 패스워드가 될 것 같습니다. 저의 소중한 툴인 ltrace를 이용하여 살펴보겠습니다. ^^;


역시 레벨 6의 패스워드파일을 열고 있습니다. 그럼 위에서 출력 된 바이너리 값들을 char 형태로 바꿔보도록 하겠습니다.

<binary>  :  <hex> : <char>
-----------------------------

00110110  :  0x36  :   6

01101100  :  0x6C  :   l
01111001  :  0x79  :   y
01110110  :  0x76  :   v
01001100  :  0x4C  :   L
01011000  :  0x58  :   X
01000011  :  0x43  :   C
01000001  :  0x41  :   A
00001010  :  0x0A  :  \n

결과 : 6lyvLXCA

그럼, 결과가 맞는지 한 번 확인해 보겠습니다.


성공입니다! ^^
(이번에는 패스워드를 지우는데 크게 의미가 없네요...-_ㅜㅋ)
AND

INTRUDED.NET - Wargames : Leviathan Level4

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

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

레벨 4 문제는 너무 쉽게 풀려서 좀 당황스러웠습니다...;;;

레벨 4도 마찬가지로 /wargames 디렉토리에서 "level4"라는 프로그램을 이용하는 것입니다. 실행을 하면 아래 그림과 같이 "Enter the password>" 라는 문자열이 출력되고, 잘못된 패스워드를 입력했을 때, "bzzzzzzzzap. WRONG"이라는 문자열이 출력됩니다. 여기서 잠깐, "bzzzzzzzzap" 이 뭘까요...-_-?

뭔가 '의성어'일듯 한데... 궁금하네요...;;; 뭐라고 읽지요? 브즈즈즈즈즈즈으압!.... 비지지지지지앱?!

쩝...;;;


레벨 2에서 사용했던 strings 명령어도 한 번 써 봤습니다. system 함수도 보이고, /bin/sh도 보이고, 의문의 bzzzzzzzzap도 보이네요...;; 그 외에 정체모를 문자열들이 다수 보입니다.

다음으로 바로 앞 문제의 마지막에 언급했던 ltrace 명령어를 다음부턴 한 번 써봐야겠다고 말씀드렸는데 이렇게 곧바로 써먹을 줄은 몰랐습니다. 아래 그림을 보시면 ltrace 명령을 이용하니 "level4"프로그램의 패스워드가 금방 나오는군요.


이리하여 레벨 4는 쉽게 해결하게 되었습니다. ^^;
AND

INTRUDED.NET - Wargames : Leviathan Level3

WarGeme/Intruded.net 2010. 8. 31. 23:42 Posted by 알 수 없는 사용자

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

세 번째 문제 입니다!!!  +_+

레벨 3도 홈 디렉토리에는 아무 힌트도 없더군요. wargame 디렉토리로 가보도록 하겠습니다. 레벨 3의 권한으로 실행할 수 있는 prog라는 파일이 하나 있습니다. 한 번 실행해 보겠습니다.


tmp 디렉토리 밑에 "file.log"라는 파일을 찾을 수 없다고 하는군요. touch 명령으로 file.log를 만들어 주고 실행했는데 아무것도 나오지 않네요. 더 확실히 알아보기 위해 vi 에디터로 file.log 파일에 "This is test file log!"라는 문장 하나를 입력하고, 저장한 후 다시 실행을 해 보니 아래 그림과 같이 file.log 파일에 들어있는 내용을 출력해주고 있음을 볼 수 있습니다.


그리고 또 다시 실행을 해 보니 file.log 파일을 찾을 수 없다고 합니다. 왜 그럴까요?
궁금하니까 gdb로 디버깅 해 보도록 하겠습니다.ㅋ


위 그림과 같이 우선 fopen 함수를 사용하여 file.log 파일을 열고 있는 듯 합니다.
더 내려가 보도록 하겠습니다.


unlink 함수를 이용해서 file.log 파일을 지우는 것 같습니다. 그래서 두 번째 실행했을 때는 파일을 찾을 수 없다고 나오는 군요. 음... 심심하니까 fopen 함수를 호출하기 직전에 브레이크 포인터를 걸고 실행해 보도록 하겠습니다.


<main+25>:  movl  $0x80486fa, (%esp) 에서
0x80486fa의 내용을 살펴보니 "/tmp/file.log"를 담고 있네요!!!

(......)

그냥... 그렇다는 겁니다....-_-;;;

그럼, 레벨 4의 패스워드를 알기 위해서는 어떻게 해야할지 곰곰히 생각해 보았습니다.

앗,,, 생각해보니 곰곰히 생각할 필요도 없는 것이었네요. /tmp/file.log 대신에 레벨 4의 홈 디렉토리에 있는 ".passwd"파일을 열게 하면 되겠네요. 어떻게...? prog 파일을 어떻게 손 볼 수는 없는 일이니 /tmp/file.log 파일을 손봐야겠습니다.

레벨 4의 홈 디렉토리에 있는 패스워드 파일과 심볼릭 링크를 걸어주면 될 듯 합니다.


성공입니다! ^^;

문제를 풀고 혹시 다른 사람들은 어떻게 풀었는지 궁금해서 찾아보니 prog 파일을 ltrace를 사용하여 그 속을 들여다 보신 분도 있더라구요. 이런 방법도 있군요. 전 그저 gdb...;; 다음엔 ltrace 같은 것도 한 번 써봐야겠습니다.
AND

INTRUDED.NET - Wargames : Leviathan Level2

WarGeme/Intruded.net 2010. 8. 31. 17:59 Posted by 알 수 없는 사용자

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

레벨 2로 접속을 하고, 홈 디렉토리의 내용을 살펴보았습니다. 이번에는 홈디렉토리에 특별한 것이 전혀 보이질 않습니다. 숨겨진 패스워드 파일에는 레벨 1에서와 같이 레벨 2의 패스워드가 들어있구요. 루트 디렉토리의 내용을 보니 워게임이라는 디렉토리가 보입니다. 주저없이 가서 살펴보았습니다. 그 안에는 setuid bit가 설정 된 파일들이 있습니다.


더 자세히 보기 위해 'ls -al' 명령으로 살펴보겠습니다.


여기서 필요한 파일은 당연히 check가 될 것입니다. 이 파일을 이용하면 레벨 3의 권한을 얻을 수 있을 것으로 예상됩니다. 실행을 해 보니 패스워드를 입력하는 곳이 보이고, 1234를 입력했을 때 잘못된 패스워드라는 문구를 출력하며 프로그램이 종료됩니다. 일단 디버깅을 해 보겠습니다.


<main+133> 에서 strcmp 함수를 호출하여 비교하는 것을 볼 수 있습니다. setuid 함수도 보이고 system 함수도 보이네요. 일단 디버깅은 잠시 미뤄두고 좀 더 쉬운 방법으로 몇 가지 더 조사를 해 봐야겠습니다.

strings 명령으로 이 프로그램에 어떤 문자열들이 있는지 알아보겠습니다.


"password:" 밑에 "/bin/sh"도 보이네요. 패스워드를 맞추게 되면 아마도 레벨 3의 쉘을 얻을 수 있나 봅니다. 그리고 가장 밑에 "secret", "love"라는 문자도 보입니다. 설마...(?)


역시나 아니네요...-_-;; 항상 쉽게쉽게 가고 싶다는...ㅋ;;

다음으로 check 파일을 vi 에디터로 열어서 헥스모드에서 한 번 살펴보겠습니다. 바이너리 파일을 vi 에디터에서 헥스 모드로 전환하는 명령은 "%!xxd" 입니다.


헥스 모드로 전환 되었습니다.


그럼 이제 가장 궁금한 "password"를 검색해 보겠습니다.


앗, 조금 전에 보았던 "secret" 과 "love"가 보이고, 다른 문자들이 더 보이네요.
주저하지 않고 써 보겠습니다.


쉘이 떳습니다. euid가 레벨 3으로 설정되어 있네요. 각 레벨의 홈 디렉토리에는 숨겨진 패스워드 파일이 있던걸 기억하시겠죠?
AND