背景
服务器本来是用来开 mc 服的,8.4开好服务器后搁置了,8.9凌晨告警,紧急关机,排查后发现是挖矿病毒
时间线
八月五日 17点52分23秒,德国 ip 192.109.206.11 爆破 ssh 成功,登录 root
八月五日 17点53分22秒,攻击者通过 root 创建用户 titu,权限为 root (该用户作用目前不明确);通过 root 添加挖矿程序,路径为 /dev/shm/syswatchd
(后来发现路径并不固定,每次启动服务都会将原程序重命名移动到另一路径),通过 root 创建系统服务 mem-tracker.service
,该服务于八月九日凌晨启动挖矿程序,同时 cpu 占用爆满
八月九日 2点2分左右,紧急关机
八月九日 8点33分左右,开始排查
八月九日 10点32分左右,排查出挖矿服务并停止服务
复现排查过程
启动服务器,发现 cpu 占用很快爆满,使用 top 命令和 ps 命令无法查询
查看定时任务 crontab -l
查看正在运行的系统服务 systemctl list-units --type=service --all | grep -iE "(enable|running)"
查看 ssh 记录 sudo grep "sshd" /var/log/auth.log | grep -iE "accepted|failed"
,发现 192.109.206.11
在 八月五日爆破 ssh 成功,同时发现八月七日 192.109.206.173
也进行了爆破,但是爆破失败,二者均为德国ip
使用 ss -tunap
查看是否有外连
发现本地 192.168.5.203:44278
连接到了 5.223.46.169:443
,使用 Shodan 查询,该 ip 位于新加坡,服务器开启了 22 和 443 两个端口,猜测这是矿池ip
查看 /proc/net/tcp
,最后一条即为可疑外连,inode 为 105723841
使用 ss -tpne | grep <inode>
查询,发现来自服务 /system.slice/mem-tracker.service
查看服务状态,发现目标进程为/usr/bin/udeb
和 /tmp/syswatchd
停止服务,cpu 占用降低至正常
异常进程排查结束
挖矿进程分析
syswatchd(rcu_scheb)
ida 查看字符串,发现 xmrig
,这是一个用于挖取门罗币的开源 CPU 挖矿程序
尝试直接运行该程序,会由于缺少配置文件而无法运行(文件名和路径不固定)
udeb
直接运行该文件,cpu占用爆满
程序没有加壳,主要功能根据函数名即可推断
Dropper
发现字符串 http://dudiito.dev/iu/tools.tar
和 /usr/local/lib/libsimplesshd.so
发现从 http://dudiito.dev/iu/tools.tar
下载了一个 tools.tar 压缩包,以及一个路径 /usr/local/lib/mslog
,但是无法直接访问该链接下载文件
注意到路径 /usr/local/lib/mslog
,发现里面正是 tool.tar
,包含三个文件
Loader
其中,udeb
和 rcu_scheb
分别为 /usr/bin/udeb
和 挖矿程序,另一个 .so
文件在函数 main_addToLdPreload()
中加载
函数 main_checkAndLaunchMiner(string locBig)
检查挖矿程序是否启动,如果没有启动,那么执行 main_prepareAndLaunchMiner(string locBig)
函数 main_prepareAndLaunchMiner(string locBig)
准备好一系列变量,最后调用函数 main_launchMinerWithRandomName(string locBig)
main_launchMinerWithRandomName(string locBig)
将挖矿程序复制到随即路径后,启动程序
libsimplesshd.so
在 tool.tar 中额外发现了该文件
在字符串中发现如下内容
跟进,该函数作用为判断程序名是否在过滤列表中
在函数列表发现 readdir
和 readdir64
readdir()
是libc中的函数,作用为读取目录,获取目录下所有文件和 inode。这里将该函数劫持,跳过了 processes_to_filter
中的文件名,导致 processes_to_filter
中文件名不会被读取到,从而在 top
ps
中隐藏了挖矿程序
钱包、矿池分析
前面已经提到,挖矿程序运行需要配置文件,或者在启动时传参,但是通过 find
命令无法找到配置文件,在 udeb 启动挖矿程序时中也没有查到参数,猜测参数是直接硬编码到挖矿程序中
尝试使用 strings
命令,得到了三个矿池链接
直接执行 strings logobserverx | grep -A 200 'config.json'
1 | "api": { |
得到信息:
-
矿池 1
-
地址:
pool.dudiito.dev:443
user:
"NEW_ADDRESSS"
-
-
矿池 2
-
地址:
5.223.46.169:443
user:
"IP-failover"
-
-
矿池 3
-
地址:
hk.salvium.gfwroute.com:1230
钱包 (门罗币):
SaLvsARaV7D9s3XNreiozaTBLLsJdan6KXCKsCbN1ojtW9ABgKsJtzkgCiQB8e5DkXfqQCPBCatXae4dbJN2ngPvDqTUd2pFyXJ
-
-
矿池 4、5
-
地址:
pool.supportxmr.com
(分别使用3333
和7777
端口)钱包 (门罗币):
48wb18tbiori5prH9ad5dbH9UN963XTKhabnUgYJtvzy7LRcAHiP1dA9xHSdwLczGCc7ahsZBx5JxXLMkHrzP5fQPXkkXJk
-
-
矿池 6
-
地址:
fr-zephyr.miningocean.org:5462
钱包 (Zephyr币):
ZEPHYR2ysT7Qebc8QLknZo5VyaQDdRHeF7dn7M6d8ra1FUsGpZ1ZpeCKun9XLptPmGCZZCAUjP81qKcYtER3GTUagU15H7btCPa2D
-