diff --git a/conpot/protocols/modbus/modbus_server.py b/conpot/protocols/modbus/modbus_server.py index 5400b105..e0929bc2 100644 --- a/conpot/protocols/modbus/modbus_server.py +++ b/conpot/protocols/modbus/modbus_server.py @@ -134,10 +134,26 @@ def handle(self, sock, address): session.add_event({"type": "CONNECTION_TERMINATED"}) break _, _, length = struct.unpack(">HHH", request[:6]) + previous_request = None + stall_counter = 0 + # Implemented fix proposed by Kevalz95, Issue #564 + # Adds stall counter to prevent infinite loop on malformed requests while len(request) < (length + 6): try: + # Previous request now assigned before recv() called, length check performed after + previous_request = request new_byte = sock.recv(1) request += new_byte + if previous_request and len(previous_request) == len(request): + stall_counter += 1 + if stall_counter >= 1000: + logger.info( + "Modbus client provided data {} but invalid.".format( + session.id + ) + ) + session.add_event({"type": "CONNECTION_TERMINATED"}) + break except Exception: break query = modbus_tcp.TcpQuery()