专栏首页FreeBuf走近科学:如何一步一步解码复杂的恶意软件

走近科学:如何一步一步解码复杂的恶意软件

写在前面的话

在检测网站安全性的过程中,最麻烦的一部分工作就是要确保我们能够找出网站中所有已存在的后门。绝大多数情况下,攻击者会在网站各种不同的地方注入恶意代码,并以此来增加再次感染该网站的成功率以及尽可能久地实现持续感染。

虽然我们之前已经给大家介绍过数百种后门以及相应的影响,但今天我们想跟大家更加深入地讨论一些关于恶意软件的分析技术,即如何解码复杂的高级恶意软件。

本文所分析的恶意软件感染样例早在几个月前就已经出现了,但是受这种恶意软件变种所感染的网站(例如WordPress和Joomla等CMS)数量却一直在增加。

恶意软件

成功感染目标网站之后,攻击者可能会进行注入后门和Web Shell、以及添加伪造的管理员用户等恶意操作。一般来说,攻击者都会采用一种或多种技术来隐藏自己的恶意代码,例如编码、加密和混淆等等。

请大家先看下面给出的代码段。其中,攻击者同时使用上面举例的三种技术。接下来,我们会一步一步地告诉大家如何对这段代码进行解码和分析。

原始的恶意软件代码段:

简化代码

在解码过程中,最重要的是要理解代码的逻辑结构。为此,我们使用了PHP Beautifier来将之前的代码段转换成了下图所示的格式:

虽然目前为止代码仍然是不可读的,但是我们现在至少已经了解了代码的编程逻辑架构。

攻击者一开始声明了一个名叫”$hc7e1d20”的变量,而这个变量是没有任何实际意义的。根据我们的经验来看,这个变量的值(406)可能是攻击者用来标识恶意软件变种版本的。

除此之外,还有一些全局变量也对我们理解代码不会提供任何帮助,我们可以直接忽略它们。

这个恶意软件样本基本上使用的是字符/字符串修改技术,攻击者在变量中存放了很多十六进制字符,然后再将它们编译成不同的变量。

第一个样例如下:

这段代码可以直接通过下面的bash命令来进行转译:

$ echo -e"\x47\x4c\x4fB\x41\x4c\x53"
GLOBALS
$ php -r 'echo"\x47\x4c\x4fB\x41\x4c\x53";'
GLOBALS

这个值(${GLOBALS}[‘tbb6a’])似乎使用了某些特殊字符来防止被转译,但是恶意软件最终似乎并没有使用这个值。现在,我们就可以创建一个简单的PHP脚本,然后自动化地打印出所有的变量以及相应的值。

查找和替换

得到这些信息之后,我们就可以使用查找和替换功能了。

第一个变量如下:

我们可以得到下面的转译结果:

为了增加代码的可读性,我们将’be10eb436’替换成了’arr’(因为它被声明为了一个array()),然后我们继续对字符进行转译。

几分钟之后,我们得到了如下所示的代码:

现在一切已经更加明朗了,接下来我们还要对代码进行一些调整。其中,前几个变量可以直接替换成下列形式:

$arr['l0e6'] = ‘chr’;
$arr['ac6c24d1'] = ‘ord’;
$arr['s8bb921e'] = ‘strlen’;

将代码种各个变量和值调整到相应位置之后,我们就得到了上述代码中的第一个函数:

恶意目的

替换了所有的函数以及变量之后,我们就可以得到如下所示的代码段了:

得到了完整并且可读的恶意代码之后,我们发现了几个有意思的地方:

1. 其中有一个名叫l3f5() 的函数,该函数负责通过按位异或计算来执行加密和解密操作。 2. 函数 q057860()采用了两层异或加密/解密计算。 a) 第一层计算中,密钥是一个预定义的常量: ($w158 = ‘2cef0f87-62fe-4bb9-a1de-4dc009e818ea’;)。 b) 第二层所使用的密钥来自于POST参数或HTTP coockie。 c) 这个函数主要用来对经过加密的序列化数据进行解码。其中,序列化数据是攻击者通过cookie或POST参数传递给恶意脚本的。 3. 解码数据可能包含: a) 可执行的PHP代码。 b) 提供关于后门和PHP版本信息的命令。

总结

现在网上有很多不同类型的恶意软件,但并非所有的恶意软件都是直接通过脚本来执行恶意命令的。比如说在这个样本中,它可以通过$_POST或$_COOKIE请求来接收任意命令,而Web服务器默认是不会记录这种行为的。

为了防止网站被恶意软件所感染,我们强烈建议管理员采用类似文件完整性监测以及Web应用防火墙(WAF)等安全措施。除此之外,我们还建议管理员定期检查网站的日志记录以尽早地发现可疑行为。

本文分享自微信公众号 - FreeBuf(freebuf),作者:Alpha_h4ck

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-08-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 最强后门刷榜病毒,“隐流者”家族盯上70%的国内应用市场

    近期,依托腾讯安全大数据,腾讯安全反诈骗实验室自研的TRP-AI反病毒智能引擎捕获到某色情病毒家族存在流量异常行为,腾讯安全研究人员研究发现,该色情病毒家族集成...

    FB客服
  • 控制流程完整性:给大家介绍一种“另类”的Javascript反分析技术

    写在前面的话 理解恶意软件的真实代码对恶意软件分析人员来说是非常有优势的,因为这样才能够真正了解恶意软件所要做的事情。但不幸的是,我们并不总是能够得到“真实”的...

    FB客服
  • 开源SOC的设计与实践

    开源日志系统分析很常见, 现在基于开源中间件可以很有效的搭建日志中心,处理各种数据的收集与分析。 日志系统也是信息系统,从软件工程的角度来看和一般的信息系统有很...

    FB客服
  • ASP.NET Core的配置(2):配置模型详解

    在上面一章我们以实例演示的方式介绍了几种读取配置的几种方式,其中涉及到三个重要的对象,它们分别是承载结构化配置信息的Configuration,提供原始配置源数...

    蒋金楠
  • React移动web极致优化

    本文start kit: steamer-react PS: 要看效果得将一个QQ群组转换成家校群,可到此网址进行转换(手Q/PC都可以访问): http:/...

    李成熙heyli
  • 通用目标检测YOLO V3

    YOLOv3非常快速和准确。 在mAP值为0.5 IOU时,YOLOv3与Focal Loss相当,但速度约快4倍。 此外,您只需更改模型的大小即可轻松在速度和...

    算法发
  • 儿童编程“控制”部分学习总结

    在任何编程语言中,控制部分都是非常重要的,也是体现编程语言神奇之处。在Scratch中同样如此。初次学习肯定会感觉有些抽象,但是在实际应用之中,则会体现出其功能...

    一石匠人
  • 你不知道的Java的split的小问题

    我是攻城师
  • 【App测试】怎么测试启动时间?

    启动时间对于App的性能测试,启动时间是个重要指标,启动时间分为两种情况,一种是冷启动时间(通常是系统重启,即在启动前没有该App进程的情况),另一种是热启动,...

    何小伟
  • 【技巧】文字探照灯 PPT也能做

    在使用PPT制作演示文稿时,往往想给自己的内容加上一些特殊效果以吸引人的眼球,比如想对文字进行“探照灯式”的扫描,灯光扫描到的文字在光柱下显示,没有扫描到的的文...

    若川

扫码关注云+社区

领取腾讯云代金券