查看原文
其他

webshell指纹-ssdeep

七夜安全 七夜安全博客 2021-01-04


webshell指纹-ssdeep
前言


最近一段时间的任务就是研究webshell的检测,感觉安全真是没有止境,尤其还是处于防御方,安全策略的制定 任重而道远。


今天给大家分享一下webshell指纹这个知识点,这个主要是制作webshell样本库,用来对已知样本进行快速防御,快速发现,主要是对付一些工具小子和初级黑客(毕竟不会自己写代码)。


支持我就点点文末GG,穷死了。。。


第一节

ssdeep,what ?

     首先说一下今天的主角ssdeep,这是一个基于模糊哈希(Fuzzy Hashing)算法的工具。要想弄明白这个工具的原理,不得不说一下模糊哈希算法。


模糊哈希算法又叫基于内容分割的分片分片哈希算法,主要用于文件的相似性比较。主要被用来取证,恶意代码检测,以及开源软件漏洞挖掘。


模糊哈希的主要原理是,使用一个弱哈希计算文件局部内容,在特定条件下对文件进行分片,然后使用一个强哈希对文件每片计算哈希值,取这些值的一部分并连接起来,与分片条件一起构成一个模糊哈希结果。使用一个字符串相似性对比算法判断两个模糊哈希值的相似度有多少,从而判断两个文件的相似程度。


通俗来说,对文件的部分变化,比如多处修改、增加、删除部分内容,只会改变模糊哈希结果某一个分片的值,并不会影响整体的变化,使用模糊哈希均能发现与源文件的相似关系,也就是判断相似度的一种方法。这种方法对于源码级样本的比对,比如webshell,是非常有效的。


一般的工具小子,拿到网上的很多webshell样本,就开始渗透测试了,最多是将webshell添加一下自己标识或者修改一下用户名,密码,对原样本的改动是不大的,因此防御端通过搜集大量webshell样本,制作webshell样本库。在发现阶段,通过扫描黑客上传的文件,使用ssdeep进行相似度比对,即可快速发现入侵。


如果大家对ssdeep如何实现内容分片,可以去看ssdeep的实现源码


C实现:https://github.com/ssdeep-project/ssdeep


golang实现:https://github.com/glaslos/ssdeep


python实现:https://github.com/bunzen/pySSDeep


支持我就点点文末GG,穷死了。。。


第二节

ssdeep使用

由于最近一直在使用golang,所以就使用golang实现了webshell的指纹库,主要是调用


https://github.com/glaslos/ssdeep


制作样本库需要大量的webshell样本,在Github上就有这样的项目:


https://github.com/tennc/webshell


其中生成hash的golang代码,指定文件路径,返回hash值如下:


  1. func (this *hashmatcher) GetHash(filename string) (string, error) {

  2.    fileObj, err := os.Open(filename)

  3.    defer fileObj.Close()

  4.    if err != nil {

  5.        return filename, err

  6.    }

  7.    data, err := ioutil.ReadAll(fileObj)

  8.    if err != nil {

  9.        return filename, err

  10.    }

  11.    hash, err := ssdeep.FuzzyBytes(data)

  12.    if err != nil {

  13.        return filename, err

  14.    }

  15.    return hash, err

  16. }


从样本库中(前提是已经将样本库加载到内存)进行比对,也很简单,指定未知样本的路径,和相似度的值,如果是90%相似,输入90即可。代码如下:


  1. func (this *hashmatcher) MatchHash(src_file string, top_value int) (bool, error) {

  2.    hash, err := this.GetHash(src_file)

  3.    if err != nil {

  4.        return false, err

  5.    }

  6.    for _, h := range this.hashes {

  7.        score, err := ssdeep.Distance(hash, h)

  8.        if err != nil {

  9.            return false, err

  10.        }

  11.        if score > top_value {

  12.            return true, nil

  13.        }

  14.    }

  15.    return false, nil

  16. }


支持我就点点文末GG,穷死了。。。


第三节

推荐

最后推荐一本书,新出的《加密与解密》第四版,凡是做过逆向的,都会知道看雪论坛,凡是去过看雪的,都知道加密与解密这本牛书。



关注公众号:七夜安全博客

  • 回复【1】:领取 Python数据分析 教程大礼包

  • 回复【2】:领取 Python Flask 全套教程

  • 回复【3】:领取 某学院 机器学习 教程

  • 回复【4】:领取 爬虫 教程

  • 回复【5】:领取编译原理 教程

  • 回复【6】:领取渗透测试教程

知识星球已经60多人了,随着人数的增多,价格之后会上涨,越早关注越多优惠。星球的福利有很多:

  • 比如上面的教程,已经提前在知识星球中分享

  • 可以发表一些问题,大家一块解决

  • 我之后写的电子书,录制的教学视频,对于知识星球的朋友都是优惠的(基本上免费)

  • 一些节假日会给大家发个红包或者赠书

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存