5252import lib .techniques .dns .use as dnsmod
5353import lib .techniques .dns .test as dnstestmod
5454
55- DNS_PORT = 5355
56-
5755def _build_query (name , tid = b"\x12 \x34 " ):
5856 pkt = tid + b"\x01 \x00 " + b"\x00 \x01 " + b"\x00 \x00 " + b"\x00 \x00 " + b"\x00 \x00 "
5957 for label in name .split ("." ):
@@ -63,15 +61,23 @@ def _build_query(name, tid=b"\x12\x34"):
6361
6462class _HighPortDNSServer (DNSServer ):
6563 # same logic as the real server (parse/pop/run), just bound high so no root is needed
66- def __init__ (self , port ):
64+ def __init__ (self , port = 0 ):
6765 self ._requests = []
6866 self ._lock = threading .Lock ()
6967 self ._socket = socket .socket (socket .AF_INET , socket .SOCK_DGRAM )
7068 self ._socket .setsockopt (socket .SOL_SOCKET , socket .SO_REUSEADDR , 1 )
7169 self ._socket .bind (("127.0.0.1" , port ))
70+ self .port = self ._socket .getsockname ()[1 ]
7271 self ._running = False
7372 self ._initialized = False
7473
74+ def close (self ):
75+ self ._running = False
76+ try :
77+ self ._socket .close ()
78+ except socket .error :
79+ pass
80+
7581_CONF = {"dnsDomain" : "exfil.test" , "hexConvert" : False , "api" : False , "verbose" : 0 , "forceDns" : False }
7682_KB = {"dnsTest" : True , "dnsMode" : False , "bruteMode" : False , "safeCharEncode" : False }
7783
@@ -81,11 +87,18 @@ class _DnsCase(unittest.TestCase):
8187
8288 @classmethod
8389 def setUpClass (cls ):
84- cls .server = _HighPortDNSServer (DNS_PORT )
90+ cls .server = _HighPortDNSServer ()
8591 cls .server .run ()
8692 while not cls .server ._initialized :
8793 time .sleep (0.02 )
8894
95+ @classmethod
96+ def tearDownClass (cls ):
97+ server = getattr (cls , "server" , None )
98+ if server is not None :
99+ server .close ()
100+ cls .server = None
101+
89102 def setUp (self ):
90103 self ._saved_conf = {k : conf .get (k ) for k in _CONF }
91104 self ._saved_kb = {k : kb .get (k ) for k in _KB }
@@ -156,7 +169,7 @@ def oracle(payload=None, *args, **kwargs):
156169 host = "%s.%s.%s.%s" % (prefix , binascii .hexlify (chunk ).decode (), suffix , conf .dnsDomain )
157170 c = socket .socket (socket .AF_INET , socket .SOCK_DGRAM )
158171 c .settimeout (3 )
159- c .sendto (_build_query (host ), ("127.0.0.1" , DNS_PORT ))
172+ c .sendto (_build_query (host ), ("127.0.0.1" , self . server . port ))
160173 try :
161174 c .recvfrom (512 )
162175 finally :
0 commit comments