Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix issues with kerberos and non NTLM domains #393

Merged
merged 2 commits into from
Sep 1, 2024
Merged

Conversation

NeffIsBack
Copy link
Contributor

@NeffIsBack NeffIsBack commented Aug 3, 2024

This is an issue from discord.
The problem is if we use flags like --use-kcache we need to use kerberos. Though, some checks are still done with if self.args.kerberos and not if self.kerberos which would be correctly set to true when using --use-kcache. Therefore, in non-NTLM environments the authentication does not work, because for example:

if self.args.kerberos:
    self.host = self.hostname

is not triggered before, when actually self.kerberos by the self.args.use_kcache flag.

This PR should fix edge case issues, like these:
NTLM is not supported
nxc smb winterfell.north.sevenkingdoms.local --use-kcache -> fails (because of the aforementioned issue)
nxc smb winterfell.north.sevenkingdoms.local --use-kcache -k -> succeeds

@NeffIsBack NeffIsBack added the bug-fix This Pull Request fixes a bug label Aug 3, 2024
@4dity4k
Copy link

4dity4k commented Aug 3, 2024

When I try with -k flag, I get the required output:

netexec smb *********** -d ********** -u beatri**** -p '**********' -k --shares --debug  
[00:28:56] DEBUG    NXC VERSION: 1.2.0 - ItsAlwaysDNS - 54cad53                                                                                                                                                                    cli.py:26
           DEBUG    PYTHON VERSION: 3.11.9 (main, Apr 10 2024, 13:16:36) [GCC 13.2.0]                                                                                                                                          netexec.py:80
           DEBUG    RUNNING ON: Linux Release: 6.8.11-amd64                                                                                                                                                                    netexec.py:81
           DEBUG    Passed args: Namespace(threads=256, timeout=None, jitter=None, verbose=False, debug=True, no_progress=False, log=None, force_ipv6=False, dns_server=None, dns_tcp=False, dns_timeout=3, version=False,     netexec.py:82
                    protocol='smb', target=['test.local'], username=['beatricemill'], password=['!!!!ilovegood17'], cred_id=[], ignore_pw_decoding=False, no_bruteforce=False, continue_on_success=False,                          
                    gfail_limit=None, ufail_limit=None, fail_limit=None, kerberos=True, use_kcache=False, aesKey=None, kdcHost=None, server='https', server_host='0.0.0.0', server_port=None, connectback_host=None,                        
                    module=None, module_options=[], list_modules=False, show_module_options=False, hash=[], delegate=None, no_s4u2proxy=False, domain='test.local', local_auth=False, port=445, share='C$',                               
                    smb_server_port=445, gen_relay_list=None, smb_timeout=2, laps=None, sam=False, lsa=False, ntds=None, dpapi=None, sccm=None, mkfile=None, pvk=None, enabled=False, userntds=None, shares=True,                           
                    interfaces=False, no_write_check=False, filter_shares=None, sessions=False, disks=False, loggedon_users_filter=None, loggedon_users=False, users=None, groups=None, computers=None, local_groups=None,                  
                    pass_pol=False, rid_brute=None, wmi=None, wmi_namespace='root\\cimv2', spider=None, spider_folder='.', content=False, exclude_dirs='', depth=None, only_files=False, pattern=None, regex=None,                          
                    put_file=None, get_file=None, append_host=False, exec_method='wmiexec', dcom_timeout=5, get_output_tries=100, codec='utf-8', no_output=False, execute=None, ps_execute=None, obfs=False, amsi_bypass=None,              
                    clear_obfscripts=False, force_ps32=False, no_encode=False)                                                                                                                                                              
           DEBUG    Protocol: smb                                                                                                                                                                                             netexec.py:136
           DEBUG    Protocol Path: /home/kali/.local/share/pipx/venvs/netexec/lib/python3.11/site-packages/nxc/protocols/smb.py                                                                                             netexec.py:139
           DEBUG    Protocol DB Path: /home/kali/.local/share/pipx/venvs/netexec/lib/python3.11/site-packages/nxc/protocols/smb/database.py                                                                                 netexec.py:141
[00:28:57] DEBUG    Protocol Object: <class 'protocol.smb'>, type: <class 'type'>                                                                                                                                             netexec.py:144
           DEBUG    Protocol Object dir: ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__',               netexec.py:145
                    '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__',                       
                    'call_cmd_args', 'call_modules', 'check_if_admin', 'computers', 'create_conn_obj', 'create_smbv1_conn', 'create_smbv3_conn', 'disks', 'domainfromdnshostname', 'domainfromdsn', 'dpapi',                                
                    'enable_remoteops', 'enum_host_info', 'execute', 'gen_relay_list', 'get_dc_ips', 'get_file', 'get_file_single', 'get_os_arch', 'groups', 'hash_login', 'inc_failed_login', 'interfaces',                                
                    'kerberos_login', 'load_modules', 'local_groups', 'loggedon_users', 'login', 'lsa', 'mark_guest', 'mark_pwned', 'ntds', 'over_fail_limit', 'parse_credentials', 'pass_pol', 'plaintext_login',                          
                    'print_host_info', 'proto_args', 'proto_flow', 'proto_logger', 'ps_execute', 'put_file', 'put_file_single', 'query_db_creds', 'resolver', 'rid_brute', 'sam', 'sccm', 'sessions', 'shares', 'spider',                   
                    'try_credentials', 'users', 'wmi']                                                                                                                                                                                      
           DEBUG    Protocol DB Object: <class 'protocol.database'>                                                                                                                                                           netexec.py:147
           DEBUG    DB Path: /home/kali/.nxc/workspaces/default/smb.db                                                                                                                                                      netexec.py:150
           DEBUG    Creating ThreadPoolExecutor                                                                                                                                                                                netexec.py:44
           DEBUG    Creating thread for <class 'protocol.smb'>                                                                                                                                                                 netexec.py:47
           INFO     Socket info: host=test.local, hostname=test.local, kerberos=True, ipv6=False, link-local ipv6=False                                                                                  connection.py:163
           DEBUG    Kicking off proto_flow                                                                                                                                                                                 connection.py:219
           INFO     Error creating SMBv1 connection to test.local: Error occurs while reading from remote(104)                                                                                                           smb.py:539
[00:28:58] DEBUG    Created connection object                                                                                                                                                                              connection.py:224
[00:28:59] DEBUG    NTLM not supported                                                                                                                                                                                            smb.py:218
           DEBUG    Error getting server information...                                                                                                                                                                           smb.py:258
           DEBUG    Server OS:  None.None build None                                                                                                                                                                              smb.py:264
           DEBUG    Update Hosts: [{'id': 7, 'ip': 'test.local', 'hostname': 'test.local', 'domain': 'test.local', 'os': '', 'dc': None, 'smbv1': False, 'signing': True, 'spooler': None, 'zerologon': None,         database.py:280
                    'petitpotam': None}]                                                                                                                                                                                                    
           DEBUG    add_host() - Host IDs Updated: [7]                                                                                                                                                                       database.py:290
[00:29:00] DEBUG    Error logging off system: SMB SessionError: code: 0xc0000203 - STATUS_USER_SESSION_DELETED - The remote user session has been deleted.                                                                        smb.py:295
           INFO     Resolved domain: test.local with dns, kdcHost: 10.10.*.*                                                                                                                                                 smb.py:303
[00:29:00] INFO     SMB         test.local 445    test.local            x64 (name:test.local) (domain:test.local) (signing:True) (SMBv1:False)                                                                                 smb.py:308
                    SMB         test.local 445    test.local            x64 (name:test.local) (domain:test.local) (signing:True) (SMBv1:False)                                                                                           
           DEBUG    Trying to authenticate using Kerberos                                                                                                                                                                  connection.py:486
           DEBUG    KDC set to: 10.10.*.*                                                                                                                                                                                      smb.py:314
           INFO     Error creating SMBv1 connection to test.local: Error occurs while reading from remote(104)                                                                                                           smb.py:539
[00:29:03] DEBUG    Checking if user is admin on test.local                                                                                                                                                              smb.py:571
[00:29:05] INFO     SMB         test.local 445    test.local           test.local\beatri****:**********                                                                                                             smb.py:362
                    SMB         test.local 445    test.local           test.local\beatri****:**********                                                                                                                      
[00:29:05] DEBUG    Calling command arguments                                                                                                                                                                              connection.py:232
           DEBUG    Calling shares()                                                                                                                                                                                       connection.py:253
           DEBUG    domain: test.local                                                                                                                                                                                          smb.py:779
[00:29:07] INFO     Shares returned: [<impacket.dcerpc.v5.srvs.SHARE_INFO_1 object at 0x7f576711a550>, <impacket.dcerpc.v5.srvs.SHARE_INFO_1 object at 0x7f5767ba8450>, <impacket.dcerpc.v5.srvs.SHARE_INFO_1 object at           smb.py:792
                    0x7f576711a790>, <impacket.dcerpc.v5.srvs.SHARE_INFO_1 object at 0x7f576711a910>, <impacket.dcerpc.v5.srvs.SHARE_INFO_1 object at 0x7f576711aa90>, <impacket.dcerpc.v5.srvs.SHARE_INFO_1 object at                      
                    0x7f576711ab10>]                                                                                                                                                                                                        
           DEBUG    Error checking READ access on share ADMIN$: STATUS_ACCESS_DENIED                                                                                                                                              smb.py:820
           DEBUG    Error checking WRITE access on share ADMIN$: STATUS_ACCESS_DENIED                                                                                                                                             smb.py:829
           DEBUG    Error adding share: cannot access local variable 'user_id' where it is not associated with a value                                                                                                            smb.py:846
           DEBUG    Error checking READ access on share C$: STATUS_ACCESS_DENIED                                                                                                                                                  smb.py:820
[00:29:08] DEBUG    Error checking WRITE access on share C$: STATUS_ACCESS_DENIED                                                                                                                                                 smb.py:829
           DEBUG    Error adding share: cannot access local variable 'user_id' where it is not associated with a value                                                                                                            smb.py:846
[00:29:09] DEBUG    Error checking WRITE access on share IPC$: STATUS_PRIVILEGE_NOT_HELD                                                                                                                                          smb.py:829
[00:29:12] DEBUG    Error checking WRITE access on share NETLOGON: STATUS_ACCESS_DENIED                                                                                                                                           smb.py:829
           DEBUG    Error adding share: cannot access local variable 'user_id' where it is not associated with a value                                                                                                            smb.py:846
[00:29:17] DEBUG    Error adding share: cannot access local variable 'user_id' where it is not associated with a value                                                                                                            smb.py:846
[00:29:19] DEBUG    Error checking WRITE access on share SYSVOL: STATUS_ACCESS_DENIED                                                                                                                                             smb.py:829
           DEBUG    Error adding share: cannot access local variable 'user_id' where it is not associated with a value                                                                                                            smb.py:846
[00:29:19] INFO     SMB         test.local 445    test.local           Enumerated shares                                                                                                                                     smb.py:848
                    SMB         test.local 445    test.local           Enumerated shares                                                                                                                                               
[00:29:19] INFO     SMB         test.local 445    test.local           Share           Permissions     Remark                                                                                                                smb.py:849
                    SMB         test.local 445    test.local           Share           Permissions     Remark                                                                                                                          
[00:29:19] INFO     SMB         test.local 445    test.local           -----           -----------     ------                                                                                                                smb.py:850
                    SMB         test.local 445    test.local           -----           -----------     ------                                                                                                                          
[00:29:19] INFO     SMB         test.local 445    test.local           ADMIN$                          Remote Admin                                                                                                          smb.py:857
                    SMB         test.local 445    test.local           ADMIN$                          Remote Admin                                                                                                                    
[00:29:19] INFO     SMB         test.local 445    test.local           C$                              Default share                                                                                                         smb.py:857
                    SMB         test.local 445    test.local           C$                              Default share                                                                                                                   
[00:29:19] INFO     SMB         test.local 445    test.local           IPC$            READ            Remote IPC                                                                                                            smb.py:857
                    SMB         test.local 445    test.local           IPC$            READ            Remote IPC                                                                                                                      
[00:29:19] INFO     SMB         test.local 445    test.local           NETLOGON        READ            Logon server share                                                                                                    smb.py:857
                    SMB         test.local 445    test.local           NETLOGON        READ            Logon server share                                                                                                              
[00:29:19] INFO     SMB         test.local 445    test.local           share           READ,WRITE                                                                                                                            smb.py:857
                    SMB         test.local 445    test.local           share           READ,WRITE                                                                                                                                      
[00:29:19] INFO     SMB         test.local 445    test.local           SYSVOL          READ            Logon server share                                                                                                    smb.py:857
                    SMB         test.local 445    test.local           SYSVOL          READ            Logon server share                                                                                                              
           DEBUG    Closing connection to: test.local                                                                                                                                                             connection.py:173

However, when I try with --use-kcache, it fails:

netexec smb *********** -d ********** -u beatri**** -p '**********' --use-kcache --shares --debug
[00:30:13] DEBUG    NXC VERSION: 1.2.0 - ItsAlwaysDNS - 54cad53                                                                                                                                                                    cli.py:26
           DEBUG    PYTHON VERSION: 3.11.9 (main, Apr 10 2024, 13:16:36) [GCC 13.2.0]                                                                                                                                          netexec.py:80
           DEBUG    RUNNING ON: Linux Release: 6.8.11-amd64                                                                                                                                                                    netexec.py:81
           DEBUG    Passed args: Namespace(threads=256, timeout=None, jitter=None, verbose=False, debug=True, no_progress=False, log=None, force_ipv6=False, dns_server=None, dns_tcp=False, dns_timeout=3, version=False,     netexec.py:82
                    protocol='smb', target=['test.local'], username=['beatricemill'], password=['!!!!ilovegood17'], cred_id=[], ignore_pw_decoding=False, no_bruteforce=False, continue_on_success=False,                          
                    gfail_limit=None, ufail_limit=None, fail_limit=None, kerberos=False, use_kcache=True, aesKey=None, kdcHost=None, server='https', server_host='0.0.0.0', server_port=None, connectback_host=None,                        
                    module=None, module_options=[], list_modules=False, show_module_options=False, hash=[], delegate=None, no_s4u2proxy=False, domain='test.local', local_auth=False, port=445, share='C$',                               
                    smb_server_port=445, gen_relay_list=None, smb_timeout=2, laps=None, sam=False, lsa=False, ntds=None, dpapi=None, sccm=None, mkfile=None, pvk=None, enabled=False, userntds=None, shares=True,                           
                    interfaces=False, no_write_check=False, filter_shares=None, sessions=False, disks=False, loggedon_users_filter=None, loggedon_users=False, users=None, groups=None, computers=None, local_groups=None,                  
                    pass_pol=False, rid_brute=None, wmi=None, wmi_namespace='root\\cimv2', spider=None, spider_folder='.', content=False, exclude_dirs='', depth=None, only_files=False, pattern=None, regex=None,                          
                    put_file=None, get_file=None, append_host=False, exec_method='wmiexec', dcom_timeout=5, get_output_tries=100, codec='utf-8', no_output=False, execute=None, ps_execute=None, obfs=False, amsi_bypass=None,              
                    clear_obfscripts=False, force_ps32=False, no_encode=False)                                                                                                                                                              
           DEBUG    Protocol: smb                                                                                                                                                                                             netexec.py:136
           DEBUG    Protocol Path: /home/kali/.local/share/pipx/venvs/netexec/lib/python3.11/site-packages/nxc/protocols/smb.py                                                                                             netexec.py:139
           DEBUG    Protocol DB Path: /home/kali/.local/share/pipx/venvs/netexec/lib/python3.11/site-packages/nxc/protocols/smb/database.py                                                                                 netexec.py:141
[00:30:14] DEBUG    Protocol Object: <class 'protocol.smb'>, type: <class 'type'>                                                                                                                                             netexec.py:144
           DEBUG    Protocol Object dir: ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__',               netexec.py:145
                    '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__',                       
                    'call_cmd_args', 'call_modules', 'check_if_admin', 'computers', 'create_conn_obj', 'create_smbv1_conn', 'create_smbv3_conn', 'disks', 'domainfromdnshostname', 'domainfromdsn', 'dpapi',                                
                    'enable_remoteops', 'enum_host_info', 'execute', 'gen_relay_list', 'get_dc_ips', 'get_file', 'get_file_single', 'get_os_arch', 'groups', 'hash_login', 'inc_failed_login', 'interfaces',                                
                    'kerberos_login', 'load_modules', 'local_groups', 'loggedon_users', 'login', 'lsa', 'mark_guest', 'mark_pwned', 'ntds', 'over_fail_limit', 'parse_credentials', 'pass_pol', 'plaintext_login',                          
                    'print_host_info', 'proto_args', 'proto_flow', 'proto_logger', 'ps_execute', 'put_file', 'put_file_single', 'query_db_creds', 'resolver', 'rid_brute', 'sam', 'sccm', 'sessions', 'shares', 'spider',                   
                    'try_credentials', 'users', 'wmi']                                                                                                                                                                                      
           DEBUG    Protocol DB Object: <class 'protocol.database'>                                                                                                                                                           netexec.py:147
           DEBUG    DB Path: /home/kali/.nxc/workspaces/default/smb.db                                                                                                                                                      netexec.py:150
           DEBUG    Creating ThreadPoolExecutor                                                                                                                                                                                netexec.py:44
           DEBUG    Creating thread for <class 'protocol.smb'>                                                                                                                                                                 netexec.py:47
           INFO     Socket info: host=10.10.*.*, hostname=test.local, kerberos=True, ipv6=False, link-local ipv6=False                                                                                         connection.py:163
           DEBUG    Kicking off proto_flow                                                                                                                                                                                 connection.py:219
           INFO     Error creating SMBv1 connection to 10.10.*.*: Error occurs while reading from remote(104)                                                                                                                  smb.py:539
[00:30:15] DEBUG    Created connection object                                                                                                                                                                              connection.py:224
           DEBUG    NTLM not supported                                                                                                                                                                                            smb.py:218
           DEBUG    NTLM authentication not available! Authentication will fail without a valid hostname and domain name                                                                                                          smb.py:232
           DEBUG    Error getting server information...                                                                                                                                                                           smb.py:258
           DEBUG    Server OS:  None.None build None                                                                                                                                                                              smb.py:264
[00:30:16] DEBUG    Update Hosts: [{'id': 8, 'ip': '10.10.*.*', 'hostname': '10.10.*.*', 'domain': 'test.local', 'os': '', 'dc': None, 'smbv1': False, 'signing': True, 'spooler': None, 'zerologon': None,          database.py:280
                    'petitpotam': None}]                                                                                                                                                                                                    
           DEBUG    add_host() - Host IDs Updated: [8]                                                                                                                                                                       database.py:290
           DEBUG    Error logging off system: SMB SessionError: code: 0xc0000203 - STATUS_USER_SESSION_DELETED - The remote user session has been deleted.                                                                        smb.py:295
           INFO     Resolved domain: test.local with dns, kdcHost: 10.10.*.*                                                                                                                                                 smb.py:303
[00:30:16] INFO     SMB         10.10.*.*    445    10.10.*.*      x64 (name:10.10.*.*) (domain:10.10.*.*) (signing:True) (SMBv1:False)                                                                               smb.py:308
                    SMB         10.10.*.*    445    10.10.*.*      x64 (name:10.10.*.*) (domain:10.10.*.*) (signing:True) (SMBv1:False)                                                                                         
           DEBUG    Trying to authenticate using Kerberos cache                                                                                                                                                            connection.py:537
           DEBUG    KDC set to: 10.10.*.*                                                                                                                                                                                      smb.py:314
[00:30:17] INFO     Error creating SMBv1 connection to 10.10.*.*: Error occurs while reading from remote(104)                                                                                                                  smb.py:539
[00:30:18] INFO     SMB         10.10.*.*    445    10.10.*.*     test.local\beatricemill from ccache KDC_ERR_S_PRINCIPAL_UNKNOWN                                                                                         smb.py:397
                    SMB         10.10.*.*    445    10.10.*.*     test.local\beatricemill from ccache KDC_ERR_S_PRINCIPAL_UNKNOWN                                                                                                   
[00:30:18] INFO     Successfully authenticated using Kerberos cache                                                                                                                                                        connection.py:542
           DEBUG    Calling command arguments                                                                                                                                                                              connection.py:232
           DEBUG    Calling shares()                                                                                                                                                                                       connection.py:253
           DEBUG    domain: test.local                                                                                                                                                                                          smb.py:779
[00:30:19] INFO     SMB         10.10.*.*    445    10.10.*.*     Error enumerating shares: STATUS_USER_SESSION_DELETED                                                                                                     smb.py:795
                    SMB         10.10.*.*    445    10.10.*.*     Error enumerating shares: STATUS_USER_SESSION_DELETED                                                                                                               
[00:30:19] DEBUG    Closing connection to: test.local

EDIT by @NeffIsBack:

  • FYI, this was the original issue that has been fixed with the PR
  • Formating

@mpgn
Copy link
Collaborator

mpgn commented Aug 3, 2024

An issue with delegate also ?

@NeffIsBack
Copy link
Contributor Author

An issue with delegate also ?

We didn't test it, but it likely would be. If you wouldn't have NTLM and delegation. Just added it to be sure

@NeffIsBack
Copy link
Contributor Author

NeffIsBack commented Aug 3, 2024

Ah hmm maybe we should just change self.args.kerberos as well... For example laps login sets self.args.kerberos which would now break. Or we change the line in laps to self.kerberos

EDIT:
Looks like laps is the only place where we have to fix it, i will just change that
image

@NeffIsBack
Copy link
Contributor Author

Should be fixed now
image

@4dity4k
Copy link

4dity4k commented Aug 3, 2024

image
I don't think the issue is resolved yet

@4dity4k
Copy link

4dity4k commented Aug 3, 2024

image
This issue has been resolved.
Please make sure to use 66da98c commit.

@NeffIsBack NeffIsBack changed the title Fix issues where we need kerberos authentication logic Fix issues with kerberos and non NTLM domains Aug 4, 2024
@mpgn
Copy link
Collaborator

mpgn commented Aug 29, 2024

Have you try on other protocol than smb with kerberos ?

@NeffIsBack
Copy link
Contributor Author

All working as intended:
image

@NeffIsBack NeffIsBack merged commit e14be33 into main Sep 1, 2024
6 checks passed
@NeffIsBack NeffIsBack deleted the neff-fix-kerberos branch September 1, 2024 10:44
@mpgn mpgn added this to the v1.3.0 milestone Sep 29, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug-fix This Pull Request fixes a bug
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants