解决和防止异常程序注入篡改文件

故障点:大部分地区访问我们的门户网站都跳转到同一条域名地址了

故障点分析:

1.大部分域名被劫持跳转到同一条域名

2.域名劫持只有部分地区,但都是访问量大的地区

3.授权DNS的工具dnspod刚好这个时间维护了

4.nginx配置文件被修改,是否有做地址重写

5.问开发说可能是js或者php文件被篡改,url地址被程序重写定向了

解决流程:

起初,我们以为部分地区被劫持,加上dnspod维护,以为是dnspod那里业务受到了影响,导致了跳转现象。但是从dnspod上的维护信息上看,只是解析业务暂停,之前解析好的域名业务正常使用,而我们在这个时间之前解析的域名还是被劫持,所以排除掉dnspod工具解析波动的问题。

查看nginx配置文件,都是正常的。那就只有文件被篡改这个了,站点文件很多,成千上万个,先用find加grep 跳转url地址 排查下,无果。想想也知道,入侵者怎么会傻到暴露很明显的url地址了,那不很快的排除掉了。然后我们就只有从重点文件一个个下手排查异常,配合开发,才知道url地址都要过一个防sql注入的php文件过滤规则,仔细检查这个文件。发现多了一个异常函数,大概意思就是所有访问的url地址全部跳转到这个url地址,这个地址用16进制加密了,而且还生成了一个隐藏的临时文件,这个临时文件放置了大量的IP,都是针对地区性的。注释掉这个函数,问题就解决了。这个问题虽小,但是影响很大(初入运维这行,故障问题点分析或解决可能不专业,敬请谅解)



为了防止下次再出现类似问题,本人开发了一个shell脚本用来实现入侵检测和报警(如有不完善的地方,欢迎各位读者热情交流探讨)

一:文件内容改变有以下特征

  1. 文件内容会变化,这里用生成md5sum指纹验证
  2. 文件大小会变化
  3. 文件时间会话
  4. 增加或者删除一些文件,比对每次检测后的差异文件数量

二:脚本的实现流程和思路

本文以监控Web服务器apache的站点目录/var/html/www下的所有文件是否被篡改为示例,实际环境参考自己部署的代码目录以及监测所需的文件

生成环境中,在网站发布代码之后,就可以对网站数据或者服务相关的配置建立初始的指纹库和文件数量库,这步很重要。这是最基础的指纹库,后面就没有对比的对象,那就无法进行入侵检测了。

友情提示:chattr  +i    +文件名   可以锁死文件,防止修改和删除重要文件,一般对/etc/passwd和/etc/shadow这种放置重要数据的类似文件,都可以用这个命令锁起来。如果为了更加安全,可以改名chattr这个命令为其它名字,记住修改名即可。但是要经常修改的文件用这个方法就比较麻烦了,要先解锁,才能正常修改。

1)导入测试数据

cp -a /etc/a* /var/www/html/

cp -a /etc/b* /var/www/html/

[[email protected] html]# ls /var/www/html/

abrt     aliases     alternatives  at.deny  bash_completion.d

acpi     aliases.db  anacrontab    audisp   bashrc

adjtime  alsa        asound.conf   audit    blkid

2)建立初始的文件指纹库

find /var/www/html/ -type f |xargs md5sum >/opt/zhiwen.db    #建立文件内容指纹库

[[email protected] opt]# tail -5 /opt/zhiwen.db

5238f32ba493cb2543bb2ed222a7a397  /var/www/html/bashrc

9cf17d7193572d7e684215051926b8ed  /var/www/html/aliases.db

199eaa1e43fa9139f0910bdb64fd219e  /var/www/html/audisp/plugins.d/af_unix.conf

b011b799f8cf6918611c9949bef00c19  /var/www/html/audisp/plugins.d/syslog.conf

2bba2f3012bdee732a5cfb7edf3a52a2  /var/www/html/audisp/audispd.conf

3)建立初始的文件数量库

find /var/www/html/ -type f >/opt/wenjian.db    #建立文件名和数量库

[[email protected] opt]# tail -5 /opt/wenjian.db

/var/www/html/bashrc

/var/www/html/aliases.db

/var/www/html/audisp/plugins.d/af_unix.conf

/var/www/html/audisp/plugins.d/syslog.conf

/var/www/html/audisp/audispd.conf

4)检测文件内容变化

echo ywxi >> /var/www/html/audisp/audispd.conf

export  LANG=en

[[email protected] html]# md5sum -c --quiet /opt/zhiwen.db    #检测所有文件内容是否有变化。

/var/www/html/audisp/audispd.conf: FAILED

md5sum: WARNING: 1 of 30 computed checksums did NOT match

5 ) 检测文件数量变化

echo ywxi.txt > /var/www/html/test.txt

md5sum -c --quiet /opt/zhiwen.db                                 #无法检测到文件的变化

find /var/www/html/ -type f >/opt/wenjian.db.error      #获取检测前的所有文件数量及文件名

[[email protected] html]# diff /opt/wenjian.db*                       #用diff命令去比较两个文件的差异

18a19

> /var/www/html/test.txt                                                #这个文件就是新增的

6)调整命令放入shell脚本中

[[email protected] scripts]# cat /scripts/Monitorfile.sh

#!/bin/bash

RETVAL=0                                            #状态初始化,有利于下面做

export LANG=zh_CN.UTF-8                 #调整字符集

CHECK_DIR=/var/www/html               #定义检测目录

[ -e $CHECK_DIR ]||exit 1                     #检测目录是否存在

zhiwendb="/opt/zhiwen.db"               #定义原始指纹库路径

filedb="/opt/wenjian.db"                    #定义原始文件库路径

ErrLog="/opt/error.log"                       #定义检测后的日志内容

[ -e $zhiwendb ] || exit 1                      #如果原始指纹库不存在则退出脚本

[ -e $filedb ] || exit 1                            #如果原始文件库不存在则退出脚本

#Detect file content

echo "`date` The contents of the file have been modified" >> $ErrLog    #打印检测命令,方便日志记录清晰可观

md5sum -c --quiet /opt/zhiwen.db &>>$ErrLog                                          #实际执行检测命令

RETVAL=$?                                                                                                    #收集返回值

# Detect the number and name of documents

find $CHECK_DIR  -type f   >/opt/wenjian.db.error                                 #实际执行检测命令,获取最新文件数量

echo "`date` Increase or delete the number of files " &>>$ErrLog          #打印检测命令,方便日志记录清晰可观

diff /opt/wenjian.db* &>>$ErrLog                                                           #实际执行检测命令,对比文件数量及文件名变化情况

if [ $RETVAL -ne 0 -o `diff /opt/wenjian.db*|wc -l` -ne 0 ]                      #如果返回值不为0,或者对比行数不为0,则做出判断发邮件

then

mail -s "`uname -n` $(date +%F) error"   *******@qq.com <$ErrLog   #发错误日志给邮箱

else

echo "Sites dir is ok"|mail -s "`uname -n` $(date + %F) is ok" *******@qq.com     #发正确信息给邮箱

fi

7)把脚本放在定时任务里面执行

[[email protected] opt]# crontab -l|tail -2

#monitor site dir and file change by ywxi at 2018323

*/5 * * * * /bin/sh /scripts/Monitorfile.sh >/dev/null 2>&1

8)测试脚本是否正常使用

[[email protected] scripts]# sh /scripts/Monitorfile.sh

[[email protected] opt]# cat error.log

2018年 04月 27日 星期五 17:59:53 CST The contents of the file have been modified

/var/www/html/audisp/audispd.conf: 失败

md5sum: 警告:1/30 生成的校验和不匹配

2018年 04月 27日 星期五 17:59:53 CST Increase or delete the number of files

18a19

> /var/www/html/test.txt                            #这是上面用检测命令时改过的文件和新增的文件

[[email protected] scripts]# echo ywxi.test >>/var/www/html/test2.txt

[[email protected] scripts]# echo ywxi2 >> /var/www/html/audisp/plugins.d/syslog.conf

[[email protected] scripts]# sh Monitorfile.sh

[[email protected] opt]# cat error.log

2018年 04月 27日 星期五 18:24:38 CST The contents of the file have been modified

/var/www/html/audisp/plugins.d/syslog.conf: 失败

/var/www/html/audisp/audispd.conf: 失败

md5sum: 警告:2/30 生成的校验和不匹配

2018年 04月 27日 星期五 18:24:38 CST Increase or delete the number of files

18a19

> /var/www/html/test.txt

24a26

> /var/www/html/test2.txt                      #看到这些报错信息,表示脚本执行成功

脚本总结:这个脚本是个简单实用但并没有优化过的,各位读者可以从实际生产环境出发,根据需要修改这个脚本。生产环境中有很多重要文件都需要被监控起来,如服务器的配置文件,系统命令文件,系统启动文件这些都可以监控起来,做好日志审计,让操作透明化。减少当黑锅侠的风险。

原文地址:http://blog.51cto.com/13707680/2108617

时间: 2024-10-09 21:33:48

解决和防止异常程序注入篡改文件的相关文章

JAVA之IO技术-将java程序的异常信息保存在文件中

package ioTest.io2; import java.io.FileNotFoundException; import java.io.PrintStream; import java.util.Properties; /* * 将应用程序的异常信息输出到指定的log文件中 */ public class ExceptionToFile { public static void main(String[] args) throws FileNotFoundException { int

如何解决:新建Android程序的时候发生了找不到 \android-sdk-windows\tools\lib\proguard.cfg文件 的错误

问题概述: 在新建Android程序的时候出现以下错误: 找不到 \android-sdk-windows\tools\lib\proguard.cfg文件 原因: SDK不完整. 解决方法: 方法一 可在 \android-sdk-windows\tools\lib\目录下新建一个proguard.cfg文件 然后添下以下内容: proguard.cfg -optimizationpasses 5-dontusemixedcaseclassnames-dontskipnonpubliclibr

安装程序无法复制文件 convlog.exe的解决方法

在安装的时候出现一个错误提示“安装程序无法复制文件CONVLOG.EX_”,上网找了很多资料,都说是因为版本问题,考虑到自己的服务器安装的是2003 SP1,后来打了补丁到SP2的,也就认为是版本问题,结果下了很多SP2版本也不行,再到网上搜索.有个说法是在运行-中输入“esentutl /p %windir%/security/database/secedit.sdb ” 就可以了,试了一下,还真管用,虽然不知道什么原理,但还是把它记录下来吧,以后用! C:\Documents and Set

[转]MSI安装程序中的文件替换

原文链接:http://teach.hanzify.org/article/652-1233562028.html 前言 最近有汉化朋友问起如何不重新制作MSI文件,而直接用汉化好的文件替换MSI安装程序中的文件.为此,将本人的实践经验作个总结,供各位汉化人参考.有错误的地方烦请指正.※说明:目前可以用于MSI编辑的软件很多,但是有些软件在保存时会在MSI文件中写入一些自己的表或内容,有些会另外嵌入一个CAB文件,使得MSI文件增大.而这里提供的方法保证不会写入任何不必要的内容和文件.※关键点:

Spring MVC +MyBatis +MySQL 简单的登录查询 Demo 解决了mybatis异常

忙活了大半天,饭也没顾得上吃,哎许久不动手,一动手就出事,下面请看今天的重头戏,额吃个饭回来再发了! 1.整体结构 2.准备工作 数据库: --Mysql 5.6 创建数据库 wolf CREATE DATABASE wolf; 创建用户表 user create table user( id int  AUTO_INCREMENT  primary key, name varchar(25) not null, pwd varchar(20) not null, create_time dat

32位程序注入64位DLL到64位进程

向其它进程注入DLL通常的做法是通过调用CreateRemoteThread这个API在目标进程内创建一个远程线程.用这个线程来调用LoadLibraryA或LoadLibraryW(下文统称LoadLibrary)以实现让目标进程载入指定的DLL文件. 使用CreateRemoteThread创建一个远程线程须要传入一个线程过程函数的地址,而且这个函数地址是须要在目标进程中有效的. 因为LoadLibrary是kernel32.dll的导出函数.所以对于执行在同一个系统上的同为32位的进程或同

atitit. web 在线文件管理器最佳实践(1)--- elFinder 的使用流程解决之道 。打开浏览服务器文件夹java .net php

atitit. web 在线文件管理器最佳实践(1)--- elFinder 的使用流程解决之道 .打开浏览服务器文件夹java .net php 1. 环境:::项目java web,需要打开浏览服务器文件夹挑选文件,在返回... 1 2. 在线文件管理器要实现的基本的功能::指定开始目录,指定getfile回调 1 3. 组件选型:: elFinder (3M) ,,php web ftp 1 4. elFinder 的概念 1 5. elFinder  1.x 的使用过程 2 6. elF

mysql报错解决MySQL Binlog(异常)——mysqlbinlog: unknown variable &#39;default-character-set=utf8&#39;

在使用mysqlbinlog分析日志时,报错: /usr/local/mysql/bin/mysqlbinlog: unknown variable 'default-character-set=utf8' 原因分析: 产生这个问题的原因是因为我在my.cnf中的client选项组中添加了:  default-character-set=utf8 这个是mysqlbinlog的一个bug 解决方法: 使用mysqlbinlog工具查看二进制日志时会重新读取的mysql的配置文件my.cnf,而不

解决安卓TextView异常换行,参差不齐等问题

Pull 解析器简介 Pull 解析器的运行方式与 SAX 解析器相似.它提供了类似的事件,如: 开始元素和结束元素事件,使用xmlPullParser.next() 可以进入下一个元素并触发相应事件.跟 SAX 不同的 是, Pull 解析器产生的事件是一个数字,而非方法,因此可以使用一个 switch 对事件进行处理.当元素开始解析时,调用 parser.nextText() 方法可以获取下一个 Text 类型节点的值. Pull解析器的源码及文档下载网址:http://www.xmlpul