Skip to content

Commit 9153a39

Browse files
committed
Adding IPv6 support to NTLMRelayX (should update after #2023 - utils.get_address() -)
1 parent 5a33fc2 commit 9153a39

File tree

6 files changed

+25
-11
lines changed

6 files changed

+25
-11
lines changed

examples/ntlmrelayx.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ def stop_servers(threads):
290290

291291
# Interface address specification
292292
parser.add_argument('-ip','--interface-ip', action='store', metavar='INTERFACE_IP', help='IP address of interface to '
293-
'bind SMB and HTTP servers',default='')
293+
'bind relay servers ("0.0.0.0" or "::" if omitted)',default=argparse.SUPPRESS)
294294

295295
serversoptions = parser.add_argument_group()
296296
serversoptions.add_argument('--no-smb-server', action='store_true', help='Disables the SMB server')
@@ -331,7 +331,7 @@ def stop_servers(threads):
331331
'setting the proxy host to the one supplied.')
332332
parser.add_argument('-wa','--wpad-auth-num', action='store', type=int, default=1, help='Prompt for authentication N times for clients without MS16-077 installed '
333333
'before serving a WPAD file. (default=1)')
334-
parser.add_argument('-6','--ipv6', action='store_true',help='Listen on both IPv6 and IPv4')
334+
parser.add_argument('-6','--ipv6', action='store_true',help='Listen on IPv6')
335335
parser.add_argument('--remove-mic', action='store_true',help='Remove MIC (exploit CVE-2019-1040)')
336336
parser.add_argument('--serve-image', action='store',help='local path of the image that will we returned to clients')
337337
parser.add_argument('-c', action='store', type=str, required=False, metavar = 'COMMAND', help='Command to execute on '
@@ -529,6 +529,9 @@ def stop_servers(threads):
529529
socks_thread.start()
530530
threads.add(socks_thread)
531531

532+
if 'interface_ip' not in options:
533+
options.interface_ip = '::' if options.ipv6 else '0.0.0.0'
534+
532535
c = start_servers(options, threads)
533536

534537
# Log multirelay flag status

impacket/examples/ntlmrelayx/servers/httprelayserver.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,13 @@ def __init__(self, server_address, RequestHandlerClass, config):
4242
self.daemon_threads = True
4343
if self.config.ipv6:
4444
self.address_family = socket.AF_INET6
45+
# scope_id (after %) can be present or not - if not, default: 0
46+
ip_parts = server_address[0].split('%')
47+
scope_id = int(ip_parts[1]) if len(ip_parts) == 2 else 0
48+
server_address = server_address + (0, scope_id)
4549
# Tracks the number of times authentication was prompted for WPAD per client
4650
self.wpad_counters = {}
47-
socketserver.TCPServer.__init__(self,server_address, RequestHandlerClass)
51+
socketserver.TCPServer.__init__(self, server_address, RequestHandlerClass)
4852

4953
class HTTPHandler(http.server.SimpleHTTPRequestHandler):
5054
def __init__(self,request, client_address, server):

impacket/examples/ntlmrelayx/servers/rawrelayserver.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,12 @@ class RAWServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
4343
def __init__(self, server_address, RequestHandlerClass, config):
4444
self.config = config
4545
self.daemon_threads = True
46-
#if self.config.ipv6:
47-
# self.address_family = socket.AF_INET6
48-
46+
if self.config.ipv6:
47+
self.address_family = socket.AF_INET6
48+
# scope_id (after %) can be present or not - if not, default: 0
49+
ip_parts = server_address[0].split('%')
50+
scope_id = int(ip_parts[1]) if len(ip_parts) == 2 else 0
51+
server_address = server_address + (0, scope_id)
4952
socketserver.TCPServer.__init__(self, server_address, RequestHandlerClass)
5053

5154
class RAWHandler(socketserver.BaseRequestHandler):

impacket/examples/ntlmrelayx/servers/rpcrelayserver.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ def __init__(self, server_address, RequestHandlerClass, config):
3737
self.daemon_threads = True
3838
if self.config.ipv6:
3939
self.address_family = socket.AF_INET6
40+
# scope_id (after %) can be present or not - if not, default: 0
41+
ip_parts = server_address[0].split('%')
42+
scope_id = int(ip_parts[1]) if len(ip_parts) == 2 else 0
43+
server_address = server_address + (0, scope_id)
4044
socketserver.TCPServer.allow_reuse_address = True
4145
socketserver.TCPServer.__init__(self, server_address, RequestHandlerClass)
4246

impacket/examples/ntlmrelayx/servers/smbrelayserver.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -106,17 +106,13 @@ def __init__(self,config):
106106
smbConfig.set('IPC$','share type','3')
107107
smbConfig.set('IPC$','path','')
108108

109-
# Change address_family to IPv6 if this is configured
110-
if self.config.ipv6:
111-
SMBSERVER.address_family = socket.AF_INET6
112-
113109
# changed to dereference configuration interfaceIp
114110
if self.config.listeningPort:
115111
smbport = self.config.listeningPort
116112
else:
117113
smbport = 445
118114

119-
self.server = SMBSERVER((config.interfaceIp,smbport), config_parser = smbConfig)
115+
self.server = SMBSERVER((config.interfaceIp,smbport), config_parser=smbConfig, ipv6=self.config.ipv6)
120116
if not self.config.disableMulti:
121117
self.server.setAuthCallback(auth_callback)
122118
logging.getLogger('impacket.smbserver').setLevel(logging.CRITICAL)

impacket/examples/ntlmrelayx/servers/wcfrelayserver.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ def __init__(self, server_address, request_handler_class, config):
5252
self.daemon_threads = True
5353
if self.config.ipv6:
5454
self.address_family = socket.AF_INET6
55+
# scope_id (after %) can be present or not - if not, default: 0
56+
ip_parts = server_address[0].split('%')
57+
scope_id = int(ip_parts[1]) if len(ip_parts) == 2 else 0
58+
server_address = server_address + (0, scope_id)
5559
self.wpad_counters = {}
5660
socketserver.TCPServer.__init__(self, server_address, request_handler_class)
5761

0 commit comments

Comments
 (0)