[어설픈] 해커스쿨 FTZ level3 풀이

2018. 12. 31. 19:41System Hacking/FTZ


안녕하세요! FTZ level 3 문제 풀이 

시작하도록 하겠습니다!


우선 전 단계에서 획득한 비밀번호

"can you fly?" 이걸 비밀번호로 입력하고

level3 폴더에 무슨 파일이 있는지 확인 합니다!


전에 있던 것과 유사하게 hint가 있네요!




바로 cat hint를 통해서

hint속의 내용을 살펴보도록 해요!


흠 이번에는 코드가 길이가 적당히 있는듯 하네요!


첫줄에 autodig의 소스이다라고 하는 것을 보면,

autodig의 소스코드가 이렇다고 말하는거 같네요!


한줄한줄 풀이를 하자면, main함수에 (argument counter

argcargv이중 포인터가)

main 함수의 두 가지 인자로 들어가네요!

 main( 인자1, 인자2) 이런꼴이니까요!  


그리고 char 형의 cmd에 100byte를 부여하네요

(=100의 array 공간을 주니까요)


그리고 argc!=2이면, 이 뜻은

아까 제가 말한 argument counter가 2가 아니면 이라는 뜻인데요!

왜 이게 이거냐면 우선 != 이 부호는

같지 않다라는 부호이고,

 argc가 argument counter 즉 argument갯수 세는 놈이라서요!


-------------※argument가 뭔디?-----------------

[ 쉽게 설명해서, 저희가 리눅스 명령어 창에 뭘 입력하는 것!]

근데 띄어쓰기 기준이에요! 

예를 들면 제가 위에서 cat hint이라고 쳤죠? 힌트 내용 보기위해서?

그럼 argument가 두 개인 거에요!

cat(argument[0]) hint(argument[1]])


ls -al이면 

ls가 argument[0], -al이 argument[1]인거죠!


----------참고로 argument는 배열이 0부터 시작해요!-----------


다시 돌아가서 argc!=2라면

즉 argument의 갯수가 2개가 아니라면, 

다음 두개의 문장을 출력한다네요!

(1) auto digger의 version0.9와 

(2) usage: ./autodig host

그리고 바로 exit(0);을 통해 프로그램이 종료됩니다!


즉 저희가 아무것도 못하고 프로그램이 꺼져버리죠?

다시말해 argument의 갯수는 무조건 2개라고 문제에서 힌트를 주는 겁니다!


자 이제 strcpy 함수가 나오네요!

stringcopy의 약자로서 string문자를 copy복사한다!

이렇게 이해하시면 될거같아요!


즉 저희가 입력한 문자를 복사하는 거죠!

 strcpy함수는 이렇게 보시면 되요!

strcpy(문자 복사할 위치, 복사할 문자)

그니까 dig @를 cmd에 복사한다는 뜻이 겠죠?


strcat 함수는 string concatenate의 약자로 string문자를 concatenate붙인다

즉 저희가 입력한 문자를 기존에 있는 문자 꽁무니에 이어 붙인다!

이렇게 이해하시면 될 것 같습니다!


그래서 cmd에 저희가 dig @라고 입력하였고

dig@바로뒤에 argv[1]의 값이 붙여지는 거죠

그리고 argv[1] 바로 뒤에 version.bind chaos txt가 이어서 붙네요!


즉 한꺼번에 보기 쉽게 적어드리자면

맨 마지막 system (cmd);에 들어갈 cmd 값을 보면

system(dig @argv[1] version.bind chaos txt); 

이게 최종적으로 되는거죠!


근데 저희가 입력을 조작하거나 건드릴 수 있는 부분은

argv[1] 이 부분이죠!

 argv[1]이 뭔지 이해가 안가시는 분들은 

제가 위에서 ※argument를 다룬 부분을 다시 보시기 

바랍니다!!


그리고 이를 이용하여 level4의 권한을 얻어라! 

이렇게 적혀있네요!


일단 일반적으로 저희가 시스템 함수를 통해서

많은 것들을 가능케 할 수 있는데

/bin/sh나 다른 함수등등..


따라서 저희가 저기서(system(cmd)에서) 쉘을 실행시키거나

하면 문제가 풀릴 것 같다는 생각이 드네요!

왜냐면 다른 곳은 저희가 값이나 다른 걸 조작 할 수가 없잖아요!


근데 more hints에 이런게 적혔네요!


(1) 동시에 여러 명령어를 사용하려면?

= ; 바로 이 세미콜론이죠

구글에서 찾아보시면 나오겠지만,

리눅스에서 ; 를 입력하면 동시에 명령어를 실행 시킬 수 있어요!

여기서 신기한건!   틀린 명령어; /bin/sh/ ; 실행 시킬수 없는 명령어 

이렇게 앞뒤로 실행시킬수 없거나 이상한 명령어가 와도 무시하고

실행 시킬 수 있는 애들만 실행 해준다는거에요!


(2) 문자열 형태로 명령어를 전달하려면?

이건 뭐 그냥 "" 여기 안에다가 명령어를 입력하면 되죠?

strcpy(cmd, "dig @")

strcat(cmd, " version. bind chaos txt")


 여기서도 보면 다 dig이나  version이나 "" 안에 있죠?


그냥 ""안에만 넣으면 된다 이겁니다!


자 이제 힌트를 모두 얻었으니 비밀번호 얻으러 갑시다!



우선 항상 저희가 계속 써왔던 find명령어를 써볼게요

find하고 /(root)에서 -user가 level4인 -perm가 4000인 

근데 permission denied가 뜨는 오류인 애들 > /dev/null(쓰레기통으로 보내)

그래서 유일하게 남은 놈이 

/bin/autodig 이놈이네요!!



그래서 혹시나 몰라서 마지막으로 

ls -al해서 autodig이 어떤놈인지 확인하기 위해서!!!


그랬더니 파일의 소유주가 level4이네요!

그럼 이 파일이 맞네요!




자 일단 한번 그냥 ./autodig을 입력해서 autodig을 실행시켜 봅시다!

그랬더니 auto digger version 0.9

usage: ./autodig host 제가 위에서

언급한 대로 출력이 되네요!



그래서 이번에는 argument갯수를 2개로 맞춰서 뒤에 아무거나 넣어보니

이상하게 뜨네요!





흠 그래서 이제 힌트를 제대로 활용해서 명령어를 입력해 보았습니다!

우선 문자열로 명령어를 전달하라고 했으니 뭐다?

(1)" "여기안에 입력한다


자 그 다음! 명령어를 연속해서 실행한다?

(2) ;를 활용한다!

근데 ;는 갯수제한 없이 사용가능하니 여기서는 두개를 써야겠네요!

왜냐?

[1] dig @ [2]version.bind chaos txt  그리고 저희가 입력할 [3] argv(1)

이렇게 3개의 argument가 있으니 이 틈사이에 두개를 끼워넣으면 되죠!

"dig@ ; argv[1]] ; version.bind chaos txt"

 자 그럼 argv[1]에는 뭐가 들어가야 하나?


/bin/sh가 들어가거나 my-pass가 들어가면 되겠죠?

/bin/sh는 쉘코드를 실행하는 거니까

쉘을 실행하고  my-pass를 입력하면 비밀번호가 뜨니까요


그러면 my-pass는 왜됨?

왜냐면 autodig자체가 setuid비트가 걸려있어서

이미 이 파일이 실행될때 level4의 권한으로 실행되고 있으니까

level4의 권한으로 "내 레벨 비밀번호가 뭐임? ㅋ"

이렇게 물어보면 내 레벨(level4) 비밀번호는 이거야!

이렇게 되는거죠!

level 3의 권한으로 실행시키는게 아니니까!


따라서 my-pass든 /bin/sh든 모두 가능합니다


그래서 최종적으로 저는 ";/bin/sh;"를 입력하였습니다


그랬더니 dig는 에러가 떴죠?

당연하게도?

왜냐면 제가 dig@요놈 그냥 무시하고 ;를 입력했으니 

실행 못하는놈이나 에러뜨는놈은 무시하고 실행 가능한 애만 실행시켜!!!

이렇게 됐으니 dig@는 제가 제대로 뒤에 무슨 값을 안줘서 에러가 뜬거죠


하지만! 실행을 시킬수 있는 /bin/sh는 실행이 된거죠!





그래서 쉘코드 화면에서 my-pass를 입력하면 아래와 같이 패스워드가 뜨게됩니다!


자 이상으로 level3 풀이 마치겠습니다!

감사합니다!