一、情报背景
自2016年至今,TrickBot已经成为最具威胁和流行的银行木马,以包含各种模块的攻击工具而闻名,对浏览器和HTTPS的攻击有着深入的研究。最近kryptoslogic团队发现了TrickBot更新了一些模块中的攻击技术,以规避证书透明度检查,本文将对其中的亮点攻击技术进行分析研判。
攻击者在对浏览器完成进程注入后,自建自签名证书,利用HOOK技术和劫持修改请求响应头的方式对浏览器证书透明度检测进行削弱,完成后续对WEB内容的javascript注入等场景的攻击需求。
二、攻击技术分析
TrickBot Webinject 模块在执行过程中会开启多个线程,每个线程会负责不同的功能。其中一些核心线程涉及到的作用如下所示:
Proxy Thread:代理线程会创建一个绑定到 127.0.0.1:15733 端口的恶意代理服务,会监听来自于浏览器的网络连接并实施一些中间人攻击的操作;
Brower Thread:浏览器线程会监控正在运行的浏览器进程,并利用反射技术将 DLL 模块加载到浏览器中,从而实现对一些浏览器关键 API 的 Hook 操作实现一些恶意操作(包括:劫持转发浏览器请求到恶意代理、防止证书校验报错等)。
当所有模块完成加载后,浏览器模块会通过 Hook 浏览器的 Connect 或者 ConnectEx API 将流量重定向到本地监听的 Socks 代理上,如果检测到浏览器处于 Debug 模式,将会中断重定向流量到代理并恢复正常通信。
Webinject 模块在运行过程中有以下两个亮点技术:
1. 通过多种手段实现规避对证书透明度的检查;
2. 实现多方式的 Javascript Web 注入。
规避证书透明度检查
Google 在 2013 年发起一个名为证书透明度(Certificate Transparency,简称CT)的项目。此项目旨在提供一个透明的生态系统,通过将证书添加到日志中并进行加密监控,可以让任何域名的所有者或CA进行公开审核,用于确定证书是否被错误签发或被恶意使用,从而加强 Web Public Key Infrastructure(Web PKI)加密连接的可靠性和有效性。在Chrome68之后,访问签发日期在2018年4月后的证书,凡是不在CT中的,Chrome将会标记其为不可信。
为了规避证书透明度的检查,TrickBot 中采用了多种手段来绕过相关的检测措施:
方式一:修改网站响应头,防止浏览器进行强制执行证书透明度检查:
方式二:Hook 浏览器证书验证函数
注入浏览器的 TrickBot 模块负责构建浏览器与恶意代理之间的初始化连接,在 Hook 检测到 Connect, ConnectEx,WSAIoctl 网络请求 API 之后,首先 TrickBot 会直接连接到目标网站,从网站获取真实的证书信息,并创建与网站证书的颁发者名称匹配的 CA 证书,用于对自己修改过的目标网站证书进行自签名操作。(当浏览器为 Firefox 时,会删除原始的 CA 证书并导入伪造的 CA 证书)
一旦浏览器流量被重定向到代理,为了防止浏览器出现 TLS 证书错误信息而通知用户请求被拦截,确保证书既经过验证又可信,注入的 TrickBot 模块会Hook CertVerifyCertificateChainPolicy 和 CertGetCertificateChain API。Hook 后的 CertGetCertificateChain 修改了证书链的返回结果,证书链上任何出现 TrustStatus 都被修改,并将状态设置为:
- CERT_TRUST_HAS_EXACT_MATCH_ISSUER
- CERT_TRUST_HAS_ISSUANCE_CHAIN_POLICY
- CERT_TRUST_HAS_VALID_NAME_CONSTRAINTS
通过以上两种方式削弱浏览器透明证书检查的能力,隐藏自签名证书的暴露,降低 Webinject 模块中间人攻击暴露的风险。
亮点二:多方式 Javascript Web 注入
TrickBot 作为一个成熟且广泛使用的多用途木马,其具备多种方式进行 Web 注入,从而满足不同场景下的攻击需求,通过使用不同的配置文件实现对 Webinject 模块的多样化利用方式,达到获取受害者凭据等敏感信息的目的。
在通过亮点一中的技术实现对证书透明检查的绕过后,Webinject 模块会开始利用不同的方式实施恶意 JS 代码的注入,从而达到窃取用户网站活动信息的目的。在进行 Webinject 模块调用之前,TrickBot 会针对不同的浏览器进行一些前置的配置修改操作,从而使后续的执行流程更加容易和可靠。
Firefox 通过修改 pref.js 实现(以下属性改为 false)
- brower.tabs.remote.autostart – 此属性保证浏览器多个选项卡保持在同一进程;
- brower.tabs.remote.autostart.2 – 同上;
- network.http.spdy.enabled.http2 – 此属性禁用 HTTP/2 网络协议;
IE 通过修改注册表实现(以下属性改为 false)
- HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\EnableHTTP2 – 此属性禁用 HTTP/2 网络协议;
- Software\Microsoft\Internet Explorer\Main\TabProcGrowth – 此属性保证浏览器多个选项卡保持在同一进程;
完成上述的配置修改以后,在旧版 Webinject 模块中支持 Sinj(静态注入)和 Dinj(动态注入)两种不同的方式对目标用户进行攻击。
Sinj(静态注入):通过恶意代理将用户的请求重定向到网络钓鱼页面中,利用伪造的目标页面直接实现对用户凭证等信息的获取;
Dinj(动态注入):利用恶意代理服务器来传递所有的流量,将目标服务器的响应转发到 TrickBot C2 服务,然后在其中修改响应内容注入恶意代码,最后将其返回给受害者。此种方式可以减少木马侧的活动特征,并且注入的内容也可在服务端自由修改;
以上两种是常规的 Webinject 配置,在新版本的 TrickBot 中支持解析配置文件 winj,其中包含 Zeus 风格的配置内容,通过解析配置文件可以直接在本地启动的 Socks 代理服务中完成注入操作,一旦匹配到与目标 URL 相符的流量,就会自动完成修改。
上述为 winj 的示例配置文件,其中通过 set_url 指定需要进行修改的目标流量,标识符 P 控制请求的类型为 POST 请求,后续的配置控制修改的位置以及修改的内容,配置内容简洁明了,客户端可针对性的对目标流量实现自定义的修改操作。插入的恶意 JS 代码,会将页面中窃取到的敏感信息回传到 C2 服务器中。
三、总结
TrickBot Webinject 模块结合了多项技术来实施中间人攻击,通过进程注入的方式 Hook 浏览器的关键 API,从而实现对流量的劫持与转发,利用自签名的 CA 证书进行对任意目标站点证书的签名校验,完成对透明度检测的绕过,在整个过程中通过 Hook 证书校验相关的 API 以及 对浏览器关键配置的修改,保证攻击全过程对于受害者无感化进行,降低攻击行为暴露的风险。
在此基础上,Webinject 模块支持了不同的 Web 注入方式,从而实现多样化场景下的攻击行为,达到对指定受害者的特定敏感信息获取及回传的目的。
参考
[1]https://www.crowdstrike.com/blog/bokbots-man-in-the-browser-overview/
[2]https://www.malwarebytes.com/resources/files/2020/06/the-silent-night-zloader-zbot_final.pdf
[3]https://new.qq.com/rain/a/20210605A044H700
[4]https://www.mdsec.co.uk/2021/01/breaking-the-browser-a-tale-of-ipc-credentials-and-backdoors/
[5]https://myssl.com/ct_check.html 在线查询证书透明度
[6]https://blog.cloudflare.com/introducing-certificate-transparency-and-nimbus/
版权声明
本站“技术博客”所有内容的版权持有者为绿盟科技集团股份有限公司(“绿盟科技”)。作为分享技术资讯的平台,绿盟科技期待与广大用户互动交流,并欢迎在标明出处(绿盟科技-技术博客)及网址的情形下,全文转发。
上述情形之外的任何使用形式,均需提前向绿盟科技(010-68438880-5462)申请版权授权。如擅自使用,绿盟科技保留追责权利。同时,如因擅自使用博客内容引发法律纠纷,由使用者自行承担全部法律责任,与绿盟科技无关。