일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 알고리즘
- 시스템 프로그래밍
- Leviathan
- css
- 드론
- 커널
- 리눅스커널
- 리눅스 커널
- 리버싱
- 시그널
- Bandit
- write up
- pwn.college
- C++
- radare2
- 어셈블리어
- 리눅스
- 컴퓨터구조
- 시스템프로그래밍
- C언어
- 워게임
- px4
- pwncollege
- 프로그래밍
- kernel
- 시스템해킹
- wargame
- 취약점
- Pwnable.kr
- 시스템
- Today
- Total
Computer Security
#24 Arbitrary Write 2 본문
우리는 아래의 파일들로 실습 할 것이다.
start.sh : qemu script
aaw_2.c : arbitrary_write 취약점이 터지는 디바이스 드라이버 예제
exp.c : 취약점을 이용해 권한 상승을 일으키는 exploit code
이전 1과 달리 2는 트래키한 취약점을 가지고 있다.
1. cat start.sh 를 이용해 적용된 보호기법을 살펴보자.
KASLR : 적용 X
SMEP : 적용 O
SMAP : 적용 O
KPTI : 적용 O
rip control이 가능하더라도, kernel stack pivoting을 이용한 익스플로잇이 불가능하다.
2. arbitrary_write 취약점이 터지는 디바이스 드라이버 예제인 aaw_2.c를 살펴보자.


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

먼저, 드라이버가 등록될 때 호출되는 aaw_init()함수를 살펴보면, victim 전역 함수 포인터에 print_noob()함수의 주소를 저장하는 것을 알 수 있다.
print_noob()함수 : 별다른 작업을 하지 않는 함수이다.
4. aaw_1.c 에서 aaw_ioctl() 부분을 살펴보자.

1. SET case 에서는, 전역 함수 포인터 victim에 원하는 값을 설정할 수 있는 기능이 있다.
2. CRED case 에서는, 현재 task의 cred 구조체의 주소를 leak 할 수 있는 기능이 있다.
3. default case 에서는, victim 전역 함수 포인터를 실행하는 기능이 있다.
일반적인 상황에서는 aaw_init() 함수에서 print_noob() 함수의 주소를 저장했기 때문에 해당 기능을 실행 할 경우 print_noob()함수가 실행된다.
5. aaw_1.c 예제와의 차이점
aaw_1.c 예제의 경우, aaw가 바로 가능한 기능(AAW case)와 write를 진행할 공격 대상(LEAK case) 둘 다 제공해줬지만, 이번 aaw_2.c 예제의 경우 write를 진행할 공격 대상(CRED case)만 제공해 주고 aaw가 가능한 기능을 제공해주지 않는다.
대신, rip control이 가능한 SET case와 default 기능이 있다.
하지만, 커널에 SMAP와 KPTI가 걸려 있기 때문에 rip control만을 이용해선 권한 상승을 일으킬 수 없다.
6. exp.c 코드를 살펴보자.

Step 1
- cred 구조체의 주소를 leak 해오는 것을 볼 수 있다.
Step 2
- victim 전역 함수 포인터를 aaw가 가능한 어셈블리 가젯으로 설정한다.
Step 3
- aaw 가젯으로 덮어쓴 victim 포인터를 호출하여 cred 구조체의 멤버를 0으로 덮어쓴다.
7. ./start.sh 를 실행해보자.

start.sh를 실행한 후, exp를 실행한 결과이다.
user권한에서 root권한을 획득 한 것을 볼 수 있다.
Arbitrary Write 최종정리
Aribitrary Write 취약점은 공격자가 원하는 위치에 원하는 값을 쓸 수 잇는 여러 조건을 가진 취약점이다.
보통 aaw primitive를 작성한 뒤, 커널의 중요한 부분을 write 하는 방식으로 exploit한다.
aaw_2 예제와 같이 rip control이 가능한 취약점과 다른 취약점들을 체이닝하여 Arbitrary Write가 가능하도록 만들 수도 있다.
'리눅스 커널 해킹' 카테고리의 다른 글
#26 Input Test Driver 1 (0) | 2022.09.03 |
---|---|
#25 Double Fetch (0) | 2022.09.02 |
#23 Arbitrary Write 1 (0) | 2022.08.31 |
#22 Kernel Heap Overflow (0) | 2022.08.30 |
#21 kernel UAF 2 (0) | 2022.08.29 |