6. Kernel Internal
• Kernel Syscall 호출 방법
• int 0x2e
• xp 이전에 쓰이던 syscall
• 상대적으로 느린 interrupt 사용으로 속도가 느림
• SYSENTER
• xp 이후부터 사용된 syscall
• int 0x2e보다 빠른 syscall을 제공한다
7. Kernel Internal
Ntdll.dllKernel32.dll
USER level KERNEL level
nt!KiFastCallEntry
SYSEXIT
Native API
nt!KiSystemCallExi
t
SYSENTER
(MSR 0x176)
ntdll!KiFastSystemCallRet
SSDT
nt!...
nt!...
nt!...
8. MSR register?
• 특수한 기능을 제공할 수 있게 정의한 control Register
• SYSENTER 명령어를 실행하면 다음 기능이 실행된다.
Code Segment <- MSR 0x174 (IA32_SYSENTER_CS)
Stack Segment <- IA32_SYSENTER_CS + 8
EIP Register <- MSR 0x176 (IA32_SYSENTER_EIP) - KiFastCallEntry
ESP Register <- MSR 0x175 (IA32_SYSENTER_ESP)
9. Kernel Hooking
• 스마트한 Kernal Fuzzer를 제작하기 위해 call flow case를 조사
할 필요가 있음
• Target 함수가 많아서 일일히 찾기 넘빡심 ㅜㅜ
“Kernel syscall 후킹 후 argument, return value를 뽑아 온 후
연관 관계를 조사하는건 어떨
까?!”
10. Kernel Hooking
• Kernel Hooking을 통해 커널 API 데이터를 수집하거나,
API 기능을 바꿔버릴 수 있음! 다양한 분야에 활용 가능
• 단점 : 드라이버 개발 넘 빡세다 ㅜㅜ
11. • 대상 운영체제에서 개발 추천...
• 윈10 에서 개발한거 윈7에서 실행하니까 계속 블루스크린 ㅠㅠ
• 블루스크린...
• Windbg 디버깅 필수
Windows Driver develop
13. Kernel Hooking – MSR Hooking
1. rdmsr 명령어를 통해 KiFastCallEntry 주소 저장
2. wrmsr 명령어를 통해 HookFunction 주소를 MSR Register에 덮
어 씌움
3. HookFunction에서는 Argument 개수에 맞춰 출력한 후 저장해
놓은 KiFastCallEntry로 jmp
18. Kernel Hooking
• But how to print return value?
• ntdll!KiFastSystemCallRet를 후킹해서 return value를 로깅하자!
User land에서 Dll 후킹을 걸면 Copy on Write 방식에 의해 모든 프로세스
에 후킹을 걸어 줘야 하므로 복잡해짐
• 그럼 nt!KiSystemCallExit에 인라인 후킹!
28. Windows Integrity
• Windows는 해당 프로세스의 액세스 토큰에 따라 액세스 제어 적
용
• UNTRUSTED - Anonymous
• LOW – Everyone, can not access to local resources
• MEDIUM – Authenticated Users
• HIGH – Administrators
• SYSTEM – LocalSystem, LocalService...
29. HackSysExtremeVulnerableDriver
• Hacksysteam에서 윈도우 커널에서 주로 발생하는 취약점들을
연습해 볼 수 있게 만든 Driver
Double Fetch
Pool Overflow
Use After Free
Uninitialized Heap Variable
Uninitialized Stack Variable
Insecure Kernel Resource Access
Stack Overflow
Stack Overflow GS
Arbitrary Overwrite
Null Pointer Dereference
Type Confusion
Integer Overflow
easy hard
30. HackSysDriver Setting
• 준비물
• Virtual KD – VMWare의 가상머신과 Windbg를 연동하여 Windows 운영
체제 디버깅을 수행하기 쉽게 해 줌
• Windbg
• HEVD.sys – hacksys 파일을 빌드하여 만든 sys 파일
• OSRLOADER – Driver load, unload를 수행하기 쉽게 해 줌
31. HackSysDriver Setting
• 대상 Windows 운영체제를 Windbg를 붙인 채 부팅
• HEVD.sys 파일을 대상 운영체제에서 OSRLOADER를 이용하여
드라이버 서비스 등록
43. • Stack Cookie 우회 방법
• 1. Stack Cookie leak
• 2. Stack Cookie Failure check 로직 수행 전에 EIP register control
Stack Overflow GS
44. Case Userland
End Of Stack Segment
...
SE handler
nSEH
...
retn
sfp
Cookie
buffer
aaaa
...
pop pop ret
shellcode
...
aaaa
aaaa
aaaa
aaaa
Stack Overflow GS
45. Case Kernelland
memory fault exceptions that occur in kernel memory areas
are not handled by exception handlers, but only crash the OS.
So generate a memory fault exception due to the access of an
unmapped page in userland.
Stack Overflow GS
47. Arbitrary Write
• exploit 방법 여러 가지 있음!
• SSDT Overwrite
• Hal Dispatch Table Overwrite
• TokenObject-> Privileges.Enabled Field Overwrite
• Hal Dispatch Table Overwrite을 이용해서 풀어보자!
53. Null Pointer Dereference
• 할당되지 않은 0x00000000 주소를 참조하여 크래쉬 남
• 0x00000000 을 쉘코드 넣어서 할당해 주자!
• ‘VirtualAlloc’, ‘VirtualAllocEx’는 0x00001000부터 할당 가능
• undocumented function NTAPI ‘NtAllocateVirtualMemory’사용
54. Windows 7 exploitation issue
• Executable NonPagedPool was the default
• Kernel 영역에 쉘코드 올려서 실행 할 수 있음
• Kernel information leaks were available with
NtQuerySystemInformation
• no SMEP, SMAP
55. Windows 8.1, 10 exploitation issue
• NonPagedPoolNx is the new default
• 커널에 쉘코드 올리는거 불가능!
• SMEP
• Windows 0xFFFFFFFFFD00448 (HAL Heap) contained a pointer to ntoskrnl.exe
• SIDT instruction leaks address of ntoskrnl.exe pointer (IDTR Register)
• Kernel address leak with GdiSharedHandleTable
• ROP base address 구할 수 있네!
• Page Table Entry overwrite can bypass SMEP
• modify U/S flag
56. Mitigations Windows 10 1607
• Remove Kernel address leak with GdiSharedHandleTable
• SIDT instruction leaks address of ntoskrnl.exe pointer
mitigated
• 아직은 HAL Heap 이용하여 릭 가능
• Page Table Entry Randomize
57. Mitigations Windows 10 1703
• HAL Heap randomized
• now must leak ntoskrnl.exe pointer
• 이제 base address 구할 때 무조건 leak 필요함
58. reference
• Hacksys Driver 깃 주소
https://github.com/hacksysteam/HackSysExtremeVulnerableDriver
• Hacksys Driver 세팅법
https://hshrzd.wordpress.com/2017/06/05/starting-with-windows-kernel-
exploitation-part-2/
• Windows Kernel Architecture Internals - Dave Probert Windows Kernel
Architect, Microsoft
• DEFCON-25-Morten-Schenk-Taking-Windows-10-Kernel-Exploitation-to-
the-next-level-UPDATED
커널은 프로세스 자원 관리, 추상화,
IPC – 프로세스 간 통신을 위한 메커니즘, 종류로는 시그널, 파이프, 큐, 공유 메모리 등이 있음
HAL - 어플리케이션이 PC의 메모리, CPU, 하드웨어 장치에 접근 하는 것을 막아 줌, 하드웨어 추상화 제공
Driver - 운영 체제와 장치의 통신을 허용하는 소프트웨어 구성 요소
PNP 드라이버 – 실제 하드웨어가 존재할 때 사용
Legacy 드라이버 – 하드웨어 없이 커널 레벨에서 동작하는 프로그램이 필요할 때 사용
커널을 처음 접하는 사람들을 위한 발표인데 왠지 고수들이...
이 슬라이드 설명 후 Hacksys 깃 들어가서 클론 방법, 코드 내용(SECURE모드 등)
직접 윈도우 키면서 보여줌
https://hshrzd.wordpress.com/2017/06/05/starting-with-windows-kernel-exploitation-part-2/
CTL_CODE – DeviceType(장치에 대한 번호), Function(장치의 기능), Method, Access(권한)
IRP(I/O Request Packet) – I/O 데이터를 전달하는 구조체
DeviceControl 함수를 실행하면 I/O 관리자가 드라이버에 전달하는 IRP를 만들어 캡슐화 한 후 드라이버 스택에 전달한다.