查看原文
其他

最新内网横向移动工具发布 - Wmiexec-Pro

The following article is from Gcow安全团队 Author xiaoli@绝影小组


 Intro

早于两年前,我基于wmihacker免杀横向的思路,造轮子写了个wmipersist-Modify.py的横向工具,相对于wmihacker来说,无需配合mimikatzPTH,即可进行PTH,但是wmipersist.Modify.py时间久了,也有许多不足之处,然后就有了这篇文章


改造点1:文件传输第一步-创建WMI类

文件传输部分是最难的,但是我看到t00ls上的flystart师傅,改了我的脚本,地址:

https://www.t00ls.com/viewthread.php?tid=68322&extra=&highlight=wmihacker&page=1

但是用的方法依旧是通过注册表传文件,这种方法有个坏处,就是写的文件不能大于512KB,因为注册表的限制,我估计这个师傅是看到奇安信的SharpWMI和香山师傅的WMIHACKER项目来的灵感


  • 奇安信的SharpWMI


可以看到,该项目的Todo,依旧想的是围绕注册表去进行修改,为此我们先把注册表传输文件放一边


  • WMIHACKER的文件传输部分



令人意外的是,我们域渗透的龙头老大哥HarmJ0y,于早些年前写了一个SharpWMI项目,并且里面用到的文件上传方法是把数据写到一个自己创建的WMI Class里面的properties

  •    


这个工具很不错,基本上该有的功能都有了,但是缺了PTH,来,是时候拥抱impacket了,我们也确立好了明确的目标,首先是创建wmi类

我们首先想到得就是impacket远程调用 IWbemServices::PutClass 方法,然后boom,就创建好了一个类,但是难题来了,PutClass要求我们传入三个value,且第一个pObject类型的值已经难倒我了,因为实在不知道impacket怎么去生成这个值



  • 后面去看了issues,发现也有一个师傅问了相同的问题


期间自己也试了很多次方法,impacketwmi.py也看了很久,无奈自己琢磨不出来,依旧创建不成类,难道就没有其他方法了吗?通过查找其他issues,有另外的大哥是通过powershell去创建一个wmi类,但是还是没有采取他的方法,因为实战powershell很容易被杀

  • 但,回想起WMIHACKER的免杀横向思路,是通过事件订阅去执行VBSVBS再去执行cmd,达到的免杀横向目的,如果我们用VBS去创建一个类,那也是免杀的,然后就按照思路去谷歌,你猜怎么着,答案就藏在微软的官方文档里   


有了VBS脚本,我们可以修改一下,变成我们想要的,如下图所示,CreationClassName可以用来表示唯一key值,而DebugOptions可以用来存储数据,并且在创建完成类后,在里面接着创建一个叫Backup的实例,用来判断是否创建类成功

类的properties如下图所示   

目前,创建类的思路已经齐全了,我们可以回到impacket,自己定义一个创建类的方法,思路就是,用wmi事件执行vbs,然后使用iWbemServices.GetObject方法去直接调用实例,判断类是否存在,存在的话,删除刚刚的事件订阅

impacket除了iWbemServices.GetObject("win32_process")的写法,还可可以直接调用实例 iWbemServices.GetObject('win32_process.Handle="0"')删除类就好办了,直接调用 iWbemServices.DeleteClass 即可


改造点2:文件传输第二步-上传/下载

有了前面的思路,大致的上传和下载思路就出来了

上传文件:我们可以不用创建类,直接把文件base64编码后,放入到vbs脚本里面,然后事件订阅执行解码和释放文件,但是注意,impacket在创建wmi实例,如果string类型的属性内容过大,传输会变得很慢很慢,同理,针对上传大文件,真的没什么好方法去解决速度

演示截图,上传了2兆的文件

下载文件:下载文件的话,就用回VBS远程创建类,然后VBS把目标文件base64编码,接着VBS在新建的类里面创建一个实例,把内容写进入(注意不能写到key属性里面)


然后用个函数封装起来,漂漂亮亮

演示截图,下载了2兆的文件


添加模块:防火墙模块

主要是玩转MSFT_NetProtocolPortFilter, MSFT_NetFirewallRule, MSFT_NetFirewallProfile这三个类,目前实现了启用禁用删除某条规则,MSFT_NetProtocolPortFilterMSFT_NetFirewallRule 这个两个类属性里面的InstanceID是关联的,然后动动手指,就可以写出一个基于端口查找防火墙规则的一个东西

演示如下,查找445端口的规则,rule id如下 {D13E226E-A4C0-4CD3-A4E1-17B5948121DE}

445此时是联不通的

然后,直接禁用规则,445联通了

你还可以删除它,之后就找不到了

还可以禁用全部防火墙的profile


聪明的你来到这里,一定发现了,怎么没有添加规则?这里就是就涉及到了impacket的问题了,impacket目前还不能发送string类型array,如果你愿意研究一下,可以看看我提的issueshttps://github.com/fortra/impacket/issues/1514

还有一个问题,如果你的防火墙名称里面有中文,windows数据包只支持latin-1,如果不好采有中文,那会报错,解决办法就是,重写防火墙规则的名称(用latin-1编码一遍结果看看有没有报错,报错代表有中文)

但是你可以更加恶意点,直接设置个空格,管理员怎么点都会报错

创建一个中文名字的防火墙规则,禁用端口445

获取规则ID

禁用

可以看到变成一片空了

点进去就报错


可能你会说,噢,那我改回来不就ok了吗,但是遇到系统自定义的规则呢?改系统自定义的,留空,就纯恶心管理员了

留空后


添加模块:RDP Wrapper

RDP这个就好解决了,设置个认证等级RPC_C_AUTHN_LEVEL_PKT_PRIVACY,然后直接改对应的值,第一个1代表开启rdp,第二个1代表同时配置防火墙

开启 Restricted Admin Mode 和查找 RDP端口就好办了,直接调用 StdRegProv类,一把梭


添加模块:WINRM Wrapper

WINRM也很好弄,调用 win32_service 开启winrm服务,然后同时调用上述防火墙模块配置好防火墙规则,系统内置了winrm的防火墙规则的,只需要enable它即可


添加模块:AMSI 绕过

这个模块只是在注册表创建一个名为 AmsiEnable的键值对,实际有没有用还需要自己测试,来源于blackhat asia 2018Tal-Liberman的分享(实际上有没有用,我还没测试过,看GhostPackSharpWMI添加了这个,我也加上一个)


模块改进:命令执行

延续上一个项目 wmiexec-RegOut中的 wmipersist-Modify.py的思路,执行WMIHACKERVBS模板,但是不同以往的是,这次选择把命令执行结果写到自己创建的类里面

注意,命令执行到这里不是程序卡住了,等一会即可,后续再去执行命令就很快了,应该是和EventFilterWQL语句有关,需要排查一下


WMI爆破

恰好之前着手给CME写了个WMI协议

一次经典的实战案例,有个内网里面445/139全部关闭,管理员又恰好只开放了135,不小心你就错过了很多咯

CME官方PR了,但是作者一直没通过 : 

https://github.com/Porchetta-Industries/CrackMapExec/pull/657


Outro

程序中还有很多不足的地方,例如命令执行这里,看GhostPackSharpWMI的历史commit中,Ridter师傅用的回显方法是把命令执行结果写到已存在的类且无关重要的属性中,后续也可以根据这个思路继续修改

  • Impacket调用PutClass实在是不懂怎么用

  • 本人只测试了有Defender / 火绒 / 360的情况下横向,结果都没触发告警


项目链接:https://github.com/XiaoliChan/wmiexec-Pro

希望有看完的大哥觉得还不错的话可以给小弟我点个star




关注公众号后台回复 0001 领取域渗透思维导图,0002 领取VMware 17永久激活码,0003 获取SGK地址,0004 获取在线ChatGPT地址,0005 获取 Windows10渗透集成环境



扫描二维码加入交流群




往期推荐



利用SourceMap还原前端代码

国内知名黑客论坛t00ls遭遇15亿次CC攻击

从星链到ChatPGT,为什么我们总在误判美国科技与经济的发展?

记一次睡梦中某核酸检测系统的渗透测试

疑似境外黑客组织对CSDN、吾爱破解、bilibili等网站发起DDoS攻击

Fofa新产品 - 绕CDN溯源真实IP!


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存