前言(扯犊子):
做为一名在前线的信息安全从业人员,应急响应技术是必不可缺的,在常见的安全保障模型P2DR模型中,response(响应)占据了其中重要的一个环节。下面是本人学习到的应急响应的一些知识,技巧。
一般应急响应流程:
整个流程中,尤为重要的莫过于获取安全事件发生后的处理阶段,下面重点总结了一下检查系统是否被入侵以及是否存在后门需要做的一些事情。
检测点(重头戏):
1】日志分析:
下面为linux系统中一些重要的日志位置和简单注释。
/var/log/messages — 包括整体系统信息,其中也包含系统启动期间的日志。此外,mail,cron,daemon,kern和auth等内容也记录在var/log/messages日志中。
/var/log/dmesg — 包含内核缓冲信息(kernel ring buffer)。在系统启动时,会在屏幕上显示许多与硬件有关的信息。可以用dmesg查看它们。
/var/log/auth.log — 包含系统授权信息,包括用户登录和使用的权限机制等。
/var/log/boot.log — 包含系统启动时的日志。
/var/log/daemon.log — 包含各种系统后台守护进程日志信息。
/var/log/dpkg.log – 包括安装或dpkg命令清除软件包的日志。
/var/log/kern.log – 包含内核产生的日志,有助于在定制内核时解决问题。
/var/log/lastlog — 记录所有用户的最近信息。这不是一个ASCII文件,因此需要用lastlog命令查看内容(*关于lastlog命令见注1)。
/var/log/maillog /var/log/mail.log — 包含来着系统运行电子邮件服务器的日志信息。例如,sendmail日志信息就全部送到这个文件中。
/var/log/user.log — 记录所有等级用户信息的日志。
/var/log/Xorg.x.log — 来自X的日志信息。
/var/log/alternatives.log – 更新替代信息都记录在这个文件中。
/var/log/btmp – 记录所有失败登录信息。使用last命令可以查看btmp文件。例如,”last -f /var/log/btmp | more“。
/var/log/cups — 涉及所有打印信息的日志。
/var/log/anaconda.log — 在安装Linux时,所有安装信息都储存在这个文件中。
/var/log/yum.log — 包含使用yum安装的软件包信息。
/var/log/cron — 每当cron进程开始一个工作时,就会将相关信息记录在这个文件中。
/var/log/secure — 包含验证和授权方面信息。例如,sshd会将所有信息记录(其中包括失败登录)在这里。
/var/log/wtmp或/var/log/utmp — 包含登录信息。使用wtmp可以找出谁正在登陆进入系统,谁使用命令显示这个文件或信息等。
/var/log/faillog – 包含用户登录失败信息。此外,错误登录命令也会记录在本文件中。
除了上述Log文件以外, /var/log还基于系统的具体应用包含以下一些子目录。
/var/log/httpd/或/var/log/apache2 — 包含服务器access_log和error_log信息。
/var/log/lighttpd/ — 包含light HTTPD的access_log和error_log。
/var/log/mail/ – 这个子目录包含邮件服务器的额外日志。
/var/log/prelink/ — 包含.so文件被prelink修改的信息。
/var/log/audit/ — 包含被 Linux audit daemon储存的信息。
/var/log/samba/ – 包含由samba存储的信息。
/var/log/sa/ — 包含每日由sysstat软件包收集的sar文件。
/var/log/sssd/ – 用于守护进程安全服务。
~/.bash_history - 至关重要的日志,往往黑客会使用history -c清理相关的日志,但此命令并不会清除保存在文件中的记录,因此需要手动删除 .bash_profile文件中的记录。
/var/log/sudo.log - 查看SUDO日志在相应的时间段是否出现可疑的用户进行过SU操作
另外如果该台主机是做为一台web服务器,还可以审计一下其web服务器的日志,接触比较多的为apache、tomcat、nagix为主。无论哪种web服务器,access_log 和 error_log日志都是值得一看的 。一般find命令可以搞定。
2】用户及用户文件分析
1、使用ls -l /etc/passwd
查看passwd文件的权限—/etc/passwd默认权限为644即(rw-r–r–),其最小权限为444(r–r–r–),首先应对该文件权限进行检查,以确认配置是否正确;然后使用ls -l /etc/shadow 检查shadow文件的权限配置,默认权限为600(rw——-),最小权限为400(r——–)。
2、使用cat /etc/passwd
查看passwd文件内容,判断是否存在可疑账号。
3、使用awk -F : '$3==0{print $1}' /etc/passwd
查看是否存在UID为0的用户,该命令表示打印UID=的用户信息。
使用awk '/$1|$6/{print $1}' /etc/shadow
查询远程登录的用户信息
禁用或者删除多余以及可疑账号:usermod -L user
(禁用),/etc/shadow
第二栏为!开头 userdel user
删除user用户 userdel -r user将删除user用户, 将/home目录下的user目录一并删除
passwd文件格式(无密码只允许本机登陆)1
root:x:0:0:root:/root:/bin/bash
用户名:密码:用户ID:组ID:用户说明:家目录:登陆之后shell
shadow文件格式1
root:$6$oGs1PqhL2p3ZetrE$X7o7bzoouHQVSEmSgsYN5UD4.kMHx6qgbTqwNVC5oOAouXvcjQSt.Ft7ql1WpkopY0UV9ajBwUt1DpYxTCVvI/:16809:0:99999:7:::
用户名:加密密码:密码最后一次修改日期:两次密码的修改时间间隔:密码有效期:密码修改到期到的警告天数:密码过期之后的宽限天数:账号失效时间:保留
3】系统文件的完整性分析
1、查看重要命令的MD5值是否发生改变
参数:ls、find、du 、ps、top 、who、last、chsh、passwd、cat、 vi、crontab、netstat
等等
1)、找到上述命令所使用的文件:which ls find ps last 等等
2)、计算MD5的值:md5sum /bin/ls /usr/bin/find /usr/bin/ps 等等
3)、与相同版本系统或之前的备份的相应值进行比较。
2、检查包安装后的变化
使用RPM命令进行查看,主要查看命令由哪一个包安装,并检查包自安装后文件是否发生过变化。
3、检查系统是否存在ROOTKIT
一般检测工具可以使用chkrootkit、rkhunter等(详情请参考http://www.evil0x.com/posts/8146.html)
另外:河马 webshell 查杀:
http://www.shellpub.com
深信服 Webshell 网站后门检测工具:
http://edr.sangfor.com.cn/backdoor_detection.html
4】网络连接
1、端口:
使用netstat命令查看当前开放的端口信息(netstat -antlp|more),当然可灵活配合grep命令,获取需要的信息。更多netstat使用姿势可参考http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316661.html。
可以使用lsof -i :port 显示进程和端口的对应关系
2、当前登录用户
who查看当前登陆用户(tty本地等了 pts远程登录)
执行w查看系统信息,可知道某一时刻用户的行为。
uptime查看登录多久,多少用户,负载信息
5】进程和服务
1、使用ps -aux
查看进程信息。或者使用ps -ef
(ps -ef对于反弹shell,更便于发现)
2、使用chkconfig -list查看服务启动信息。
6】其他方面:
1、定位含有S位权限的文件
命令:find / -perm -004000 -type f
2、检查最近一段时间内更改的文件
find /home/work -type f -mtime T
3、查看计划任务crontab -l
cd /etc/crontab
ls
crontab -r
删除后门自启计划任务
4、查看执行过什么命令history
查看root用户的历史命令cat ~/.bash_history
history | grep '2017-2-12'
根据时间查看干了什么history | tail -n 5
显示最近5次执行的命令history -c
清空history历史
5、查看有没有提权痕迹cat /etc/passwd
极有可能其他用户出现id,组id 0、0的情况lsof -g
gid号 通常能找到恶意文件关联的lib文件
6、显示最后登录系统的倒数10条记录last -10
7、离线系统数据:
对于现场无法定位的系统,在取得批准后可将问题主机的数据进行镜像拷贝,方便随后进行分析。
8、 开机启动项排查:
当我们需要开机启动自己的脚本时,只需要将可执行脚本丢在 /etc/init.d目录下,然后在 /etc/rc.d/rc*.d中建立软链接即可ln -s /etc/init.d/sshd /etc/rc.d/rc3.d/S100ssh
此处 sshd是具体服务的脚本文件,S100ssh是其软链接,S 开头代表加载时自启动;如果是 K 开头的脚本文件,代表运行级别加载时需要关闭的
因此需要对启动项文件进行排查:
1 | more /etc/rc.local |
9、补充一点加固history信息的知识:
1)保存 1 万条命令
sed -i ‘s/^HISTSIZE=1000/HISTSIZE=10000/g’ /etc/profile
2)为历史的命令增加登录的IP地址、执行命令时间等信息:
在 /etc/profile的文件尾部添加如下行数配置信息:
1 | ######jiagu history xianshi######### |
3)source /etc/profile让配置生效
生成效果:
1 2018-07-10 19:45:39 192.168.204.1 root source /etc/profile
总结
以上是应急响应的一些主要的步骤和流程,希望通过这些总结,给大家带来帮助。如有问题,欢迎留言交流~~
Tips:
1、在应急响应中,重要数据的分析工作最好拷贝至工作机器中新建的虚拟机中进行。
2、日志信息可以通过重定向来记录结果;在收集前使用du -sh /日志路径 命令判断日志文件大小,过大则根据情况提取特定时间段的日志信息。
3、根据情况还可以对流量、数据库、基础网络等方面进行检测排查。
补充
一:lastlog
lastlog文件在每次有用户登录时被查询。可以以root身份运行lastlog命令检查某特定用户上次登录的时间,并格式化输出上次登录日志/var/log/lastlog的内容。它根据UID排序显示登录名、端口号(tty)和上次登录时间。如果一个用户从未登录过,lastlog显示Never logged。
*语法lastlog(选项)
*选项-b<天数>:显示指定天数前的登录信息'
-h:显示召集令的帮助信息;
-t<天数>:显示指定天数以来的登录信息;
-u<用户名>:显示指定用户的最近登录信息。
二:定时任务异常排查:more /etc/cron.daily/*
查看目录下所有文件
原理:
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 实现异步定时任务调度
三:服务 服务自启动
第一种修改方法:1
2
3chkconfig [--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、查询已安装的服务:
RPM 包安装的服务:
chkconfig --list
查看服务自启动状态,可以看到所有的RPM包安装的服务
ps aux | grep crond
查看当前服务
系统在 3 与 5 级别下的启动项
中文环境
chkconfig –list | grep “3:启用|5:启用”
英文环境
chkconfig –list | grep “3:on|5:on”
源码包安装的服务
查看服务安装位置 ,一般是在 /user/local/
service httpd start
搜索 /etc/rc.d/init.d/查看是否存在
四:一些日志分析技巧:
1、定位有多少IP在爆破主机的 root 帐号:
grep “Failed password for root” /var/log/secure | awk ‘{print $11}’ | sort | uniq -c | sort -nr | more
定位有哪些 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
爆破用户名字典是什么?
grep “Failed password” /var/log/secure|perl -e ‘while($_=<>){ /for(.*?) from/; print “$1n”;}’|uniq -c|sort -nr
2、登录成功的 IP 有哪些:
grep “Accepted “ /var/log/secure | awk ‘{print $11}’ | sort | uniq -c | sort -nr | more
登录成功的日期、用户名、IP:
grep “Accepted “ /var/log/secure | awk ‘{print $1,$2,$3,$9,$11}’
3、增加一个用户 kali 日志:1
2
3
4
5Jul1000:12:15localhostuseradd[2382]: newgroup: name=kali, GID=1001
Jul1000:12:15localhostuseradd[2382]: newuser: name=kali, UID=1001, GID=1001, home=/home/kali
, shell=/bin/bash
Jul1000:12:58localhostpasswd: pam_unix(passwd:chauthtok): passwordchangedforkali
#grep"useradd"/var/log/secure
4、删除用户kali日志:1
2
3
4
5
6
7Jul1000:14:17localhostuserdel[2393]: deleteuser'kali'
Jul1000:14:17localhostuserdel[2393]: removedgroup'kali' ownedby'kali'
Jul1000:14:17localhostuserdel[2393]: removedshadowgroup'kali' ownedby'kali'
#grep"userdel"/var/log/secure
5、su 切换用户:1
Jul 10 00:38:13 localhost su: pam_unix(su-l:session): session opened for user good by root(uid=0)
sudo 授权执行:1
sudo -lJul 10 00:43:09 localhost sudo: good : TTY=pts/4 ; PWD=/home/good ; USER=root ; COMMAND=/sbin/shutdown -r now
参考链接:http://www.sohu.com/a/259254300_649850
感谢信安之路《Linux 应急响应流程及实战演练》文章作者等,该文中也有几处应急案例可供参考。