Computer Security

#23 Arbitrary Write 1 본문

리눅스 커널 해킹

#23 Arbitrary Write 1

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

Arbitrary Write 

 

Arbitrarty Write 취약점은 말 그대로 공격자가 원하는 위치에 원하는 값을 쓸 수 있는 여러 조건을 가진 취약점이다.

 

이전에 배웠던 대부분의 취약점들이 특정 영역이나 rip만 변조할 수 있는것과 달리, 이 취약점은 쓰기 권한이 있는 모든 메모리 영역에 원하는 데이터를 쓸 수 있는 차이점이 있다.

 

해당 취약점은 다양한 방식으로 발생할 수 있으며, 가장 기본적인 방식과 트리키한 방식을 하나씩 알아보자.

 

 

 

 


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

 

write_1

 

start.sh : qemu script

aaw_1.c : arbitrary_write 취약점이 터지는 디바이스 드라이버 예제

exp.c : 취약점을 이용해 권한 상승을 일으키는 exploit code

 

 

 


1. cat start.sh 를 이용해 적용된 보호기법을 살펴보자.

cat start.sh

KASLR : 적용 X

SMEP : 적용 O

SMAP : 적용 X

KPTI : 적용 X

 

 

 

 


2. arbitrary_write 취약점이 터지는 디바이스 드라이버 예제인 aaw_1.c를 살펴보자.

aaw_1.c

 

 

 

 


3. aaw_1.c 에서 aaw_init() 부분을 살펴보자.

init()

먼저, 드라이버가 등록될 때 호출되는 aaw_init()함수를 살펴보면, victim 전역 함수 포인터에 print_noob()함수의 주소를 저장하는 것을 알 수 있다.

 

 

print_noob()함수 :  별다른 작업을 하지 않는 함수이다.

 

 

 

 


4. aaw_1.c 에서 aaw_ioctl() 부분을 살펴보자.

aaw_ioctl()

1. AAW case 에서는, 임의의 주소에 원하는 값을 쓸 수 있는 기능이 있다.

 

2. LEAK case 에서는, victim 전역 함수 포인터의 주소를 leak 할 수 있는 기능이 있다.

 

3. EXEC case 에서는, victim 전역 함수 포인터를 실행하는 기능이 있다. 일반적인 상황에서는 aaw_init() 함수

 

print_noob() 함수의 주소를 저장했기 때문에 해당 기능을 실행할 경우 print_noob()함수가 실행된다.

 

 

 

 


5. exp.c 코드를 살펴보자.

exp.c

Step 1 

  • victim 전역 함수 포인터의 주소를 leak 해오는 것을 알 수 있다.
  • 이후 kernel stack pivoting 기법을 사용하기 위해 set_fake_stack()함수를 호출해 fake stack을 구성한다.

 

Step 2 

  • leak한 victim 포인터를 xchg가젯의 주소로 덮는 것을 볼 수 있다.

 

Step 3

  • xchg 가젯으로 덮힌 victim 전역 함수 포인터를 실행하는 것을 볼 수 있다.

 

 

 


6. ./start.sh 를 실행해보자.

./start.sh

 

start.sh를 실행한 후, exp를 실행한 결과이다.

 

user권한에서 root권한을 획득 한 것을 볼 수 있다.

반응형

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

#25 Double Fetch  (0) 2022.09.02
#24 Arbitrary Write 2  (0) 2022.09.01
#22 Kernel Heap Overflow  (0) 2022.08.30
#21 kernel UAF 2  (0) 2022.08.29
#20 Kernel UAF 1  (0) 2022.08.28
Comments