Computer Security

#11 KADR 우회 본문

리눅스 커널 해킹

#11 KADR 우회

쿠리 Kuri 2022. 8. 19. 18:30
반응형

KADR(Kernel Address Display Restriction)

 

커널의 내부 정보와 관련된 파일들을 root 권한으로만 확인할 수 있도록 하는 보호 기법이다.

 

이를 user 권한에서 우회할 수 있다면 커널의 모든 심볼들의 주소를 확인할 수 있겠지만, 보통 이렇게 우회하지는 않고, 로컬 환경에서 root권한으로 변경한 후 심볼들의 주소를 확인하여 디버깅에 참고한다.

 

KADR 우회보단 KADR이 걸려있는 환경에서 디버깅하는 팁에 관해 알아보자.

 

 


우리는 아래의 파일들로 실습 할 것이다.

kadr_bypass

start.sh : qemu script

 

 

 


1. ./start.sh  실행한뒤, cat proc/kallsyms | grep printk 를 이용해 살펴보자.

/proc/kallsyms 파일은 커널의 모든 심볼들의 주소를 담고 있다.

user 권한으로 /proc/kallsyms를 확인하면 주소 대신  000000...이 출력된다.

이는 KADR에 의해 커널 주소가 숨겨졌기 때문이다.

 

 

 


2. root권한으로 수정1

 

권한수정1

mkdir rootfs : 압축된 파일 시스템을 해제할 디렉토리를 생성한다.

 

cp rootfs.cpio rootfs : 파일 시스템을 rootfs 디렉토리로 복사한다.

 

 

 


3. root권한으로 수정2

권한수정 2

cd rootfs : rootfs 디렉토리로 이동한다.

 

cpio -id -v < rootfs.cpio : rootfs.cpio 를 cpio 명령으로 압축 해제한다.

 

 


4. root권한으로 수정3

vi init

압축을 해제하고 나온 파일 중 init은 1번 프로세스를 작동할 스크립트이다.

init의 'setuidgid 1000'  부분을 'setuidgid 0' 으로 변경하여 root 권한으로 설정한다.

 

 

 


5. root권한으로 수정 (마지막)

 

rm rootfs.cpio

rm rootfs.cpio 명령어를 통해 복사했던 rootfs.cpio 파일을 삭제한다.

 

 

find . | cpio -o --format=newc > ../rootfs.cpio 명령을 이용해 현재 디렉토리의 파일들을 상위 디렉토리에 rootfs.cpio로 압축한다.

 

 

 

 


6. 처음으로 돌아와서 ./start.sh 를 입력한 뒤, cat proc/kallsyms | grep printk 를 확인해보자.

./start.sh

변경된 root 권한으로 /proc/kallsyms 를 확인해 봤더니, 그전에 00000...이 출력된 것과 달리 커널 주소를 출력하는 것을 볼 수 있다.

 

 

 

 


KADR 우회 방법

 

이렇듯 파일 시스템의 init 스크립트를 수정해서 root 권한으로 /proc/kallsyms 를 확인하면 원하는 심볼의 주소를 얻을 수 있다. 얻은 주소를 이용해 break pointer를 거는 등의 작업이 가능하다.

 

커널 디버깅을 할 땐, 확인한 커널 주소가 바뀌지 않도록 qemu script를 수정해서 KALSR을 끈 상태로 디버깅하는 것을 추천한다.

 

만약 커널 힙과 관련된 취약점을 테스트 하는 경우, user 권한일 때와 root 권한일 때의 힙 풍수가 달라지기 때문에 테스트 중에는 user권한으로 디버깅해야 한다.

 

 

반응형

'리눅스 커널 해킹' 카테고리의 다른 글

#13 KPTI 우회  (0) 2022.08.21
#12 SSP 우회  (0) 2022.08.20
#10 SMAP 우회  (0) 2022.08.18
#9 SMEP 우회  (0) 2022.08.17
#8 KASLR 우회  (0) 2022.08.16
Comments