漏洞原理笔记

按利用原理分类:

拒绝服务,缓冲区溢出,内存篡改,设计缺陷。

拒绝服务

比如if(MmIsAdressVaild(buffer)),只比较第一个字节。如果传一页最后一个字节,长度大于2,就会发生问题。

任意地址写入任意数据

比如neitherio不做Probeforread/write,就r3传入一个内核地址,一般是要被调用的函数,想办法将该地址值设为0,然后一个办法在r3分配一个0地址空间,调用ZwAllocateVirtualMemory,并将R0shellcode拷贝入这里。

要很少被调用的函数,因为进程隔离,如果其他进程使用这个函数会调用0地址代码,而其他进程没有0地址的代码,会产生崩溃。

NTSTATUS ZwAllocateVirtualMemory(
  _In_    HANDLE    ProcessHandle,
  _Inout_ PVOID     *BaseAddress,
  _In_    ULONG_PTR ZeroBits,
  _Inout_ PSIZE_T   RegionSize,
  _In_    ULONG     AllocationType,
  _In_    ULONG     Protect
);

baseAddress如果指向0传入,函数不会认为你是在0地址分配,二十认为你想在任何可以地址分配内存,而不是0.绕过方法就是指定allocationtype为MEM_TOP_DOWN从上而下分配。此时指定baseAddress为1,长度大于这个值,然后分配成功地址范围急速从负的值,到1,把0地址就包含在内了,此时再去尝试指向NULL指针指向地址写入,就不会异常了。

然后r0shellcode可以提升进程权限到system进程(比如这个权限可以访问注册表SAM,SECURITY,更新系统文件,手工杀毒),恢复内核的hook,添加调用门等。

竞争条件漏洞

就是多线程多进程编程出的问题,是一种异常行为,由对事件相对节奏依赖关系的破坏引发的。属于TOCTOU漏洞一种,即程序先检查某个对象特征,然后的动作是在假设这些特性保持情况下作出的,但是可能已经改变,因为进程不是原子方式运行,会进行进程切换,所以如果处理不好,会互相干扰,引起安全问题。

竞争条件漏洞发生要具备以下条件:

多个事件发生,事件间有一定隔离,有一定的关系,比如后面事件依赖前面事件。

攻击者能改变第一个事件所产生的,第二个事件所依赖的假设。

以为linux临时文件都有权限,所以在open函数,要加O_EXCL,独占,不然就要出问题。

Set-UID

理论上密码是高权限,普通用户也可以修改密码原因是,set-uid是unix重要的安全机制,当一个set-uid程序运行时,它被假设为具有拥有者权限。比如密码是root拥有,其他用户启动这个程序,就有了拥有者权限。设置set-uid的命令是chmod u+s xxx,前提是chown root Xxx,先让拥有者成为root。

CVE-2014-0196

这个漏洞就是个竞争条件漏洞,参考博客

https://blog.csdn.net/py_panyu/article/details/45565449

大概就是tty中溢出,ops覆盖成自己的payload。

ROP(return-oriented programming)对抗DEP

就是自己不写shellcode,利用系统自己的代码,合起来并凑出自己的程序,比如在kernel32.dll,找到ret1,指令是pop r,ret,另外ret2,call r,然后利用栈溢出之类的漏洞,将返回值放在栈上,比如从上到下依次防ret1,system地址,ret2,函数退出时,先执行ret1,指令是pop r,就将system放到了r里,在执行ret2,就call r,执行了call system。 

Double-fetch

用户通常会通过调用内核函数完成特定功能,当内核函数两次从同一用户内存地址读取同一数据时,通常第一次读取用来验证数据或建立联系,第二次则用来使用该数据。与此同时,另一个用户线程,用户空间并发运行的恶意线程可以在两次内核读取操作之间,利用竟争条件对该数据进行篡改,从而造成内核使用数据篡改。
Double fetch漏洞可造成包括缓冲区溢出、信息泄露、空指针引用等后果,最终造成内核崩溃或者恶意提权。

UAF(Use-After-Free)

就是使用了已经被释放的内存。比如释放了申请的堆没有将指针指向NULL,然后对其进行是否指向NULL进行了判断然后执行代码。我们可以利用这个,用占位的思想,有漏洞的线程释放了内存,恶意进程里面申请跟有漏洞的进程释放大小相同的内存,就得到刚才释放的内存,然后就可以利用这个执行shellcode,或者有些程序利用引用计数管理内存,然后对技术多加或者少减,造成引用计数不为0,但是已经被释放掉了。

https://www.anquanke.com/post/id/85797

未初始化漏洞

指分配一块内存后未经初始直接进行使用,我们为了控制未初始化对象的内容会先释放一个与之相同大小的已经布置好内容的内存,然后让未初始化对象来重用我们的内容。

或者未初始化指针,释放一个野指针,导致奔溃,可能引起提权。

OOB(out of bound)越界访问漏洞

就是越界读写,可以绕过地址随机化保护,比如通过溢出得到虚表地址,对于C++程序来说虚函数表斯被编译在全局数据段,对于模块的基地址偏移是固定的,通过泄露的虚函数表的地址减去偏移就可以知道对象所处的dll模块的基地址。也就可以使用这个模块中的工具指令了。

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值