Skip to content

Commit 57b9633

Browse files
Handle TransferSyntax UUID in opposite byte order during DCE/RPC bind
Some exploit tools encode the NDR32 TransferSyntax UUID bytes in big-endian format within a little-endian DCE/RPC packet. When the standard byte-order parse doesn't match NDR32/NDR64, try the opposite byte order before rejecting.
1 parent 2cc925c commit 57b9633

File tree

1 file changed

+10
-1
lines changed
  • modules/python/dionaea/smb

1 file changed

+10
-1
lines changed

modules/python/dionaea/smb/smb.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1663,13 +1663,22 @@ def process_dcerpc_packet(self, buf):
16631663
ctxitem.TransferSyntax = tmp.TransferSyntax # [:16]
16641664
ctxitem.TransferSyntaxVersion = tmp.TransferSyntaxVersion
16651665
# Check for supported transfer syntaxes (NDR32 or NDR64)
1666+
# Some clients encode the TransferSyntax UUID in the opposite
1667+
# byte order from the packet's DataRepresentation, so try both.
16661668
syntax_str = str(transfersyntax_uuid)
16671669
if syntax_str == NDR32_UUID:
16681670
pointer_size = 32
16691671
elif syntax_str == NDR64_UUID:
16701672
pointer_size = 64
16711673
else:
1672-
pointer_size = None
1674+
alt_uuid = parse_dcerpc_uuid(tmp.TransferSyntax, not is_big_endian)
1675+
alt_str = str(alt_uuid)
1676+
if alt_str == NDR32_UUID:
1677+
pointer_size = 32
1678+
elif alt_str == NDR64_UUID:
1679+
pointer_size = 64
1680+
else:
1681+
pointer_size = None
16731682

16741683
if pointer_size is not None:
16751684
if service_uuid.hex in registered_services:

0 commit comments

Comments
 (0)