1%ENIP Tests 2 3+Syntax check 4= Import the enip layer 5 6from scapy.contrib.enipTCP import * 7#from scapy.all import * 8 9 10+ Test ENIP/TCP Encapsulation Header 11= Encapsulation Header Default Values 12pkt=ENIPTCP() 13assert pkt.commandId == None 14assert pkt.length == 0 15assert pkt.session == 0 16assert pkt.status == None 17assert pkt.senderContext == 0 18assert pkt.options == 0 19 20 21+ ENIP List Services 0x0004 22= ENIP List Services Reply Command ID 23pkt=ENIPTCP() 24pkt.commandId=0x4 25assert pkt.commandId == 0x4 26 27= ENIP List Services Default Values 28pkt=ENIPListServices() 29assert pkt.itemCount == 0 30 31= ENIP List Services Custom Values 32pkt.items.append(ENIPListServicesItem(serviceName=b'test')) 33assert pkt.items[0].itemTypeCode == 0 34assert pkt.items[0].itemLength == 0 35assert pkt.items[0].protocolVersion == 0 36assert pkt.items[0].flag == 0 37assert pkt.items[0].serviceName == b'test' 38 39 40+ ENIP List Identity 0x0063 41= ENIP List Identity Reply Command ID 42pkt=ENIPTCP() 43pkt.commandId=0x63 44assert pkt.commandId == 0x63 45assert raw(pkt) == b"c\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ 46b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" 47 48= ENIP List Identity Default Values 49pkt=ENIPListIdentity() 50assert pkt.itemCount == 0 51 52= ENIP List Identity Custom Values 53pkt=ENIPListIdentityItem(sinAddress="192.168.1.1", 54 productNameLength=4, productName=b"test") 55assert pkt.protocolVersion == 0 56assert pkt.sinAddress == "192.168.1.1" 57assert pkt.productNameLength == 4 58assert pkt.productName == b'test' 59 60 61+ ENIP List Interfaces 62= ENIP List Interfaces Reply Command ID 63pkt=ENIPTCP() 64pkt.commandId=0x64 65assert pkt.commandId == 0x64 66 67= ENIP List Interfaces Reply Default Values 68pkt=ENIPListInterfaces() 69assert pkt.itemCount == 0 70 71= ENIP List Interfaces Reply Items Default Values 72pkt=ENIPListInterfacesItem(itemTypeCode=0x0c) 73assert pkt.itemTypeCode == 0x0c 74assert pkt.itemLength == 0 75assert pkt.itemData == b'' 76 77 78+ ENIP Register Session 79= ENIP Register Session Command ID 80pkt=ENIPTCP() 81pkt.commandId=0x65 82assert pkt.commandId == 0x65 83 84= ENIP Register Session Default Values 85pkt=ENIPRegisterSession() 86assert pkt.protocolVersion == 1 87assert pkt.options == 0 88 89= ENIP Register Session Request 90registerSessionReqPkt = b'\x65\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00' 91 92pkt = ENIPTCP(registerSessionReqPkt) 93assert pkt.commandId == 0x65 94assert pkt.length == 4 95assert pkt.session == 0 96assert pkt.status == 0 97assert pkt.senderContext == 0 98assert pkt.options == 0 99assert pkt[ENIPRegisterSession].protocolVersion == 1 100assert pkt[ENIPRegisterSession].options == 0 101 102= ENIP Register Session Reply 103registerSessionRepPkt = b'\x65\x00\x04\x00\x7b\x9a\x4e\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00' 104 105pkt = ENIPTCP(registerSessionRepPkt) 106assert pkt.commandId == 0x65 107assert pkt.length == 4 108assert pkt.session == 0xa14e9a7b 109assert pkt.status == 0 110assert pkt.senderContext == 0 111assert pkt.options == 0 112assert pkt[ENIPRegisterSession].protocolVersion == 1 113assert pkt[ENIPRegisterSession].options == 0 114raw(pkt) 115 116 117+ ENIP Send RR Data 118= ENIP Send RR Data Command ID 119pkt=ENIPTCP() 120pkt.commandId=0x6f 121assert pkt.commandId == 0x6f 122 123= ENIP Send RR Data Default Values 124pkt=ENIPSendRRData() 125assert pkt.interface == 0 126assert pkt.timeout == 255 127assert pkt.itemCount == 0 128 129= ENIP Send RR Data Request 130sendRRDataReqPkt = b'\x6f\x00\x3e\x00\x7b\x9a\x4e\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\xb2\x00\x2e\x00' 131pkt = ENIPTCP(sendRRDataReqPkt) 132assert pkt.commandId == 0x6f 133assert pkt.length == 62 134assert pkt.session == 0xa14e9a7b 135assert pkt.status == 0 136assert pkt.senderContext == 0 137assert pkt.options == 0 138assert pkt.interface == 0 139assert pkt.timeout == 0 140assert pkt.itemCount == 2 141 142= ENIP Send RR Data Reply 143sendRRDataRepPkt = b'\x6f\x00\x2e\x00\x7b\x9a\x4e\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x02\x00\x00\x00\x00\x00\xb2\x00\x1e\x00' 144 145pkt = ENIPTCP(sendRRDataRepPkt) 146assert pkt.commandId == 0x6f 147assert pkt.length == 46 148assert pkt.session == 0xa14e9a7b 149assert pkt.status == 0 150assert pkt.senderContext == 0 151assert pkt.options == 0 152assert pkt.interface == 0 153assert pkt.timeout == 1024 154assert pkt.items[0].typeId == 0 155assert pkt.items[0].length == 0 156assert pkt.items[1].typeId == 0x00b2 157assert pkt.items[1].length == 30 158 159 160+ ENIP Send Unit Data 161= ENIP Send Unit Data Command ID 162pkt=ENIPTCP() 163pkt.commandId=0x70 164assert pkt.commandId == 0x70 165 166= ENIP Send Unit Data Default Values 167pkt=ENIPSendUnitData() 168assert pkt.interface == 0 169assert pkt.timeout == 255 170assert pkt.itemCount == 0 171 172= ENIP Send Unit Data 173sendUnitDataPkt = b'\x70\x00\x2d\x00\x7b\x9a\x4e\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xa1\x00\x04\x00\xcc\x60\x9a\x7b\xb1\x00\x19\x00\x01\x00' 174 175pkt = ENIPTCP(sendUnitDataPkt) 176assert pkt.commandId == 0x70 177assert pkt.length == 45 178assert pkt.session == 0xa14e9a7b 179assert pkt.status == 0 180assert pkt.senderContext == 0 181assert pkt.options == 0 182assert pkt.interface == 0 183assert pkt.timeout == 0 184assert pkt.itemCount == 2 185 186assert pkt.items[0].typeId == 0x00a1 187assert pkt.items[0].length == 4 188assert pkt.items[0].data == b'\x7b\x9a\x60\xcc' 189assert pkt.items[1].typeId == 0x00b1 190assert pkt.items[1].length == 25 191assert pkt.items[1].data == b'\x00\x01' 192