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

相关文章

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

Java中&和&&以及|和||的区别、应用场景和代码示例

《Java中&和&&以及|和||的区别、应用场景和代码示例》:本文主要介绍Java中的逻辑运算符&、&&、|和||的区别,包括它们在布尔和整数类型上的应用,文中通过代码介绍的非常详细,需要的朋友可... 目录前言1. & 和 &&代码示例2. | 和 ||代码示例3. 为什么要使用 & 和 | 而不是总是使