SeLoadDriverPrivilege 在提权中的应用

本文作者:hl0rey(信安之路作者团队成员 兼 信安之路学生渗透小组组长)

看到一篇不错的文章

https://www.tarlogic.com/en/blog/abusing-seloaddriverprivilege-for-privilege-escalation/

我本想翻译学习一下,结果发现安全客已经有人翻译了,我也就没必要翻译了,就复现学习一下吧,顺便算是稍微补充下原文的内容,验证下提权风险。希望能对大家有所帮助。

windows 操作系统下有各种各样的权限,有的权限如果给了普通用户的话,很可能就会存在提权风险,进而导致服务器被人拿下。

UAC 对权限的限制

UAC 和 windwos 访问令牌

windows 访问令牌(access token),与用户所执行的所有程序相关联,决定用户能够访问哪些资源。自从 Windows 2000 开始出现了受限令牌(restricted token,直到 vista 才开始使用受限的令牌去运行大多数程序,也就是 UAC) ,它只有访问部分资源的权限。vista 之后的系统,用户登陆以后会获得两个令牌,一个受限的和一个不受限的,受限的令牌用来运行绝大多数程序,除非用户主动用不受限的令牌运行程序,这样就更安全了。

UAC(User Account Contrl),是 windows vista 及更高版本操作系统中采用的一种控制机制。其表现是通知用户是否对应用程序使用硬盘驱动器和系统文件授权,以达到帮助阻止恶意程序损坏系统的效果。

过了 UAC 也就获取到不受限的访问令牌了。

举例

没过 uac 之前 win10 管理员可以使用的权限

过了 uac 之后(右键以管理员权限运行之后的 cmd)

可以明显看出权限多了很多。

SeLoadDriverPrivilege 和 Load and unload device drivers 策略

SeLoadDriverPrivilege

字面意思,安装和卸载驱动的权限。

能加载驱动,那么在系统内核级别执行代码也是可能的。

利用 Windows NTLoadDriver API 在用户空间加载驱动

NTSTATUSNTLoadDriver(
 _In_PUNICODE_STRINGDriverServiceName
);

此函数作为唯一的输入参数 DriverServiceName,它是一个指向 Unicode 格式字符串的指针,该字符串指定定义驱动程序配置的注册表项:

RegistryMachineSystemCurrentControlSetServicesDriverName

在 DriverName 键下,可以定义不同的配置参数。最相关的是:

  • ImagePath:REG_EXTEXSZ 类型值,指定驱动程序路径。在这种情况下,路径应该是一个具有非特权用户修改权限的目录.
  • Type:指示服务类型的 REG_WORD 类型的值。就我们的目的而言,应该将该值定义为 SERVICE_KERNEL_DRIVER (0x00000001)。

要记住的一件事是,传递给 NTLoadDriver 的注册表项默认位于 HKLM 键 (HKEY_LOCAL_MACHINE) 下,后者只定义对管理员组的修改权限。尽管文档表明使用了密钥“Registry Machine System CurrentControlSet Services”,但 NTLoadDriver API 并不限制 HKCU(HKEY_Current_USER) 密钥下的路径,这些路径可以由非特权用户修改。

考虑到这种情况,在调用 NTLoadDriver API 时,可以在 HKCU(HKEY_CURRENT_USER) 下使用注册表项,指定遵循以下格式的路径:

RegistryUser{NON_PRIVILEGED_USER_SID}

Load and unload device drivers 策略

值得注意的是它的默认值,在域控上管理员组和打印机操作员组都有这个权限。爽了。

默认权限如下表:

值得一提的是打印机操作员组(Print Operators)是可以本地登陆的。

本地安全策略、(本地)组策略、域控制器安全策略、域安全策略之间的关系和效力优先级
  • “本地安全策略”完全隶属于“组策略”,是“计算机设置”-“ Windows 设置”-“安全设置”的子项。
  • “域控制器安全策略"属于 OU 策略的一种,它仅仅作用在 Domain Controller 这个组织单元(ou) 上。
  • 域控制器安全策略仅更改域控制器的本地用户,而域安全策略控制整个域的用户。
  • 默认情况下,当多条策略之间不产生冲突的时候,多条策略之间是合并关系;但产生冲突的时候,优先级高的策略会替代优先级低的策略,也就是排在后面的生效。
  • 按照组策略的优先级顺序从低到高分别为:
localpolicy(本地)->sitepolicy(站点)->domainpolicy(域)->oupolicy(组织单元)

测试手法

这里我们使用 Capcom.sys(一个可以让你在内核空间执行代码的有漏洞的已经签名的驱动)来辅助我们提权。由于它的签名已经过期了,所以我们把系统设置到测试模式(在此模式下可以运行非官方和未经签名的驱动程序)或者禁用驱动强制签名。

不要觉得这样的情况特别少见,至少在个人电脑应该还是比较常见,因为可能会因为安装未签名的驱动,导致系统无法启动,逼着用户禁用驱动签名

我的测试环境是 win10(x64),什么版本都行,这不是个系统漏洞,也没有打不打补丁修复之说。

进入测试模式

开启测试模式的方法

打开管理员命令行,输入“bcdedit /set testsigning on ”,显示操作成功后,重新启动系统。

然后看到右下角,我测试的环境是

加载驱动

我们使用原文作者提供的poc工具

https://github.com/TarlogicSecurity/EoPLoadDriver/

EoPLoadDriver.exe System\CurrentControlSet\MyService <驱动文件的绝对路径>

我运行的是:

EoPLoadDriver.exe System\CurrentControlSet\MyService C:\Users\hl0rey\Desktop\tools\Capcom.sys

NTSTATUS 的值为 0,证明加载成功了。

用 driverview 看一下是否成功加载了驱动:

测试失败之后再进行测试,记得删除注册表键值

提权

原文给出了两种利用方式:

  • 获取一个 system 权限的 shell https://github.com/tandasat/ExploitCapcom/tree/master/ExploitCapcom
  • 隐藏进程 https://github.com/zerosum0x0/puppetstrings

我们是为了提权,也就只关注第一种利用方法了。

直接执行程序即可。so easy,但是感觉有些鸡肋。光弹个 shell。

但是编程是不可能的,这辈子都不可能编程,只能拿大佬的代码来改改这样子,才能维持渗透。

所以我就把第一种方法的源码稍作修改,改成了可以执行一条命令。执行命令没有回显是隐藏执行,执行 GUI 程序会一下弹出来。

不加参数会回显使用方法:

执行个 notepad.exe 试试看。

从任务管理器看下权限,果然有一个 system 权限的记事本,这就厉害了,想往哪里写就往哪里写了。

msf模块利用

exploit/windows/local/capcom_sys_exec

先拿到一个 win10 的 meterpreter shell(x64 位的 shell)。

需要事先在目标机器加载 Capcom.sys 驱动文件。

然后一波常规配置之后,直接获得一个 system 权限的 shell。

总结

  • 利用加载驱动的权限去加载一些已经签名的有漏洞的驱动,进而进行提取,这样挺符合实战的。
  • uac 对后续渗透的限制是极大的,拿到 shell 之后,记得过 uac 再进行相关的提权操作。
  • 我之前是打算在 win2008 打印机服务器以一个打印机管理员账户来测试的,结果没过 uac,就换到 win10 下来测试了,如果各位有在 win2008 下测试成功的大哥,请务必来教教我。

参考资料

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

https://www.tarlogic.com/en/blog/abusing-seloaddriverprivilege-for-privilege-escalation/

https://www.unknowncheats.me/forum/general-programming-and-reversing/189625-capcom-sys-usage-example.html

https://blog.didierstevens.com/2008/05/26/quickpost-restricted-tokens-and-uac/

https://blog.csdn.net/pastway/article/details/51507135

用到的工具

我编译好的以及修改过的

链接:https://pan.baidu.com/s/1FFQeQwlQvb9W6lPgozrjhw 密码:b1bc

老外的源码

https://github.com/TarlogicSecurity/EoPLoadDriver/

https://github.com/zerosum0x0/puppetstrings

https://github.com/tandasat/ExploitCapcom/tree/master/ExploitCapcom

https://github.com/rapid7/metasploit-framework/pull/7363

https://github.com/FuzzySecurity/Capcom-Rootkit/tree/master/Driver

Capcom.sys sha1:c1d5cf8c43e7679b782630e93f5e6420ca1749a7

原文发布于微信公众号 - 信安之路(xazlsec)

原文发表时间:2018-06-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏玩转全栈

Flutter封装阿里push

因为阿里的推送对小米和华为的离线推送兼容的比较好,因此,我使用flutter将阿里推送封装了一下,效过图,如下所示,这里是将进程杀死之后,小米设备收到的推送效果...

3.2K70
来自专栏FreeBuf

解密所有APP运行过程中的内部逻辑

0x01前言 这年头,apk全都是加密啊,加壳啊,反调试啊,小伙伴们表示已经不能愉快的玩耍了。静态分析越来越不靠谱了,apktool、ApkIDE、jd GUI...

303100
来自专栏小白安全

web渗透思路及总结

(一)针对网站程序,不考虑服务器。 一、查找注入,注意数据库用户权限和站库是否同服。 二、查找XSS,最近盲打很流行,不管怎样我们的目的是进入后台。...

94170
来自专栏FreeBuf

利用Pentestbox打造MS17-010移动杀器

1、前言 前段时间Shadow Broker披露了 Windows大量漏洞,甚至爆出黑客组织 Equation Group 对于Windows 远程漏洞 MS1...

38970
来自专栏吴伟祥

Linux Partition scheme 分区方案(一)

根分区包含Linux系统所有的目录。如果在安装系统时只分配了/分区,那么上面的/boot、/usr和/var将都包含在根分区中,也就是这些分区将占用根分区的空间...

31320
来自专栏雨过天晴

转 树莓派无显示器安装系统

19520
来自专栏北京马哥教育

Windows10+Ubuntu双系统安装

最近因为毕设重新回归Ubuntu,手头有一台装了Win10的ThinkPad X240s,最终成功完成了Windows 10 教育版和Ubuntu Kylin ...

87760
来自专栏FreeBuf

Kali 2.0 安装与使用指南

关于kali使用前的一些配置,网上有很多版本,但是几乎都很雷同,或者是不全,或者是根本就没有测试过,或者是有的方法是错的(换句话说是版本变化的差异),因此让很多...

1.2K50
来自专栏为数不多的Android技巧

让Alfred支持拼音搜索

Alfred是个好东西,不过检索程序的时候不支持拼音搜索;我在论坛看到有人给作者反馈过,无奈作者说支持中文,他不知道拼音是什么,于是就不了了之了。举个例子:我想...

37610
来自专栏小狼的世界

HP-UX培训学习笔记

HP-UX操作系统全称为Hewlett Packard UniX,是惠普服务器上所有的操作系统。其发源自 AT & T SRV4系统,可以支持HP的PA-RIS...

18220

扫码关注云+社区

领取腾讯云代金券