终于开始看这个东西了,等了很久,迷失自己很久了~~~~~~~~~
本文是个人笔记,如有类同,纯属巧合~~~~~~~~~~~~~~~~~~~~~~~~~
内核漏洞主要作用:
1)远程代码执行 2)本地权限提升 3)远程拒绝服务攻击 4 本地拒绝服务攻击
但是最后实现时执行了内核 r0 shellcode ,明明修改了进程token 为system 的token 但回到用户层还是没修改的样子,也就没提权成功,
出现问题的怀疑:
1) 不是纯粹的原系统(下次验证)
2) 代码问题 (我都执行了书上的代码还是那样?)
3) 设置有问题? xpsp3 exe用release版本 ,sys 用 build xp 模式 check? 下次换成 free 试试
远程拒绝服务攻击 和 本地拒绝服务攻击 一般不必过多 “构造”
驱动程序编译期默认开启 GS 那么利用缓冲区溢出比较困难。
一般采用修改系统内核内存数据 / 执行 Ring 0 shellcode 的漏洞
思路:
构造条件 ——》 构造数据 ——》 触发漏洞 ——》利用方法 1)R0 shellcode 2)修改内核内存数据
1)提权 system 修改当前进程的TOKEN 为SYSTEM 进程的token 这样当前进程具备了 系统最高权限
2)恢复内核HOOK 安全软件通过HOOL/INLINE HOOK系统内核函数来实现防御,恢复这些HOOK/INLINE HOOK 就可突破
3)添加调用门,添加中断门,添加任务门,添加陷阱门 出入R0 R3 的重要手段,在系统中成功添加一个门就自由R0/E3
三种: 1 任意地址写任意数据(必定造成本地提权) 2 固定地址写任意数据 3 任意地址写固定数据
方法: 1)不推荐修改内存数据,因为很多重要的内核内存数据都是不可直接修改的,如果内存所在页属性被标记为只读,并且CR0寄存器的WP位设置为1,是不能直接写入该内存的
2)R0 shellcode 首先将CR0 的WP位置为0,即禁止内存保护,修改完再恢复WP位即可
R0 有很多内核API 函数,多保存于一些表中,并且这个表也是由内核导出的。例如 SSDT HalDispatchTable
并且修改这些表中的内核 API 函数地址为事先准备好的 shellcode 存放的地址(本进程空间内存地址),然后
在本进程中调用这个内核API函数,这样实现了在R0权限下执行shellcode的目的,一定选“冷门” 函数
可以看 reactOS 了解源码,
NtQueryIntervalProfile(IN KPROFILE_SOURCE ProfileSource, OUT PULONG Interval) -》
ReturnInterval = (ULONG)KeQueryIntervalProfile(ProfileSource); -》
ProfileSourceInformation.Source = ProfileSource;
Status = HalQuerySystemInformation(HalProfileSourceInformation,
sizeof(HAL_PROFILE_SOURCE_INFORMATION),
&ProfileSourceInformation,
&ReturnLength);
HalQuerySystemInformation
1) 然后选择 HalDispathTable 表地址为x 中的一个函数 HalQuerySystemInformation 入口存放地址y=x+4 篡改为0,(最后再调用该函数的上层函数NtQueryIntervalProfile)
2) 在0x0地址(上面被篡改的地址)申请内存,存放 R0 shellcode 代码,
3) 然后R0 shellcode 被执行,
4) 调用 NTdll.dll 模块中的 NtQueryIntervalProfile 函数
kd> dt -v -r1 _kpcr
nt!_KPCR
struct _KPCR, 27 elements, 0xd70 bytes
+0x000 NtTib : struct _NT_TIB, 8 elements, 0x1c bytes
```````````````````````````````````
+0x0dc KernelReserved2 : [17] Uint4B
+0x120 PrcbData : struct _KPRCB, 91 elements, 0xc50 bytes
+0x000 MinorVersion : Uint2B
+0x002 MajorVersion : Uint2B
+0x004 CurrentThread : Ptr32 to struct _KTHREAD, 74 elements, 0x1c0 bytes //内核模式下fs:[0x124]
kd> dt -v -r1 _KTHREAD
nt!_KTHREAD
struct _KTHREAD, 74 elements, 0x1c0 bytes
+0x000 Header : struct _DISPATCHER_HEADER, 6 elements, 0x10 bytes
``````````````````````````````
+0x02e Alerted : [2] UChar
+0x030 Iopl : UChar
+0x031 NpxState : UChar
+0x032 Saturation : Char
+0x033 Priority : Char
+0x034 ApcState : struct _KAPC_STATE, 5 elements, 0x18 bytes
+0x000 ApcListHead : [2] struct _LIST_ENTRY, 2 elements, 0x8 bytes
+0x010 Process : Ptr32 to struct _KPROCESS, 29 elements, 0x6c bytes //_kthread+0x44
kd> dt _ePROCESS
nt!_EPROCESS
+0x000 Pcb : _KPROCESS
+0x06c ProcessLock : _EX_PUSH_LOCK
+0x070 CreateTime : _LARGE_INTEGER
+0x078 ExitTime : _LARGE_INTEGER
+0x080 RundownProtect : _EX_RUNDOWN_REF
+0x084 UniqueProcessId : Ptr32 Void //ProcessID
+0x088 ActiveProcessLinks : _LIST_ENTRY //next eprocess
+0x090 QuotaUsage : [3] Uint4B
+0x09c QuotaPeak : [3] Uint4B
+0x0a8 CommitCharge : Uint4B
+0x0ac PeakVirtualSize : Uint4B
+0x0b0 VirtualSize : Uint4B
+0x0b4 SessionProcessLinks : _LIST_ENTRY
+0x0bc DebugPort : Ptr32 Void
+0x0c0 ExceptionPort : Ptr32 Void
+0x0c4 ObjectTable :