2018. 12. 31. 19:41ㆍSystem Hacking/FTZ
안녕하세요! FTZ level 3 문제 풀이
시작하도록 하겠습니다!
우선 전 단계에서 획득한 비밀번호
"can you fly?" 이걸 비밀번호로 입력하고
level3 폴더에 무슨 파일이 있는지 확인 합니다!
전에 있던 것과 유사하게 hint가 있네요!
바로 cat hint를 통해서
hint속의 내용을 살펴보도록 해요!
흠 이번에는 코드가 길이가 적당히 있는듯 하네요!
첫줄에 autodig의 소스이다라고 하는 것을 보면,
autodig의 소스코드가 이렇다고 말하는거 같네요!
한줄한줄 풀이를 하자면, main함수에 (argument counter인
argc와 argv이중 포인터가)
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 풀이 마치겠습니다!
감사합니다!
'System Hacking > FTZ' 카테고리의 다른 글
[어설픈] 해커스쿨 FTZ level 6 문제풀이 (0) | 2019.01.16 |
---|---|
[어설픈] 해커스쿨 FTZ level 5 문제풀이 (0) | 2019.01.15 |
[어설픈] 해커스쿨 FTZ level4 풀이 (0) | 2019.01.06 |
[어설픈] 해커스쿨 FTZ level2 풀이 (0) | 2018.12.26 |
[어설픈] 해커스쿨 FTZ Level 1 풀이 (0) | 2018.12.26 |