Skip to content

Commit d5337f1

Browse files
authored
DCE/RPC frag fix + Cert class fixes (#4786)
* Fix broken behavior of IOCTL with fragmented DCE/RPC * Fix broken export() function in Cert/Key
1 parent 42fa1c2 commit d5337f1

2 files changed

Lines changed: 34 additions & 12 deletions

File tree

scapy/layers/smbclient.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1044,17 +1044,18 @@ def send(self, x):
10441044
if SMB2_IOCTL_Response not in resp:
10451045
raise ValueError("Failed reading IOCTL_Response ! %s" % resp.NTStatus)
10461046
data = bytes(resp.Output)
1047+
super(SMB_RPC_SOCKET, self).send(data)
10471048
# Handle BUFFER_OVERFLOW (big DCE/RPC response)
1048-
while resp.NTStatus == "STATUS_BUFFER_OVERFLOW":
1049+
while resp.NTStatus == "STATUS_BUFFER_OVERFLOW" or data[3] & 2 != 2:
10491050
# Retrieve DCE/RPC full size
10501051
resp = self.ins.sr1(
10511052
SMB2_Read_Request(
10521053
FileId=self.PipeFileId,
10531054
),
10541055
verbose=0,
10551056
)
1056-
data += resp.Data
1057-
super(SMB_RPC_SOCKET, self).send(data)
1057+
data = resp.Data
1058+
super(SMB_RPC_SOCKET, self).send(data)
10581059
else:
10591060
# Use WriteRequest/ReadRequest
10601061
pkt = SMB2_Write_Request(

scapy/layers/tls/cert.py

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -284,15 +284,20 @@ def public_numbers(self, *args, **kwargs):
284284
def key_size(self):
285285
return self.pubkey.key_size
286286

287-
def export(self, filename, fmt="DER"):
287+
def export(self, filename, fmt=None):
288288
"""
289289
Export public key in 'fmt' format (DER or PEM) to file 'filename'
290290
"""
291+
if fmt is None:
292+
if filename.endswith(".pem"):
293+
fmt = "PEM"
294+
else:
295+
fmt = "DER"
291296
with open(filename, "wb") as f:
292297
if fmt == "DER":
293-
f.write(self.der)
298+
return f.write(self.der)
294299
elif fmt == "PEM":
295-
f.write(self.pem)
300+
return f.write(self.pem.encode())
296301

297302

298303
class PubKeyRSA(PubKey, _EncryptAndVerifyRSA):
@@ -544,15 +549,20 @@ def der(self):
544549
encryption_algorithm=serialization.NoEncryption()
545550
)
546551

547-
def export(self, filename, fmt="DER"):
552+
def export(self, filename, fmt=None):
548553
"""
549554
Export private key in 'fmt' format (DER or PEM) to file 'filename'
550555
"""
556+
if fmt is None:
557+
if filename.endswith(".pem"):
558+
fmt = "PEM"
559+
else:
560+
fmt = "DER"
551561
with open(filename, "wb") as f:
552562
if fmt == "DER":
553-
f.write(self.der)
563+
return f.write(self.der)
554564
elif fmt == "PEM":
555-
f.write(self.pem)
565+
return f.write(self.pem.encode())
556566

557567

558568
class PrivKeyRSA(PrivKey, _DecryptAndSignRSA):
@@ -826,6 +836,12 @@ def setSubjectPublicKeyFromPrivateKey(self, key):
826836
else:
827837
raise ValueError("Unknown type 'key', should be PubKey or PrivKey")
828838

839+
def resignWith(self, key):
840+
"""
841+
Resign a certificate with a specific key
842+
"""
843+
self.import_from_asn1pkt(key.resignCert(self))
844+
829845
def remainingDays(self, now=None):
830846
"""
831847
Based on the value of notAfter field, returns the number of
@@ -896,15 +912,20 @@ def pem(self):
896912
def der(self):
897913
return bytes(self.x509Cert)
898914

899-
def export(self, filename, fmt="DER"):
915+
def export(self, filename, fmt=None):
900916
"""
901917
Export certificate in 'fmt' format (DER or PEM) to file 'filename'
902918
"""
919+
if fmt is None:
920+
if filename.endswith(".pem"):
921+
fmt = "PEM"
922+
else:
923+
fmt = "DER"
903924
with open(filename, "wb") as f:
904925
if fmt == "DER":
905-
f.write(self.der)
926+
return f.write(self.der)
906927
elif fmt == "PEM":
907-
f.write(self.pem)
928+
return f.write(self.pem.encode())
908929

909930
def show(self):
910931
print("Serial: %s" % self.serial)

0 commit comments

Comments
 (0)