Skip to content

Commit 9833f3b

Browse files
committed
DCE/RPC: defragment should happen after integrity check/decryption
1 parent c15a670 commit 9833f3b

File tree

1 file changed

+14
-13
lines changed

1 file changed

+14
-13
lines changed

scapy/layers/dcerpc.py

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2618,24 +2618,24 @@ def _up_pkt(self, pkt):
26182618
# Since the connection-oriented transport guarantees sequentiality, the receiver
26192619
# will always receive the fragments in order.
26202620

2621-
def _defragment(self, pkt):
2621+
def _defragment(self, pkt, body=None):
26222622
"""
26232623
Function to defragment DCE/RPC packets.
26242624
"""
26252625
uid = pkt.call_id
26262626
if pkt.pfc_flags.PFC_FIRST_FRAG and pkt.pfc_flags.PFC_LAST_FRAG:
26272627
# Not fragmented
2628-
return pkt
2628+
return body
26292629
if pkt.pfc_flags.PFC_FIRST_FRAG or uid in self.frags:
26302630
# Packet is fragmented
2631-
self.frags[uid] += pkt[DceRpc5].payload.payload.original
2631+
if body is None:
2632+
body = pkt[DceRpc5].payload.payload.original
2633+
self.frags[uid] += body
26322634
if pkt.pfc_flags.PFC_LAST_FRAG:
2633-
pkt[DceRpc5].payload.remove_payload()
2634-
pkt[DceRpc5].payload /= self.frags[uid]
2635-
return pkt
2635+
return self.frags[uid]
26362636
else:
26372637
# Not fragmented
2638-
return pkt
2638+
return body
26392639

26402640
def _fragment(self, pkt):
26412641
"""
@@ -2660,12 +2660,6 @@ def _fragment(self, pkt):
26602660
# Similarly the signature output SHOULD be ignored.
26612661

26622662
def in_pkt(self, pkt):
2663-
# Defragment
2664-
pkt = self._defragment(pkt)
2665-
if not pkt:
2666-
return
2667-
# Get opnum and options
2668-
opnum, opts = self._up_pkt(pkt)
26692663
# Check for encrypted payloads
26702664
body = None
26712665
if conf.raw_layer in pkt.payload:
@@ -2787,6 +2781,13 @@ def in_pkt(self, pkt):
27872781
if pkt.vt_trailer:
27882782
vtlen = len(pkt.vt_trailer)
27892783
body, pkt.vt_trailer = body[:-vtlen], body[-vtlen:]
2784+
# Defragment
2785+
if body:
2786+
body = self._defragment(pkt, body)
2787+
if not body:
2788+
return
2789+
# Get opnum and options
2790+
opnum, opts = self._up_pkt(pkt)
27902791
# Try to parse the payload
27912792
if opnum is not None and self.rpc_bind_interface:
27922793
# use opnum to parse the payload

0 commit comments

Comments
 (0)