본문 바로가기

Write Up

(12)
LOB #6 wolfman ID : wolfman Passwd : love eyuna - darkelf.c 내용을 확인 버퍼의 크기는 40이고, 코드의 내용은 위와 같다 - main 함수 디버깅 스택의 크기는 44 (buffer(40)+i(4))이므로 dummy값은 존재하지 않는다 sfp에서 40만큼 떨어진 거리에 buffer가 존재한다 - argv[1]의 길이가 48까지만 허용되므로 buffer(40) + sfp(4) + ret(4) =48만큼만 들어갈 수 있다 그러므로 쉘코드는 argv[1]에 들어가면 안된다 -> argv[1] 대신 argv[2]에 쉘코드를 넣고 argv[2]의 주소를 ret에 넣는 방법 사용 - argv[2]의 주소를 알아내기 위해 strcpy 다음 코드에 break point를 걸고 디버깅 창에서 다음과 ..
FTZ #5 ID : level5 Passwd : what is your name? - hint를 먼저 확인한다 - /usr/bin에 이동하면 파일 목록 중 level5가 있는 것을 확인가능하다 위의 사진과 같이 level5의 파일에 level6의 setuid가 걸려있는 것도 확인 가능하다 level5 파일을 실행해보면 아무일도 존재하지 않는다 - /tmp에 이동하여 파일 목록을 살펴보면, level5.tmp에 관한 파일은 존재하지 않는다 일단 임의로 level5.tmp 파일을 만들어 보자 파일 내용을 뭘로 해야할지 몰라 일단 비밀번호를 출력해주는 시스템 함수를 입력하였다 그 후 level5를 실행 후 만든 level5.tmp 파일을 확인하면 다음 level의 비밀번호가 대신 쓰여져 있다 추측 상 level5를 실행..
FTZ #4 ID : level4 Passwd : suck my brain - 먼저 hint를 확인해본다 - /etc/xinetd.d/에 백도어를 심어놓았다고 했으니 해당 위치로 이동해본다! backdoor가 있는 것을 확인할 수 있다! - backdoor를 보면, 코드 내용 전체를 알 수는 없지만 finger라는 명령어를 실행하면 server위치의 해당 파일이 실행되는 것이라고 추측했다.. 그리고 user에는 level5가 걸려있는 것을 확인가능하다 - /home/level4/tmp 위치에 backdoor 파일을 만든다 이때 파일의 내용을 my-pass 명령어가 실행되도록 한다! - finger 명령어를 실행하면 아무 일도 일어나지 않는다! finger 명령어를 더 자세히 알아보아야 할 것 같아 검색해봤다 * fi..
FTZ #3 ID : level3 Passwd : can you fly? - hint를 먼저 확인한다 - 일단 more hints의 정답을 보면 ① 동시에 여러 명령어를 사용하려면? ';'(세미콜론) 사용 ② 문자열 형태로 명령어를 전달하려면? ""(큰따옴표) 사용 - level4의 uid가 걸려있는 파일을 찾는다 * autodig 즉, /bin/autodig를 실행시킬 때 ';'을 이용해서 /bin/bash 명령어와 my-pass 명령어를 동시에 입력해준다! 이때, 문자열로 전달하기 위해 ""로 감싸주면 된다!
FTZ #2 ID : level2 Passwd : hacker or cracker - 먼저 hint를 확인 - level3 setuid가 걸려있는 파일 검색 - /usr/bin/editor 실행 VIM 편집기가 실행되는 것을 확인할 수 있다! * vim에서는 '!명령어'를 사용하면 vi 텍스트편집기를 빠져나와서 해당 결과를 보여줌 -> 외부 쉘을 실행시키기 위해 입력모드에서 '!/bin/bash' 입력 - 결과 vi 편집기를 빠져나오고 level3으로 권한이 상승된 것을 확인 가능하다!
FTZ #1 ID : level1 Passwd : level1 파일 목록 중 hint가 있으므로 확인! level2의 setuid가 걸려 있는 파일을 찾기 위해 몇가지 명령어를 알아보자! ① find : 파일 및 디렉토리 검색 ② /dev/null로 출력 버리기 : /dev/null 파일은 항상 비어있으며, 이곳으로 전송된 데이터는 버려짐. 특정 명령어를 실행 후, 출력이 필요없는 경우는 /dev/null로! -> 에러 메시지를 처리할 때도 /dev/null으로 처리하는 것이 좋다! (파일 디스크립터에서 '2'가 에러 출력 담당) - find문 작성 : root부터 user name이 level2이고 다음 level 권한이 있는 파일 검색 find / -user level2 -perm -4000 2>/dev/null..
LOB #5 orc ID : orc Passwd : cantata wolfman에 다음레벨의 seteuid가 걸려있는 것 확인 가능! - wolfman.c 소스 코드 현재 버퍼의 크기는 40이고, 환경변수를 비우는 for loop문을 사용중이다. 또한 strcpy 함수를 사용해서 bof 취약점이 발생하고 있다. 이번 문제에서는 buffer hunter를 사용해서 buffer를 비우는 memset 함수를 사용하였지만 strcpy 함수 이후에 사용하였으므로 상관없음 -> lob 4번과 똑같은 방법으로 풀면된다! main 함수 디버깅으로 가기 전 extern에 대해 알아보고 가자! * extern extern 자료형 전역변수; : 선언한 전역 변수를 다른 파일의 코드에서 사용하고 싶을 때 extern 사용 - main 함수 디버..
LOB #4 goblin - argv[2] + NOP Sled이용 https://rsy99.tistory.com/42에서 main 함수에서 에 breakpoint를 건 이후를 기준으로 한다! 먼저 argv[2]의 주소를 알아내야 한다. 일단 argv[1][47]이 "\xbf"가 되어야 하므로 "\xbf"*48을 해준다. 그 후 " "(공백)를 추가 후 argv[2]를 삽입해줘야 한다. 우리는 argv[2]와 NOP Sled를 모두 이용할 것이므로 argv[2]에 "\x90"*100+"25byte shellcode", 총 125byte가 필요하다. 위와 같이 payload를 작성해준다. 그 후 "A"(41)이 나타나는 주소공간을 찾아주어야한다. 위에서 "00" 이후가 argv[2]의 주소공간이다! argv[2]의 공간 중 하나를 골라 ret에 넣어준다 ret -> 0xb..