[Kernel] Kernel Shellcode



이전 문서들에서도 보이듯 일반적인 Application exploit과 달리 Kernel exploit에서는 실행할 process를 system 권한으로 만드는 것에 중점을 두게 됩니다. 따라서 특정 Application을 통해 다른 process를 실행시키는 것이 아닌 현재 내가 실행시킬수 있는 프로그램의 권한을 올리는 것이 목적입니다.

 

Step 1. Token

Window에서 실행중인 process와 관련된 사용자 계정 및 접근 권한은 token이라는 커널 개체에 의해서 결정됩니다. 다양한 process의 커널 데이터 구조에는 process의 token에 대한 pointer가 들어가 있습니다.

 

단순히 cmd.exe를 실행시켜 현재 process의 권한을 보면 PC user의 이름만 나타나게 됩니다.

 

 

 

Token을 살펴보는 것이 목적이므로 먼저 system process를 찾아 token을 살펴보겠습니다.

windbg를 연결시켜 system process를 찾은 모습입니다. 아래의 그림에서 system process에 대한 EPROCESS 구조체의 주소를 구할 수 있습니다.

 

 

 

system process의 EPROCESS 구조체를 살펴보면 Token이라는 4bytes 크기의 데이터를 볼 수 있습니다. 구조체에 대한 포인터라 생각해서 특정 데이터가 들어있을 줄 알았지만 _EX_FAST_REF라는 데이터가 담겨져 있습니다.

 

 

 

Kernel에서의 모든 객체에 대한 포인터의 하위 4bit는 항상 0으로 설정되어 있고 포인터의 참조 횟수 등에 따라 하위 4bit값을 자유롭게 사용할 수 있습니다. 따라서 해당 포인터 값을 가져오려면 하위 4bit를 0으로 만든 후 가져와야 온전한 구조체의 pointer를 가져올 수 있습니다.

 

Token 데이터가 있는 메모리의 값을 살펴보면 특정 데이터가 존재하는 것을 알 수 있습니다. 하지만 이 값은 온전한 token 구조체 포인터의 값이 아닙니다.

 

 

 

온전한 token 구조체 포인터 값을 가져오기 위해서 하위 4bit를 0으로 만들어주기 위해서 and연산을 수행한 모습입니다. 0x89e01270이라는 주소값이 token 구조체 포인터 값이라는 것을 알 수 있습니다.

 

 

 

Token 구조체를 해당 데이터에 입히면 아래와 같은 정보가 뜨게 됩니다.

 

 

 

User라고 되어있는 부분의 SID를 보게되면 S-1-5-18이라는 정보를 얻을 수 있습니다.

 

 

 

Step 2. Token change

MSDN을 참고해보면 위와 같은 권한은 operating system이 사용하는 system 권한인 것을 알 수 있습니다. system 권한은 살펴봤으니 cmd.exe process의 token의 정보가 필요합니다.

 

cmd.exe의 EPROCESS 부분입니다. 해당 token의 주소도 알 수 있는데 이 부분에 system token 구조체 주소를 넣으면 cmd.exe process 권한이 바뀌게 됩니다.

 

 

 

cmd.exe token의 offset을 계산하고 아래와 같이 cmd.exe token의 값에 system process 값을 복사한 상태입니다.

 

 

 

system process의 token값을 복사해 권한 상승이 일어난 cmd.exe process입니다.

 

 

 

따라서 kernel exploit에서는 위와 같은 원리로 shellcode를 작성해 현재 실행시키는 process의 권한을 system 권한으로 상승시킵니다.

'System > Windows' 카테고리의 다른 글

[Window Application Exploit] ROP  (0) 2017.09.15
[Kernel] Kernel Shellcode Analysis  (0) 2017.09.13
[Kernel] Kernel Pool Attack  (0) 2017.09.08
[Kernel] Allocate Kernel Memory Free  (0) 2017.09.06
[Kernel Exploitation] GDI Bitmap Abuse  (0) 2017.09.04

이 글을 공유하기

댓글