开始协议处理句柄_基于smb协议的wmiexec浅析

前言

之前研究过Crackmapexec这款工具,对这个工具基于smb协议的wmiexec执行方法产生的流量进行了分析,网上似乎还没有相关的文章,这里旨在抛砖引玉,简单梳理下整个过程,以初学者的视角,探索流量当中存在的奥妙之处。

前序知识

OPC协议

OPC协议:OPC是一种利用微软的COM/DCOM技术来达成自动化控制的协定,采用典型的C/S模式,针对硬件设备的驱动程序由硬件厂商完成,提供统一OPC接口标准的Server程序,软件厂商只需按照OPC标准接口编写Client程序就访问Server程序进行读写,即可实现与硬件设备的通信。与大多数应用层协议不同,OPC的基础协议DCOM协议使用动态端口机制,在真正建立数据连接之前通讯双方还需要协商需要使用的端口。

用一张网上的图来表示下:

075383c377dd6521e64abe745d3e9e94.png

上图中,OPC客户端使用5568作为源端口首先向OPC服务器的135端口发起连接,连接成功后再经过OPC服务器分配新端口1118,并通过接口ISystemActivator的方法RemoteCreateInstance的应答报文返回给客户端,之后客户端使用5569作为源端口向服务器的1118端口发起新的连接用来后面的真正数据的传输。为什么会是这个流程那是因为在Windows当中有一个运行在135端口的rpcss服务也就是dcom的激活服务负责协调本机所有com对象的激活,当本机激活时采用通过内核通信,无法捕获数据包,属于内部操作,只有当远程激活或远程重定向到本机激活这种方式才可以捕获到数据包.远程激活有2种方式,一种是采用CoCreateInstanceEx方式指定远程服务器和激活身份等参数调用rpscss的IRemoteSCMActivator接口的RemoteCreateInstance方法激活,或者CoGetClassObject等于调用rpscss的IRemoteSCMActivator接口的RemoteGetClassObject方法激活同样可选指定远程服务器和激活身份等参数,这里就是采取了调用rpscss的IRemoteSCMActivator接口的RemoteCreateInstance方法激活的方式

DCERPC

RPC是一种编程模型,主要用于应用程序实现远程过程调用,微软的DCEPRC即是对远程过程调用的一种实现和扩展,实际上Windows上的很多服务以RPC的形式对外提供调用接口,外部应用程序可以通过调用这些PRC接口来实现对特定服务的访问。DCERPC有多种不同的承载方式,如TCP、UDP、HTTP、SMB命名管道等,客户端通过不同的承载协议连接到指定的服务端,由UUID绑定(Bind)到需要使用的终端接口(endpoint/interface)上,再传递所需参数来调用接口上指定的方法(operation),服务端随后将执行结果封装到协议数据包中返回。当使用TCP作为承载协议时DCERPC的知名端口号为135。

在RPC中,不同的终端定义了各自的一系列操作方法以供被调用,这些终端由各自唯一的UUID作为标识,在DCERPC的Bind操作中指定UUID,以告诉服务端使用哪个终端接口,TCP三次握手连接建立之后,例如DCERPC的绑定操作中通过指定UUID为367ABB81-9844-35F1-AD32-98F038001003,该UUID对应的终端是SVCCTL(ServiceControl,与服务管理相关的调用)。

SMB协议可以由多种命令来承载DCE/MS RPC层数据,同样是139、445/TCP上的通信,因不同的SMB命令而导致不同的SMB层解码。

环境

攻击者:MAC-192.168.56.1受害者:Win7-192.168.56.3

执行命令方式

sudo cme smb 192.168.56.3 -u Administrator -p '123456' --exec-method wmiexec -x whoami

流量特征简要分析

1、Crackmapexec基于wmiexec执行命令,首先也是先建立smb连接,首先攻击者发送一个SMB negotiate protocolrequest请求数据包

在用户级共享(与之相对的是共享级共享)中"NTLM 0.12"是首选SMB dialect,也就是NTLM版本为0.12,如果在NEGTIATE Request中说了,我可以支持Dialect:202、210、300、302、311,对应版本即为SMB 2.02 2.1 3.0 3.0.2 3.1.1

在下图当中我们看到首选的确实为NTLM 0.12f080cb512ab0fb9a84681659804580f3.png

2、攻击者机器发起认证协商请求59a39994d839d0616cc87771fc0621b2.png

3、受害者机器发起响应,返回一个NTLM Server Challengebd5fb984b596c5503b9704d63a9fcb18.png

4、然后攻击者机器发送User Name、Host Name、Domain Name和response给受害者机器8f36f3d48007ac0f41bce0fbbfaa3c39.png

5、然后服务端返回,没有提示出错信息,说明成功建立连接了618879c0bb11dcc9c6520068b9efa283.png

6、我们会发现它是先进行了smb v1的认证之后,然后又进行了smb v2的认证bc877669e7be89fb08d9b451b2e60623.png

7、当攻击者和受害者完成了磋商和认证之后,它会发送一个tree connect andx rerquest SMB数据报并列出它想访问网络资源的名称8f376b9cc13db2a5ba5c570dd1316039.png

8、受害者机器会发送一个tree connect andx response应答数据报以表示此次连接是否被接受或拒绝,下图可以看到没有提示错误,说明连接成功ac0d492491a0a941c7d85bef01ec954f.png

9、下面是攻击者去告诉受害者这台机器,它想去连接svcctl服务29aaf4aa238d3e25b49c5872dbf9d61c.png

10、下面是响应内容f1105ec9d67422ce9c44caf96391d83c.png

11、接下来我们的攻击者机器开始进行DCERPC的绑定操作,通过指定UUID为367ABB81-9844-35F1-AD32-98F038001003,该UUID对应的终端是SVCCTL(ServiceControl,与服务管理相关的调用)0bfc75801401b037f4727172626ab7c4.png

12、接着我们攻击者机器收到了Bindack(12)报文,但是并不意味着BIND操作成功,要检查Ack result字段,解析Bindack报文时,务必判断Ack result字段是否 等于Acceptance(0),此时意味着BIND操作成功,Bind_ack(12)报文的RPC层大小与协议序列有关9b36276d68957f5ccd72e82a0a931a35.png

ee57db559a1ea58afc2be9f578f5469b.png

13、绑定操作完成后,将对选用的终端接口执行指定方法调用,调用方法通过opnum指定,调用SVCCTL中编号为15的方法,即OpenSCManagerW(调用参数已经过编码加密)789f5315d6ac1cdf523128ce88a55f03.png

14、然后受害者机器返回相应的响应信息,这里还没有用到OpenSCManagerW的返回的句柄只是流量当中存在这个过程所以做了下分析1312b451529eb9215c6971dd0b7198be.png

15、AUTH3之前的Bind的UUID为ISystemActivator(000001a0-0000-0000-c000-000000000046)代表协商的服务为IRemoteSCMActivator方式,因为后面将会调用RemoteCreateInstance就是属于IRemoteSCMActivator当中的方法2c0f7591e85d997d7129df113f587ce0.png

16、然后攻击者机器给受害者机器传递NTLM认证参数17dd2cf9616e2161872b9a99a44a4af5.png

17、然后攻击者机器使用RemoteCreateInstance(Opnum 4)方法为实际对象创建对象引用1bd819ac2a8a1f431822758921e3b8a5.png

18、接下来查看下受害者机器的响应,此处回复加密数据当中回复1030端口15287414c88f4e571c7bb8d8e6df2c22.png

19、所以后面我们的攻击者机器开始于受害者机器利用1030端口进行通信35d86e78a394389b647d2c2f398c1988.png

20、然后再去进行了DCERPC的绑定操作进行绑定相应的UUID:f309ad18-d86a-11d0-a075-00c04fb68820也就是我们的IWbemLevel1Login

c4ddede29c386b080105b920e9b5079d.png

21、接着我们攻击者机器收到了Bindack(12)报文,但是并不意味着BIND操作成功,要检查Ack result字段,解析Bindack报文时,务必判断Ack result字段是否 等于Acceptance(0),此时意味着BIND操作成功4d8fd5e299af09da22cdf4bb50bae183.png

22、进行了传递NTLM认证参数34cbb8174efadd3a2b1d91a9fed77095.png

23、然后调用了IWbemLevel1Login接口当中的Opnum为6的NTLMLogin方法,下面可以看到我们传递的参数的//./root/cimv2命名空间

HRESULT NTLMLogin( [in, unique, string] LPWSTR wszNetworkResource, [in, unique, string] LPWSTR wszPreferredLocale, [in] long lFlags, [in] IWbemContext* pCtx, [out] IWbemServices** ppNamespace );

07dcbad30aeccf7c2c597fb1f4f539f6.png

24、下面是返回响应的内容07dcbad30aeccf7c2c597fb1f4f539f6.png

25、接着调用了alter_context进行添加新的安全上下文,其实也就是新绑定了一个IRemUnknown UUID: 00000131-0000-0000-c000-0000000000467f47f0f3c65aa3844665b86fbf13f2ff.png

26、下面就是alert_context回复以及我们受害者机器发送AUTH3包进行认证d1d0ce5c3b55bdf0bd3b303e9a2ea229.png

27、然后调用了RemRelease方法请求在对象的指定接口数量上递减指定数量的引用计数,此处对我们之前引用的IWbemLevel1Login接口对象进行了销毁

HRESULT RemRelease( [in] unsigned short cInterfaceRefs, [in, size_is(cInterfaceRefs)] REMINTERFACEREF InterfaceRefs[] );

a5a4e719f755363bab77e5ffb613e244.png

c64a4f04af58b92ccc2da246957a3110.png

28、接着又去添加新的安全上下文,Interface UUID: 9556dc99-828c-11cf-a37e-00aa003240c7,这个接口对象其实就是IWbemServices,然后下面日常的响应、认证等操作315eb5588fdc2efacfffdc8e35d6a220.png

29、然后之后调用了Opnum为6的方法也就是GetObject方法,GetObject方法检索CIM类或CIM实例。此方法必须从与当前IWbemServices接口关联的名称空间中检索CIM对象,取得我们想要调用的Provider类型实例,他以一个IWbemClassObject类型指针返回,微软在WMI核心部件和微软WMI软件开发工具中包括了很多提供程序。我们最常用的是Win32提供程序(核心WMI),他用于处理Win32系统特征。CIM存储库把这些信息存储为以"Win32"为前缀的类中,他包含在root\CIMV2名字空间中。例如,Win32BIOS、Win32Service、Win32Process等等,所以下面的图当中可以看到,我们传入的是Win32_Process类

HRESULT GetObject( [in] const BSTR strObjectPath, [in] long lFlags, [in] IWbemContext* pCtx, [out, in, unique] IWbemClassObject* ppObject, [out, in, unique] IWbemCallResult* ppCallResult );

bf51e663e090ab2a8760051047693443.png

30、下面就是受害者机器给攻击者机器返回相应的响应结果519a2ea6b9c253121b78bc975f41eb4a.png

c5acdfecf58f7ed26400473fd15ca414.png

31、然后我们就会调用Opnum为24的ExecMethod来调用函数,下面可以看到调用的参数传递,之后在我们的Windows当中就会利用Wmiprvse来调用cmd执行命令

HRESULT ExecMethod( [in] const BSTR strObjectPath, [in] const BSTR strMethodName, [in] long lFlags, [in] IWbemContext* pCtx, [in] IWbemClassObject* pInParams, [out, in, unique] IWbemClassObject* ppOutParams, [out, in, unique] IWbemCallResult* ppCallResult );

bd548d1f621d095bfd5bfbd61475cb63.png

948476ce9880b10bb739248959ad38af.png

总结

此处通过对自己使用Crackmapexec的wmiexec模式过程当中产生的流量分析,对于DCOM激活的过程,以及基于DCERPC调用WMI程序的流程进行了梳理,如有错误之处还请指出,喜欢我们就关注我们吧

参考文章

https://www.anquanke.com/post/id/167057

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346460.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

apache camel_轻量级的开源集成:Apache Camel还是Spring集成?

apache camel首先,为全面披露信息,在过去的1.5年中, 我一直担任 FuseSource(现为Red Hat) 的顾问,为零售,运输,银行/金融等不同行业的大型和小型公司提供SOA和集成项目支持。我的专长…

科尔达服务101

我今天想写一篇简短的要点文章。 我真的很好奇我能多快出版此书。 所以走吧 这篇文章是关于Corda Services(使用Corda 3.2版)的。 这些是什么? 作为经常使用Spring的开发人员,我个人会说它们就像Beans。 Spring Beans可以做的还很…

intent隐式和显式_Neo4j:使隐式关系成为显式和双向关系

intent隐式和显式我最近阅读了Michal Bachman关于 Neo4j中双向关系的文章 ,他建议对于某些关系类型,我们对关系的方向不那么感兴趣,因此可以在查询时忽略它。 他使用以下示例显示Neo Technology和GraphAware之间的合作关系: 两家…

mysql读写分离 存储过程_基于maxscale的读写分离部署笔记

使用maxscale搭建的读写分离架构,后期还可以再结合MHA做master的故障转移,这样业务层面上不需要做任何的改动即可。基于connect方式的不要使用。从库延迟他还会继续分发请求过去,暂时不适合生产使用。实验演示:目前的主从结构&…

python读书笔记2000_流畅的Python读书笔记

特殊方法的存在是为了Python解释器调用的,你自己并不需要去调用他们,比如说my_object.len()这种写法是没有的,应该使用len(my_object)。在使用len(my_object)的时候,如果my_object是一个自定义类的对象,那么Python会自…

antd 3升级命令_是时候拥有一个你自己的命令行工具了

本篇博客主要介绍了如何使用commander, inquirer以及chalk从零开始,创建属于自己的命令行工具。0. 一分钟体验首先我们先花一分钟的时间,体验一下创建自己的命令行cli工具是什么感觉。0.1. 新建项目目录假如我们的项目名称叫hello-cli,使用如…

找不到要去的声明_老汉将行李袋交由他人看管 去了一趟卫生间找不到人了.........

春节走亲访友难免多喝两杯,但酒后乘车却容易造成财物遗失。目前正值春运返程高峰,从沧州女儿家返程回山东老家的蔡先生就因为中午多喝了几杯酒,便将装有12000元生活费的行李袋弄丢了。好在沧州火车站派出所民警最终将蔡先生的失物找回&#x…

java可视化压缩_web可视化技术发展(1/6)

EverCraft一直在关注Web可视化技术的发展,在本系列文章里,小编将对国外一篇感觉很不错的综述性文章进行翻译,供这一领域的爱好者相互学习。这篇paper的信息为:“Mwalongo, F., et al., State-of-the-Art Report in Web-based Visu…

屏幕坏点检测图片_电视屏幕出现坏点?行家会这样做!

液晶电视经常会有几个亮点或暗点,这些通常被称为电视坏点。作为强迫症患者,面对这些屏幕坏点我们应该怎么做?下面跟小智聊聊这个问题吧!首先,坏点形成的原因首先是因为液晶屏幕由很多点组成,每个点由RGB三原…

Java:GraalVM数据库流性能

GraalVM是JVM块的新成员。 它是一个开源虚拟机,能够同时运行多种编程语言,例如Java,Rust和JavaScript。 GraalVM还有一个新的内部代码优化器管道,在某些情况下,与其他JVM相比,它可以显着提高性能。 了解如何…

kubelet启动失败_kubelet 架构浅析

一、概要kubelet 是运行在每个节点上的主要的“节点代理”,每个节点都会启动 kubelet进程,用来处理 Master 节点下发到本节点的任务,按照 PodSpec 描述来管理Pod 和其中的容器(PodSpec 是用来描述一个 pod 的 YAML 或者 JSON 对象…

shell 提取sql 的字段名表名_SQL代码风格规范

作为新时代SQL Boy,大部分时间都是在写sql,很多时候看到别人写的代码实在是不规范,命名随便写,没有缩进,看起来很没有逻辑性,今天分享下我自己的一些规范,从这里修改而来。--名称:xx…

亚马逊ec2 实例删除_亚马逊免费使用套餐:在EC2 Linux实例上安装Tomcat 7

亚马逊ec2 实例删除Amazon Web Services提供了12个月的免费使用期限,使开发人员可以在云中运行任何他们想要的东西。 免费层包括14个服务,其中Web开发人员最关注EC2服务。 EC2是一项服务,通过停止和启动Windows和/或Linux的虚拟实例来提供可调…

使用混合多云每个人都应避免的3个陷阱(第4部分)

每天都在肆意宣传云,但每个人都应避免三个陷阱。 从云,混合云到混合多云,您被告知这是确保业务数字化未来的一种方式。 您必须做出的这些选择不会排除提高客户体验和敏捷交付这些应用程序的日常工作。 让我们开始一段旅程,仔细研…

Java,JavaFX的流畅设计风格拨动开关

嗨,这次我将在新版本的JMetro中讨论新的Toggle Switch样式。 拨动开关是一种近年来变得非常流行的控件。 我前一段时间在ControlsFX库中添加了JavaFX实现。 刚刚发布的JMetro版本4.1中提供了此新样式。 什么是拨动开关 在以前的文章中,我谈到了切换开…

python解析多层嵌套json_Python爬虫解析多个嵌套JSON,多级,json

Python爬虫解析多级嵌套json最近刚接触Python爬虫,正好最近肺炎在全国蔓延,所以准备从网站爬取肺炎实时数据,并解析自己想要的数据。获取json数据网址为 https://m.look.360.cn/events/feiyan爬取网址:def main():urlhttps://m.lo…

如何使用vps 异地组网_使用ZEROTIER异地组建内网(局域网)

一、注册账号(该网站打开比较慢,但并不影响组网后的网速)二、建立虚拟局域网网(获取Network ID)1.选择菜单栏的Networks菜单2.选择创建网络3.注意获取到的Network ID(需要在每台组网的电脑上加入这个network id)4.大部分设置默认就可以了.三、下载软件点菜单中的Dow…

编写一个watchdog.sh脚本_五大原因!为何要将Jupyter Notebook转换为python脚本?

全文共3360字,预计学习时长9分钟图源:unsplash大多数数据科学在线课程都把Jupyter Notebook作为教学媒介,这是因为初学者在Jupyter Notebook的单元格中编写代码,比编写包含类和函数的脚本更容易。另一个原因在于它使浏览和绘制数据…

java 多线程 总结_Java 多线程总结

昨天熬了个通宵,看了一晚上的视频,把java 的多线程相关技术重新复习了一遍,下面对学习过程中遇到的知识点进行下总结。首先我们先来了解一下进程、线程、并发执行的概念:进程是指:一个内存中运行的应用程序&#xff0c…

基本服务-使用大使网关

这是我对Knative服务进行实验的延续,这次是围绕在Knative服务应用程序之上构建网关。 这是基于我之前的两篇文章- 使用Knative部署Spring Boot App以及在Knative中进行服务到服务的调用 。 为什么在Knative应用程序之上使用网关 为了解释这一点,让我谈谈…