八、流量操作:代理视角
BokBot的代理模块依赖于流量操作来窃取受害者的敏感信息。受害者浏览器生成的Web流量与目标url列表(webinjects)进行匹配,如果匹配成功,代理将执行下列操作之一:重定向到钓鱼网站(webfake);页面抓取;页面截图;或是忽略此条消息。对请求的响应需要匹配后再确定是否将HTML或Javascript注入页面并返回给受害者。
图3:BokBot WebFake流程概述
8.1、Web注入DAT文件
BokBot主模块下载的DAT文件是结构化的二进制文件,其中包含一系列目标url、目标HTML/Javascript代码块和要注入的Javascript/HTML代码块。在初始化过程中,该DAT文件将就每个webinject类别分成多个列表。webinject类别列表是由一系列webinject类构建的。解析后,每个元素都具有以下结构:
8.2、页面抓取
页面抓取处理函数对URL或HTML主体执行匹配,以确定是否应该抓取页面的信息并将其发送到C2。页面抓取的目标是银行帐户显示页面,以抓取目标的帐户信息。
· Type 33、34
这两种类型是使用精确的URL字符串或正则表达式来匹配受害者请求的URL。一旦匹配完成,HTML主体和匹配的URL都被发送到C2。每个目标url都与包含受害者账户信息的页面相关,例如:
chaseonline.chase.com/gw/secure/ena client.schwab.com/Accounts/Summary/Summary.aspx
· Type 64
此类型将扫描网页主体,寻找与帐户余额、安全验证问题和其他个人数据相关的文本(“帐户余额”、“当前余额”等)。如果找到,URL、HTML主体和匹配的文本将被压缩并发送到C2。
8.3、页面截图
当URL与Type 49注入匹配时,能生成屏幕截图。过程如下:截图用Windows GDI+ API截取,生成位图,写入tmp文件,读入缓冲区,压缩,然后发送到C2。位图被写入AppData下的本地临时目录,文件名是唯一的alpha字符字符串。例如:AppData\Local\Temp\alksfjlkdsfk.tmp。
尽管我们写此篇分析报告时研究的BokBot版本中,web注入没有提供具体的示例,但我们有理由相信这些屏幕截图将包含与商业和银行帐户相关的敏感细节。
8.4、代码注入
代码注入的工作方式是匹配URL,或者对HTML元素执行匹配和替换。
· Type17、19
Type 17和19用于隐藏页面中的元素、获取表单数据、注入代码、替换代码,以及让webfake获取受害者的信任感。这两种类型的区别在于,Type 17不依赖于正则表达式来匹配和替换HTML和Javascript。
· Type 81
Type 81是被代理服务器完全忽略的url列表。这样做的目的是为了避免在广告、聊天或电子邮件客户端插入广告时可能出现的复杂情况。请求和响应由代理转发给受害者,此段代码是无需修改的。
8.5、Webfake钓鱼站点
BokBot使用webinject创建目标网站的副本,这些副本网站称为webfake。通过重写URI将流量转发到webfake站点。本节介绍用于将流量重定向到webfake的每种注入类型。这些都是在Web浏览器不知情的情况下发生的。
图4:BokBot WebFake示例
· Type 50
Type 50请求对从客户端接收到的uri执行精确匹配(没有正则表达式)。当匹配成功时,URL被重写为指向webfake站点,请求被发送到副本页面。对该请求的响应由代理服务器解析并发回给受害者。
· Type 51
若要匹配单个图标/gif/位图/其他名称,则使用正则表达式匹配和替换:
匹配的正则表达式:^https:\/\/www\.amazon\.[a-z]{2,5}\/.*\/style\/images\/(.*)\.(png’|gif)$
替换URI:hxxps://hospirit[.]com/amazon/style/images/$1.$2
hospirit的IP地址:185.68.93.136
该正则表达式将用PNG或GIF文件的名称替换值“$1”和“$2”。这个重写的请求将从代理服务器发出。
· Type 52
Type 52请求似乎是检查子字符串的URL,然后提取该数据,但是我们用于撰写本篇报告的BokBot样本中不包含Type 52的重写过程。
· URL重写绕过
如果每次受害者试图登录目标网站时都使用相同的webfake过程,那么这也会成为一个问题。一旦收集了受害者的信息,就不再需要重写url来指向webfake站点。相反,请求应该不经修改就发送到真正的网站。为了确保这一点,BokBot维持了一个位于HKCU\Software\Classes\CLSID注册表项下的子键列表。
为此,需要为每个目标站点生成唯一的名称。 此类别中包含的每种注入类型都包含Webfake模板字段,例如:
上图中,黄色标注部分的值,其作用是生成唯一注册表项名称的种子(在“验证请求”一节中有更详细的介绍)。每个目标站点都包含一个类似于上面突出显示的值,或者一个使用URL主机名的标识符(例如,“amazon”)。
如果注册表子键存在,代理服务器将向C2发送一个请求,以确定是否应该重写请求。如果C2的响应不是两个字节之一(“0x2D”或“0x2B”),则不会重写合法URL来指向webfake站点。
8.6、验证请求
验证请求由Bot API javascript生成(后面将介绍),用于向C2发送数据,或者在注册表中插入/删除/查询值。使用多种验证请求类型,每一种都由代理服务器处理。
表4:验证命令
· Type 96
为了显示“Site Down for Maintenance”消息或向受害者提供合法的网站(绕过URL重写请求),注入javascript代码的Bot API可以生成Type 96的banknameS请求。
传递给请求主体的值将被写入注册表,并由Bot API和处理URL重定向请求类型的代码执行。
每个站点都提供一个惟一的ID,该ID通过banknameS参数发送到代理服务器。此值用于生成UUID,它将是注册表项的名称。所有这些条目都是在以下注册表路径下创建的:HKCU\Software\Classes\CLSID。
创建密钥之后,位于Type 96请求主体中的值被散列并写入注册表子密钥中的(默认)值字段。
· Type 97、98
Type 97和98的验证都将由Bot API注入的javascript生成,并将对Type 96请求创建的注册表项执行操作。Type 97查询注册表以查看值是否存在,Type 98将删除键。
· Type 100
要么Verification Type 100直接传递给C2(Type 2),要么请求告诉代理服务器以某种方式与C2(Type 1)交互。这些请求是HTTP POST或HTTP GET请求,其中包含从恶意javascript代码收集的信息。
8.7、小结
让我们以cashanalyzer网站注入回顾本节的内容:首先,代理服务器从Web浏览器接收访问www.cashanalyzer.com的请求,接着代理循环遍历各种webinject列表以匹配URL,继而找到匹配项。
代理服务器从Webfake Template字段的第一部分获取2299737dfa5c070dc29784f1219cd511值,并使用它生成一个UUID来确定是否设置了“站点停止维护”页面(请参阅“8.6、验证请求”一节)。如果存在,则向C2发送一个请求,以确定块页是否应该使用新的时间更新或删除。
一旦进行了块页检查,代理服务器将接受Webfake Template的其余部分,并用web协议(HTTP/HTTPS)和URL hospirit.com/cashanalyzer替换前面的://字符串。至于URL的路径和查询,content/main?a=2299737dfa5c070dc29784f1219cd511&b=#gid#&c=#id#被附加到URL的末尾。项目ID和Bot ID值分别替换#gid#和# ID #参数值令牌。
请求将发送到webfake。发送响应并进行其他检查以确定是否有任何匹配的注入类型。如果没有找到匹配,响应将被转发回受害者的浏览器而不进行修改。浏览器无法感知网页已被重定向了,且从用户视角看,初始URL仍然在浏览器地址栏中。
当浏览器响应时,将从webfake发送额外的请求来加载相关javascript文件。在本例中,main.js是从webfake加载的。浏览器请求从重定向的网站下载javascript文件,代理服务器再次执行webinject匹配例程。结果是找到了一个Type 19的匹配项。
当重定向的网站响应请求时,“Code to Inject”值将被注入main.js代码。现在,所有收集目标的帐户信息的必要组件都已到位。
一旦收集了表单数据,代理服务器将发送和处理Verification Type 100请求。这些请求是POST请求,表单数据包含在请求体中,由代理处理后,表单数据将通过向C2通信线程发送信号发送到C2。
请求参数可以通过“七、代理与C2的通信”一节进行解析。
代理服务器处理webinjects的方式有多种变化。但是,这个例子足以展示整个工作流程。
九、流量操作:浏览器视角
由于注入的javascript API有很多变体,所以我们不试图抽象归纳每个注入的高级进程的共同点,本节将继续以上一节中介绍的cashanalyzer.com为例。举一反三,此类分析也可用于了解其他注入的工作原理。
在本节中,前两小节将介绍站点如何与受害者、代理和C2之间进行交互。最后的“9.8、小结”一节则汇总介绍。
9.1、Bot API:核心Javascript模块
如前所述,main.js文件包含了Bot API代码。此代码提供了与代理、C2和网页HTML元素交互所需的一切,以确保受害者在输入帐户信息时能无缝链接。
9.2、令牌状态
令牌的状态是一个数字指示器,用于标识Bot API下一步应该采取什么操作。有五种象征性的状态:
表5:令牌状态
比如,如果出现某种错误,令牌状态被设置为3或4,这将触发javascript中的逻辑调用viewBlock方法(下一节中讲述)并加载“Site Down for Maintenance”(网站正在维护)页面。
9.3、页面视图的体系结构
为了确保以正确的顺序收集正确的信息,Bot API依赖于传统的视图/控制器体系结构。在本例中,控制器是由攻击者控制的webfake站点。Bot API客户端通知C2它已准备好接收命令,服务器响应命令,此命令用于加载下一页面视图。
表6:页面视图命令
Bot API接收到该命令后,将修改相关HTML元素的CSS显示字段来显示此代码块。使用webfake的典型会话将采取以下步骤:
1.加载登录页面视图
· 受害者输入账户信息并提交表单
· 在处理登录表单时,将显示一个等待页面
2.加载安全令牌页视图
· 受害者进入安全令牌
· 在处理安全令牌表单时,将显示一个等待页面
3.加载了姓名/姓氏/电话号码页面视图
· 受害者输入此信息
· 在处理此表单时,将显示另一个等待页面
下面的“9.8、小结”中将对此举例介绍介绍。
9.4、等待页面
当受害者试图登录网站时,代理将请求转发给webfake站点,而该站点将请求转发给合法站点,因此会有一段空闲期。为了避免引起任何怀疑,Bot API会显示一个等待页面。
图5:登录后等待页面
该网站有多个版本,每个版本对应一个帐号信息收集过程:登录信息;安全令牌信息;安全问题的答案;以及收集受害者姓名和地址的表格。
9.5、通信:Bot API请求到C2
代理服务器使用Validation Type 100请求将代表Bot API的命令转发到C2。这些请求中包含一个base64编码的字符串。该字符串解码为JSON格式的一系列参数。
表7描述了每个参数的含义。在这种情况下,Bot API通知C2该页面尚未初始化(无效)。
表7:Bot API C2通信的URL参数
Bot API定期发送Heatbeat(Type 1)请求。这些请求用作维持与C2的持续通信的手段,并为Bot API提供接收命令的媒介。
9.6、通信:C2响应Bot API
来自C2的响应包含了指定Bot API根据初始请求需要执行哪些操作的命令。每次提交表单后,C2都会接收到一条命令,告诉Bot API接下来要加载哪个页面。这些响应也是base64编码的JSON。
在本例中,命令ID为“99”,内容是告知Bot API重新加载原始站点。这将重置所有表单,清除所有站点块并加载原始页面。表8涵盖了C2响应的各个字段:
表8:C2响应字段
可以看到,表8的id字段与表6的内容是一致的。
9.7、站点维护页面
只要Bot API的令牌状态设置为“3”或“4”,就会显示一个错误页面,指出存在技术问题(图6)。只要存在与C2,webfake,代理服务器通信的问题,或者当webfake与真实网站通信时发生错误,令牌会被设置为这两种状态之一。
图6:BokBot代理的“Site Down for Maintenance”页面
修复日期是通过在当前时间上添加一个小时生成的。在显示网站之后,通过发送一个Type 96 Verification请求在注册表中设置这个时间戳。一旦计时器过期,将发送一个Type 98 Verification请求来从注册表中删除阻塞时间。
日志记录
Bot API不断地将日志数据作为base64编码的JSON发送回C2。下面是解码后的JSON对象:
此数据块有一系列键-值对,其中h键中包含了日志,也就是值。这些日志是描述性的,对于攻击者来说非常有用。
9.8、小结
9.8.1、初始浏览器请求
用户的浏览器向cashanlyzer.com发送请求,请求被代理拦截后重写,并发送到webfake站点,代理再将响应发送回受害者。页面内容还包含以下javascript代码,用于从攻击者控制的站点加载javascript文件:
这个main.js请求由代理转发,并在响应中注入以下代码:
此代码将调用main.js中定义的String.prototype.init方法。init方法包含恶意Bot API javascript模块,并将最终调用main函数来初始化和加载webfake站点。
图7:Cashanalyzer伪登录页面
在执行检查以确定是否需要加载块页面之后,Bot API调用viewStep方法并将字符串“login”传递给它,“login”是包含登录表单的HTML <div>对象的元素id。
该元素的显示字段将从none切换为block,并显示登录页面(图7)。之后用户就可以在该页面输入登录信息并单击“continue”。所有输入的数据都被放入C2请求结构中,并发送到webfake站点。
上面突出显示的段落中,第一部分是用户帐户凭据,第二部分是日志信息。日志信息会通知另一端的用户登录视图已经加载,最后一个视图是等待页面。
当Bot API不断发送心跳请求,等待来自webfake站点的响应时,受害者看到的等待页面会出现混乱。
处理完成后,Web服务器会响应一个命令来禁用登录页面,并使下一页面显现,在本例分析中,该命令是加载用户联系信息表单。
其余步骤是自解释的:后续操作由导致等待时间的表单组成,然后是其他表单,直到到达最后一步。
9.8.2、结束过程
收集完所有信息后,Bot API向代理服务器发送一个Validation Type 96的请求,但注册表中设置的值不是时间戳,而是字符串“true”,如下所示。
此请求指示代理服务器使用(默认)值创建 ‘HKCU\Software\Classes\CLSID\{7570CC99-D32B-6883-1375-9D2881583EFB)‘ 注册表项,并设置为四字节二进制值。设置完成后,任何进一步的访问尝试都会绕过所有重写URL的尝试(注入类型50,51,52),并将加载合法网站。
要加载合法网站,页面需要刷新,之后用户就能登录到合法的cashanalyzer.com网站。当然,如果用户要访问的网站仍与webinject匹配,那么还是会被手机信息(收集帐户余额数据等)。
十、CrowdStrike Falcon是如何阻止BokBot感染的
CrowdStrike Falcon Prevent™新一代防病毒软件在启用进程阻塞时能成功阻止BokBot,过程如下。
BokBot生成一个svchost子进程,注入主模块,然后svchost进程生成并注入多个子进程。图8中的流程树是使用已开启流程阻塞功能的Falcon Prevent,查看BokBot时的示例。如下所示,位于第一个svchost进程内部的BokBot的主模块启动了几个恶意子进程。
图8:未启用进程阻塞的BokBot进程树
如果没有启用预防功能,客户仍然会收到恶意活动的通知,但是不会自动采取任何预防动作。
10.1、可疑进程阻塞
Falcon Prevent能阻止BokBot的主模块和所有子模块的执行,同时启用了进程阻塞的Falcon Prevent可以杀死父进程svchost上的BokBot感染。图9是启用了流程阻塞的Falcon UI中的流程树,可以看到svchost流程被终止了。图10解释了终止此流程的原因。
图9:启用进程阻塞的BokBot进程树
图10:BokBot进程终止说明
可疑进程阻止是基于恶意软件行为的防护示例。即使恶意软件使用了Falcon的攻击指标(IOA)中未记录的行为,Falcon也可以通过利用下一代AV机器学习或Crowdstrike Intelligence团队收集的情报来防止恶意软件的执行。
十一、指标
BokBot哈希值
本文样本使用了以下哈希:
文件位置:
注册表:
网络监听器:
攻击者控制的网站:
还没有评论,来说两句吧...