前言

分享一个文件监控的小脚本

用途

以前在打AWD的时候,需要一个好一点的文件监控脚本,但网上找的都不是很好用,于是自己写了一个小脚本

代码

#!/usr/bin/python3
# *_* coding: utf-8 *_*

import os
import shutil
import time
from pyinotify import WatchManager, Notifier, ProcessEvent, IN_DELETE, IN_CREATE, IN_MODIFY, IN_OPEN, IN_ACCESS, IN_ATTRIB

class Events(ProcessEvent):

    def process_IN_CREATE(self, event):
        if(event.dir != True):
            print("["+(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))+"]",end=' ')
            print("[Maskname]: Create | [Name]: "+event.name+" | [Path]: "+event.path+" | [Pathname]: "+event.pathname)
            if os.path.splitext(event.name)[-1] == ".php":
                os.unlink(event.pathname)
                print("Successful deal the php file!")

    def process_IN_DELETE(self, event):
        if(event.dir != True):
            print("["+(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))+"]",end=' ')
            print("[Maskname]: Delete | [Name]: "+event.name+" | [Path]: "+event.path+" | [Pathname]: "+event.pathname)
            if os.path.splitext(event.name)[-1] != ".php":
                try:
                    shutil.copyfile((pathbak + event.name), (event.path+"/"+event.name))
                    print("Successful restore file!")
                except:
                    pass

    def process_IN_MODIFY(self, event):
        if(event.dir != True):
            print("["+(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))+"]",end=' ')
            print("[Maskname]: Change | [Name]: "+event.name+" | [Path]: "+event.path+" | [Pathname]: "+event.pathname)

    def process_IN_ACCESS(self, event):
        if(event.dir != True):
            print("["+(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))+"]",end=' ')
            print("[Maskname]: Access | [Name]: "+event.name+" | [Path]: "+event.path+" | [Pathname]: "+event.pathname)
            if event.name in importence:
                print("Notice!!! Importent file was accessed!!!")

def myinotify(path):

    wm = WatchManager()
    mask = IN_DELETE | IN_CREATE | IN_MODIFY | IN_OPEN | IN_ACCESS | IN_ATTRIB
    wm.add_watch(path, mask, auto_add=True, rec=False)
    myevent = Events()
    notifier = Notifier(wm, myevent)
    notifier.loop()

if __name__ == "__main__":
    path = ['/var/www/html/q/']
    pathbak = '/var/www/html/q.bak/'
    importence = ['flag.php','flag']
    myinotify(path)

功能介绍

这个小脚本是对pyinotify模块的一次升级改造,主要分为以下功能

  • 增:现实情况下,文件增添一般是攻击者通过web漏洞写了木马。在此处,脚本对所有的增添文件进行监控,并自行删除所有新增的php文件
  • 删:碰到删除,在我的映像中,好像就是删除install.lock文件对web服务进行重装以达到入侵目的。此脚本可以监控所有的删除文件,并在之前设置好的备份目录里恢复所有非php文件。
  • 查:一般情况就是入侵者通过web漏洞对文件进行读取。一般来说,读取的都是重要的文件,如:config.php、database.php等等,也有可能是直接读取放在web目录下的flag。脚本在这里可以监控所有的文件读取记录,并设置重要目录importence关键词,若读取到关键词里的文件,即可发出重要提示,也可以避免文件访问过多漏过重要文件被读取的信息。
  • 改:针对所有的文件修改信息发出提醒

本地测试效果图

本地测试命令

效果图

可以看见install.lock文件并未被删除

BUG

本来我的设想中,会有文件修改之后会自动恢复的这一功能,但是在实际情况下,脚本中的增添删除功能和修改恢复功能起了冲突。并且在增添监控功能中,我的设想仅删除写入的木马。但是在实际情况下,web服务会创建临时session文件,脚本也会对进行误伤。同时删除监控和增添监控在功能上存在相悖的地方。
这是我在这个脚本上遇到的小问题,目前来说,我的解决方法就只有关闭rec参数,分几个脚本对重要目录进行监控。但这样又有悖我的精简性原则。。。。。
先把问题写下来,希望以后自己技术提升,能有所解决吧!


工具开发      python

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!

thinkphp5.0-1远程代码执行漏洞分析 上一篇
反序列化小记 下一篇