finish MCS server side begin pdu and lic

This commit is contained in:
citronneur
2014-07-20 21:06:29 +02:00
parent 093822815b
commit 16b9aba7a5
3 changed files with 74 additions and 24 deletions

View File

@@ -204,6 +204,16 @@ class LicPacket(CompositeType):
self.licensingMessage = message self.licensingMessage = message
def createValidClientLicensingErrorMessage():
"""
Create a licensing error message that accept client
server automata message
"""
message = LicensingErrorMessage()
message.dwErrorCode.value = ErrorCode.STATUS_VALID_CLIENT
message.dwStateTransition.value = StateTransition.ST_NO_TRANSITION
return LicPacket(message = message)
def createNewLicenseRequest(serverLicenseRequest): def createNewLicenseRequest(serverLicenseRequest):
""" """
Create new license request in response to server license request Create new license request in response to server license request

View File

@@ -450,9 +450,13 @@ class MCS(LayerAutomata):
log.info("MCS DISCONNECT_PROVIDER_ULTIMATUM") log.info("MCS DISCONNECT_PROVIDER_ULTIMATUM")
self._transport.close() self._transport.close()
return return
elif not self.readMCSPDUHeader(opcode.value, DomainMCSPDU.SEND_DATA_INDICATION): #client case
raise InvalidExpectedDataException("Invalid expected MCS opcode") elif self._mode == LayerMode.CLIENT and not self.readMCSPDUHeader(opcode.value, DomainMCSPDU.SEND_DATA_INDICATION):
raise InvalidExpectedDataException("Invalid expected MCS opcode for server to client communication")
elif self._mode == LayerMode.SERVER and not self.readMCSPDUHeader(opcode.value, DomainMCSPDU.SEND_DATA_REQUEST):
raise InvalidExpectedDataException("Invalid expected MCS opcode for client to server communication")
#server user id #server user id
per.readInteger16(data, Channel.MCS_USERCHANNEL_BASE) per.readInteger16(data, Channel.MCS_USERCHANNEL_BASE)

View File

@@ -491,13 +491,13 @@ class RDPInfo(CompositeType):
self.cbAlternateShell = UInt16Le(lambda:sizeof(self.alternateShell) - 2) self.cbAlternateShell = UInt16Le(lambda:sizeof(self.alternateShell) - 2)
self.cbWorkingDir = UInt16Le(lambda:sizeof(self.workingDir) - 2) self.cbWorkingDir = UInt16Le(lambda:sizeof(self.workingDir) - 2)
#microsoft domain #microsoft domain
self.domain = String(readLen = UInt16Le(lambda:self.cbDomain.value - 2), unicode = True) self.domain = String(readLen = UInt16Le(lambda:self.cbDomain.value + 2), unicode = True)
self.userName = String(readLen = UInt16Le(lambda:self.cbUserName.value - 2), unicode = True) self.userName = String(readLen = UInt16Le(lambda:self.cbUserName.value + 2), unicode = True)
self.password = String(readLen = UInt16Le(lambda:self.cbPassword.value - 2), unicode = True) self.password = String(readLen = UInt16Le(lambda:self.cbPassword.value + 2), unicode = True)
#shell execute at start of session #shell execute at start of session
self.alternateShell = String(readLen = UInt16Le(lambda:self.cbAlternateShell.value - 2), unicode = True) self.alternateShell = String(readLen = UInt16Le(lambda:self.cbAlternateShell.value + 2), unicode = True)
#working directory for session #working directory for session
self.workingDir = String(readLen = UInt16Le(lambda:self.cbWorkingDir.value - 2), unicode = True) self.workingDir = String(readLen = UInt16Le(lambda:self.cbWorkingDir.value + 2), unicode = True)
self.extendedInfo = RDPExtendedInfo(conditional = extendedInfoConditional) self.extendedInfo = RDPExtendedInfo(conditional = extendedInfoConditional)
class RDPExtendedInfo(CompositeType): class RDPExtendedInfo(CompositeType):
@@ -1065,16 +1065,19 @@ class PDULayer(LayerAutomata, tpkt.FastPathListener):
caps.CapsType.CAPSTYPE_SOUND : caps.Capability(caps.CapsType.CAPSTYPE_SOUND, caps.SoundCapability()) caps.CapsType.CAPSTYPE_SOUND : caps.Capability(caps.CapsType.CAPSTYPE_SOUND, caps.SoundCapability())
} }
#share id between client and server #share id between client and server
self._shareId = 0 self._shareId = 0x103EA
def connect(self): def connect(self):
""" """
Connect event in client mode send logon info Connect event in client mode send logon info
Next state receive license PDU Next state receive license PDU
""" """
self.sendInfoPkt() if self._mode == LayerMode.CLIENT:
#next state is license info PDU self.sendInfoPkt()
self.setNextState(self.recvLicenceInfo) #next state is license info PDU
self.setNextState(self.recvLicenceInfo)
else:
self.setNextState(self.recvInfoPkt)
def close(self): def close(self):
""" """
@@ -1082,24 +1085,35 @@ class PDULayer(LayerAutomata, tpkt.FastPathListener):
""" """
self.sendDataPDU(ShutdownRequestPDU()) self.sendDataPDU(ShutdownRequestPDU())
def sendInfoPkt(self): def recvInfoPkt(self, data):
""" """
Send a logon info packet Receive info packet from client
Client credential
@param data: Stream
""" """
#always send extended info because rdpy only accept RDP version 5 and more securityFlag = UInt16Le()
self._transport.send((UInt16Le(SecurityFlag.SEC_INFO_PKT), UInt16Le(), self._info)) securityFlagHi = UInt16Le()
data.readType((securityFlag, securityFlagHi))
if not (securityFlag.value & SecurityFlag.SEC_INFO_PKT):
raise InvalidExpectedDataException("Waiting info packet")
data.readType(self._info)
#next state send error license
self.sendLicensingErrorMessage()
self.sendDemandActivePDU()
def recvLicenceInfo(self, data): def recvLicenceInfo(self, data):
""" """
Read license info packet and check if is a valid client info Read license info packet and check if is a valid client info
@param data: Stream @param data: Stream
""" """
#license preambule #packet preambule
securityFlag = UInt16Le() securityFlag = UInt16Le()
securityFlagHi = UInt16Le() securityFlagHi = UInt16Le()
data.readType((securityFlag, securityFlagHi)) data.readType((securityFlag, securityFlagHi))
if securityFlag.value & SecurityFlag.SEC_LICENSE_PKT != SecurityFlag.SEC_LICENSE_PKT: if not (securityFlag.value & SecurityFlag.SEC_LICENSE_PKT):
raise InvalidExpectedDataException("Waiting license packet") raise InvalidExpectedDataException("Waiting license packet")
validClientPdu = lic.LicPacket() validClientPdu = lic.LicPacket()
@@ -1134,6 +1148,9 @@ class PDULayer(LayerAutomata, tpkt.FastPathListener):
self._serverCapabilities[cap.capabilitySetType] = cap self._serverCapabilities[cap.capabilitySetType] = cap
self.sendConfirmActivePDU() self.sendConfirmActivePDU()
#send synchronize
self.sendClientFinalizeSynchronizePDU()
self.setNextState(self.recvServerSynchronizePDU)
def recvServerSynchronizePDU(self, data): def recvServerSynchronizePDU(self, data):
""" """
@@ -1197,7 +1214,6 @@ class PDULayer(LayerAutomata, tpkt.FastPathListener):
#http://msdn.microsoft.com/en-us/library/cc240454.aspx #http://msdn.microsoft.com/en-us/library/cc240454.aspx
self.setNextState(self.recvDemandActivePDU) self.setNextState(self.recvDemandActivePDU)
def recvFastPath(self, fastPathData): def recvFastPath(self, fastPathData):
""" """
Implement FastPathListener interface Implement FastPathListener interface
@@ -1235,6 +1251,30 @@ class PDULayer(LayerAutomata, tpkt.FastPathListener):
if updateDataPDU.updateType.value == UpdateType.UPDATETYPE_BITMAP: if updateDataPDU.updateType.value == UpdateType.UPDATETYPE_BITMAP:
self._clientListener.onUpdate(updateDataPDU.updateData.rectangles._array) self._clientListener.onUpdate(updateDataPDU.updateData.rectangles._array)
def sendInfoPkt(self):
"""
Send a logon info packet
client automata message
"""
self._transport.send((UInt16Le(SecurityFlag.SEC_INFO_PKT), UInt16Le(), self._info))
def sendLicensingErrorMessage(self):
"""
Send a licensing error message
server automata message
"""
self._transport.send((UInt16Le(SecurityFlag.SEC_LICENSE_PKT), UInt16Le(), lic.createValidClientLicensingErrorMessage()))
def sendDemandActivePDU(self):
"""
Send server capabilities
server automata PDU
"""
demandActivePDU = DemandActivePDU()
demandActivePDU.shareId.value = self._shareId
demandActivePDU.capabilitySets._array = self._serverCapabilities.values()
self.sendPDU(demandActivePDU)
def sendPDU(self, pduMessage): def sendPDU(self, pduMessage):
""" """
Send a PDU message to transport layer Send a PDU message to transport layer
@@ -1281,8 +1321,6 @@ class PDULayer(LayerAutomata, tpkt.FastPathListener):
confirmActivePDU.shareId.value = self._shareId confirmActivePDU.shareId.value = self._shareId
confirmActivePDU.capabilitySets._array = self._clientCapabilities.values() confirmActivePDU.capabilitySets._array = self._clientCapabilities.values()
self.sendPDU(confirmActivePDU) self.sendPDU(confirmActivePDU)
#send synchronize
self.sendClientFinalizeSynchronizePDU()
def sendClientFinalizeSynchronizePDU(self): def sendClientFinalizeSynchronizePDU(self):
""" """
@@ -1305,8 +1343,6 @@ class PDULayer(LayerAutomata, tpkt.FastPathListener):
fontListPDU = FontListDataPDU() fontListPDU = FontListDataPDU()
self.sendDataPDU(fontListPDU) self.sendDataPDU(fontListPDU)
self.setNextState(self.recvServerSynchronizePDU)
def sendInputEvents(self, pointerEvents): def sendInputEvents(self, pointerEvents):
""" """
send client input events send client input events