impacket
impacket copied to clipboard
dhcp.py: decode error "object has no attribute 'encode'"
Configuration
impacket version: HEAD Python version: 3.11 Target OS: Linux
Debug Output With Command String
dhcp = DhcpPacket(buffer)
print(dhcp)
Traceback (most recent call last):
File "/home/mdt/Source/emdete/honeypot/snooper/main.py", line 14, in learn_dhcp
dhcp = DHCP(buffer)
^^^^^^^^^^^^
File "/home/mdt/Source/oss/python/impacket/impacket/dhcp.py", line 148, in __init__
structure.Structure.__init__(self, data, alignment)
File "/home/mdt/Source/oss/python/impacket/impacket/structure.py", line 87, in __init__
self.fromString(data)
File "/home/mdt/Source/oss/python/impacket/impacket/structure.py", line 152, in fromString
self[field[0]] = self.unpack(field[1], data[:size], dataClassOrCode = dataClassOrCode, field = field[0])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mdt/Source/oss/python/impacket/impacket/structure.py", line 307, in unpack
return eval(dataClassOrCode, {}, fields)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "<string>", line 1, in <module>
File "/home/mdt/Source/oss/python/impacket/impacket/dhcp.py", line 179, in unpackOptions
value = self.unpack(format, options[i+2:i+2+size])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mdt/Source/oss/python/impacket/impacket/structure.py", line 382, in unpack
return dataClassOrCode(data)
^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/six.py", line 644, in b
return s.encode("latin-1")
^^^^^^^^
AttributeError: ("'bytearray' object has no attribute 'encode'", "When unpacking field 'options | _ | b''[:0]'")
PCAP
b'\x01\x01\x06\x00\xa3Y\xdf\x06\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf84A\xdb2.\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00c\x82Sc5\x01\x032\x04\xc0\xa8\x00\x8c6\x04\xc0\xa8\x00\x019\x02\x02@7\x07\x01\x03\x06\x0c\x0f\x1c*<\x0cudhcp 1.36.1=\x07\x01\xf84A\xdb2.\xff\x00\x00\x00\x00\x00\x00\x00\x00'
Additional context
it seems the line 381 in impacket/structure.py should read:
if (isinstance(data, bytes) or isinstance(data, bytearray)) and dataClassOrCode is b:
because the buffer is not bytes but bytearray. fixing this leads to the next error:
Traceback (most recent call last):
File "/home/mdt/Source/emdete/honeypot/snooper/main.py", line 14, in learn_dhcp
dhcp = DhcpPacket(buffer)
^^^^^^^^^^^^^^^^^^
File "/home/mdt/Source/oss/python/impacket/impacket/dhcp.py", line 148, in __init__
structure.Structure.__init__(self, data, alignment)
File "/home/mdt/Source/oss/python/impacket/impacket/structure.py", line 87, in __init__
self.fromString(data)
File "/home/mdt/Source/oss/python/impacket/impacket/structure.py", line 152, in fromString
self[field[0]] = self.unpack(field[1], data[:size], dataClassOrCode = dataClassOrCode, field = field[0])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mdt/Source/oss/python/impacket/impacket/structure.py", line 307, in unpack
return eval(dataClassOrCode, {}, fields)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "<string>", line 1, in <module>
File "/home/mdt/Source/oss/python/impacket/impacket/dhcp.py", line 179, in unpackOptions
value = self.unpack(format, options[i+2:i+2+size])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mdt/Source/oss/python/impacket/impacket/structure.py", line 386, in unpack
return unpack(format, data)[0]
^^^^^^^^^^^^^^^^^^^^
struct.error: ('unpack requires a buffer of 4 bytes', "When unpacking field 'options | _ | b''[:0]'")