作者:SungLin@知道创宇404实验室
时间:2019年9月18日
原文链接:https://paper.seebug.org/1035/
0x00 信道的创建、连接与释放
通道的数据包定义在MCS Connect Inittial PDU with GCC Conference Create Request中,在rdp连接过程如下图所示:
信道创建数据包格式如下:
在MCS Connect Inittial中属于Client Network Data数据段,MS_T120
将会在连接一开始的时候通过函数termdd!_IcaRegisterVcBin
创建一个虚拟通道id是0x1f大小为0x18的结构体,之后就调用termdd!IcaCreateChannel
开始创建大小为0x8c的信道结构体之后将会与虚拟通道id是0x1f绑定,也就是这个结构体将会被我们利用
信道的定义字段主要是名字加上配置,配置主要包括了优先级等
在server对MCS Connect Inittial应答包,将会依次给出对应虚拟通道的id值:
在rdp内核中依次注册的值对应应该是0、1、2、3, MS_T120信道将会通过我们发送的用户虚拟id为3的值再一次绑定,首先通过termdd!_IcaFindVcBind找到了刚开始注册的虚拟通道id是0x1f,如下所示:
但是在termdd!_IcaBindChannel时,却将我们自定义的id值为3与信道结构体再一次绑定在一起了,此信道结构体就是MS_T120
同时我们自己的用户id将内部绑定的0x1f给覆盖了
我们往信道MS_T120发送数据主动释放其分配的结构体,其传入虚拟通道id值为3通过函数termdd!IcaFindChannel在channeltable中查找返回对应的信道结构体:
下图为返回的MS_T120信道结构体,其中0xf77b4300为此信道可调用的函数指针数组: