前言
分享一个文件监控的小脚本
用途
以前在打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参数,分几个脚本对重要目录进行监控。但这样又有悖我的精简性原则。。。。。
先把问题写下来,希望以后自己技术提升,能有所解决吧!