redis非授权访问的查毒过程

网友投稿 759 2023-03-14

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

redis非授权访问的查毒过程

排查及处理过程

2016年9月26日晚,阿里云后台报告有一台服务器在异地登录的告警,初步怀疑是被入侵了,临时采取关闭这台服务器的方法避免对集群中的其他主机造成危害。

第二天,开始排查原因。

首先在服务器上发现一个额外的计划任务(下图是解决过程中被我注释掉了)

联想到这个机器上跑有redis,基本断定是redis的未加密码导致的非授权访问。

根据以往经验,linux上的这个病毒通常是DDOS或者挖矿程序。下面来慢慢分析。

我们根据crontab里面的网址,我们到chrome里面输入这个链接下载下看下文件内容,(建议在虚拟机里操作,防止这个文件是浏览器0day利用脚本),

下面是wget 下载到的pm.sh,内容如下:

根据这个脚本的内容,我们大致就知道他的作案手段了:

1、利用redis非授权入侵

2、下载脚本,写入crontab定时执行,确保病毒的再生。

3、修改服务器sshd登录为他自己的秘钥。

5、/opt/KHK75NEOiq33 -Install 这步操作应该是释放出病毒文件(如下的ntp)【hexdump -C/opt/KHK75NEOiq33 可以看到文件内容,但是好像是加密了。暂不具备反汇编能力,无法获知这个命令感染了哪些文件】

6、伪造ntp服务,给管理员造成迷惑,驻留后台。(Linux下是没有ntp服务的,有的是ntpd服务)

附发现的伪造的/etc/init.d/ntp文件内容:

#!/bin/sh#For RedHat and cousins:#chkconfig: - 99 01#description: NTP daemon#processname: /usr/sbin/ntp ###BEGIN INIT INFO#Provides:          /usr/sbin/ntp#Required-Start:#Required-Stop:#Default-Start:     2 3 4 5#Default-Stop:      0 1 6#Short-Description: NTP daemon#Description:       NTP daemon###END INIT INFO cmd="/usr/sbin/ntp "-D""# 正常的系统上不存在这个可执行程序,可以断定是/opt/KHK75NEOiq33-Install 释放出来的# 将这个文件和/opt/KHK75NEOiq33 -Install 通过diff命令比对,发现是同一个文件。  name=$(basename$0)pid_file="/var/run/$name.pid"stdout_log="/var/log/$name.log"stderr_log="/var/log/$name.err" get_pid(){    cat "$pid_file"} is_running(){    [ -f "$pid_file" ] &&/usr/sbin/ntp -Pid $(get_pid) > /dev/null 2>&1} case"$1" in    start)        if is_running; then            echo "Already started"        else            echo "Starting $name"                       $cmd >>"$stdout_log" 2>> "$stderr_log" &            echo $! > "$pid_file"            if ! is_running; then                echo "Unable to start, see$stdout_log and $stderr_log"                exit 1            fi        fi    ;;    stop)        if is_running; then            echo -n "Stopping$name.."            kill $(get_pid)            for i in {1..10}            do                if ! is_running; then                    break                fi                echo -n "."                sleep 1            done            echo            if is_running; then                echo "Not stopped; maystill be shutting down or shutdown may have failed"                exit 1            else                echo "Stopped"                if [ -f "$pid_file"]; then                    rm "$pid_file"                fi            fi        else            echo "Not running"        fi    ;;    restart)        $0 stop        if is_running; then            echo "Unable to stop, will notattempt to start"            exit 1        fi        $0 start    ;;    status)        if is_running; then            echo "Running"        else            echo "Stopped"            exit 1        fi    ;;    *)    echo "Usage: $0{start|stop|restart|status}"    exit 1    ;;esacexit0

#!/bin/sh#For RedHat and cousins:#chkconfig: - 99 01#description: NTP daemon#processname: /usr/sbin/ntp ###BEGIN INIT INFO#Provides: /usr/sbin/ntp#Required-Start:#Required-Stop:#Default-Start: 2 3 4 5#Default-Stop: 0 1 6#Short-Description: NTP daemon#Description: NTP daemon###END INIT INFO cmd="/usr/sbin/ntp "-D""# 正常的系统上不存在这个可执行程序,可以断定是/opt/KHK75NEOiq33-Install 释放出来的# 将这个文件和/opt/KHK75NEOiq33 -Install 通过diff命令比对,发现是同一个文件。 name=$(basename$0)pid_file="/var/run/$name.pid"stdout_log="/var/log/$name.log"stderr_log="/var/log/$name.err" get_pid(){ cat "$pid_file"} is_running(){ [ -f "$pid_file" ] &&/usr/sbin/ntp -Pid $(get_pid) > /dev/null 2>&1} case"$1" in start) if is_running; then echo "Already started" else echo "Starting $name" $cmd >>"$stdout_log" 2>> "$stderr_log" & echo $! > "$pid_file" if ! is_running; then echo "Unable to start, see$stdout_log and $stderr_log" exit 1 fi fi ;; stop) if is_running; then echo -n "Stopping$name.." kill $(get_pid) for i in {1..10} do if ! is_running; then break fi echo -n "." sleep 1 done echo if is_running; then echo "Not stopped; maystill be shutting down or shutdown may have failed" exit 1 else echo "Stopped" if [ -f "$pid_file"]; then rm "$pid_file" fi fi else echo "Not running" fi ;; restart) $0 stop if is_running; then echo "Unable to stop, will notattempt to start" exit 1 fi $0 start ;; status) if is_running; then echo "Running" else echo "Stopped" exit 1 fi ;; *) echo "Usage: $0{start|stop|restart|status}" exit 1 ;;esacexit0

chkconfig--list|grep 3:on 可以看到ntp这个伪装的服务被设置为开机自启动了。

解决方法:

chkconfig ntp off

chkconfig --del ntp

先拷贝出ntp这个启动脚本,然后rm -f /etc/init.d/ntp

先拷贝出/usr/sbin/ntp /opt/KHK75NEOiq33这2个病毒文件,然后rm -f /usr/sbin/ntp /opt/KHK75NEOiq33 删除病毒文件

编辑 /var/spool/cron/crontabs/root和 /var/spool/cron/root,清除植入的cron计划任务

此外,还要检查以下几处:

1、是否有新添加的账户 【grep '/bin/bash' /etc/passwd】

2、查看其他可登陆的账户下是否也有恶意的计划任务

3、检查是否有新添加了sudo账户

当然,这是台线上的服务器,为了防止还有残留的病毒文件,最好我们还是先备份下数据,然后重装了系统。

安全策略:

给redis做密码授权访问,不要绑定在0.0.0.0:6379端口。开启iptables防火墙,只允许部分主机访问redis端口编写脚本,定期检查汇报重要文件的md5sum。

附一个之前写过检测md5sum的脚本:

后续

上一篇:在Firefox玩坏你的固态硬盘之前:请速调整这项默认配置
下一篇:aiops的智能运维(智能化运维工具)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~