SMB 协议详解之-process/user/session/tree/message/file ID原理和数据包分析技巧

本文主要是介绍SMB 协议详解之-process/user/session/tree/message/file ID原理和数据包分析技巧,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在前面分析SMB协议数据包的过程中,《网络攻防协议实战分析》专栏,这里和《SMB攻击流量数据包分析》专栏,这里,可以看到在SMB协议中存在很多的ID,即Unique Identifiers。那么这些ID表示什么含义?在实际分析数据包的过程中如何根据这些ID进行过滤分析?本文将介绍SMB/SMB2中的process id,User/session id,tree id ,File id,Message ID。并介绍如何通过各种 id 快速的分析SMB数据包中各种命令交互所表示的业务逻辑。

数据包

使用的数据包包含SMB和SMB2协议两种,如下:
SMB协议使用的pcap数据来自于wireshark sample,这里,对smbtorture.cap.gz数据包中的tcp.stream eq 0流, 如下:
在这里插入图片描述
SMB2协议使用的pcap数据来自于wireshark sample,这里,smb2-peter.pcap数据包中的tcp.stream eq 0流, 如下:
在这里插入图片描述
本文的分析主要以SMB2的数据包为主,SMB类似。

各种ID

在前面的介绍SMB协议的过程中,可知承载SMB协议的协议可以是TCP,NetBios,QUIC等,即传输层协议可以使TCP或者UDP,但是传输层只是定义了服务到服务的连接,也就是应用程序到应用程序的连接。对于应用程序内部不同的操作和事务之间的连接,通过传输层是无法区分的,因此就需要SMB在应用层协议加以区分。因此在SMB协议内部就定义了 process ID,User/session ID,tree ID,fileID ,message ID来区分不同粒度操作和事务。

  • process ID 是SMB连接的标识,表示不同的SMB连接。
  • Tree ID是share层次的标识,的目的就是区分不同的share连接,在之前的文章有所介绍,见这里。
  • User ID 是用户层次的标识,表示SMB认证用户的标识,到了SMB2中变成了session id。
  • File ID是文件层次的标识,表示执行的文件句柄。
  • message ID是命令层次的标识,表示执行的命令对。

进程层次标识 Process ID

由于一个TCP上可能承载不同的SMB连接,为了区分一个TCP上不同的SMB连接,因此使用process ID 表示对应的SMB connection,该ID在SMB连接一开始就分配,如下:
在这里插入图片描述
可以看到在SMB的协议协商阶段,客户端就分配了该进程ID,后续基于该SMB连接的都是用该ID。新的SMB连接则会采用新的ID。

用户层次标识Session/User ID

由于SMB连接上可能出现多个用户的认证请求,因此在SMB2中使用session ID 表示对应的用户,SMB中是user ID 表示对应的用户。因此session ID往往是在用户认证的时候进行分配,如下:
在这里插入图片描述
在这里插入图片描述

上图可以看到在SMB2 SESSION_SETUP Request之前session id 为0,开始认证之后,服务器生成了表示该用户的session ID 。在smbtorture.cap.gz使用user id表示同样内容,可以查看之。

共享层次表示 Tree ID

由于SMB连接上可能出现不同的共享连接请求,因此使用在SMB2中使用treeID 表示对应的共享,即SMB2 TREE_CONNECT Request请求后分配。关于tree id 的详细解释,详见《SMB 协议详解之-TreeID原理和SMB数据包分析技巧》,这里。

文件层次标识 File ID

由于SMB连接上可能出现对不同文件的操作,因此使用File ID表示对应操作的文件,即像SMB2 CREATE Request Response请求后分配,如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

上图可以看到104数据包返回了文件的file ID,106数据包查询该文件信息以及108数据包关闭该文件都是用该文件ID。不同的文件具备不同的文件ID。

命令文件层次标识 Message ID

由于SMB连接上会出现对不同的命令请求和响应,因此在SMB2中使用Message ID表示相关的命令对,即像不同的SMB2 QUERY_INFO Request 请求和SMB2 QUERY_INFO Response响应使用不同的Message id表示不同命令对,如下:

在这里插入图片描述

在这里插入图片描述
上图可以看到数据包43,44使用messsage id 5表示一对命令,数据包45,46使用Message id 6表示一对命令。当然除了信息查询的操作之外,还可以进行文件创建,目录创建,文件搜索等等操作,具体可以使用的命令操作详细可以查看这里,如下:
在这里插入图片描述

Wireshark分析小技巧

在日常的SMB数据包分析的过程中,常见的wireshark技巧是,基于该tree ID 过滤,就可以当得知用户在该路径上做了哪些操作,如下:
在这里插入图片描述
可以看到在2048这个tree id 对应的路径\192.168.114.129\TEST上,产生了文件删除,目录创建,文件写入等操作。因此通过过滤对应的tree id ,结合该tree id上执行的命令,以及本专栏《网络攻防协议实战分析》前面介绍的SMB协议上的用户认证的信息,这里。就可以知道是哪个用户,对于哪个路径下的文件,做了哪些操作。即通过tree id的过程就能够快速了解SMB数据包中的业务逻辑,实现对于SMB数据包中关于share操作部分的解读。

同样也可以通过process id,session id,File id,Message id等过滤,实现不同粒度的操作分析。

以上就是SMB协议中 各种 id相关内容的介绍,希望对你日常工作有所帮助。

本文为CSDN村中少年原创文章,未经允许不得转载,博主链接这里。

这篇关于SMB 协议详解之-process/user/session/tree/message/file ID原理和数据包分析技巧的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/994590

相关文章

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

MySQL中between and的基本用法、范围查询示例详解

《MySQL中betweenand的基本用法、范围查询示例详解》BETWEENAND操作符在MySQL中用于选择在两个值之间的数据,包括边界值,它支持数值和日期类型,示例展示了如何使用BETWEEN... 目录一、between and语法二、使用示例2.1、betwphpeen and数值查询2.2、be

python中的flask_sqlalchemy的使用及示例详解

《python中的flask_sqlalchemy的使用及示例详解》文章主要介绍了在使用SQLAlchemy创建模型实例时,通过元类动态创建实例的方式,并说明了如何在实例化时执行__init__方法,... 目录@orm.reconstructorSQLAlchemy的回滚关联其他模型数据库基本操作将数据添

Java中ArrayList与顺序表示例详解

《Java中ArrayList与顺序表示例详解》顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构,:本文主要介绍Java中ArrayList与... 目录前言一、Java集合框架核心接口与分类ArrayList二、顺序表数据结构中的顺序表三、常用代码手动

Spring Boot Interceptor的原理、配置、顺序控制及与Filter的关键区别对比分析

《SpringBootInterceptor的原理、配置、顺序控制及与Filter的关键区别对比分析》本文主要介绍了SpringBoot中的拦截器(Interceptor)及其与过滤器(Filt... 目录前言一、核心功能二、拦截器的实现2.1 定义自定义拦截器2.2 注册拦截器三、多拦截器的执行顺序四、过

JAVA线程的周期及调度机制详解

《JAVA线程的周期及调度机制详解》Java线程的生命周期包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED,线程调度依赖操作系统,采用抢占... 目录Java线程的生命周期线程状态转换示例代码JAVA线程调度机制优先级设置示例注意事项JAVA线程

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

C++构造函数中explicit详解

《C++构造函数中explicit详解》explicit关键字用于修饰单参数构造函数或可以看作单参数的构造函数,阻止编译器进行隐式类型转换或拷贝初始化,本文就来介绍explicit的使用,感兴趣的可以... 目录1. 什么是explicit2. 隐式转换的问题3.explicit的使用示例基本用法多参数构造

Android使用java实现网络连通性检查详解

《Android使用java实现网络连通性检查详解》这篇文章主要为大家详细介绍了Android使用java实现网络连通性检查的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录NetCheck.Java(可直接拷贝)使用示例(Activity/Fragment 内)权限要求

MyBatis中的两种参数传递类型详解(示例代码)

《MyBatis中的两种参数传递类型详解(示例代码)》文章介绍了MyBatis中传递多个参数的两种方式,使用Map和使用@Param注解或封装POJO,Map方式适用于动态、不固定的参数,但可读性和安... 目录✅ android方式一:使用Map<String, Object>✅ 方式二:使用@Param