SeLoadDriverPrivilege 在提权中的应用

红蓝对抗 2019-11-10

本文作者: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 管理员可以使用的权限

img

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

img

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

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 策略

img

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

img

默认权限如下表:

img

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

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

测试手法

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

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

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

进入测试模式

开启测试模式的方法

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

img

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

img

加载驱动

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

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

EoPLoadDriver.exe SystemCurrentControlSetMyService <驱动文件的绝对路径>

我运行的是:

EoPLoadDriver.exe SystemCurrentControlSetMyService C:Usershl0reyDesktoptoolsCapcom.sys

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

img

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

img

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

提权

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

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

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

img

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

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

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

img

执行个 notepad.exe 试试看。

img

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

img

msf模块利用

exploit/windows/local/capcom_sys_exec

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

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

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

img

总结

  • 利用加载驱动的权限去加载一些已经签名的有漏洞的驱动,进而进行提取,这样挺符合实战的。
  • 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

img


本文由 信安之路 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

楼主残忍的关闭了评论