应急响应作为安全工作中最贴近用户实际需求的一环,对其的了解是每一位安全服务工作者应该具备的基本素养。
本文将从应急响应的定义,常用的理论模型、linux和windows操作系统下一般的应急响应思路几个方面,为大家总结一下在应急响应中需要具备的一些基础理论和基本操作方法。
网络安全是指网络系统的硬件、软件以及其系统中的数据受到保护、不因偶然的或者恶意的原因遭到破坏、更改、泄露,保证系统连续可靠、正常运行、网络服务不中断。
网络安全应急响应就是指针对已经发生或者可能发生的安全事件进行监控分析、协调、处理保护资产安全的活动。主要是为了对网络安全有所准备,以便在遇到突发网络安全事件时做到有序应对、妥善处理。
应急响应的主要活动应当包含以下方面:
这里就罗列书中的比较浅显易懂的自适应安全架构模型出来,与之相对应的还包括网络滑动标尺模型、网络杀伤和反杀伤链模型、钻石模型等。请移步原文进行查看。 原文来自:《应急响应-网络安全的预防、发现、处置和恢复》
自适应安全架构是Gartner在2014年提出的,面向未来下一代安全架构。自适应安全架构模型从防御、检测、响应和预测四个维度,强调安全防护是一个持续处理的、循环的过程、细粒度、多角度、持续化的对安全威胁进行了实时动态分析,自动适应不断变化的网络和威胁环境,并不断优化自身的防御机制。
该模型的提出是为了解决当前机构、企业的防护功能难以应对高级定向攻击的问题。首先,机构企业系统遭受到持续攻击时,缺乏持续的防御力;其次,传统的安全框架在面对新的威胁和攻击时已经显得力不从心;再次,应急响应的方式已经不再是面向持续高级攻击的正确思维模式(我们不可能一直持续在高戒备的应急响应状态去抵御持续性的威胁)。因此,gartner提出了如下图所示的自适应安全架构模型来应对高级定向攻击:
集防御、检测、响应和预测于一体的自适应安全架构,以智能,集成和联动的方式应对各类攻击,而非各自为战,毫无互动。尤其对于高级威胁,自适应系统需要持续完善保护功能,下面对自适应安全架构的四大能力进行简要的说明:
- 防御能力:通过技术、产品和服务等方式来防御攻击。目标是通过减少被攻击面来提升攻击门槛,并在业务系统受到影响前拦截攻击
- 检测能力:假设机构,企业自身已经处在被攻击状态中,用来发现那些逃过防御网络的攻击。目标是降低威胁造成的停摆事件以及其他潜在的损失。
- 响应能力:用于高效调查和补救被检测分析功能(或者外部服务)查出的事务,目的是提供入侵认证和攻击溯源。并提出新的防御手段来避免未来事故的发生
- 预测能力:通过防御、检测、响应的结果不断地优化基线系统,逐渐精准预测未知的、新型的攻击、主动锁定对现有的系统具有威胁的新型攻击,并对漏洞划定优先级和定位,该情报将反馈到防御和检测功能,从而构成整个处理流程的闭环。
深入理解并合理应用自适应安全架构模型,将有助于机构,企业构建新型网络安全防御体系,提升网络安全主动防御力,最终达到安全的可管、可控、可视、可调度、可持续。
PDCERF方法最早于1987年提出,该方法将应急响应的流程分成准备阶段、检测阶段、抑制阶段、根除阶段、恢复阶段、总结阶段等六个阶段的工作。并根据应急响应的总体策略对每个阶段定义适当的目的,明确应急响应顺序和过程。
下图就是六个过程的PDCERF模型:
此阶段以预防为主,主要工作涉及识别机构、企业的安全风险、建立安全政策、建立协作体系和应急响应制度。按照安全策略配置安全设备和软件,为应急响应与恢复准备主机。
通过网络安全措施,进行一些准备工作、例如扫描、风险分析、打补丁。如果有条件且得到许可,可以建立监控设施,建立数据汇总分析的体系,制定能够实现应急响应目标的策略和流程,建立信息沟通渠道,建立能够集合起来处理突发事件的体系。
检测阶段主要检测事件是否已经发生还是正在进行中,以及事件产生的原因和性质。确定事件的性质和影响的严重程度,预计采用什么样的专用资源来修复。选择检测工具,分析异常现象,提高系统或网络行为的监控级别,估计安全事件的范围。通过汇总,确定是否发生了全网的大规模事件,确定应急等级,决定启动哪一级应急方案。
一般的事故现象包括:
- 账号盗用
- 骚扰性的垃圾信息
- 业务服务功能失效
- 业务系统内容被明显篡改
- 系统崩溃、资源不足
抑制阶段的主要任务是限制攻击/破坏波及的范围,同时也是在降低潜在的损失。所有的抑制活动都是建立在能正确检测事件的基础上的,抑制互动必须结合检测阶段发现的安全事件的现象,性质,范围等属性,制定并实施正确的抑制策略。
抑制策略通常包含以下内容:
- 完全关闭所有系统
- 从网络上断开主机或断开部分网络
- 修改所有的防火墙和路由器的过滤规则
- 封锁或删除被攻击的登陆账号
- 加强对系统或网络行为的监控
- 设置诱饵服务器进一步获取事件信息
- 关闭受攻击的系统或其他相关系统的部分服务
根除阶段的主要任务主要是通过事件的分析找出根源并且彻底根除,以避免攻击和再次使用相同的手段攻击系统,引发安全事件。加强宣传,公布危害性和解决办法,呼吁用户解决终端问题。加强检测工作,发现和清理行业与重点部门问题。
恢复阶段的主要任务主要是把破坏的信息彻底还原到正常运作状态。确定使系统恢复正常的需求和时间表,从可信的备份介质中恢复用户数据。打开系统和应用服务,恢复系统网络连接,验证恢复系统,观察其他的扫描,探测可能标识入侵者再次入侵的信号。一般来说,想要成功的恢复被破坏的系统,需要有干净的备份系统,编制并维护系统恢复的操作手册,而且在系统重装后需要对系统进行全面的安全加固。
总结阶段的主要任务是回顾并整合应急响应过程的相关信息,进行事后分析总结和修订安全计划、政策、程序、并进行训练,以防止入侵再次发生。基于入侵的严重性和影响,确定是否进行新的风险分析,给系统和网络资产制作一个新的目录清单。这一阶段的工作对于准备阶段工作的开展起到重要的支持作用。
总结阶段的工作主要包括以下这3个方面的内容:
- 形成事件处理的最终报告
- 检查应急响应过程中存在的问题,重新评估和修改事件影响过程
- 评估应急响应人员相互沟通在事件处理上存在的缺陷以促进事后进行更有针对性的培训
由于准备阶段涉及的东西大多是与安全基线有关的一些繁杂的基础操作,故在本文不予列出。我们的应急响应直接从事件发生开始。假设现在已经接到了应急响应的需求。定位到了某一台或者某几台服务器上时,我们究竟应该怎么办。如何快速定位恶意程序或者webshell,以及还原攻击者的攻击路径成了一个关键的课题。
常见的应急响应事件分类:
Web 入侵:网页挂马、主页篡改、Webshell
系统入侵:病毒木马、勒索软件、远控后门
网络攻击:DDOS 攻击、DNS 劫持、ARP 欺骗
黑客在渗透完毕后一定会想办法完成自己的权限维持,当然最低端的维权方案就是创建一个后门账号。来来来,几条命令抓住低段位黑客小尾巴。
#1、用户信息文件 /etc/passwd
root:x:0:0:root:/root:/bin/bash
account:password:UID:GID:GECOS:directory:shell
#用户名:密码:用户ID:组ID:用户说明:家目录:登陆之后的 shell
#注意:无密码只允许本机登陆,远程不允许登陆
#2、影子文件 /etc/shadow
root:$6$oGs1PqhL2p3ZetrE$X7o7bzoouHQVSEmSgsYN5UD4.kMHx6qgbTqwNVC5oOAouXvcjQSt.Ft7ql1WpkopY0UV9ajBwUt1DpYxTCVvI/:16809:0:99999:7:::
#用户名:加密密码:密码最后一次修改日期:两次密码的修改时间间隔:密码有效期:密码
#修改到期到的警告天数:密码过期之后的宽限天数:账号失效时间:保留
一些常用的命令:
#1.who --- 查看当前登录用户(tty 本地登陆 pts 远程登录)
[root@blackstone ~]# who
batman tty1 2023-01-10 03:36
batman pts/1 2023-03-22 19:24 (192.168.2.1)
#2.w --- 查看系统信息,想知道某一时刻用户的行为
[root@blackstone ~]# w
20:51:23 up 6 days, 7:22, 2 users, load average: 0.01, 0.02, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
batman tty1 10Jan23 70days 1.48s 0.01s login -- batman
batman pts/1 192.168.2.1 19:24 3.00s 0.02s 0.04s sshd: batman [priv]
#3.uptime --- 查看登陆多久、多少用户,负载状态
[root@blackstone ~]# uptime
20:53:23 up 6 days, 7:24, 2 users, load average: 0.00, 0.01, 0.05
排查思路:
#1.查看当前PID为0的特权用户
[root@blackstone ~]# awk -F: '$3==0{print $1}' /etc/passwd
root
#2.查询可以远程登录的帐号信息
[root@blackstone ~]# awk '/\$1|\$6/{print $1}' /etc/shadow
#3.除root帐号外,其他帐号是否存在sudo权限。如非管理需要,普通帐号应删除sudo权限
[root@blackstone ~]# more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"
#4.禁用或删除多余及可疑的帐号
usermod -L user 禁用帐号,帐号无法登录,/etc/shadow 第二栏为 ! 开头
userdel user 删除 user 用户
userdel -r user 将删除 user 用户,并且将 /home 目录下的 user 目录一并删除
基本用法:通过 .bash_history 文件查看帐号执行过的系统命令
#1、root 用户的历史命令
histroy
#2、打开 /home 各帐号目录下的 .bash_history,查看普通帐号执行的历史命令。为历史的命令增加登录的 IP 地址、执行命令时间等信息:
#2.1 保存1万条命令
sed -i 's/^HISTSIZE=1000/HISTSIZE=10000/g' /etc/profile
#2.2 在/etc/profile的文件尾部添加如下行数配置信息:
######jiagu history xianshi#########
USER_IP=`who -u am i 2>/dev/null | awk '{print $NF}' | sed -e 's/[()]//g'`
if [ "$USER_IP" = "" ]
then
USER_IP=`hostname`
fi
export HISTTIMEFORMAT="%F %T $USER_IP `whoami` "
shopt -s histappend
export PROMPT_COMMAND="history -a"
######### jiagu history xianshi ##########
#2.3 让配置生效
source /etc/profile
#生成效果:
1 2018-07-10 19:45:39 192.168.204.1 root source /etc/profile
#3、历史操作命令的清除。但此命令并不会清除保存在文件中的记录,因此需要手动删除 .bash_profile 文件中的记录。
history -c
入侵排查:
#进入用户目录下,导出历史命令。
cat .bash_history >> history.txt
通过对历史命令的追溯复原我们可以推断出恶意用户在我们的服务器里面做了什么但是,很多入侵者到这里都会删除掉所有的历史命令,并且使用history -c
进行历史命令的清除,但是不排除一些傻蛋,不清除自己的痕迹或者在清除痕迹之前被我们踢下线。这样一来我们还是可以获得历史命令,对其进行分析。
#1.查看已经达到连接状态的连接信息,查找恶意进程的蛛丝马迹(连接端口为连续的数字是很可疑)
[root@blackstone ~]# netstat -antp | grep EST
tcp 0 0 127.0.0.1:45268 127.0.0.1:9000 ESTABLISHED 84199/php-fpm: pool
tcp 0 0 127.0.0.1:45046 127.0.0.1:9000 ESTABLISHED 84172/php-fpm: pool
tcp 0 0 127.0.0.1:9000 127.0.0.1:45000 ESTABLISHED 84169/php-fpm: pool
#2.查看下 pid 所对应的进程文件路径($PID 为对应的 pid 号)
ls -l /proc/$PID/exe
file /proc/$PID/exe
#3.检查异常进程
ps aux | grep pid
#4.杀掉进程 慎用
kill -9 pid
系统运行级别示意表:
运行级别 | 含义 |
---|---|
0 | 关机 |
1 | 单用户模式,可以想象为windows的安全模式,主要用于系统修复 |
2 | 不完全的命令行模式,不含NFS服务 |
3 | 完全的命令行模式,就是标准字符界面 |
4 | 系统保留 |
5 | 图形模式 |
6 | 重启动 |
常用命令:
#1.查看运行级别命令
runlevel
#2.查看系统默认允许级别
[root@blackstone ~]# cat /etc/inittab
#3.开机启动配置文件
/etc/rc.local
/etc/rc.d/rc[0~6].d
#4.例子:当我们需要开机启动自己的脚本时,只需要将可执行脚本丢在 /etc/init.d 目录下,然后在 /etc/rc.d/rc*.d 文件中建立软链接即可。(注:此中的 * 代表 0,1,2,3,4,5,6 这七个等级)
入侵排查:
more /etc/rc.local
tree /etc/rc.d/
正常状态下可能存在的文件:
[root@blackstone ~]# tree /etc/rc.d/
/etc/rc.d/
├── init.d
│ ├── functions
│ ├── keepalived
│ ├── netconsole
│ ├── network
│ └── README
├── rc0.d
│ ├── K50netconsole -> ../init.d/netconsole
│ └── K90network -> ../init.d/network
├── rc1.d
│ ├── K50netconsole -> ../init.d/netconsole
│ └── K90network -> ../init.d/network
├── rc2.d
│ ├── K50netconsole -> ../init.d/netconsole
│ └── S10network -> ../init.d/network
├── rc3.d
│ ├── K50netconsole -> ../init.d/netconsole
│ └── S10network -> ../init.d/network
├── rc4.d
│ ├── K50netconsole -> ../init.d/netconsole
│ └── S10network -> ../init.d/network
├── rc5.d
│ ├── K50netconsole -> ../init.d/netconsole
│ └── S10network -> ../init.d/network
├── rc6.d
│ ├── K50netconsole -> ../init.d/netconsole
│ └── K90network -> ../init.d/network
└── rc.local
基本使用:
1.利用crontab创建计划任务(前提是这个服务已经被我们运行起来了)
crontab -l 列出某个用户cron服务的详细内容
Tips:默认编写的crontab文件会保存在 (/var/spool/cron/用户名 例如: /var/spool/cron/root
crontab -r 删除每个用户cront任务(谨慎:删除所有的计划任务)
crontab -e 使用编辑器编辑当前的crontab文件
如:*/1 * * * * echo "hello world" >> /tmp/test.txt 每分钟写入文件
2.利用 anacron 命令实现异步定时任务调度
#每天运行 /home/backup.sh 脚本:
vi /etc/anacrontab
@daily 10 example.daily /bin/bash /home/backup.sh
#当机器在 backup.sh 期望被运行时是关机的,anacron会在机器开机十分钟之后运行它,而不用再等待 7天。
入侵排查
/var/spool/cron/*
/etc/crontab
/etc/cron.d/*
/etc/cron.daily/*
/etc/cron.hourly/*
/etc/cron.monthly/*
/etc/cron.weekly/
/etc/anacrontab
/var/spool/anacron/*
#小技巧 使用more查看目录下的所有文件
more /etc/cron.daily/*
服务自启动
第一种修改方法:
chkconfig [--level 运行级别] [独立服务名] [on|off]
chkconfig –level 2345 httpd on 开启自启动
chkconfig httpd on (默认level是2345)
第二种修改方法:
修改 /etc/re.d/rc.local 文件
加入 /etc/init.d/httpd start
第三种修改方法:
使用 ntsysv 命令管理自启动,可以管理独立服务和 xinetd 服务。
入侵排查
#1.查询已经安装的服务
#1.1RPM 包安装的服务
#1.1.1 基于chkconfig的检测方法
chkconfig --list 查看服务自启动状态,可以看到所有的RPM包安装的服务
ps aux | grep crond 查看当前服务
##系统在3与5级别下的启动项
###中文环境
chkconfig --list | grep "3:启用\|5:启用"
###英文环境
chkconfig --list | grep "3:on\|5:on"
#1.1.2 基于systemctl 的检测方法
[root@blackstone ~]# systemctl list-unit-files | grep enable
#1.2 源码编译安装的服务
查看服务安装位置 ,一般是在/user/local/
service httpd start
搜索/etc/rc.d/init.d/ 查看是否存在
日志默认存放位置:/var/log/
查看日志配置情况:more /etc/rsyslog.conf
日志文件 | 说明 |
---|---|
/var/log/cron | 记录了系统定时任务相关的日志 |
/var/log/cups | 记录打印信息的日志 |
/var/log/dmesg | 记录了系统在开机时内核自检的信息,也可以使用dmesg命令直接查看内核自检信息 |
/var/log/mailog | 记录邮件信息 |
/var/log/message | 记录系统重要信息的日志。这个日志文件中会记录Linux系统的绝大多数重要信息,如果系统出现问题时,首先要检查的就应该是这个日志文件 |
/var/log/btmp | 记录错误登录日志,这个文件是二进制文件,不能直接vi查看,而要使用lastb命令查看 |
/var/log/lastlog | 记录系统中所有用户最后一次登录时间的日志,这个文件是二进制文件,不能直接vi,而要使用lastlog命令查看 |
/var/log/wtmp | 永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。同样这个文件也是一个二进制文件,不能直接vi,而需要使用last命令来查看 |
/var/log/utmp | 记录当前已经登录的用户信息,这个文件会随着用户的登录和注销不断变化,只记录当前登录用户的信息。同样这个文件不能直接vi,而要使用w,who,users等命令来查询 |
/var/log/secure | 记录验证和授权方面的信息,只要涉及账号和密码的程序都会记录,比如SSH登录,su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中 |
日志分析技巧(这部分后面会专门进行定向学习):
#1.定位有多少IP在爆破主机的root帐号:
grep "Failed password for root" /var/log/secure | awk '{print $11}' | uniq -c | sort -nr | more
#1.1 定位有哪些IP在爆破:
grep "Failed password" /var/log/secure|grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"|uniq -c
#1.2 爆破用户名字典是什么?
grep "Failed password" /var/log/secure| awk '{print $9}' | sort -nr | uniq -c
#2. 登录成功的IP有哪些:
grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
#2.1 登录成功的日期、用户名、IP:
grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}'
#3. 增加一个用户kali日志:
Jul 10 00:12:15 localhost useradd[2382]: new group: name=kali, GID=1001
Jul 10 00:12:15 localhost useradd[2382]: new user: name=kali, UID=1001, GID=1001, home=/home/kali
, shell=/bin/bash
Jul 10 00:12:58 localhost passwd: pam_unix(passwd:chauthtok): password changed for kali
#grep "useradd" /var/log/secure
#4. 删除用户kali日志:
Jul 10 00:14:17 localhost userdel[2393]: delete user 'kali'
Jul 10 00:14:17 localhost userdel[2393]: removed group 'kali' owned by 'kali'
Jul 10 00:14:17 localhost userdel[2393]: removed shadow group 'kali' owned by 'kali'
# grep "userdel" /var/log/secure
#5. su切换用户:
Jul 10 00:38:13 localhost su: pam_unix(su-l:session): session opened for user good by root(uid=0)
#5.1 sudo授权执行:
sudo -l
Jul 10 00:43:09 localhost sudo: good : TTY=pts/4 ; PWD=/home/good ; USER=root ; COMMAND=/sbin/shutdown -r now
1、查看敏感目录,如/tmp目录下的文件,同时注意隐藏文件夹,以“…”为名的文件夹具有隐藏属性
2、得到发现WEBSHELL、远控木马的创建时间,如何找出同一时间范围内创建的文件?
可以使用find命令来查找,如 find /opt -name “*” -atime 1 -type f 找出 /opt 下一天前访问过的文件
其实针对于异常文件更加有效的处理方案就是使用各类安全扫描工具进行扫描,
Rootkit是一种通过修改操作系统内核或更改指令执行路径,来隐藏系统对象(包括文件、进程、驱动、注册表项、开放端口和网络连接等),以逃避或者规避标准系统机制的程序。Rootkit源于UNIX系统,Root指拥有所有特权的管理员,Kit是管理工具,由此可以认为Rootkit就是而已获取管理员特权的工具,利用其越权。Rootkit提供服务而非实现服务,3种服务:隐遁;侦察;控制。
利用rootkit可以轻松的实现针对文件或者内核的修改替换,做到留下后门这样的操作。为了应对这样的攻击手段,我们也有相应的反制措施,即对应的查杀工具来辅助我们进行操作。
#1.chkrootkit --- 网址:http://www.chkrootkit.org
使用方法:
wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
tar zxvf chkrootkit.tar.gz
cd chkrootkit-0.52
make sense
#编译完成没有报错的话执行检查
./chkrootkit
#2.rkhunter --- 网址:http://rkhunter.sourceforge.net
使用方法:
Wget https://nchc.dl.sourceforge.net/project/rkhunter/rkhunter/1.4.6/rkhunter-1.4.6.tar.gz
tar -zxvf rkhunter-1.4.6.tar.gz
cd rkhunter-1.4.6
./installer.sh --install
rkhunter -c
RKHunter是专业检测系统是否感染rootkit的工具,通过执行一系列脚本来确定服务器是否感染rootkit。RKHunter可以做到:
MD5校验,检测文件是否有改动
检测rootkit使用的二进制和系统工具文件
检测特洛伊木马程序特征码
检测常用程序的文件属性是否正常
检测系统相关测试
检测隐藏文件
检测可以的核心模块LKM
检测系统已启动的监听端口
运行截图:
生成的日志会以日志的形式记录到我们的/var/log/rkhunter.log
里面去。红色的位置需要我们注意。
Clamav
网址:http://www.clamav.net/download.html
1.yum安装
#安装
yum install -y clamav
#更新病毒库
freshclam
#扫描方法
clamscan -r /etc --max-dir-recursion=5 -l /root/etcclamav.log
clamscan -r /bin --max-dir-recursion=5 -l /root/binclamav.log
clamscan -r /usr --max-dir-recursion=5 -l /root/usrclamav.log
#扫描并杀毒
clamscan -r --remove /usr/bin/bsd-port
clamscan -r --remove /usr/bin/
clamscan -r --remove /usr/local/zabbix/sbin
#查看日志发现
cat /root/usrclamav.log |grep FOUND
2.源码编译
#1、安装 zlib:
wget http://nchc.dl.sourceforge.net/project/libpng/zlib/1.2.7/zlib-1.2.7.tar.gz
tar -zxvf zlib-1.2.7.tar.gz
cd zlib-1.2.7
#安装一下gcc编译环境: yum install gcc
CFLAGS="-O3 -fPIC" ./configure --prefix= /usr/local/zlib/
make && make install
#2、添加用户组 clamav 和组成员 clamav:
groupadd clamav
useradd -g clamav -s /bin/false -c "Clam AntiVirus" clamav
#3、安装 Clamav
tar –zxvf clamav-0.97.6.tar.gz
cd clamav-0.97.6
./configure --prefix=/opt/clamav --disable-clamav -with-zlib=/usr/local/zlib
make
make install
#4、配置 Clamav
mkdir /opt/clamav/logs
mkdir /opt/clamav/updata
touch /opt/clamav/logs/freshclam.log
touch /opt/clamav/logs/clamd.log
cd /opt/clamav/logs
chown clamav:clamav clamd.log
chown clamav:clamav freshclam.log
#5、ClamAV 使用:
/opt/clamav/bin/freshclam 升级病毒库
./clamscan –h 查看相应的帮助信息
./clamscan -r /home 扫描所有用户的主目
./clamscan -r --bell -i /bin 扫描bin目录并且显示有问题的文件的扫描结果
涉及到病毒查杀的知识,我们应确定病毒文件的位置与行为后取得授权的情况下进行病毒查杀,慎用查杀工具,以防止引发误杀正常文件。
系统完整性可以通过rpm自带的-Va来校验检查所有的rpm软件包,查看哪些命令是否被替换了:
./rpm -Va > rpm.log
如果一切均校验正常将不会产生任何输出,如果有不一致的地方,就会显示出来,输出格式是8位长字符串,每个字符都用以表示文件与RPM数据库中一种属性的比较结果 ,如果是. (点) 则表示测试通过。
验证内容中的8个信息的具体内容如下:
S 文件大小是否改变
M 文件的类型或文件的权限(rwx)是否被改变
5 文件MD5校验是否改变(可以看成文件内容是否改变)
D 设备中,从代码是否改变
L 文件路径是否改变
U 文件的属主(所有者)是否改变
G 文件的属组是否改变
T 文件的修改时间是否改变
如果命令被替换了,就需要我们将其还原回来。当然也可以直接使用yum等命令重新下一个。
应用示例:
#1.查询 ls 命令属于哪一个包
[root@blackstone ~]# rpm -qf /bin/ls
coreutils-8.22-18.el7.x86_64
#2. 先把 ls 转移到 tmp 目录下,造成 ls 命令丢失的假象
[root@blackstone ~]# mv /bin/ls /tmp
#3.利用rpm自带的包检测功能进行检测 --- 很快就检测出了ls命令的缺失
[root@blackstone ~]# rpm -Va > rpm.log
[root@blackstone ~]# cat rpm.log
S.5....T. c /etc/profile
missing /usr/bin/ls
........P /usr/bin/python2.7
S.5....T. c /etc/my.cnf
.......T. c /etc/nginx/nginx.conf
.......T. c /etc/httpd/conf.modules.d/00-proxy.conf
S.5....T. c /etc/httpd/conf/httpd.conf
S.5....T. c /etc/sslh.cfg
.......T. c /etc/sysconfig/sslh
S.5....T. /usr/sbin/sslh
.......T. c /etc/selinux/targeted/contexts/customizable_types
S.5....T. c /etc/selinux/targeted/contexts/files/file_contexts.subs
....L.... c /etc/pam.d/fingerprint-auth
....L.... c /etc/pam.d/password-auth
....L.... c /etc/pam.d/postlogin
....L.... c /etc/pam.d/smartcard-auth
....L.... c /etc/pam.d/system-auth
S.5....T. c /etc/redis.conf
.M....... /usr/bin/find
SM5....T. c /etc/rc.d/rc.local
missing /var/run/wpa_supplicant
S.5....T. c /etc/php.ini
S.5....T. c /etc/sysconfig/authconfig
.......T. c /etc/httpd/conf.d/ssl.conf
.......T. c /etc/php-fpm.d/www.conf
#4.移除ls并重新安装,进行命令的修复
[root@blackstone ~]# yum remove ls
Loaded plugins: fastestmirror
No Match for argument: ls
No Packages marked for removal
[root@blackstone ~]# yum install ls
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirror.lzu.edu.cn
* epel: mirrors.tuna.tsinghua.edu.cn
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
No package ls available.
Error: Nothing to do
#5.测试修复情况
[root@blackstone ~]# ll
total 74212
-rw-r--r-- 1 root root 0 Feb 11 16:23 11
-rw-r--r-- 1 root root 0 Feb 11 16:21 16:21:01
-rw-r--r-- 1 root root 0 Feb 11 16:22 16:22:01
-rw-r--r-- 1 root root 0 Feb 11 16:23 16:23:01
Github 项目地址:
https://github.com/grayddq/GScan
https://github.com/ppabc/security_check
https://github.com/T0xst/linux
尽信书不如无书,工具只是辅助,别太过于依赖,关键在于你如何解决问题的思路。
通常我们有使用软件协助我们查杀webshell。但是随着一些木马webshell
的变形,黑客更加倾向于在网站庞大的目录下某一个小文件后面插入对应的webshell
,不但经过变形还很难定向查找出来。那么,我们难道就只能采用传统的webshell
查杀方式-用特征码一个个对照进行查找嘛?
试想一下,如果你的网站被入侵,攻击者留下隐藏的后门,你真的都可以找出来吗?面对一个大中型的应用系统,数以百万级的代码行,是不可能做到每个文件每段代码进行手工检查的。
即使是一款拥有 99.9% 的Webshell
检出率的检测引擎,依然可能存在 Webshell 绕过的情况。另外,像暗链、网页劫持、页面跳转等常见的黑帽 SEO 手法,也很难通过手动检测或工具检测全部识别出来。
最好的方式就是做文件完整性验证
。通过与原始代码对比,可以快速发现文件是否被篡改以及被篡改的位置。当然,第一个前提是,你所在的团队已具备代码版本管理的能力,如果你是个人站长,相信你已经备份了原始代码。
在 Linux 中,我们经常使用 diff 命令来比较两个文本文件的差异。同样,我们可以通过一行命令快速找出两个项目文件的差异。
diff命令可以比较文本文件的差异,而使用find命令接md5校验函数可以轻松的实现目录下全文件数字摘要。那么我们可以大概理清楚,这里我们需要进行的操作。我们需要有一个网站的备份文件,然后在文件根目录下使用find命令结合校验函数生成每一个文件的md5校验值。形成结果文本。
当我们要判断网站是否被恶意入侵时,只需要在网站对应目录下继续利用find命令生成摘要文件即可。通过diff
对摘要文件的比对我们可以快速定位到修改了的文件位置,之后再次利用diff
文件进行文件内容比对,就可以轻松判断出究竟修改该了那些内容。
下面我会用一个示例来演示这一个过程:
#1.创建对应目录,以及文件其中dir1为网站文件dir2为备份文件。注意实际环境中备份文件应当存储到别的设备上去,用的时候在拿出来。
[root@blackstone ~]# mkdir test
[root@blackstone ~]# cd test
[root@blackstone test]# mkdir dir1 dir2
[root@blackstone test]# echo 'i am batman' > cms.php
[root@blackstone test]# cp cms.php dir1
[root@blackstone test]# cp cms.php dir2
#制造恶意篡改文件的假象
[root@blackstone test]# echo 'i am joker' >> dir1/cms.php
#2.生成对应目录的文件内容数字摘要
[root@blackstone test]# cd dir1
[root@blackstone dir1]# find ./ -type f -exec md5sum {} \; | sort -k 2 > result.txt
[root@blackstone dir1]# cd ../dir2
[root@blackstone dir2]# find ./ -type f -exec md5sum {} \; | sort -k 2 > result.txt
#3.比对摘要文件的不同定位篡改了的文件位置
[root@blackstone test]# diff ./dir1/result.txt ./dir2/result.txt
1c1
< f83ec156bf33dc1d40b4b0e6c81667bd ./cms.php
---
> 0e3490ccba461affcd7c0bcd20736721 ./cms.php
#4.详细比对文件内容定位文件内容修改点 --- 找到隐藏的小丑!
[root@blackstone test]# diff -c -a -r ./dir1/cms.php ./dir2/cms.php
*** ./dir1/cms.php 2023-03-23 11:55:17.818409595 -0400
--- ./dir2/cms.php 2023-03-23 11:54:50.084956589 -0400
***************
*** 1,2 ****
i am batman
- i am joker
--- 1 ----
Q:为什么不直接在网站目录下生成摘要文档,后期直接比对摘要文档就行。还非得再把源文件备份一下?
A:因为我们如果仅仅做文件的md5摘要,只能定位到文件位置,而文件内容修改了多少我们将无从得知。
到这里看起来有一些麻烦的diff命令实际上还是很好用的。主要是利用摘要文件的差异来定位修改过的文件,定位到问题文件之后,在对比文件内容的修改内容。快速的解决了大量文件的对比查杀难题。
这里使用python完成MD5校验脚本的实现。先来看看源码(特地感谢周老师的源码):
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import hashlib
import json
# 网站目录所有文件列表
path_list = []
# 静态文件可以不做hash效验
White_list = ['.js', '.jpg', '.png', '.html', '.htm']
def GetFile(path):
for dirpath, dirnames, filenames in os.walk(path):
for dirname in dirnames:
dir = os.path.join(dirpath, dirname)
# print dir
path_list.append(dir)
for filename in filenames:
file = os.path.join(dirpath, filename)
if os.path.splitext(file)[1] not in White_list:
# print file
path_list.append(file)
return path_list
# 使用文件迭代器,循环获取数据
def md5sum(file):
m = hashlib.md5()
if os.path.isfile(file):
f = open(file,'rb')
for line in f:
m.update(line)
f.close
else:
m.update(file)
return (m.hexdigest())
def Get_md5result(webpath):
pathlist = GetFile(webpath)
md5_file = {}
for file in pathlist:
md5_file[file] = md5sum(file)
json_data = json.dumps(md5_file)
fileObject = open('result.json', 'w')
fileObject.write(json_data)
fileObject.close()
def load_data(json_file):
model = {}
with open(json_file,'r') as json_file:
model = json.load(json_file)
return model
def Analysis_dicts(dict1, dict2):
keys1 = dict1.keys()
keys2 = dict2.keys()
ret1 = [i for i in keys1 if i not in keys2]
ret2 = [i for i in keys2 if i not in keys1]
print u"可能被删除的文件有:"
for i in ret1:
print i
print u"新增的文件有:"
for i in ret2:
print i
print u"可能被篡改的文件有:"
ret3 = list((set(keys1).union(set(keys2))) ^ (set(keys1) ^ set(keys2)))
for key in ret3:
if key in keys1 and key in keys2:
if dict1[key] == dict2[key]:
pass
else:
print key
if __name__ == '__main__':
webpath = raw_input("Please enter your web physical path, for example, c:\\\\wwww]. ").lower()
Get_md5result(webpath)
dict2 = load_data("result.json")
methodselect = raw_input("[?] Check the integrity of the file: [Y]es or [N]O (Y/N): ").lower()
if methodselect == 'y':
file = raw_input("Please enter the hash file path to be compared: ").lower()
dict1 = load_data(file)
Analysis_dicts(dict1, dict2)
elif methodselect == 'n':
exit()
使用的方法和上面我们说到的diff没有多大的区别,好的一点是我们可以简单的运行几次脚本获取之前复杂的操作结果。
使用示例:针对nginx
下html
文件夹的MD5动态检测
#1.创建我们的检测文件夹,写入脚本
[root@blackstone md5chack]# cd /usr/local/nginx/
[root@blackstone nginx]# mkdir md5chack
[root@blackstone nginx]# cd md5chack/
[root@blackstone md5chack]# cp -r ../html/ ./
[root@blackstone md5chack]# ll
total 4
drwxr-xr-x. 4 root root 149 Mar 23 16:00 html
-rw-r--r-- 1 root root 2498 Mar 23 16:09 md5.py
#2.第一次获取初始状态的md5校验指纹,并进行重命名
[root@blackstone md5chack]# python md5.py
Please enter your web physical path, for example, c:\\wwww]. /usr/local/nginx/html
[?] Check the integrity of the file: [Y]es or [N]O (Y/N): n
[root@blackstone md5chack]# mv result.json demo.json
[root@blackstone md5chack]# ll
total 8
-rw-r--r-- 1 root root 2 Mar 23 16:12 demo.json
drwxr-xr-x. 4 root root 149 Mar 23 16:00 html
-rw-r--r-- 1 root root 2498 Mar 23 16:09 md5.py
#3.修改目标文件夹下的一些文件模拟攻击行为
[root@blackstone md5chack]# cd ../html/
[root@blackstone html]# ll
total 28
drwxr-xr-x 2 root root 6 Mar 23 16:14 123
-rw-r--r-- 1 root root 20 Mar 23 16:14 1.php
-rw-r--r-- 1 root root 116 Mar 23 16:14 2.php
-rwxr-xr-x 1 root root 537 Mar 23 16:14 50x.html
drwxr-xr-x 2 root root 102 Mar 23 16:14 cssinjection
-rw-r--r-- 1 root root 194 Mar 23 16:14 fast.php
-rwxr-xr-x 1 root root 14 Mar 23 16:14 index.bk
-rwxr-xr-x 1 root root 406 Mar 23 16:14 index.html
-rw-r--r-- 1 root root 20 Mar 23 16:14 webshell.txt
[root@blackstone html]# mkdir 456
[root@blackstone html]# vim webshell.txt
[root@blackstone html]# rm -f index.bk
#4.再次运行脚本获取结果
[root@blackstone md5chack]# python md5.py
Please enter your web physical path, for example, c:\\wwww]. /usr/local/nginx/html
[?] Check the integrity of the file: [Y]es or [N]O (Y/N): y
Please enter the hash file path to be compared: demo.json
可能被删除的文件有:
/usr/local/nginx/html/index.bk
新增的文件有:
/usr/local/nginx/html/456
可能被篡改的文件有:
/usr/local/nginx/html/webshell.txt
#5.使用diff命令比对文件的内容异同 --- 备份源文件的重要性
[root@blackstone md5chack]# diff -c -a -r ./html/webshell.txt ../html/webshell.txt
*** ./html/webshell.txt 2023-03-23 16:00:37.477998952 -0400
--- ../html/webshell.txt 2023-03-23 16:21:42.281391611 -0400
***************
*** 1 ****
! thos is a webshell
--- 1,2 ----
! thos is a webshell
! i am batman
可以看到,利用python脚本我们可以高效的找到对应目录下发生的一些恶意修改。
关键词:代码对比工具,你会找到很多好用的工具,常见的有Beyond Compare 和 WinMerge。这里我演示一种winmerge即可。
点击文件进行多路对比即可,注意这里写入的应该为目录的绝对路径。
点击查看:
进一步查看文件的内容差异:
快速定位,内容到目录的一站式对比,不过在正常的应急响应流程中需要客户中的高权限人员自行进行源码的备份。并保证源码的安全性,如此才能将这样的查杀方案实现。
限于篇幅原因,widnows的应急响应基本操作我放到后面的文章中进行总结(我可没摆…) 。
本文主要介绍了应急响应的概念以及常用的一些应急响应的模型。我们可以知道应急响应的通常流程为准备阶段、检测阶段、抑制阶段、根除阶段、恢复阶段、和总结阶段。通过这样的多次循环可以有效的提升企业的安全基线水位线。为企业的安全运行,提供质量上的保障。