impacket icon indicating copy to clipboard operation
impacket copied to clipboard

dhcp.py: decode error "object has no attribute 'encode'"

Open emdete opened this issue 2 years ago • 2 comments

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

emdete avatar Oct 16 '23 10:10 emdete

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]'")

emdete avatar Oct 16 '23 15:10 emdete