針對提權小神器Sherlock的分析與利用
01 Sherlock簡介
Sherlock是一個在Windows下用於本地提權的PowerShell指令碼。
目前包含了以下漏洞:
- MS10-015 : User Mode to Ring (KiTrap0D)
- MS10-092 : Task Scheduler
- MS13-053 : NTUserMessageCall Win32k Kernel Pool Overflow
- MS13-081 : TrackPopupMenuEx Win32k NULL Page
- MS14-058 : TrackPopupMenu Win32k Null Pointer Dereference
- MS15-051 : ClientCopyImage Win32k
- MS15-078 : Font Driver Buffer Overflow
- MS16-016 : ‘mrxdav.sys’ WebDAV
- MS16-032 : Secondary Logon Handle
02 初步使用
本地載入指令碼
Import-Module Sherlock.ps1
遠端載入指令碼
IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/rasta-mouse/Sherlock/master/Sherlock.ps1')
發現漏洞:
Appears Vulnerable就是存在漏洞
驗證:
可以發現提權成功,注意Sherlock只是驗證,並不能幫助你直接進行利用。
03 隱藏的小技巧
除了上述的基本功能外,腳本里面還隱藏了一些作者沒有介紹到的小功能
獲取軟體版本
Sherlock還可以讓我們來獲取軟體的版本號,我們只需要執行Get-FileVersionInfo
命令即可。
演示:
獲取CPU架構
執行Get-Architecture
命令,我們就可以知道CPU的架構是32位還是64位的。
演示:
04 Sherlock漏洞驗證原理分析
Sherlock除了作者已經加入的那些漏洞,我們還可以自己來加入感興趣的漏洞。再新增漏洞之前,我們先來分析一下Sherlock漏洞驗證的原理。
在Sherlock中,每一個漏洞驗證模組都是一個function
,具體形式如下:
function Find-MS16032 { }
然後使用Get-Architecture
來獲取系統版本,判斷系統版本是否存在提權漏洞。符合再進行下一步判斷。
if ( $Architecture[1] -eq "AMD64" -or $Architecture[0] -eq "32-bit" )
然後通過Get-FileVersionInfo
獲取存在漏洞的檔案的版本資訊,主要提取後面兩段數字。
然後就簡單了,用一個switch+if對比版本就行了:
然後我們自己新增漏洞就簡單了,在function New-ExploitTable
中加入漏洞資訊。
測試一下,我們先來建立一個function Find-MS16135:
然後在function Find-AllVulns
中加入Find-MS16135
就OK啦。
測試看看:
05 總結
整個框架總體思路就是這樣咯,接下來就看小夥伴們來查詢存在漏洞的檔案版本了,目前我還沒好的思路可以快速去尋找存在漏洞的檔案版本,不知道大家有沒有好的思路求分享啊。
專案地址:https://github.com/rasta-mouse/Sherlock