티스토리 뷰

Pwnable/FTZ

FTZ Level19

dtqdtq01 2018. 11. 17. 01:18

FTZ Level19




이번 문제는 이전 문제들과 다른 점이 있다.


바로 setreuid() 함수가 없다는 점이다.



Redhat 7.0 이후의 버전부터, Bash Drop Privileges라는 정책이 적용되었다.


Drop Privileges 정책이란?

원래는 SetUID가 걸린 파일은 실행 시에 그 파일의 소유자 권한으로 실행되지만,

bash 쉘을 실행할 때에는 실행한 유저의 권한으로, 즉 euid(Effective UID)가 아닌 raid(Real UID) 권한으로 실행된다.

쉽게 말해, SetUID가 걸린 Binary를 이용한 권한상승 취약점을 막아보고자 이러한 정책을 적용한 것이다.

하지만, setreuid() 함수를 이용하면 이를 우회할 수 있다.


이번 문제는 setreuid() 함수가 없기 때문에 직접 권한 상승을 해주어야 한다.


그렇기에 쉘 코드 앞에 setreuid(level20의 raid, level20의 uid)를 넣어줘야 한다는 소리이다.


쉘 코드를 만들어 보자 ! ! ! 




일단 setreuid() 함수의 인자에 들어가는 다음 레벨의 uid를 알아내기 위해 /etc/passwd 파일을 열어, level20의 uid를 확인해보자.


level20의 uid는 3100이다.





그리고 setreuid() 함수의 시스템 콜 번호를 알아보자.


시스템 콜 번호는 /usr/include/asm/unistd.h 에 선언되어 있다.


setreuid() 함수의 시스템 콜 번호는 70이다.


쉘 코드를 만들기 위해서는 우선 어셈블리 언어로 코드를 작성해 object 파일을 만들어야 하기 때문에,


구한 값들을 16진수로 바꿔주는 게 좋다.


70은 16진수로 0x46 ,

3100은 16진수로 0xc1c이다.

 



이제 setreuid() 함수의 쉘 코드를 만들어보자.


시스템 콜의 인자는 eax(시스템 콜 번호), ebx(인자 1), ecx(인자 2), edx(인자 3) 등으로 사용하기 때문에,


각각의 인자에 맞는 레지스터에 값을 넣고 interrupt를 발생시켜 시스템 콜을 호출해야 한다.


NULL Byte를 없애기 위해 eax를 xor 하여 초기화 시켜주자.


마찬가지로 NULL Byte를 없애기 위해 하위 레지스터들을 사용할 것이다.


mov 명령어로 setreuid() 함수의 시스템 콜 번호인 0x46(=70)을 al 레지스터에 넣는다.


mov 명령어로 setreuid() 함수의 첫 번째 인자인 level20의 raid 값 0xc1c(=3100)을 bx 레지스터에 넣는다.


mov 명령어로 setreuid() 함수의 번째 인자인 level20의 euid 값 0xc1c(=3100)을 cx 레지스터에 넣는다.


그리고 int 명령어로 시스템 콜을 호출하는 값인 0x80 interrupt를 발생시켜 시스템 콜을 호출한다.




이제 컴파일 후 objdump 명령어를 이용해 기계어 코드를 dump 한다.


setreuid(3100, 3100)의 쉘 코드가 완성되었다.


"\x31\xc0\xb0\x46\x66\xbb\x1c\x0c\x66\xb9\x1c\x0c\xcd\x80"


총 14 Byte이다.


이제 gdb로 분석하여 스택을 살펴보자.



esp를 0x28만큼 뺀다.


0x28은 10진수로 40이다.


buf의 크기가 20byte이니, Dummy 값의 크기는 20Byte이다.



buf에 쉘 코드를 넣기엔 크기가 부족하므로, 환경 변수에 쉘 코드를 등록하고 사용할 것이다.


아까 제작한 setreuid 쉘 코드 뒤에 기존의 쉘 코드를 붙여 등록하자.


앞선 문제들에서 만들었듯 getenv() 함수로 등록한 쉘 코드의 주소를 구하는 프로그램을 작성하여 실행하자.



쉘 코드의 주소는 0xbffffc08이다.



'Pwnable > FTZ' 카테고리의 다른 글

FTZ Level20  (0) 2018.11.18
FTZ Level18  (0) 2018.11.16
FTZ Level17  (0) 2018.11.16
FTZ Level16  (0) 2018.11.15
FTZ Level15  (0) 2018.11.15
댓글
최근에 올라온 글
Total
Today
Yesterday