标签归档:webshell

【企业安全实战】infotify配合ssdeep实现webshell监控

0x01 概述


inotify是一种文件系统的变化通知机制,如文件增加、删除等事件可以立刻让用户态得知。使用inotify监控Web目录下jsp与jspx文件的创建修改操作,然后检测该文件中WebShell特征函数等或者用ssdeep与常用Webshell规则库做对比,相似度超过60则记录到日志中,OSSEC监控日志并告警。

inotify数据结构是轻量级的,所造成的内存消耗也很少,每一个watch消耗540字节(32位系统)或者1KB(64位系统),使用非交换内存,因此,假设您将最大值设置为524288,并且所有的都使用(不太可能),那么会使用256mb/512mb 32位/64位内存。需要注意应用程序还将使用额外的内存来跟踪inotify句柄、文件/目录路径等等。在实际环境中推荐设置的值是524288。

 

0x02 ssdeep


ssdeep是一个用来计算context triggered piecewise hashes(CTPH) 基于文本的分片哈希算法 。

安装

yum install ssdeep

常用参数:

-m - Match FILES against known hashes in file

-k - Match signatures in FILES against signatures in file

-d - Directory mode, compare all files in a directory

-p - Pretty matching mode. Similar to -d but includes all matches

-g - Cluster matches together

-v - Verbose mode. Displays filename as its being processed

-r - Recursive mode

-s - Silent mode; all errors are supressed

-b - Uses only the bare name of files; all path information omitted

-l - Uses relative paths for filenames

-c - Prints output in CSV format

-x - Compare FILES as signature files

-a - Display all matches, regardless of score

-t - Only displays matches above the given threshold

-h - Display this help message

-V - Display version number and exit

获取JSP菜刀马的Hash值,并存储到hash.txt中

[root@server120 tmp]# ssdeep -b webshell/caidao.jsp > hash.txt

[root@server120 tmp]# cat hash.txt

ssdeep,1.1--blocksize:hash:hash,filename

96:i8sShQnlyxavFlyGHXZjaQY2lpI9kPEDGgH:PsHZVHNax2lpqrD5H,"caidao.jsp"

然后使用这个值来获得相似度,我们讲菜刀马复制为xxoo.jsp,然后做比对

[root@server120 tmp]# ssdeep -bm hash.txt /tmp/webshell/xxoo.jsp

xxoo.jsp matches hash.txt:caidao.jsp (100)

可以看到相似度为100

然后我们修改一下菜刀马的密码为vinc

[root@server120 tmp]# ssdeep -bm hash.txt /tmp/webshell/xxoo.jsp

xxoo.jsp matches hash.txt:caidao.jsp (99)

发现相似度为99

所以对于一些大的webshell,如果只是修改密码或者title的话,通过相似度基本可以判断为是webshell了。

只筛选相似度50以上的文件

ssdeep -t 50 -bm hash.txt webshell/xxoo.jsp

从Git上下载Webshell的汇总,地址:

https://github.com/tennc/webshell

https://github.com/ysrc/webshell-sample

制作hash库

[root@server120 jspx]# find ./ -name "*.jspx" -exec cp {} /tmp/webshell/ \;

[root@server120 jsp]# find ./ -name "*.jsp" -exec cp {} /tmp/webshell/ \;

[root@server120 jsp]# ssdeep -b /tmp/webshell/* > hash.txt

 

0x03 pyinotify


Pyinotify是一个Python模块,用来监测文件系统的变化。 Pyinotify依赖于Linux内核的功能—inotify(内核2.6.13合并)。 inotify的是一个事件驱动的通知器,其通知接口通过三个系统调用从内核空间到用户空间。Inotify 可以监视的文件系统事件包括:

IN_ACCESS,即文件被访问

IN_MODIFY,文件被write

IN_ATTRIB,文件属性被修改,如chmod、chown、touch等

IN_CLOSE_WRITE,可写文件被close

IN_CLOSE_NOWRITE,不可写文件被close

IN_OPEN,文件被open

IN_MOVED_FROM,文件被移走,如mv

IN_MOVED_TO,文件被移来,如mv、cp

IN_CREATE,创建新文件

IN_DELETE,文件被删除,如rm

IN_DELETE_SELF,自删除,即一个可执行文件在执行时删除自己

IN_MOVE_SELF,自移动,即一个可执行文件在执行时移动自己

IN_UNMOUNT,宿主文件系统被umount

IN_CLOSE,文件被关闭,等同于(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)

IN_MOVE,文件被移动,等同于(IN_MOVED_FROM | IN_MOVED_TO)

安装pyinotify:

yum install git

git clone https://github.com/seb-m/pyinotify.git

cd pyinotify/

python setup.py install

修改系统配置

vim /etc/sysctl.conf

fs.inotify.max_user_watches=524288

sysctl -p

这里监控jsp和jspx文件CREATE操作,需要排除挂载目录。

ShellCheck.py:

#!/usr/bin/env python

# encoding:utf-8



import sys

import pyinotify

import os

import subprocess



SUFFIXES = [".jsp", ".jspx"]



def suffix_filter(filename):

    return os.path.splitext(filename)[1] not in SUFFIXES



def detect_shell(pathname):

    try:

        f = open('/root/vulnerable.txt','a')

        print "/usr/bin/ssdeep -bm /var/ossec/hash.txt " + pathname

        result = subprocess.Popen("/usr/bin/ssdeep -t 60 -bm /var/ossec/hash.txt " + pathname, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

        out = result.stdout.readlines()

        for o in out:

            if "matches" in o :

                content = "Vulnerable(Webshell): " + pathname + ":" + o.split(":")[1]

                print content

                f.write(content)

    except Exception as e:

        print "[-] %s" % (str(e))

    finally:

        f.close()



class EventHandler(pyinotify.ProcessEvent):

    def __call__(self, event):

        if not suffix_filter(event.name):

            super(EventHandler, self).__call__(event)



    def process_IN_CREATE(self, event):

        #print "Create Jsp File : %s" % (event.pathname)

        detect_shell(event.pathname)



def main(path, exclude_dir):

    wm = pyinotify.WatchManager()

    mask = pyinotify.IN_CREATE

    #mask = pyinotify.ALL_EVENTS

    wm.add_watch(path, mask, exclude_filter=pyinotify.ExcludeFilter(exclude_dir), rec=True)

    eh = EventHandler()

    notifier = pyinotify.Notifier(wm, eh)

    notifier.loop()



if __name__ == "__main__":

    path = '/web/project/'

    exclude_dir = ['/opt/shellscan'] # mount dir

    main(path, exclude_dir)

使用supervisor启动,配置文件shellcheck.conf:

[program:shellcheck]

command=/usr/bin/python /root/ShellCheck.py

autostart=true

autorestart=true

user=root

startsecs=10

startretries=3

logfile=/var/log/shellcheck.log

 

0x04 OSSEC配置


Agent端新增监控/root/vulnerable.txt文件

  <localfile>

    <log_format>syslog</log_format>

    <location>/root/vulnerable.txt</location>

  </localfile>

Server端添加规则

vim local_rules.xml

<group name="webshell">

  <rule id="120000" level="10">

      <match>Vulnerable(Webshell)</match>

      <description>Suspect webshell files.</description>

  </rule>

</group>

 

【应急响应】Linux应急记录20170117

11:10看到主机监控告警,告警内容为

cd "/usr/local/web/cdksw/general-tomcat-6.0.18/webapps/background/background/upload/";ver;echo [S];pwd;echo [E]

看起来就是上传目录被传了JSP了,受影响的是两台负载的机器,其中一台报警了。
查看报警定位到被黑的JAVA项目进程为5916。
搜索上传路径下的JSP文件,找到了三个,很明显的JSP马。

-rw-r--r-- 1 admin admin 84496 Mar 19 2015 1394517320862.jsp
-rw-r--r-- 1 admin admin 6285 Mar 19 2015 1394619430391.jsp
-rw-rw-r-- 1 admin admin 139012 Mar 19 2015 1419589329217.jsp

不过这里的时间是2015年的。可能是被修改了时间,也可能15年的时候就被搞了。
来看一下Nginx日志。

219.150.180.18 - - [11/Nov/2015:11:49:14 +0800] "HEAD /background/upload/1394619430391.jsp HTTP/1.1" 404 162 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.71 Safari/537.36" "-"

发现15年的时候有人访问过这个文件,不过返回状态码是404
然后看到今天的日志

61.178.80.107 - - [16/Jan/2017:11:07:44 +0800] "POST /background/upload/1394619430391.jsp HTTP/1.1" 200 420 
59.151.109.39 - - [16/Jan/2017:11:10:00 +0800] "POST /background/upload/1394619430391.jsp HTTP/1.1" 200 197

攻击者11:07访问的马,然后11:10告警。
下午看日志发现攻击者仍然在尝试上传。

处理方式:
1)另一台机器上同样是有这三个马,删除JSP马。
2)Nginx限制upload目录下JSP访问。
3)与开发确认后,得知该后台已经不使用了,下线处理。