Fake-SMS恶意软件混淆分析——低代码的时代来了

2024-04-15 19:52

本文主要是介绍Fake-SMS恶意软件混淆分析——低代码的时代来了,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

写在前面的话

在安全社区中,只要聊到开源代码使用方面的话题,就肯定会聊到安全问题。虽然使用开源代码通常会被认为是安全的,但我们需要清楚的是,与非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

这篇关于Fake-SMS恶意软件混淆分析——低代码的时代来了的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/906770

相关文章

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

python多进程实现数据共享的示例代码

《python多进程实现数据共享的示例代码》本文介绍了Python中多进程实现数据共享的方法,包括使用multiprocessing模块和manager模块这两种方法,具有一定的参考价值,感兴趣的可以... 目录背景进程、进程创建进程间通信 进程间共享数据共享list实践背景 安卓ui自动化框架,使用的是

SpringBoot生成和操作PDF的代码详解

《SpringBoot生成和操作PDF的代码详解》本文主要介绍了在SpringBoot项目下,通过代码和操作步骤,详细的介绍了如何操作PDF,希望可以帮助到准备通过JAVA操作PDF的你,项目框架用的... 目录本文简介PDF文件简介代码实现PDF操作基于PDF模板生成,并下载完全基于代码生成,并保存合并P

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

SpringBoot基于MyBatis-Plus实现Lambda Query查询的示例代码

《SpringBoot基于MyBatis-Plus实现LambdaQuery查询的示例代码》MyBatis-Plus是MyBatis的增强工具,简化了数据库操作,并提高了开发效率,它提供了多种查询方... 目录引言基础环境配置依赖配置(Maven)application.yml 配置表结构设计demo_st

SpringCloud集成AlloyDB的示例代码

《SpringCloud集成AlloyDB的示例代码》AlloyDB是GoogleCloud提供的一种高度可扩展、强性能的关系型数据库服务,它兼容PostgreSQL,并提供了更快的查询性能... 目录1.AlloyDBjavascript是什么?AlloyDB 的工作原理2.搭建测试环境3.代码工程1.