公司动态

LINUX应急响应思路

2019-11-01

网络入侵事件层出不穷,linux系统的安全事件更为常见,本篇文章重点针对linux系统应急响应思路作出了解析。希望给读者些许帮助。


01
基本流程


1.信息收集

主要搜集感染主机数、主机补丁情况、中毒现象描述、问题出现时间、账号是否存在弱密码情况、对外开放端口情况、服务开启情况、操作系统版本等信息。

2.分析研判

根据收集到的信息情况对日志、进程、网络流量、启动项、样本文件等进行分析,判断是什么类型的安全事件,比如挖矿病毒、肉鸡等。

3.清理处置

根据分析的情况,进行针对性的修复,比如杀掉病毒进程、删除病毒文件、打补丁等。

4.产出报告

对排查处理过程进行整理并输出完整的安全事件报告。


02
处理思路


1.利用工具初步排查

应急响应在排查过程中,穿插着自动化工具来提升安全应急响应的处置工作效率,掌握基础的安全工具使用方法对工作人员在应急响应排查中也会带来有效的帮助。
 
①使用Rkhunter检查Rookit
安装过程:
1.wget https://jaist.dl.sourceforge.net/project/rkhunter/rkhunter/1.4.4/rkhunter-1.4.4.tar.gz
2.tar zxvf rkhunter-1.4.4.tar.gz
3.cd rkhunter-1.4.4
4./install.sh --install
 
安装完成后,/usr/local/bin/rkhunter --help可以查看帮助获得更多参数详情。
在这里我们主要查看常用基础命令是否有被替换,常被替换的二进制文件通常有ps、netstat、du、ping、lsof、ssh等,注意排查warning显示的命令(rkhunter会进行md5校验检测,有可能会出现系统版本不同部分命令安装方式不同导致md5与rkhunter的md5库中的不同出现warning告警):
/usr/local/bin/rkhunter --propupd
/usr/local/bin/rkhunter -c --sk --rwo

 
②使用ClamAV扫描病毒木马
安装过程:
yum install epel-release -y
yum -y install clamav
更新病毒库:
freshclam
扫描目录:
clamscan -r /opt

(PS:以上是无病毒情况下的扫描输出;Infected files显示的是被感染文件的数量,这行需要注意)
 
③使用在线网站(virustotal)对可疑文件进行检查
网址:https://www.virustotal.com


FILE:选择上传本地文件进行扫描。

URL:选择输入URL进行扫描。
SEARCH:选择输入URL、IP地址、域名或者文件散列值进行搜索匹配。
 
④使用LMD检查WebShell
安装方法:
wget http://www.rfxn.com/downloads/maldetect-current.tar.gz
tar zxvf maldetect-current.tar.gz
cd maldetect-1.6.4/
./install.sh
扫描目录:
maldet --scan-all /opt

 
工具的种类有很多,不仅仅只局限于以上的这几个,但是工具更多的还是用于辅助的作用,很多情况下使用完工具后是需要进行人工排查的。


2.对用户密码及登陆情况进行检查

查看除root外是否还有UID=0的用户:
awk -F: '$3==0{print $1}' /etc/passwd | grep -v root
查看还有哪些GID=0 的用户:
awk -F: '$4==0{print $1}' /etc/passwd | grep -v root
 
查看是否有空口令用户:
awk -F: 'length($2)==0 {print $1}' /etc/shadow
查看是否有其他非需要账户存在sudo权限:
more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"
 
检查历史登陆以及正在登陆的记录:
last、lastlog、w、ls -l /dev/pts等命令
lastb查看登录失败的记录
确认异常tty正在登陆可以先通过命令强制用户下线:pkill -kill -t pts/1 (pts/1为异常tty终端)


3.通过 find 命令查找可疑文件及目录

根据入侵时间进行查找,比如前面排查中对入侵时间可以推断出在24小时内,那么可以查找24小时内被更改过内容的文件
find / -mtime 0
 
也可以结合查找一些指定后缀的文件 例如.jsp等
find / -mtime 0 -name *.jsp  
 
查找72小时内修改过权限等属性的文件
find / -ctime -2
 
查找权限是可读可写可执行的文件
find / -name *.jsp -perm 777  
find / -perm 2777
find / -perm 4777
 
查找哪些目录为所有用户可读可写可执行的,对这些目录进行检查是否存在可疑文件,系统自带的话通常有/tmp /var/tmp /dev/shm等目录
find / -type d -perm 777
find / -type d -perm 1777



4. 检查文件是否被替换

先查看/usr/bin等目录下的文件是否有被替换,比如文件大小等(正常命令文件大小不会太大而且好几个文件不会大小都完全一致):
ls -larth /usr/bin
 
查看文件来自于哪个rpm包:
rpm -qf /bin/netstat或者rpm -q --whatprovides /bin/netstat
再通过rpm包来检查文件以及检查系统中实际存在的文件来判断文件是否被替换了
借助rpm数据库检查:rpm -ql rpm --dump
(第二个字段是代表文件内容最后修改时间,可以用date -d "UTC 1970-01-01 第二字段数值 secs" 来进行转换)
检查系统中实际存在的文件属性:stat /bin/netstat
再查看系统中的文件sha256散列值进行比对:sha256sum /bin/netstat

 
 
遇到病毒文件root用户没有权限删除时:
lsattr xxx.txt
检查是否有隐藏权限 比如a是只能追加内容不能编辑 i是不能编辑内容 这两种权限存在都会导致文件被锁定
可以通过chattr -ai xxx.txt去除隐藏权限再尝试删除病毒文件。
 
如果出现了基础常用命令被替换的情况,可以尝试删除被替换的命令,然后拷贝另一台没被攻击服务器里的正常命令到被攻击的这台服务器进行使用。



5.历史命令记录

history查看当前用户的历史操作记录,以及在各个用户的家目录下通过.bash_history查看各个用户的历史操作记录。
 

6.端口以及进程检查

查看端口监听情况:
netstat  -anptl | less
检查建立连接的信息:
netstat -anp | grep ESTABLISHED
 
查看进程:
ps aux |less
或者ps -ef
查看pid所对应的进程文件路径:
ls -l /proc/pid号/exe
 
使用lsof列出进程打开文件:
lsof -p pid           
 
查看cpu 负载情况,检查是否有cpu、内存等负载跑高的情况:
top -c
 
利用strace追踪病毒进程:
strace -tt -p pid -o filename -ff
查看追踪日志
cat filename.*
检查病毒进程打开或者写入了哪些文件。
 
将异常进程强制kill:
kill -9 pid
但往往病毒进程被kill了还是会自启动,可以先检查会在什么目录下生成,然后用chattr +i 目录 将该目录先锁定,阻止异常进程不断自启动,然后再对定时任务以及启动项等进行排查。
 
遇到隐藏进程时,可以尝试利用unhide审计隐藏进程:
安装方法:
yum install -y unhide
使用:
unhide brute   //通过暴力PID检测的方式
unhide procall  //通过分析proc和procfs的方式
unhide的更多使用方式可以通过man进行查看:man unhide
 
当分析病毒进程遇到困难时,分析其内存往往是查找问题的最后一道防线:
通过gdb attach pid 进入到gdb环境,
输入bt查看堆栈信息,获取起止地址。
dump binary memory file.dump start_addr end_addr
file.dump为输出文件名,可以自己指定,start_addr是起始地址,end_addr是终止地址。
通过strings file.dump获取字符串内容,再对其内容进行检查分析。



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/*
 

8.检查启动项

显示所有系统服务在不同运行级的状态信息,检查是否有非自己设置自启动的服务存在: 
chkconfig --list
查看以下目录及文件来检查启动脚本是否被修改:
/etc/rc.d/*
/etc/rc.local
/etc/rc[0-6].d,
/etc/inittab
 

9.日志分析

linux日志默认保存在/var/log目录下。
主要日志文件介绍:
/var/log/messages:内核及公共消息日志
/var/log/cron:计划任务日志
/var/log/dmesg:系统引导日志
/var/log/maillog:邮件系统日志
/var/log/lastlog:用户登录日志
/var/log/boot.log:记录系统在引导过程中发生的时间
/var/log/secure:用户验证相关的安全性事件
/var/log/wtmp:当前登录用户详细信息
/var/log/btmp:记录失败的的记录
/var/run/utmp:用户登录、注销及系统开、关等事件;
 
通常,在排查过程中会使用less /var/log/secure查看登录验证情况,该日志里通常是会记录登录IP。通过IP我们可以去对应的一些在线网站例如ipip.net等查看一些相应的信息,例如归属地、DNS指向等。
查看是否有被ssh暴力破解:
cat /var/log/secure |grep "Failed password" | awk '{print $11}' | sort | uniq -c | sort -r

 ps:定位有哪些IP在爆破并且列出次数。
 
查看web访问日志:
可以结合登陆日志里的异常IP 在访问日志中检索异常IP以及upload等相关关键字来确认是否有上传可疑文件等。再通过恶意文件进行再次检索 查看每个恶意IP的行为,来还原一次实际的攻击情况。
 

10.检查载入模块

检查已载入的模块中是否异常模块:
lsmod
如果显示有可疑模块使用modinfo查看详细模块信息:
modinfo 模块名  
确认是异常模块可以尝试卸载:
rmmod 模块名


11.分析流量以及恶意域名

linux下通常用tcpdump进行流量分析,主要分析当前主机访问了哪些域名、URL、服务,或者有哪些外网IP在访问本地主机的哪些端口、服务和目录,又使用了何种协议等等。
有时候,可以根据网络协议来直接过滤分析流量。譬如,目前IRC协议已经很少被使用了,但利用IRC建立僵尸网络通道的现象仍比较普遍。另外,有时候也可以根据恶意域名进行判断。
可以根据以下几个方面来判断是否是恶意域名:

① 随机域名
这类域名通常表现为随机性,因为这是利用随机算法生成的域名,黑客可以利用这类的域名来避免长期使用某个特定域名而被封禁。
因为大多数情况,域名是为了方便使用者记忆而注册产生的,随机性的域名难记度非常高,在实际使用中很少会有需要的地方,显然这种不是正常企业会去访问的。

② 动态域名
企业级用户很少会主动去使用动态域名,动态域名是开放给其他人使用的子域名,并且子域名绑定的IP是可以动态获取的,大多数是免费的,因此常被黑客所使用。
以下图片里一级域名的基本是动态域名:


③ 近期注册的域名
通常访问域名中有刚刚注册又并非客户自己的域名的,也可以关注一下,因为通常情况下 企业也很少会去访问一个刚注册又并非是自己企业注册的域名。

④ 暗网域名
比如顶级域名为.onion等域名。

⑤ 少见的顶级域名
一些其他国家申请的顶级域名,因为如果没有业务需求的话通常企业很少会去访问其他国家的域名,特别是一些比较不常见的国家以及黑客较多的国家,例如:.ru,.ws.cc.pw.su.mz等等。
另外,通常也可以利用威胁情报社区来进行分析,主流的目前有x.threatbook.cnwww.virustotal.com、virusscan.jotti.org、ti.qianxin.com等等。