一、注意事项
1. 在做入侵排查前使用命令HISTFILE=/dev/null,将本次shell下执行的命令不写入.bash_history中避免干扰之前的历史命令,该命令仅针对当次shell有效,重开shell后需要重新执行该命令。
2. 在确定找到恶意文件或被入侵的原因之前,切勿杀死恶意进程或重启系统,否则会破坏现场。
3. 可能存在ps、netstat、ls等命令异常,可能是已被攻击者或病毒木马等替换,此时需要及时删除这些命令文件,使用正确的文件,以便于再次启动恶意文件。
检查方法:
- 可通过ls -lh /bin/ps 来查看, 这类命令文件大小通常在100k左右(不同的OS版本不一样,大小有所不同),若文件过大,便可能是已被攻击者或病毒木马等替换。
- 通过rpm自带的-Va来校验检查所有的rpm软件包,检查命令是否被替换,命令:rpm -Va > rpm.log
- 如果一切均校验正常将不会产生任何输出,如果有不一致的地方,就会显示出来,输出格式是8位长字符串,每个字符都用以表示文件与RPM数据库中一种属性的比较结果 ,如果是. (点) 则表示测试通过,如下图所示:4.解决方法:
- 拷贝本地的正确命令文件到受攻击的主机,先将被替换的文件拷贝到tmp目录,mv /bin/ls /tmp ,再将本地文件拷贝到受害主机即可(切记不要删除原有文件,先备份,与客户沟通后,由客户决定是否删除,切勿自行决断)
- 通过rpm进行修复
文件提取还原过程:
rpm -qf /bin/ls #查询ls命令属于哪个软件包, 然后到Packet找到对应的rpm包,使用命令 rpm -ivh xxx.rpm进行安装, 也可以使用yum install xxx进行安装(需要联网)
二、用户登录记录排查
1. w命令:用于显示当前在线的用户信息,了解系统的使用情况
2. last命令:用于显示用户最近登录信息,可能会留下入侵者的痕迹
3. uptime命令:查看当前时间、系统运行时间、当前登录的用户有多少,以及前 1、5 和 15 分钟系统的平均负载,便于了解系统的运行状况和负载情况(判断是否挖矿等提供一定凭据,存在挖矿cpu占用率非常高)
三、进程情况排查
1. top命令:查看资源消耗情况,id表示系统cpu剩余,若该值很小,说明系统可能被用于挖矿等严重占用资源,此时可记录下该进程的PID
2. ps -aux --sort=-pcpu/ps -elf命令:可能top命令找到的仅是一个执行进程,可使用ps -aux--sort=-pcpu或ps -elf查询所有进程,从而找到所有相关进程(父进程、子进程等),也可以检查是否存在其它异常进程(资源异常占用进程、命名异常进程、恶意外连等)。--sort=-pcpu会根据cpu占用情况从高到低排序,有利于定位到资源占用高的进程。
- 恶意外连进程
- 资源异常占用进程
- 命名异常进程
3. losf -p $pid 命令:根据进程号查询文件占用情况,可根据此命令找到恶意文件的位置
4. 在进程查询的过程中可能会出现两种情况,1:可以根据进程找到启动文件;2:文件启动后注入到其它进程中,此时根据进程无法找到启动文件
- 可以根据进程找到启动文件
命令:ls -l /proc/pid/exe可直接查看
- 由init进程启动,无法找到启动文件, 最后的子进程由PID:1初始化进程拉起,无法找到启动文件,
- 获取内存地址命令:cat /proc/pid/maps,记录下heap的内存地址
- 进入gdb调试命令:gdb attach pid
- dump内存文件命令:dump memory memory.dump start stop memory.dump为保存的文件,可指定路径;start为内存起始地址,stop为结束地址(第i步中记录的heap地址)
detach #调试结束,解除进程与gdb的连接,使进程继续运行
- 获取dump出的文件的内容strings命令:strings -n 10 memory.dump (-n 表示过滤字符长度)至此获得启动的原始文件
四、网络连接排查
1. 使用netstat -antlp|more;或者netstat -ano|more发现异常外连后,运行ls -l /proc/$PID/exe或file /proc/$PID/exe($PID 为对应的pid 号)可找到启动文件
2. 异常外连情况:半连接、异常字符进程(注意syn半连接和不规则命名)SYN半连接:不规则命令连接:
3. 查看端口占用情况命令:lsof -i:port,根据端口查看外连情况
五、历史命令排查
1. 通过.bash_history查看帐号执行过的系统命令,注意不同用户下的.bash_history文件记录相同,建议通过root账号登录,打开/home各帐号目录下的.bash_history,查看其余帐号的历史命令可通过history得到很多的证据, 请记得把所有账号 .bash_history文件都查看,不要遗漏
2. 命令history也可直接执行history进行查看,也需要更换所有用户进行查看历史命令
六、服务器账号排查
1. 查看用户信息文件/etc/passwd
字段按顺序解释:用户名:密码:用户ID:组ID:用户说明:home目录
注意:无密码/nologin只允许本机登陆,远程不允许登陆主要关注/bin/bash或/bin/sh的用户,注意是否存在异常账号(需要和客户沟通)
2. 查看影子文件/etc/shadow
字段按顺序解释:用户名:加密密码:密码最后一次修改日期:两次密码的修改时间间隔:密码有效期:密码修改到期到的警告天数:密码过期之后的宽限天数:账号失效时间:保留
3. 检查特权用户命令:awk -F: '$3==0{print $1}' /etc/passwd可以用此命令筛选出所有的特权用户
4. 检查以远程登录的账号命令:awk '/$1|$6/{print $1}' /etc/shadow可以快速筛选出远程账号
5. 排查ssh密钥文件,命令: ls -al ~/.ssh与客户确定是否存在异常的密钥文件
七、计划任务排查
1. crontab排查,crontab -l 列出某个用户cron服务的详细内容, 会泄露恶意文件的相关信息
注意:
- 默认编写的crontab文件会保存在 (/var/spool/cron/用户名 例如: /var/spool/cron/root)
- 每个账号下都有属于自己的计划任务,因此需要排查所有用户的计划任务,切勿遗漏
2. 排查文件列表
/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/*
八、开机启动项排查
linux启动顺序中决定程序启动项的在init这里,分为两大步骤:按级别加载/etc/rc(0-6).d目录下的启动脚本;加载/etc/rc.local文件;因此需要排查启动项文件排查是否存在恶意脚本。
1.开机启动配置文件/etc/rc.local,需要查看/etc/rc.local是否存在恶意执行启动项
需要查看/etc/rc[0-6].d下是否存在恶意文件脚本,主要关注rc3、rc4和rc5
2.启动项级别解释主要关注3~5,命令如下:chkconfig –list
九、日志审计
1. 日志默认存放位置:/var/log/
2. 查看日志配置情况:more /etc/rsyslog.conf
3. 系统日志文件说明
日志文件 | 说明 |
/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授权,甚至添加用户和修改用户密码都会记录在这个日志文件中 |
4. 应用日志文件说明
HTTP /var/log/httpd/access.log #或者是HTTP服务器配置文件中的日志路径
FTP /var/log/vsftp.log #或者是同路径下的xferlog
Squid /var/log/squid #或者是squid.access.log
NFS /var/log/nfs
IPTABLES /var/log/iptables/……
Samba /var/log/samba
DNS /var/log/message
DHCP /var/log/message #或者/var/lib/dhcp/db/dhcpd.leases
Mail /var/log/maillog
5. 特殊日志打开方式
utmpdump /var/log/wtmp
utmpdump /var/run/utmp
utmpdump /var/log/btmp
可配合more和grep命令共同使用
6.日志排查方法
- 定位有多少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 "$1\n";}'|uniq -c|sort -nr - 定位登录成功的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}' - webshell定位:
find /var/www/ -name "*.php" | xargs egrep 'assert | phpspy | c99sh | milw0rm | eval | \( gunerpress | \(bas464_encode | spider _bc | shell_exec | passthru | \(\$\_\POST\[|eval\(str_rotl3 | .chr\c|\$\{\"\_P|eval\C\$\_R | file_put_contents\C\.\*\$\_ | base64_decode' - 脚本文件定位打包:
find /var/www/html/ |grep -E ".asp$|.aspx$|.jsp$|.jspx$|.jspf$|.php$|.php3$|.php4$|.php5$|.inc$|.phtml$|.jar$|.war$|.pl$|.py$|.cer$|.asa$|.cdx$|.ashx$|.ascx$|.cfm$|.cgi$ "|xargs tar zcvf /tmp/shellscript.tar.gz
7.文件属性排查
- stat:
可以确定文件的访问、修改时间文件的时间戳,inode中一共有以下3个:a. access time, 最后一次访问的时间,只是访问,并没有修改。比如cat,head,tail之类的。b. modify time, 最后一次修改文件内容的时间。c. change time, 最后一次修改文件属性的时间,比如权限,大小之类的。 - ls -lh:
可以确定文件的大小避免部分文件的大小与实际空间大小不符合 - 查看最近都有哪些文件发生了变动
find / -mtime -2 -print0 | xargs -0 ls -lt例如:2天内产生更改的文件 - 孤儿文件查询:
find / -nouser -print查看系统上的孤儿文件,这些文件可能是由攻击者创建的临时账户产生的 - 文件查找的相关命令:
sudo find / -mtime(atime/ctime) -x #按照创建、修改时间查找
sudo find ./ -perm 4777 #按照权限查找文件
find ./ -mtime -1 -type f #按照文件类型查找