System call을 이용해 커널모드로 전환되었을 때 root권한으로 상승시켜야 하는 문제이다.
커널 exploit을 맛볼 수 있는 기회가 되었다.



(문제화면)


커널 exploit에서는 시원하게 uid 0으로 만들어버리는 방법을 사용한다그 후 shell을 실행시키면 root권한의 쉘을 얻을 수 있는 것이다.



(시스템 확인)



접속해보았더니 시스템이 arm 시스템이었다.




(커널모듈)


시스템을 확인해보니 m.ko 커널 오브젝트 파일이 있었다m.ko 모듈을 insmod 했을 거라는 예상을 해본다
 
커널 모듈 소스코드를 문제에서 주었다.



(커널 모듈 소스코드)


확인해보면 system call을 하나 만들어서 등록해두었다입력을 통해 out으로 문자열을 소문자면 대문자로 바꾸어주어 보내는 함수이다. printk를 통해 함수가 등록된 것을 알려준다.



(dmesg 확인)



dmesg를 통해서 확인해보니 모듈이 등록되어있는 것을 확인했다.
 
위에서 정의한 system_call은 입력포인터출력포인터에 대한 범위 검사가 없다그렇기에 원하는 곳에 원하는 값을 적을 수 있다는 이야기이다.
시스템콜이 동작할 때는 커널모드로 전환되므로 메모리에서 커널영역 또한 참조하고 수정할 수 있다위 시스템콜의 취약점을 이용하면 커널영역을 마음대로 수정할 수 있다는 이야기가 된다.
나는 system call table의 주소를 내가 원하는 함수로 덮어 쓰므로써 원하는 함수를 실행하기로 계획했다
 
커널 exploit 할 때는 uid 0으로 만들어버린다고 했었는데 방법은 이렇다.
commit_creds(prepare_kernel_cred (0));
 
위 주소는 cat /proc/kallsyms | grep @@ 을 통해 찾을 수 있다
그 후 table의 원하는 주소를 찾아 그 주소를 위 함수가 실행될 수 있도록 덮어쓰고 실행하면 된다.
 

나는 getuid geteuid를 덮어썼다.



(내 exploit코드)



Exploit 코드이다.
 

여기서 주의할 점은 영어 소문자의 범위가 되면 -0x20이 된다는 점이다그렇기에 60까지 쓸 수 있는데 그러면 geteuid를 실행하게 되면 0x8003f560으로 넘어 가게 될텐데, 6c 까지 슬라이딩해서 넘어가야한다. nop으로 깔아주려 했으나 arm 계열에서 nop의 코드는 0x00이다.




(nop 코드)



그렇기에 nop의 기능과 같게 의미없는 코드로 채워야했다. 12바이트를!



(mov r1, r1)


이 코드를 컴파일 한 후 실행해보면



(권한상승)


권한이 상승된 것을 확인할 수 있고 flag까지 안전하게 확인할 수 있었다.

'WarGame > 500 Project' 카테고리의 다른 글

(65/500) pwnable.kr - echo2  (0) 2018.03.08
(64/500) backdoor - Enter the matrix  (0) 2017.10.31
(62/500) NOE.systems - BURYBURY  (0) 2017.10.01
(61/500) NOE.systems - double_input  (0) 2017.09.17
(60/500) pwnable.kr - crypto1  (0) 2017.08.27

+ Recent posts