1515from pyrdp .enum import MCSChannelName , ParserMode , PlayerPDUType , ScanCode , SegmentationPDUType
1616from pyrdp .layer import ClipboardLayer , DeviceRedirectionLayer , LayerChainItem , RawLayer , \
1717 VirtualChannelLayer
18+ from pyrdp .layer .rdp .virtual_channel .dynamic_channel import DynamicChannelLayer
19+ from pyrdp .layer .segmentation import SegmentationObserver
1820from pyrdp .logging import RC4LoggingObserver
1921from pyrdp .logging .adapters import SessionLogger
2022from pyrdp .logging .observers import FastPathLogger , LayerLogger , MCSLogger , SecurityLogger , \
2527from pyrdp .mitm .ClipboardMITM import ActiveClipboardStealer , PassiveClipboardStealer
2628from pyrdp .mitm .config import MITMConfig
2729from pyrdp .mitm .DeviceRedirectionMITM import DeviceRedirectionMITM
30+ from pyrdp .mitm .DynamicChannelMITM import DynamicChannelMITM
2831from pyrdp .mitm .FastPathMITM import FastPathMITM
2932from pyrdp .mitm .FileCrawlerMITM import FileCrawlerMITM
3033from pyrdp .mitm .layerset import RDPLayerSet
3740from pyrdp .mitm .TCPMITM import TCPMITM
3841from pyrdp .mitm .VirtualChannelMITM import VirtualChannelMITM
3942from pyrdp .mitm .X224MITM import X224MITM
40- from pyrdp .recording import FileLayer , RecordingFastPathObserver , RecordingSlowPathObserver , \
41- Recorder
42-
43- from pyrdp .layer .segmentation import SegmentationObserver
43+ from pyrdp .parser .rdp .virtual_channel .dynamic_channel import DynamicChannelParser
44+ from pyrdp .recording import FileLayer , Recorder , RecordingFastPathObserver , \
45+ RecordingSlowPathObserver
4446
4547
4648class PacketForwarder (SegmentationObserver ):
@@ -238,6 +240,8 @@ def buildChannel(self, client: MCSServerChannel, server: MCSClientChannel):
238240 self .buildClipboardChannel (client , server )
239241 elif self .state .channelMap [channelID ] == MCSChannelName .DEVICE_REDIRECTION :
240242 self .buildDeviceChannel (client , server )
243+ elif self .state .channelMap [channelID ] == MCSChannelName .DYNAMIC_CHANNEL :
244+ self .buildDynamicChannel (client , server )
241245 else :
242246 self .buildVirtualChannel (client , server )
243247
@@ -330,7 +334,9 @@ def buildDeviceChannel(self, client: MCSServerChannel, server: MCSClientChannel)
330334 LayerChainItem .chain (client , clientSecurity , clientVirtualChannel , clientLayer )
331335 LayerChainItem .chain (server , serverSecurity , serverVirtualChannel , serverLayer )
332336
333- deviceRedirection = DeviceRedirectionMITM (clientLayer , serverLayer , self .getLog (MCSChannelName .DEVICE_REDIRECTION ), self .statCounter , self .state )
337+ deviceRedirection = DeviceRedirectionMITM (clientLayer , serverLayer ,
338+ self .getLog (MCSChannelName .DEVICE_REDIRECTION ),
339+ self .statCounter , self .state )
334340 self .channelMITMs [client .channelID ] = deviceRedirection
335341
336342 if self .config .enableCrawler :
@@ -339,6 +345,30 @@ def buildDeviceChannel(self, client: MCSServerChannel, server: MCSClientChannel)
339345 if self .attacker :
340346 self .attacker .setDeviceRedirectionComponent (deviceRedirection )
341347
348+ def buildDynamicChannel (self , client : MCSServerChannel , server : MCSClientChannel ):
349+ """
350+ Build the MITM component for the dynamic channel.
351+ Ref: https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-rdpedyc/0147004d-1542-43ab-9337-93338f218587
352+ :param client: MCS channel for the client side
353+ :param server: MCS channel for the server side
354+ """
355+
356+ clientSecurity = self .state .createSecurityLayer (ParserMode .SERVER , True )
357+ clientVirtualChannel = VirtualChannelLayer (activateShowProtocolFlag = False )
358+ clientLayer = DynamicChannelLayer (DynamicChannelParser (isClient = True ))
359+ serverSecurity = self .state .createSecurityLayer (ParserMode .CLIENT , True )
360+ serverVirtualChannel = VirtualChannelLayer (activateShowProtocolFlag = False )
361+ serverLayer = DynamicChannelLayer (DynamicChannelParser (isClient = False ))
362+
363+ clientLayer .addObserver (LayerLogger (self .getClientLog (MCSChannelName .DYNAMIC_CHANNEL )))
364+ serverLayer .addObserver (LayerLogger (self .getServerLog (MCSChannelName .DYNAMIC_CHANNEL )))
365+
366+ LayerChainItem .chain (client , clientSecurity , clientVirtualChannel , clientLayer )
367+ LayerChainItem .chain (server , serverSecurity , serverVirtualChannel , serverLayer )
368+
369+ dynamicChannelMITM = DynamicChannelMITM (clientLayer , serverLayer , self .getLog (MCSChannelName .DYNAMIC_CHANNEL ), self .statCounter , self .state )
370+ self .channelMITMs [client .channelID ] = dynamicChannelMITM
371+
342372 def buildVirtualChannel (self , client : MCSServerChannel , server : MCSClientChannel ):
343373 """
344374 Build a generic MITM component for any virtual channel.
0 commit comments