拯救被“绑架”的服务器
2020-12-30河南刘景云
河南 刘景云
单位的一台Web 服务器出现运行缓慢的现象,无法为外部的客户提供服务。该机安装的是CentOS 6.X 系统,后台使用的Redis 数据库,一直以来运行的都很正常。
为了排查问题,笔者随手在一台客户机上执行了“redis -h x.x.x.x -p 6308”命令,来检测是否可以访问后台的Redis 数据库。其中的“x.x.x.x”为该服务器的IP,“6308”为Redis 开放的端口。按照正常情况,是需要输入认证密码的,但是该机却没有提示任何认证提示,直接连接成功。这一反常情况引起了笔者的注意。
寻觅踪迹,发现幕后“黑手”
笔者登录到服务器上,执行“top”命令,在返回信息中的“Load average”栏中显示系统负载情况,可以看出在1分钟,5 分钟以及15 分钟等时间段中,系统平均负载都比较高,这说明系统运行压力很大。因为该机硬件配置较高,应对正常的工作应该没有任何问题的,肯定有来历不明的程序大量占用了系统资源。果然,在进程列表中发现了名为“nginx0”的可疑进程,其CPU 占用率极高,是以Root身份运行的。
但是该机并没有安装Nginx服务,这明显存在问题,肯定是该不法程序过度占用CPU 资源,才造成服务器运行缓慢的问题。
经过检测,发现该机网络带宽占用率很高,很明显该不法程序在频繁和外界进行通讯,产生了很大的流量的缘故。在进程列表中,显示该进程的PID 为21039,据此可以追踪到其实际的藏身地。执行“ls -al/proc/21039/exe”命令,显示其存储路径为“/var/data/nginx0”。
既然找到了不法程序,就将其清除,执行“kill -9 21039”命令,将该进程关闭。
执行“rm -rf/var/data/nginx0”命令,将该非法程序删除。本以为这样就万事大吉了,奇怪的是,当经过几分钟后,再次执行“top”命令,发现该非法进程有出现了。据此推断,在系统中还存在与其关联“内应”,当其判断该进程被清除后,就会自动生成并启动该非法进程。
笔者首先想到的是计划任务,应该是在系统的Crontab 中存在预设的定时任务,来定时激活该不法进程。
对于Linux 的计划任务来说,实际上存在系统级别和用户级别的Crontab,两者分别对应“/etc/crontab”和“/var/spool/cron”存储路径。
对用户级别的Cron 进程检测,并没有发现问题。执行“ll/var/spool/cron”命令,发现了几个计划任务项目,但实际上,该机管理员根本并没有配置任何计划任务。这些计划任务肯定和不法进程有关。
执行“cat/var/crontab/stroot”命令,打开名为“stroot”的计划任务,发现其中存在乱码信息,但是这并不影响Shell 的执行,在其中可以看到其使用了“curl”命令,在指定的时间段,每隔几分钟从某个来历不明的网站下载并执行一个Shell 脚本,该脚本作用是判断上述非法进程是否存在,如果不存在的话,就会自动下载并运行上述不法程序。
笔者随手执行了“netstat -antlp”命令,查看网络端口开启情况,在其中看到TCP 22 端口处于监听状态,那么在黑客会不会利用SSH 登录本机呢?
笔者执行“vim/etc/ssh/sshd_config”命令,打开OpenSSH 的配置文件,在其中仔细观察,果然发现一些问题,在其中的“PermitRootLogin”,“RSAAuthentication”,“PubkeyAuthentication”栏中均设置为“yes”,这表示允许Root 账户登录SSH,启用RSA 认证,允许密钥认证等操作。
但是,该机管理员根本没有改动过该配置文件,这显示是黑客的恶意修改所致。在“AuthorizedKeysFile”栏中显示的并不是默认的“.ssh/authorized_keys”参数,确是一个名称杂乱的公钥认证文件。进入“/root/.ssh”目录,果然找到了该奇怪的认证文件。
根据以上分析,笔者断定该机已经被黑客完全控制,黑客一定获取了免密钥登录功能,以Root 身份远程登录系统,并拥有对该机的完全控制权。
看来,必须采取紧急措施,将恶意程序彻底删除,并切断黑客对该机控制权。
逆向分析,识破黑客伎俩
在解决问题之前,必须了解黑客究竟是如何对本机进行渗透的。
前面已经提到,该机安装的是Redis 数据库,但是却开放了TCP 6308 端口,并且因为便于使用,没有为Redis 设置密码,这就为黑客造成了可乘之机。
黑客可能使用“Nmap”等扫描工具,扫描到了该机存在上述漏洞,之后会尝试登录操作,黑客会“惊喜”地发现可以顺利登录,并且可以执行各种Redis 命令对该机上的Redis 数据库进行操作。
显然,黑客并没有满足于此,没有对数据库进行破坏,而是希望完全该机,并将其作为跳板来攻击其他主机。
黑客先在自己的某台主机上开启一个监听端口,之后其另外一台主机上连接到该服务器的Redis 环境,利用Redis 的指令开启一个Socket 连接,使其指向目标主机,同时向“/var/spool/cron”或者“/etc/crontab”等路径写入非法的计划任务项目。
这样黑客就可以在PC1 上获取针对该服务器的Shell 连接,因为该机的Redis 是以Root 身份运行,黑客自然可以获取Root 权限。
黑客为了便于完全控制该服务器,还会在本机上来生成RSA 密钥对,之后将公钥转变为文本文件,通过特殊处理后,将其写入到Redis 数据库中。
连接到Redis 控制界面后,提取非法写入公钥信息,并将该公钥文件写入目录中。这样,黑客就可以远程控制该主机。
查补漏洞,扫除恶意程序
根据以上分析,不难发现正是因为该服务器开放了Redis 端口,并且没有设置密码,才导致黑客可以很轻松地获取该服务器的控制权。
因此,当务之急是必须强化Redis 的安全性,因为Redis 的TCP 6380 端口完全暴露在网上,其安全性是无法得到保证的。因此执行“iptables -A INPUT -p tcp-m tcp --dport 6380 -j DROP”命令,在Linux 防火墙添加一条规则,其中的“-A”参数表示创建一条新规则,“-p tcp”参数表示匹配TCP 协议的数据包,“-dport 6380”表示匹配目的端口为6380 的数据包。
也可以执行“iptables-L -n”命令,查看Linux 防火墙规则信息,如果发现TCP 6380 端口处于开放状态,可以执行“iptables -D INPUT-p tcp -m tcp --dport 6380 -j ACCEPT”命令,将对应的规则删除即可。因为管理员使用Root 权限来运行Redis,所以一旦Redis 被黑客控制,就很容易让其获取Root 权限。
因此使用普通用户身份运行Redis,方法是执行“useradd -s/sbin/nologin redistest”命令,创建名为“redistest”的普通用户,之后执行“cd/home/redistest”,“mkdir log dbdata run”命令,创建所需的文件夹。
执行“cp/etc/redis.conf/home/redistest/redistest.conf”命令,将Redis配置文件复制到该普通账户的家目录中。执行“chow-R redistest:redistest/home/redistest/*”命令,修改上述文件夹权限,让“redistest”账户拥有合适的控制权。执行“vim redis.conf”命令,打开Redis 的配置文件,在其中的“pidfile”行中输入“/home/redistest/run/redis_6379.pid”,在“logfile”行中输入“/home/redistest/log/redis.log”。在“dir”行中输入“/home/redistest/dbdata”,来设置新的路径信息。
执行“/home/redistest/dbdata”命令,在其中的“ExecStart=”栏中输入“/usr/bin/redis-server/home/redistest/redistest.conf”,修改Redis 的启动方式。执行“systemctl restart redis.service”命令,就可以以普通用户身份启动Redis。执行“ps-aux|grep redis”命令,可以查看Redis 的启动信息。
为了防止随意连接Redis,最好为其添加密码,执行“vim redis.conf”命令,在Redis 配置文件的“requirepass”行中输入合适的密码。之后执行“systemctl restart redis.service”,来重启Redis。
以后执行“redis-cli -h x.x.x.x”命令,在命令行中需要输入“auth xxx”命令,才可以连接Redis,其中的“xxx”为具体的密码。
也可以执行“redis-cli-h x.x.x.x -a xxx”命令,在命令行中的“-a”参数后面写入密码,来安全连接Redis。为了防止黑客利用非法公钥免密登录,执行“rm-rf/root/.ssh/”命令,将“/root/.ssh”目录中黑客写入的非法公钥文件删除,可以在自己的主机上使用“sshkeygen”命令。将生成合法公钥文件复制到该服务器上,在“/root/.ssh0 目录下得到合法 的“authorized_keys”公钥文件。
这样,管理员就可以实现免密登录该服务器。执行“chmod 400~/.ssh/authorized_keys”命令,为“authprized_keys”文件设置严格的权限,让拥有者对其只能进行修改操作,其余的用户没有任何权限。执行“chattr+i authorized_keys”命令,将该文件锁定,只要不解锁,连Root 用户都无权对其进行修改操作。因为黑客已经对OpenSSH 的配置文件进行了修改,为了稳妥起见,可以从其他正常的主机上复制“sshd_config”文件,来覆盖该机的OpenSSH 配置文件。执行“systemctl restart sshd”命令,来重启sshd 服务让配置生效。
提高了Redis 的安全性,封锁了黑客的SSH 连接通道后,之后就可以清理黑客在本服务器上创建的各种恶意文件了。
执行“rm -rf/var/spool/cron”,“rm -rf/etc/crontab”之类的命令,将黑客上传的恶意计划任务全部删除。继续在该服务器检查,发现在“/etc/init.d”中存在名为“stnginx”的非法文件,在“/etc/systemd/system/”目录下发现名为“ngsql.service”的非法程序。在“/etc/rc.local”目录下发现名为“krdisc”,在“etc/init.d”目录下发现名为“netudev”的程序,这些可能是用来自动运行不法程序的,将其全部删除。
最后使用上述方法,关闭“nginx0”的进程并清除对应的文件。这样,该服务器终于可以正常运行了。