Skip to content

Commit da85567

Browse files
authored
Refresh included [MS-NRPC] version (#4825)
* Update included [MS-NRPC] to latest version * dns_resolve: retry if truncated
1 parent b810032 commit da85567

File tree

4 files changed

+4333
-16
lines changed

4 files changed

+4333
-16
lines changed

doc/scapy/layers/dcom.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ General usage
5454
5555
import uuid
5656
from scapy.layers.dcerpc import find_com_interface
57-
import scapy.layers.msrpce.raw.ms_pla
57+
from scapy.layers.msrpce.raw.ms_pla import GetDataCollectorSets_Request
5858
5959
CLSID_TraceSessionCollection = uuid.UUID("03837530-098b-11d8-9414-505054503030")
6060
# The COM interface must have been compiled by scapy-rpc (midl-to-scapy)

scapy/layers/dns.py

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1380,13 +1380,15 @@ def pre_dissect(self, s):
13801380

13811381

13821382
@conf.commands.register
1383-
def dns_resolve(qname, qtype="A", raw=False, verbose=1, timeout=3, **kwargs):
1383+
def dns_resolve(qname, qtype="A", raw=False, tcp=False, verbose=1, timeout=3, **kwargs):
13841384
"""
13851385
Perform a simple DNS resolution using conf.nameservers with caching
13861386
13871387
:param qname: the name to query
13881388
:param qtype: the type to query (default A)
13891389
:param raw: return the whole DNS packet (default False)
1390+
:param tcp: whether to use directly TCP instead of UDP. If truncated is received,
1391+
UDP automatically retries in TCP. (default: False)
13901392
:param verbose: show verbose errors
13911393
:param timeout: seconds until timeout (per server)
13921394
:raise TimeoutError: if no DNS servers were reached in time.
@@ -1409,8 +1411,11 @@ def dns_resolve(qname, qtype="A", raw=False, verbose=1, timeout=3, **kwargs):
14091411
for nameserver in conf.nameservers:
14101412
# Try all nameservers
14111413
try:
1412-
# Spawn a UDP socket, connect to the nameserver on port 53
1413-
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
1414+
# Spawn a socket, connect to the nameserver on port 53
1415+
if tcp:
1416+
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1417+
else:
1418+
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
14141419
sock.settimeout(kwargs["timeout"])
14151420
sock.connect((nameserver, 53))
14161421
# Connected. Wrap it with DNS
@@ -1428,6 +1433,21 @@ def dns_resolve(qname, qtype="A", raw=False, verbose=1, timeout=3, **kwargs):
14281433
sock.close()
14291434
if res:
14301435
# We have a response ! Check for failure
1436+
if res[DNS].tc == 1: # truncated !
1437+
if not tcp:
1438+
# Retry using TCP
1439+
return dns_resolve(
1440+
qname=qname,
1441+
qtype=qtype,
1442+
raw=raw,
1443+
tcp=True,
1444+
verbose=verbose,
1445+
timeout=timeout,
1446+
**kwargs,
1447+
)
1448+
elif verbose:
1449+
log_runtime.info("DNS answer is truncated !")
1450+
14311451
if res[DNS].rcode == 2: # server failure
14321452
res = None
14331453
if verbose:

0 commit comments

Comments
 (0)