其他分享
首页 > 其他分享> > 过滤山河,过滤大海。

过滤山河,过滤大海。

作者:互联网

0x00

在这位大哥的博客http://riusksk.me/看到有文件操作漏洞相关的视频,然后我去看了视频:https://www.youtube.com/watch?v=HFO8GCGQcUc

然后,我开始照着思想构造一个工具,在这之前我对文件过滤驱动接触甚少,但我知道大概长啥样子,后来我找到了这个:
https://blog.csdn.net/Henzox/article/details/38066673
非常感谢这位大哥把初始化好的的过滤驱动代码给放出来了

它需要一些时间,它非常有趣,我会慢慢实现

驱动上的CreateFile过滤

创建文件需要调用CreateFile,而CreateFile参数对应的信息保存在IO_STACK_LOCATION->Parameters.Create中

现在已经有一个初始化好的框架,FsfCreate函数代表了
拦截所有的CreateFile中进行的操作。
在这里插入图片描述

在FsfCreate中我对于内核态下创建文件和用户态创建文件采用不同的过滤方式

它们两者的不同可以参考
https://googleprojectzero.blogspot.com/2019/03/windows-kernel-logic-bug-class-access.html

对于内核和进程共享句柄的方式创建的文件,也就是在驱动中创建的文件,过滤方式:如下图所示

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

那么在找到漏洞后可以收集所需要的的信息了

在这里插入图片描述

下面是我用hevd漏洞测试的结果。
在这里插入图片描述

如果不运行漏洞利用的程序,则不会打印任何输出,这很棒,它现在能过滤我不想要的,实际上收集这些内容足够了,接下里只需要把这些信息再写入一个文件里保存起来,然后开始分析漏洞成因和编写利用。

记录时第一次记录漏洞打开则创建文件方式打开
在这里插入图片描述

之后则以打开方式打开

在这里插入图片描述

测试结果:
hevd测试
在这里插入图片描述

挂了一会,抓住一些系统进程的操作,但是这种感觉不知道咋触发…
在这里插入图片描述

软件测试
在这里插入图片描述
在这里插入图片描述
这里的访问属性只要不是读取都可以去捣鼓会,因为我以前搞了一半天,我发现即使能被符号链接劫持但是请求访问属性是读就只能去读就坑爹呀,有木有。

但是图三下面两个驱动是要管理员权限才能通信所以没办法利用。

感觉在驱动中存在这种漏洞采用逆向往往更有效,而且这种通信方式来文件操作的驱动我感觉非常少,不过学了总比没有好。有了这种方式过滤不仅可以帮助我们挖掘漏洞还可以帮助我们来快速定位漏洞点。

用户上的CreateFile过滤

我的目的是为了抓住在高权限进程或者systme权限进程度普通用户可写的文件操作

和驱动上开始判断都一样,要先过滤模拟令牌
在这里插入图片描述

之后有两种可比较目标文件是否被用户可写

第一种

第一种方法使用 token和SeAccessCheck去比较也就是视频中的方法:

后来发现一些坑点:

如果当前请求模式为用户模式时并且当前线程上下文中的的token是0x3000或着0x4000时,使用SeAccessCheck和文件描述符作比较结果肯定实是不合预期的,因为它实际上代表的不是普通用户,所以在这里我把该值设为全局变量,为了让它更准确更快速,我选择启动驱动后然后在运行一个测试用例,然后捕获这个测试用例的线程上下文,用这个线程上下文来初始化做比较的上下文,这个测试用例线程一直会挂起,驱动中判断的上下文也一直是测试用例的上下文。

当初始化上下文之后开始过滤,判断token

在这里插入图片描述

在这里插入图片描述

如果是高权限进程的文件操作,接着使用SeAccessCheck来判断普通用户当前操作文件的访问权限。

这里记录下SeAccessCheck的参数意思和使用姿势。

从win2000看看它SeAccessCheck的实现(accessck.c文件中),它多了一些很多参数。
在这里插入图片描述

在这里插入图片描述
其实多的参数是原本的SeAccessCheck参数结构体拆分了。

SecurityDescriptor:访问文件的安全描述符,可以通过ObGetObjectSecurity来获得,如果安全描述符没有Dacl,那么SeAccessCheck成功时可允许访问权限一定是所有访问权限也就是完全控制
在这里插入图片描述

SubjectSecurityContext:线程的安全上下文,可以通过 SeCaptureSubjectContext来获得

SubjectContextLocked:当您在调用SeAccessCheck之前时调用了SeLockSubjectContext,那么它应该设置为0,否则为1。并且之后需要调用SeUnlockSubjectContext

DesiredAccess:对应CreAteFile时的DesiredAccess参数,代表了需要检查的权限,比如GENERIC_WRITE

DesiredAccess含义:不再多说了,访问属性- -

PreviouslyGrantedAccess:在SepAccessCheck执行过程中,每次检查一次权限(从低往高)后都会或上(|=)检查的权限,当检查完毕后并成功时,最后赋值给GrantedAccess,失败则为NULL。
在这里插入图片描述

Privileges:需要检查的特权,显然我们只需要检查是不是普通用户,如果我们给Privileges赋值为0,那么一切检查将通过。

GenericMapping:文件对象访问权限和通用访问权限之间的映射,在我看到过windows自带的代码以及别人写的代码都是使用IoGetFileObjectGenericMapping()来获得。如果它为0,您会免费得到蓝屏大礼包;

AccessMode:请求模式,0为用户模式,1为内核模式

GrantedAccess:如果请求成功则,则把DesiredAccess赋值给GrantedAccess

AccessStatus:指向状态值的指针,表示拒绝访问的原因。

第二种

除了这种方式可以判断目标文件是否被用户可写,还有一种就是解析目标文件的安全描述符
最后我使用的也是这种解析安全描述符的方法,
拿一下图片 来自·安全客

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

先看看从开始过滤掉不需要的请求和模拟token以及低权限token后如何判断

在这里插入图片描述

在这里插入图片描述

为什么要第二次获取创建?当我获取到目标文件dacl时 我发现创建没有dacl的文件不是在测试用例中创建,而是svchost.exe替我创建,并且创建时还不显示文件名

在这里插入图片描述
然后改成这样
在这里插入图片描述

终于显示正常,,

在这里插入图片描述
最后改成保存信息
在这里插入图片描述

挂了驱动一下午,回来看后我又发现了一些问题,windows自带的系统进程有事没事它也会创建一大堆没有dacl的东西,名称都是随机的…无语 另外下图中的不是临时文件表示创建时没有设置临时文件标志,有很多的他会创建后手动调API删了。。。
在这里插入图片描述

继续,上面是抓住没有dacl的文件部分,如果有dacl怎么办呢?

为了方便省事直接获取当前登录用户的sid,然后对比文件sid

在这里插入图片描述

在这里插入图片描述

上面两种情况都是属于dacl可以被当前用户完全控制的情况,如果有dacl也有ace但不是文件所有者怎么办?
在这里插入图片描述

我观察了一会,跑了5分钟出现了一大堆可写文件,并且名字是真的长。。。。不知道系统在偷偷乱下什么玩意 在这里插入图片描述

在这里插入图片描述

后面我又去遍历了下sacl,但是我发现这个sacl只是记录访问信息对我来说并没有什么用, 到这里过滤用户下创建文件就告一段落了。

ReadFile/WriteFile过滤

这里就不区分内核和用户了,我尝试过比较上一次读取可写文件的长度,如果写入的长度和上次读取文件的长度相等,并且读取文件可写,但是写入目标文件不可写就记录下来,但是最后会卡住,原因未知,留着后面在这里插入图片描述

IRP_MJ_SET_INFORMATION 过滤

IRP_MJ_SET_INFORMATION 对应的操作是设置文件信息和重命名还有删除

我目前能想到的就是利用高权限进程删除可写的文件或者设置文件信息时,设置符号链接或者硬链接达到删除系统文件或者修改文件信息

或者重命名时就是我们准备好的硬链接或者符号链接进行重命名,如果没要任何效验,达到权限覆盖的目的

当然这都是在没有进程模拟的情况下。

话不多说,码代码
我在这里开始也不需要区分内核和用户,只需要判断token是否模拟,以及token是否是高进程或者system权限,前面说过,低权限进程可通信的驱动去逆向比较好
在这里插入图片描述

接着我需要根据消息类型判断不同的请求,但是请求类型有70多个,挺多的
在这里插入图片描述
后面我只选择了一个 删除文件,其他的后面使用的话如果有必要会在写吧。

在这里插入图片描述
取得管理员权限删除C:\Windows\WindowsUpdate.log
在这里插入图片描述

在这里插入图片描述

很好,显示出来了,能显示删除文件的路径然后就是使用老套路判断该文件是否有写入权限了,有则记录下来。

痛点

如果虚拟机配置不足,那么过滤消息会漏掉,我试过4线程过滤两个派遣函数就会漏掉一些消息,但是核心一上去,就无压力了,不过有个坏处就是笔记本的风扇哐当哐当的响。

不能利用和发现集成一体,只是过滤文件操作信息并记录可能有漏洞的信息,并且还有很多很多的可以过滤的面,并且我还排除了目录文件。

如果要挖第三方软件要排除这几个,否则windows自带的就比较多
在这里插入图片描述

写的时候推翻了自己的代码很多次,不管是逻辑上的还是api调用,有的时候调api,就一直调参数,然后一直蓝屏。。。后面蓝屏都麻木了…

下面是写工具时记录读过的网站

关于访问控制:
https://docs.microsoft.com/en-us/archive/msdn-magazine/2008/november/access-control-understanding-windows-file-and-registry-permissions

https://cloud.tencent.com/developer/article/1515253

关于ACCESS_MASK访问格式解析:https://ldapwiki.com/wiki/MS%20Access%20Mask

这个网址解释ACCESS_MASK标准访问权限通用访问权限字段意思 https://www.teamdev.com/downloads/winpack/javadoc/com/jniwrapper/win32/system/AccessOptions.html

还有这个
https://docs.microsoft.com/en-us/windows/win32/secauthz/access-mask#:~:text=Access%20system%20security%20%28%20ACCESS_SYSTEM_SECURITY%20%29.%20It%20is,the%20SE_SECURITY_NAME%20%28Manage%20auditing%20and%20security%20log%29%20privilege.

和这个http://www.ntfs.com/ntfs-permissions-acl-use.htm

关于ACCESS_MASK低16位字段解释 这里面超过256位就不是16位字段解释了 而是标准访问权限
https://docs.microsoft.com/en-us/windows/win32/wmisdk/file-and-directory-access-rights-constants

在这里可以找到wdm.h未定义的访问权限对应的数值(如果wdk比较老的话)https://processhacker.sourceforge.io/doc/ntioapi_8h.html#a5da6a26239179a4923473fe54658fa8d

ACE属性解释:https://editor.csdn.net/md?articleId=110320186

ACE结构体
https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_ace_header

官网解释 irp,https://docs.microsoft.com/en-us/windows-hardware/drivers/ifs/irp-mj-create

irp
https://www.cnblogs.com/LittleHann/p/3450436.html

关于过滤驱动API:https://www.easefilter.com/kb/fltkernel-fltcreatefile.htm

sid解析:https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-dtyp/81d92bba-d22b-4a8c-908a-554ab29148ab

SACL:https://www.codercto.com/a/18275.html

内核文件操作:https://wenku.baidu.com/view/4d86135379563c1ec5da7192.html

File Information Classes:

https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/4718fc40-e539-4014-8e33-b675af74e3e1

https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/ne-wdm-_file_information_class

代码和思路:https://doxygen.reactos.org

https://nullcon.net/website/archives/pdf/The-Windows-Sandbox-Paradox-%28Flashback%29-James-Forshaw-nullcon-goa-2019.pdf

标签:大海,文件,山河,windows,过滤,https,权限,com
来源: https://blog.csdn.net/qq_43045569/article/details/111051305