本文作者:hl0rey(信安之路作者团队成员 兼 信安之路学生渗透小组组长)
看到一篇不错的文章
https://www.tarlogic.com/en/blog/abusing-seloaddriverprivilege-for-privilege-escalation/
我本想翻译学习一下,结果发现安全客已经有人翻译了,我也就没必要翻译了,就复现学习一下吧,顺便算是稍微补充下原文的内容,验证下提权风险。希望能对大家有所帮助。
windows 操作系统下有各种各样的权限,有的权限如果给了普通用户的话,很可能就会存在提权风险,进而导致服务器被人拿下。
windows 访问令牌(access token),与用户所执行的所有程序相关联,决定用户能够访问哪些资源。自从 Windows 2000 开始出现了受限令牌(restricted token,直到 vista 才开始使用受限的令牌去运行大多数程序,也就是 UAC) ,它只有访问部分资源的权限。vista 之后的系统,用户登陆以后会获得两个令牌,一个受限的和一个不受限的,受限的令牌用来运行绝大多数程序,除非用户主动用不受限的令牌运行程序,这样就更安全了。
UAC(User Account Contrl),是 windows vista 及更高版本操作系统中采用的一种控制机制。其表现是通知用户是否对应用程序使用硬盘驱动器和系统文件授权,以达到帮助阻止恶意程序损坏系统的效果。
过了 UAC 也就获取到不受限的访问令牌了。
没过 uac 之前 win10 管理员可以使用的权限
过了 uac 之后(右键以管理员权限运行之后的 cmd)
可以明显看出权限多了很多。
SeLoadDriverPrivilege
字面意思,安装和卸载驱动的权限。
能加载驱动,那么在系统内核级别执行代码也是可能的。
利用 Windows NTLoadDriver API 在用户空间加载驱动
NTSTATUSNTLoadDriver(
_In_PUNICODE_STRINGDriverServiceName
);
此函数作为唯一的输入参数 DriverServiceName,它是一个指向 Unicode 格式字符串的指针,该字符串指定定义驱动程序配置的注册表项:
RegistryMachineSystemCurrentControlSetServicesDriverName
在 DriverName 键下,可以定义不同的配置参数。最相关的是:
要记住的一件事是,传递给 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)是可以本地登陆的。
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 看一下是否成功加载了驱动:
测试失败之后再进行测试,记得删除注册表键值
原文给出了两种利用方式:
我们是为了提权,也就只关注第一种利用方法了。
直接执行程序即可。so easy,但是感觉有些鸡肋。光弹个 shell。
但是编程是不可能的,这辈子都不可能编程,只能拿大佬的代码来改改这样子,才能维持渗透。
所以我就把第一种方法的源码稍作修改,改成了可以执行一条命令。执行命令没有回显是隐藏执行,执行 GUI 程序会一下弹出来。
不加参数会回显使用方法:
执行个 notepad.exe 试试看。
从任务管理器看下权限,果然有一个 system 权限的记事本,这就厉害了,想往哪里写就往哪里写了。
exploit/windows/local/capcom_sys_exec
先拿到一个 win10 的 meterpreter shell(x64 位的 shell)。
需要事先在目标机器加载 Capcom.sys 驱动文件。
然后一波常规配置之后,直接获得一个 system 权限的 shell。
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