Notice
Recent Posts
Recent Comments
Link
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

trash houz

[Linux Kernel] STARCTF 2019 hackme 본문

Writeup

[Linux Kernel] STARCTF 2019 hackme

applemasterz17 2019. 8. 2. 00:24

리눅스 커널 익스플로잇 문제입니다. 

.ko 파일, 이미지 파일등이 제공되는데, ko 파일을 ida 로 분석해보겟습니다. 

 

hackme_ioctl

ioctl 을 이용해 0x30000(malloc), 0x30001(read), 0x30002(write), 0x30003(free) 가 구현되어있습니다. 

취약점은 write() 와 read() 의 offset 을 체크하는곳에 있습니다. 

offset 을 내부적으로 unsigned 형을 사용하지 않아 사용자 입력으로 offset 에 음수값을 입력했을때 memory leak 이 가능합니다. 

read() 에서 음수값을 넣게되면 요청한 fd 기준으로 음수값 만큼의 전까지 메모리를 전부 읽어옵니다. 

 

 

pool

또 코드를 보면 pool 이라는 배열이 있습니다. 

kmalloc()  으로 동적할당한 공간의 주소를 저장하는 배열입니다. 

8바이트(주소) + 8바이트(크기) 로 저장되어 있으므로 pool 전체 조회시 gdb 에서 동적할당한횟수*2  만큼 확인해야합니다. 

 

 

hackme_ioctl() -> read() 부분

위에서 말한 unsigned 를 붙이지 않아 발생한 취약점을 이용해 memory leak 을 해보겟습니다. 

궁극적으로 root 권한 탈취가 목표이므로 권한에 관한 부분을 leak 해보겟습니다. 

이 부분에 관한 자세한 내용은 아래 링크의 포스트를 통해 참고해주세요. 

-> task_struct 에서 권한상승 팁

 

 

위 코드를 통해 메모리 leak 이 가능함을 알수있습니다. 

이제 수정이 필요한곳의 주소도 알고 있으니 원하는곳에 쓰기만 하면 됩니다. 

 

커널은 kmalloc() 을 통해 힙에 공간을 할당하고 kfree() 로 해제합니다. 

커널의 힙에도 userland 에서의 heap 처럼 kfree() 했을시 주소값이 남게 됩니다. 

이를 통해 이미 free 된 공간에 남아있는 주소를 수정해 원하는곳에 원하는값을 쓸수 있습니다. 

 

pool 의 모습

kmalloc() 을 40바이트씩 64번 한 뒤 pool 의 메모리 모습입니다 (index: 0 ~ 63)

맨 마지막이 63번째 인덱스 입니다. 

이제 61번째 공간을 kfree() 해보겟습니다. 

 

 

pool -> kfree(61) 직후의 모습

정상적으로 kfree() 가 되었습니다. 

이번엔 kfree() 전에 쓰여져있던 메모리 주소인 0xffff88800e9327c0 로 가보겟습니다.

 

 

pool[61] 의 모습 

맨 처음 8바이트에 이상한 주소값이 쓰여있습니다.

0xffff88800e9327c0 하고 비슷한 부근의 메모리인것으로 보아 힙 주소로 보입니다.

다시 kmalloc() 을 통해 같은 크기로 동적할당해보면 마지막으로 free 한곳이 처음으로 할당되고,

한번더 할당하면 저곳에 쓰여진 주소로 할당이 됩니다. 

 

이제 이곳의 주소를 copy_from_user() 를 통해 cred 위치로 변경하면되겟습니다. 

이미 free 된곳에 어떻게 접근하냐구요 ?

위에 unsigned 체크를 하지않아 leak 을 한것과 동일한 방식을 사용하면 됩니다.

 

 

전체 exploit 코드입니다. 

'Writeup' 카테고리의 다른 글

[Linux Kernel] 0CTF 2018 FINAL BABY  (0) 2019.08.23
[Linux Kernel] CISCN 2017 babydriver  (0) 2019.08.20
[Linux Kernel] CSAW-CTF 2015 stringIPC  (0) 2019.08.05