专栏首页七夜安全博客哈勃linux沙箱-源码剖析上篇

哈勃linux沙箱-源码剖析上篇

哈勃沙箱技术总览

第一节

哈勃linux沙箱

今天说的哈勃沙箱是腾讯哈勃检测系统中,linux恶意文件检测部分的开源代码。github地址为:

https://github.com/Tencent/HaboMalHunter

今天是源码剖析的第一篇,目标是简要介绍一下沙箱使用的检测手段和主要技术点。从github中输出的html报表里,监控的信息还是挺丰富的。这里只截取一部分,根据github中的说明,大家很容易就可以搭建一个沙箱。

每个技术点咱们在接下来的文章里会陆续讲到,经过我的讲解,大家基本上可以设计一款可用的沙箱。

第二节

静态检测

在哈勃沙箱的代码目录中,static目录下即为静态检测的代码,代码很清晰。静态检测的本质是特征码匹配,对已知的恶意文件进行快速匹配进而查杀,如果能在静态检测层面发现恶意代码,就不需要动态分析了,这样速度就会快很多。

从static_analyzer.py来看,哈勃linux沙箱静态检测,获取的信息主要有六个方面:

1. 文件类型信息

通过file命令获取文件信息,比如是二进制还是其他类型文件,在linux中是无法通过后缀判断它是什么文件的。

2. 文件hash比对

对于已知的恶意文件都有相应的hash库,方便快速比对。哈勃主要计算文件的md5,sha1,sha256,这是一种绝对匹配方式。

还有一种方式是计算文件的ssdeep值,这个在我之前讲webshell检测时讲过这个,这个值可以通过相似度判断恶意文件的一些变形。

3. exiftool信息

获取文件属性信息,通过exiftool工具来实现,内容包括修改时间,创建时间等等。

4. 文件大小

文件大小也是一个辅助判断的依据,毕竟木马文件不会很大,几兆的木马文件上传也是费事。

5. yara模糊过滤

YARA是一款旨在帮助恶意软件研究人员识别和分类恶意软件样本的开源工具,使用YARA可以基于文本或二进制模式创建恶意软件家族描述信息。

YARA的每一条描述或规则都由一系列字符串和一个布尔型表达式构成,并阐述其逻辑。YARA规则可以提交给文件或在运行进程,以帮助研究人员识别其是否属于某个已进行规则描述的恶意软件家族。比如下面这个例子:

rule silent_banker : banker
{
    meta:
        description = "This is just an example"
        thread_level = 3
        in_the_wild = true
    strings:
        $a = {6A 40 68 00 30 00 00 6A 14 8D 91}
        $b = {8D 4D B0 2B C1 83 C0 27 99 6A 4E 59 F7 F9}
        $c = "UVODFRYSIHLNWPEJXQZAKCBGMT"
    condition:
        $a or $b or $c
}

实现代码为:

6. 查壳

一般的恶意文件,为了防止被逆向人员分析,都会加壳的。

哈勃主要是判断了是否是upx壳。如果是upx,则进行解压。判断是upx壳的方法很简单,直接使用upx进行解压,返回是否成功。

接着提取以下信息:

  • 明文字符串(通过strings命令),
  • 动态库(通过ldd命令)
  • 入口点,节,段,符号等信息(通过readelf命令)

第三节

动态检测

动态检测是沙箱的核心部分,但是本篇不展开讲解,在下一篇进行详细分析,因为动态检测的原理比较复杂。动态检测的内容在dynamic目录下的dynamic_analyzer.py文件里。

一般的动态检测主要是监视程序三个部分的内容:

  1. syscall系统调用
  2. 进程内存
  3. 网络流量

对于系统调用,哈勃使用了三种方式进行了全方位的监控:ltrace/strace/sysdig。

ltrace和strace

ltrace和strace都是基于ptrace机制进行检测的,但是又有很大的不同,strace跟踪系统调用,而ltrace可以跟踪动态库函数。我们知道,ptrace机制可以用来跟踪系统调用,那么ltrace是如何使用它跟踪库函数呢?

首先ltrace打开elf文件,对其进行分析。在elf文件中,出于动态链接的需要,需要在elf文件中保存函数的符号,供链接器使用。具体格式,大家可以参考elf文件的格式。

这样ltrace就能够获得该文件中,所有系统调用的符号,以及对应的执行指令。然后,ltrace将该执行指令所对应的4个字节替换成断点指令。

这样在进程执行到相应的库函数后,就可以通知到了ltrace,ltrace将对应的库函数打印出来之后,继续执行子进程。

实际上ltrace与strace使用的技术大体相同,但ltrace在对支持fork和clone方面,不如strace。strace在收到fork和clone等系统调用后,做了相应的处理,而ltrace没有。

至于sysdig的原理,以及与ltrace,strace的区别,我们会在下一文章中进行详细说明。

内存分析

对于内存,沙箱基本上都是基于volatility来做的,哈勃也不例外。哈勃主要分析了两部分内存:

1.bash 调用历史

2.父子进程的关系

网络分析

对于网络,沙箱主要做了两个部分的工作,一部分是虚拟网络环境,另一部分是网络抓包

1.INetSim虚拟网络环境

2.tcpdump 抓取数据包

有的木马,还会有自删除,自锁定,自修改的行为,这是一些自保护的需要。沙箱中对此也进行了检测:

第四节

现有代码的不足

对于开源的部分代码,发现一些不能落地生产环境的地方,付费版的代码应该没这些问题。

1.没有实现检测的自动化

它是把沙箱安装到虚拟机中,然后人工拖动程序进入沙箱检测,没有发现自动化的代码。当然,对于虚拟机的自动化控制,这个是可以做的,二次开发。

2.没有策略

沙箱的检测策略是没有开源的,这是很宝贵的东西。我们虽然可以获取大量的信息,但是哪些是恶意的,我们没办法判别。当然这就是我们策略该做的事情了,只要有样本,策略还是可以做的。

3.请期待下一篇:沙箱的动态检测机制。

本文分享自微信公众号 - 七夜安全博客(qiye_safe)

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

原始发表时间:2019-01-04

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • WebShell通用免杀的思考

    之前看待事物总是看其一角,做技术也是囿于一面,思维不是很开阔,经过不断地看书,思考,认知慢慢有了 改变,获益良多。

    七夜安全博客
  • linux无文件执行— fexecve 揭秘

    之前的文章中,我们讲到了无文件执行的方法以及混淆进程参数的方法,今天我们继续讲解一种linux无文件执行的技巧,是后台朋友给我的提醒,万分感谢,又学到了新的东西...

    七夜安全博客
  • 无线安全专题_破解篇03--打造个人字典

    七夜安全博客
  • C#实现定时器的几种方案

    前几天写了一篇java的定时器方案,应小伙伴的要求,今天这里一下c#实现定时器的方案。

    用户4831957
  • 深入浅出数据库事务

    说到数据库事务,很多人就会想事务的ACID即原子性,一致性,隔离性,持久性,以及事物的四个隔离级别,但是并不是很明白为什么要用这四个特性来保证事务,以及事务的隔...

    Java识堂
  • 消息服务框架(MSF)应用实例之分布式事务三阶段提交协议的实现

    一,分布式事务简介 在当前互联网,大数据和人工智能的热潮中,传统企业也受到这一潮流的冲击,纷纷响应国家“互联网+”的战略号召,企业开始将越来越多的应用从公司内网...

    用户1177503
  • 【转载】Spring 中,事务的传播方式

    spring 特有的事务传播行为,spring 支持 7 种事务传播行为,确定客户端和被调用端的事务边界(说得通俗一点就是多个具有事务控制的 service 的...

    水货程序员
  • 面子不能输!美国5G实现了全国覆盖,只是速度尚不如4G

    近日,美国第三大运营商T-Mobile公开宣称,已在美国启用全国性的5G网络,覆盖了全美国5000个城镇,5G服务覆盖面积超过100万平方英里,网络覆盖人口超过...

    悲了伤的白犀牛
  • Android开发笔记(二十一)横幅轮播页Banner

    在前面的博文《Android开发笔记(十九)底部标签栏TabBar》中,我们提到可以在一个主页面里通过选项卡方式,切换到不同的子页面。那么在手机上还有另外一...

    用户4464237
  • 【快学springboot】9.使用 @Transactional 注解配置事务管理

    springboot对数据库事务的使用非常的方便,只需要在方法上添加@Transactional注解即可。Spring 为事务管理提供了丰富的功能支持。Spri...

    Happyjava

扫码关注云+社区

领取腾讯云代金券