写在前面的话
在安全社区中,只要聊到开源代码使用方面的话题,就肯定会聊到安全问题。虽然使用开源代码通常会被认为是安全的,但我们需要清楚的是,与非FOSS(自由与开源软件)解决方案相比,开源软件解决方案并不能保证完全的可信任度或更好的安全性。那么关键问题就出现了:即使代码经过了混淆处理,我们是否仍应该使用FOSS?答案肯定是否定的,而且这样的代码并不应该被视为FOSS。
先让我们一起回头看看恶意软件的定义到底是什么?恶意软件可以被描述为在未经用户意识或许可的情况下执行操作,导致计算机系统或网络出现问题的软件。恶意软件的类型非常多,比如说蠕虫、RootKit、病毒、木马和间谍软件等。虽然它们的复杂程度和绕过安全检测的能力可能有很大差异,但影响都是非常严重的。
本文由Aleksa Majkić于2024年3月24日发表于Medium。在这篇文章中,我们将深入研究一个开源工具中隐藏恶意代码的典型案例,并给大家演示如何通过经过混淆的恶意代码来追、分析和识别威胁行为者。实际上,我们其实可以将手头上的任何代码都想象成是恶意代码,而我们可以和任何安全分析人员一样,去对代码进行分析和审计。除此之外,本文还将涉及到Git库的取证分析、代码加密、压缩和混淆相关的内容。
一切是如何开始的?
在一个寒冷冬天的早晨,当时我正在做我本该做的事情,当我在浏览Twitter时,意外地发现了一个内容包含“Fake-SMS”的开源工具介绍推文。虽然这个项目目前已经不是恶意软件了,但早在2022年它当时还是一个恶意软件。该项目包含恶意代码的持续时间我们不得而知,但我分析后发现它至少有一个月的时间存在恶意代码。
一段Python代码,就可以免费发送短信,这听起来就很nice吧?当然了,这必不可能是真的,下载下来之后,我系统的安全警报就biubiubiu了。毫无疑问,我遇到了恶意软件,出于我的“本能”,我打算对其进行进一步的分析。从推文来看,这篇推文貌似还是来源于受信任的源,于是我便点进去研究了一下这位名为“three_cube”的安全专家所发布的一些文章。但我却发现他所发的文章很多信息和观点都是矛盾的,似乎他完全就是一个菜鸟。更可怕的是,还有一些内容甚至要付费才能阅读。即便是如此,这位大哥仍然得到了David Bombal和Null Byte等专家的认可。
环境搭建和工具准备
在开始启动并分析恶意软件之前,工作环境是至关重要的。我们可以选择虚拟环境或一个单独的物理系统进行分析,每种选择有各自的优势,具体看自己。然后就是为测试系统接入网络了,我们建议创建一个隔离网络环境,因为我们的控制措施越强,遇到安全问题的概率就越低。
环境配置好之后,就要选择分析所使用的工具了。针对这一个恶意软件样本,我将完全依赖于静态分析方法,也就是在不运行代码的情况下进行分析。考虑到这个样本的“业余”属性,我也不需要其他的工具来解决它的混淆处理、打包或代码加密等问题。虽然监控恶意软件在执行过程中的行为可能更容易进行分析,但我的这种取证分析方法相对来说更安全一些。当然了,你也可以选择动态分析和静态分析相结合的方式,效果可能会更好一些。
Fake-SMS推文分析
由于在本文撰写之时,之前的推文已经无法访问了。为此,我提供了一个【Wayback链接】给大家访问和查看。
文章中提及到一个没有包含任何混淆处理代码的Bash脚本,而该项目却是采用Python开发的,通过查看其代码库的commit历史,我发现它压根就和Bash没关系。但是在搜索资料之后,我发现2021年7月份geeksfoeks.com网站上出现了一篇宣传该工具的旧文章,这证实了该项目最初是用Bash编写的。
这也就意味着,很有可能对该项目的commit历史进行了修改,要么就是删除了原本Bash版本的分支,要么就是用Python版本的代码使用相同的URL直接取代了原始项目。
时间线分析
下图显示的就是我通过资料收集之后,整理出来的Fake-SMS时间线:
我能找到的旧版本代码托管在linuxquestions.com网站上,因为当时有一名用户在该网站上就Fake-SMS工具中存在混淆代码的事情发帖求助过。如果你感兴趣的话,可以看看旧版本的Fake-SMS源码:
从代码来看,最初Fake-SMS的Bash版本除了每天发送一条免费短信所需的代码外,不包含任何其他代码,那么恶意代码很可能就是在2021年至2023年间由原作者添加的。
Git代码库分析
访问Fake-SMS的代码库【GitHub传送门】(该代码库仍然可以访问)后,我发现了以下几点内容:
1、脚本本身体积不小,每天发送一条短信的效率也很低;
2、安装指引写的不够好,而且它不建议创建虚拟环境,而是建议全局安装;
3、需要安装一个不必要的软件包termcolor,而这个包对于短信发送来说没有意义,其目的就是格式化ASCII字符;
4、以这种方式发送短信并不是真正匿名的,因为IP地址仍然可以泄漏你的信息;
5、命令行ASCII字符与文章中显示的不同;
6、项目使用Python开发,而非Bash。我们知道该项目以前是Bash写的,在某个时候变成了Python,而使用不同的编程语言重写一个项目的情况比较少见;
7、代码库没有Issues页面,也就是无法提交错误信息;
8、该代码库只有一个相关的近期commit(2023年11月14日),信息为“error fix”,这也说明这个项目的Git历史被修改过;
在对该项目的Fork进行分析时,我发现了两个老版本且仍然可以访问的Fork,两个Fork的时间都是2022年11月,即hxlxmjxbbxs/fake-sms和Doru991/fake-sms。乍一看,这些Fork的代码与当前项目代码惊人的相似,不过commit历史有很大的区别。下图显示的是一个Fake-SMS Fork的commit历史:
由此看来,Python版本的代码似乎来源于2021年10月30日的初始commit(7688162)。通过分析之后,我能够确定恶意代码就是在2022年11月12日的一次commit(3d620ea)中出现的。这个版本的代码中,开发者想隐藏的远远不止所使用的公共API,而且代码经过了混淆处理:
抽丝剥茧-代码深入分析
为了彻底弄清楚恶意代码的行为,我们不得不去对代码进行抽丝剥茧的分析,但我知道最终的结果一定是好的,因为在使用解释型语言时,最终必须要给解释器一些它所能理解的东西。换句话说,代码必须在某个时刻执行。这些代码的混淆处理其实做得并不好,我直接用eval命令和print语句就搞定了第一层混淆和后续的混淆。当然了,没能拿到明文信息,到手的却是另外的混淆层。下图显示的是第二层经过混淆处理的代码:
就像解决第一层混淆一样,我用eval和print处理了一下,得到了如下内容(第三层混淆代码):
继续上述操作,得到第四层混淆代码:
通过重复相同的过程,我得到了更多的模糊代码层,它们使用了不同的模糊技术组合。下图所示为第五层混淆代码:
下图为第六层混淆代码:
下图为第七层混淆代码:
最后一层(第八层)模糊代码层如下所示:
最后,经过了最后一次eval+print的替换,拿到了最终的核心内容。下图所示即为Fake-SMS经过反混淆处理后的源代码:
为了更好地理解这个恶意软件,下面的代码只包含了该工具的恶意代码部分:
对代码进行分析后,我发现Linux和Windows系统都会启动一个远程文件下载任务,这也就意味着,目标用户的设备上运行该脚本之后,威胁行为者将能够执行远程代码执行(RCE)攻击。
为了进行对比,我先提供可以真正每天发送一条短信的代码:
很明显,工具并没有完全实现其承诺的功能。虽然它会提示用户输入消息,但实际的消息从未被发送出去。换句话说,就是输入的消息已被存储,但从未被使用,发送的只有“Hello World”。因此,你不仅无法每天发送一条免费短信,反而感染了恶意软件。
谁是背后的始作俑者?
到底是谁?为什么要这样做?此时我只想说一句:“掘地三尺我也要把你找出来!”
在查看了该项目GitHub的账户资料之后,我发现大多数的社交媒体链接已经被删除了,尽管如此,GitHub的commit历史还是能发现一些有价值的信息的。在查看了初始commit之后,我推断出了他就读大学的名称,他的LinkedIn资料和其他相关信息(地理位置和当前雇主等等)。对于经验丰富的人来说,信息收集工作其实并不困难,几分钟的事而已。他的真名是Sikander Rasheed,下面是他资料README的链接:
而且我还找到了他的Y0uTube频道链接,他的Y0uTube给我一种“黑客高手”的感觉:
下面是他的Telegram:
最讽刺的是,他自称自己是一个“好人”,是一个“红队专家”或“漏洞Hunter”,但是却对开源社区造成了这样严重的影响。
总结
本文旨在强调一个事实,即恶意软件其实并不需要多么出众或复杂才能取得成功。其实根本不用花大量精力去寻找0 day,也可以实现恶意目的。这也就意味着,很多缺乏经验的开发者很可能就会受到这种威胁的影响,因为很多人在GitHub上下载了代码之后会直接运行和使用。所以,我们一定要对使用的所有代码保持警惕!
最后给大家一句建议:“你不为产品付费,那你就是产品!”
IoC
文件名:fakesms.py文件大小:1.66949844360352 KBMD5:D5C8063A0A5F4292D616BFC5C3FCEB47SHA-256:7673072621F94777F1DF767103F8052299A84692D2598C71EA340F722113DD55
参考资料
https://twitter.com/three_cube/status/1618948587513352193
https://www.y0utube.com/@davidbombal
https://drvoip.com/wtf_otw/
Null Byte — The aspiring white-hat hacker/security awareness playground « Null Byte :: WonderHowTo
SP 800-83 Rev. 1, Guide to Malware Incident Prevention and Handling for Desktops and Laptops | CSRC
Social Engineering Attacks: Creating a Fake SMS Message
https://web.archive.org/web/20231208160803/https://www.hackers-arise.com/post/social-engineering-attacks-creating-a-fake-sms-message
https://www.linuxquestions.org/questions/linux-newbie-8/how-to-de-obfuscate-bash-script-i-think-i%27m-hacked-4175700270/
GitHub - machine1337/fake-sms: A small and efficent script to send SMS all over the world anonymously
Deobfuscate/Decode Files or Information, Technique T1140 - Enterprise | MITRE ATT&CK®
参考链接
https://medium.com/@aleksamajkic/fake-sms-how-deep-does-the-rabbit-hole-really-go-17e25c42f986