Pwnable 도서관/Linux 스터디

Kernel(3)

0x00 2024. 1. 25. 20:02

ret2usr
SMEP 보호 기법이 걸려있지 않은 경우 커널 공간에서 유저 공간의 코드을 실행할수 있는것을 이용해서 권한 상승을 일으키는 기법

CTF 문제든 리얼월드든 SMEP 는 기본적으로 걸려있기 때문에 이 기법을 사용하는 일은 상당히 드문편이다.

backup_rv() 함수는 커널공간에서 성공적으로 권한 상승을 일으킨뒤 쉘을 실행하기 위해 
유저 공간으로의 전환에 필요한 현재의 context 를 저장하는 역할을 한다.

context  표는 이와같이 
RIP , CS , RFLAGS, RSP ,SS  이 있고
RIP 레지스터를 제외한 레지스터들은 현재 상황의 레지스터들을 저장하고

RIP는 /bin/sh 를 실행하는 함수인 shell() 함수의 주소를 저장한다.
RSP 를 저장하는 이유는 커널공간에서는 kerenl stack 을 사용하고 유저공간으로 전환
할떄 RSP 를 유저공간의 statck 으로 교체 해줘야하기 떄문이다.


1. commit_creds(pre) 코드를 실행하고 (권한상승) -> swapgs 명령을 호출 시킨다. -> RSP 를 backup_rv() 함수를
이용해 저장한 context 가 있는 유저 공간 stack 으로 설정한다. -> iretq 명령을 호출해 유저 공간으로  복귀하여 shell() 함수 실행시킨다.

swapgs : kerenlGSbase 의 값을 GS.base 의 값으로 교환하여 시스템 소프트웨어가 시스템
데이터 구조에 대한 포인터를 로드하는 빠른 방법을 제공한다.

iretq : 커널 공간에서 사용자 공간으로 전환 할수 있는 명령이다.


KernelROP : SMEP 보호 기법을 우회하기 위한 기법으로 커널 공간의 주소들로 ROP payload 를 작성하여 권한 상승을 일으키는 기법이다.
SMEP 는 ring0 에서 ring3 의 코드 실행을 방지하기 위한 보호 기법이다.

SMEP 보호기법은 커널 공간에서 유저공간과 관련된 코드의 실행을 막는 기법이기 때문에, 실행되는 대상이 커널공간의 주소일경우 
SMEP 를 우회할수있다.

dummy 
pop rdi; ret 
rdi 을 0 으로 한다( prepare_kernel_cred (0) 인자을 0으로 하기위함)

pop rcx; ret;
0
mov rdi,rax;rep...;ret;
commit_creds 

swapgs;ret;
retq;ret 

context 



gadgot 

/usr/src/linux-headers-$(uname -r)/scripts/extract-vmlinux bzImage > vmlinux
objdump -M intel -d vmlinux | grep "pop    rdi" (pop 그다음 4번의 공백을 띄어 주었음)

이방법은 objdump 방법이고 rp++ 방법으로 도 구할수 있다.


cr4 overwrite :  KernelROP 에서 파생된 기법으로 cr4 레지스터의 smep 제어 비트를 제거해서
smep 보호 기법을 비활성화 하는 기법이다.

bof 상황에서 overflow 할수 있는 크기가 작거나 마땅한 ROP 가젯을 찾기 어려울떄 시도해볼만 하다.

제한적인 상황에서 smap 제어 비트를 제거하여 smap 도 우회가 가능하다.

cr4 레지스터 20번쨰에 smep 제어 비트가 있다 . 이 비트를 제거 해서 우회 한다는 말이다.

kerenl 패닉을 일으켜 cr4 초기값을 볼수있다.

rip 컨트롤 만 사용해야 한다면 피벗을 가지고 공격을 해야한다.


kerenl stack pivoting : 함수 포인터를 덮을수 있는 취약점과 같이 rip control 만 가능하고
rsp control 이 불가능한 상황에서  kernelrop 로 실행 흐름을 변경하기 위해 kerenl stack 을 pivoting 
하는 기법이다.

xchg eax , esp 어셈블리 가젯과 mmap() 함수을 이용한다.

smep 보호기법을 우회 할수 있지만 smap 도 걸려 있는 상황에선 좀더 복잡한 과정이 필요하다


/dev/test 장치를 open() 
pivoting 할  fake stack 을 준비하는 set_fake_stack() 함수 호출 -> write() 함수를 이용해 test 드라이버에 
xchg 가젯의 주소를 전달

exp.c 코드의 set_fake_stack() 함수 부분 
statck pivoting 을 일으킬 xchg 가젯의 하위 4byte 를 인자로 mmap() 할당

현재의 context 를 저장하는 backup_rv() 함수 호출

mmap() 을 이용해 할당한 xcahg_32 주소에 권한 상승을 일으키는 commit_cred(pre) 코드 및
필요한 명령과 저정한 context 를 이용해서 ROP Payload 를 구성한다.


xchg esp , eax 어셈블리는 레지스터를 서로 바꾸는 명령어이다.
rax 에 xchg  가젯 주소가 들어 있는 이유는 , 커널에서는 함수 포인터를 실행할떄 rax 레지스터 
에 주소를 저장한뒤에 jmp rax 를 하기 때문이다( r12 일떄도있다)

xchg 는 하위 4byte 값으로 rsp 가 변경된다.


xchg eax, esp
ret ( pop rip, jmp rip)

(ROP payload fake stack)
pop rdi; ret;
0
prepare_kerenl_cred
pop rcx, ret;

대부분 rip control 만 가능한 취약점이기 때문에 kerenl statck pivoting 기법은 매우 중요하다
xchg eax,rsp 가젯이 없을떄 mov esp,0x 가젯을 사용할수도있다



kerenl heap spray 기법
kerenl heap spray 기법은 kerenl heap 을 spraying 을 하는 기법이다.

kerenl heap 과 관련된 취약점을 exploit 할때, 이 기법이 필요한 경우가 있다.
유저 공간에서는 kmalloc() 함수를 호출 할수 없기 때문에 다양한 syscall 을 이용하여 kmalloc() 함수를
간접적으로 호출한다.
이번 강의에서는 msgsnd() syscall 을 이용한 방법을 알아볼것이다.

kerenl heap spray 조건

유저가 원하는 크기의 슬랩 객체 할당이 가능해야함
유저가 원하는 데이터를 할당한 슬랩 객체에 복사할수 있다.
할당한 슬랩 객체에 불필요한 헤더 데이터 가 없어야한다
exploit 이 끝날떄 까지 spraying 한 슬랩 객체가 해제 되지 않아야한다.


msgsnd() , add_key(), snedmsg(), setxattr() 등 당양한 syscall 을 통해 spraying 을 할수있다.


userfaultdf 

page fault 란 Demand paging 을 사용한다. (리눅스는) 프로그램의 실행에 필요한
page 만 주 메모리에 적재 되어있다. 그러다 보니 특정 메모리가 
가상메모리 상에는존재 하지만 물리 메모리상에는 존재 하지 않을떄가 있는데
이떄 page Fault 가 발생된다.

Page Falult 가 발생되면 프로세스가 인터럽트 가 되고 물리 메모리상에서 grame 을
할당한뒤 하드디스크로 부터 필요한 page 를 받아 적재 하고 마지막으로 중단되었던 
프로세스로 돌아가 명령을 다시 수행한다.

사용자와 프로세스는 마치 위와같은 page Fault Handing 과정이 없었던것 처럼
메모리를 사용할수 있다.

Anonymous Mapping : 파일이나 장치가 연결되지 않는 메모리 매핑 
프로그램이 stack 및 heap 과 같은 용도로 사용하기 위해 운영체제 로 부터 
메모리를 할당하는 방법이다.

Anonymous Mapping 을 할경우 처음엔 가상 메모리만 할당(lazy allocation)
Anonymous Mapping 영역에 처음으로 접근 할경우 Page Fault 가 발생하여
물리 메모리를 할당. 이때 발생하는 Page Fault 는 Demand paginig 에 의해 
발생하는 Page Fault 와는 달리 하드 디스크로부터 page 를 불러와 적재 하지는 않음

이와같은 Anonymous Mapping 은 mmap() 함수에 MAP_ANONMOUS 플래그를
전달하여 만들수도 있다.



userfaultfd : 페이지 폴트가 발생 했을때 새로운 물리메모리를
할당 해주는것이 아닌 유저 공간의 스레드가 하도록 설정하는 system call

 

employee_backup.xlsx
0.01MB

'Pwnable 도서관 > Linux 스터디' 카테고리의 다른 글

kernel(2)  (0) 2024.01.22
kernel(1)  (1) 2024.01.22
ProtoStar (clear)  (2) 2023.11.28
pwnable.kr [Toddler's Bottle]  (0) 2023.07.11
pwntools  (0) 2023.05.19