Skip to content

Commit 6a2874e

Browse files
authored
Merge pull request Pennyw0rth#667 from Pennyw0rth/neff-fix-mssql
2 parents f5dc9ea + 207b7da commit 6a2874e

2 files changed

Lines changed: 22 additions & 47 deletions

File tree

nxc/connection.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,7 @@ def parse_credentials(self):
389389
if "\\" in line and len(line.split("\\")) == 2:
390390
domain_single, username_single = line.split("\\")
391391
else:
392-
domain_single = self.args.domain if hasattr(self.args, "domain") and self.args.domain else self.domain
392+
domain_single = self.args.domain if hasattr(self.args, "domain") and self.args.domain is not None else self.domain
393393
username_single = line
394394
domain.append(domain_single)
395395
username.append(username_single.strip())
@@ -398,7 +398,7 @@ def parse_credentials(self):
398398
if "\\" in user:
399399
domain_single, username_single = user.split("\\")
400400
else:
401-
domain_single = self.args.domain if hasattr(self.args, "domain") and self.args.domain else self.domain
401+
domain_single = self.args.domain if hasattr(self.args, "domain") and self.args.domain is not None else self.domain
402402
username_single = user
403403
domain.append(domain_single)
404404
username.append(username_single)

nxc/protocols/mssql.py

Lines changed: 20 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ def check_if_admin(self):
8989
else:
9090
if is_admin:
9191
self.admin_privs = True
92-
92+
9393
@reconnect_mssql
9494
def enum_host_info(self):
9595
challenge = None
@@ -102,7 +102,7 @@ def enum_host_info(self):
102102
login["ClientPID"] = random.randint(0, 1024)
103103
login["PacketSize"] = self.conn.packetSize
104104
login["OptionFlags2"] = tds.TDS_INIT_LANG_FATAL | tds.TDS_ODBC_ON | tds.TDS_INTEGRATED_SECURITY_ON
105-
105+
106106
# NTLMSSP Negotiate
107107
auth = ntlm.getNTLMSSPType1("", "")
108108
login["SSPI"] = auth.getData()
@@ -144,16 +144,7 @@ def print_host_info(self):
144144
self.logger.display(f"{self.server_os} (name:{self.hostname}) (domain:{self.targetDomain})")
145145

146146
@reconnect_mssql
147-
def kerberos_login(
148-
self,
149-
domain,
150-
username,
151-
password="",
152-
ntlm_hash="",
153-
aesKey="",
154-
kdcHost="",
155-
useCache=False,
156-
):
147+
def kerberos_login(self, domain, username, password="", ntlm_hash="", aesKey="", kdcHost="", useCache=False):
157148
self.username = username
158149
self.password = password
159150
self.domain = domain
@@ -200,29 +191,21 @@ def kerberos_login(
200191
return False
201192
except Exception:
202193
error_msg = self.handle_mssql_reply()
203-
self.logger.fail("{}\\{}:{} {}".format(self.domain, self.username, kerb_pass, error_msg if error_msg else ""))
194+
self.logger.fail(f"{self.domain}\\{self.username}:{used_ccache} {error_msg if error_msg else ''}")
204195
return False
205196

206197
@reconnect_mssql
207198
def plaintext_login(self, domain, username, password):
208199
self.password = password
209200
self.username = username
210201
self.domain = domain
211-
202+
212203
try:
213-
res = self.conn.login(
214-
None,
215-
self.username,
216-
self.password,
217-
self.domain,
218-
None,
219-
not self.args.local_auth,
220-
)
204+
res = self.conn.login(None, self.username, self.password, self.domain, None, not self.args.local_auth)
221205
if res is not True:
222206
raise
223207
self.check_if_admin()
224-
out = f"{self.domain}\\{self.username}:{process_secret(self.password)} {self.mark_pwned()}"
225-
self.logger.success(out)
208+
self.logger.success(f"{self.domain}\\{self.username}:{process_secret(self.password)} {self.mark_pwned()}")
226209
if not self.args.local_auth and self.username != "":
227210
add_user_bh(self.username, self.domain, self.logger, self.config)
228211
if self.admin_privs:
@@ -233,7 +216,7 @@ def plaintext_login(self, domain, username, password):
233216
return False
234217
except Exception:
235218
error_msg = self.handle_mssql_reply()
236-
self.logger.fail("{}\\{}:{} {}".format(self.domain, self.username, process_secret(self.password), error_msg if error_msg else ""))
219+
self.logger.fail(f"{self.domain}\\{self.username}:{process_secret(self.password)} {error_msg if error_msg else ''}")
237220
return False
238221

239222
@reconnect_mssql
@@ -242,26 +225,18 @@ def hash_login(self, domain, username, ntlm_hash):
242225
self.domain = domain
243226
self.lmhash = ""
244227
self.nthash = ""
245-
228+
246229
if ntlm_hash.find(":") != -1:
247230
self.lmhash, self.nthash = ntlm_hash.split(":")
248231
else:
249232
self.nthash = ntlm_hash
250233

251234
try:
252-
res = self.conn.login(
253-
None,
254-
self.username,
255-
"",
256-
self.domain,
257-
f"{self.lmhash}:{self.nthash}",
258-
not self.args.local_auth,
259-
)
235+
res = self.conn.login(None, self.username, "", self.domain, f"{self.lmhash}:{self.nthash}", not self.args.local_auth)
260236
if res is not True:
261237
raise
262238
self.check_if_admin()
263-
out = f"{self.domain}\\{self.username}:{process_secret(self.nthash)} {self.mark_pwned()}"
264-
self.logger.success(out)
239+
self.logger.success(f"{self.domain}\\{self.username}:{process_secret(self.nthash)} {self.mark_pwned()}")
265240
if not self.args.local_auth and self.username != "":
266241
add_user_bh(self.username, self.domain, self.logger, self.config)
267242
if self.admin_privs:
@@ -272,7 +247,7 @@ def hash_login(self, domain, username, ntlm_hash):
272247
return False
273248
except Exception:
274249
error_msg = self.handle_mssql_reply()
275-
self.logger.fail("{}\\{}:{} {}".format(self.domain, self.username, process_secret(self.nthash), error_msg if error_msg else ""))
250+
self.logger.fail(f"{self.domain}\\{self.username}:{process_secret(self.nthash)} {error_msg if error_msg else ''}")
276251
return False
277252

278253
def mssql_query(self):
@@ -305,10 +280,10 @@ def execute(self, payload=None, get_output=False):
305280
if not payload:
306281
self.logger.error("No command to execute specified!")
307282
return None
308-
283+
309284
get_output = True if not self.args.no_output else get_output
310285
self.logger.debug(f"{get_output=}")
311-
286+
312287
try:
313288
exec_method = MSSQLEXEC(self.conn, self.logger)
314289
output = exec_method.execute(payload)
@@ -317,7 +292,7 @@ def execute(self, payload=None, get_output=False):
317292
self.logger.fail(f"Execute command failed, error: {e!s}")
318293
return False
319294
else:
320-
self.logger.success("Executed command via mssqlexec")
295+
self.logger.success("Executed command via mssqlexec")
321296
if output:
322297
output_lines = StringIO(output).readlines()
323298
for line in output_lines:
@@ -330,24 +305,24 @@ def ps_execute(self, payload=None, get_output=False, methods=None, force_ps32=Fa
330305
if not payload:
331306
self.logger.error("No command to execute specified!")
332307
return None
333-
308+
334309
response = []
335310
obfs = obfs if obfs else self.args.obfs
336311
encode = encode if encode else not self.args.no_encode
337312
force_ps32 = force_ps32 if force_ps32 else self.args.force_ps32
338313
get_output = True if not self.args.no_output else get_output
339-
314+
340315
self.logger.debug(f"Starting PS execute: {payload=} {get_output=} {methods=} {force_ps32=} {obfs=} {encode=}")
341316
amsi_bypass = self.args.amsi_bypass[0] if self.args.amsi_bypass else None
342317
self.logger.debug(f"AMSI Bypass: {amsi_bypass}")
343-
318+
344319
if os.path.isfile(payload):
345320
self.logger.debug(f"File payload set: {payload}")
346321
with open(payload) as commands:
347322
response = [self.execute(create_ps_command(c.strip(), force_ps32=force_ps32, obfs=obfs, custom_amsi=amsi_bypass, encode=encode), get_output) for c in commands]
348323
else:
349324
response = [self.execute(create_ps_command(payload, force_ps32=force_ps32, obfs=obfs, custom_amsi=amsi_bypass, encode=encode), get_output)]
350-
325+
351326
self.logger.debug(f"ps_execute response: {response}")
352327
return response
353328

@@ -368,7 +343,7 @@ def put_file(self):
368343
self.logger.fail(f"Error during upload : {e}")
369344

370345
@requires_admin
371-
def get_file(self):
346+
def get_file(self):
372347
remote_path = self.args.get_file[0]
373348
download_path = self.args.get_file[1]
374349
self.logger.display(f'Copying "{remote_path}" to "{download_path}"')

0 commit comments

Comments
 (0)