유저 / 그룹 / 컴퓨터 (Users / Groups / Computers)
Domain Admins나 파생된 Local Admins 같은 도메인 내 고권한 유저 훑어보기. 커스텀 그룹도 같이 찾아봄.
# 도메인 내 전체 유저 리스트 뽑기
cmd> net user /domain
PS > Get-NetUser | select cn # PowerView.ps1 사용
# 특정 유저 상세 정보 보기
cmd> net user [username] /domain # 소속 그룹이 10개 넘어가면 cmd 명령어는 에러남
PS > Get-ADUser -Identity <username> -Server asd.domain.com -Properties * # 파워쉘
# 도메인 내 전체 그룹 리스트 뽑기
cmd> net group /domain
PS > Get-ADUser -Filter 'Name -like "*lorenzo"' -Server asd.domain.com | Format-Table Name,SamAccountName -A
PS > Get-NetGroup -GroupName * # PowerView.ps1 사용
# AD 그룹 열거
PS > Get-ADGroup -Identity Administrators -Server asd.domain.com
# 그룹 멤버십 같은 상세 정보 보기
cmd> net group [groupname] /domain
PS > Get-ADGroupMember -Identity Administrators -Server domain.com # 파워쉘
# 도메인 패스워드 정책 확인
cmd> net accounts /domain
# 특정 날짜 이후에 변경된 AD 오브젝트 전부 가져오기
PS > $ChangeDate = New-Object DateTime(2022, 02, 28, 12, 00, 00)
PS > Get-ADObject -Filter 'whenChanged -gt $ChangeDate' -includeDeletedObjects -Server asd.domain.com
# 틀린 패스워드 횟수(badPwdCount)가 0보다 큰 계정 열거
# 브루트포스 공격할 때 계정 잠기는 거 피하는 용도로 유용함
PS > Get-ADObject -Filter 'badPwdCount -gt 0' -Server domain.com
# 특정 도메인 추가 정보 보기
PS> Get-ADDomain -Server asd.domain.com
# 도메인 내 전체 컴퓨터 뽑기
cmd> net view
cmd> net view /domain
# 특정 컴퓨터의 리소스/공유 폴더 보기
cmd> net view \\[computer_name] /domain
# 도메인 내 모든 운영체제 리스트 뽑기
PS > Get-NetComputer -fulldata | select operatingsystem # PowerView.ps1 사용
도메인 컨트롤러 호스트명 (PdcRoleOwner)
PS> [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
모든 유저랑 해당 속성값 싹 다 긁어오는 파워쉘 스크립트:
$domainObj = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
$PDC = ($domainObj.PdcRoleOwner).Name
$SearchString = "LDAP://"
$SearchString += $PDC + "/"
$DistinguishedName = "DC=$($domainObj.Name.Replace('.', ',DC='))"
$SearchString += $DistinguishedName
$Searcher = New-Object System.DirectoryServices.DirectorySearcher([ADSI]$SearchString)
$objDomain = New-Object System.DirectoryServices.DirectoryEntry
$Searcher.SearchRoot = $objDomain
$Searcher.filter="samAccountType=805306368"
$Result = $Searcher.FindAll()
Foreach($obj in $Result){
Foreach($prop in $obj.Properties)
{
$prop
}
Write-Host "------------------------"
}
filter 속성에 원하는 오브젝트 타입 속성을 아무거나 넣을 수 있음. 예를 들어 아래처럼 name 속성 써서 Jeff_Admin 유저만 필터링 가능함:
$Searcher.filter="name=Jeff_Admin"
중첩 그룹 (Nested Groups)
도메인 내 모든 그룹 찾아서 이름만 쫙 뽑기:
$domainObj = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
$PDC = ($domainObj.PdcRoleOwner).Name
$SearchString = "LDAP://"
$SearchString += $PDC + "/"
$DistinguishedName = "DC=$($domainObj.Name.Replace('.', ',DC='))"
$SearchString += $DistinguishedName
$Searcher = New-Object System.DirectoryServices.DirectorySearcher([ADSI]$SearchString)
$objDomain = New-Object System.DirectoryServices.DirectoryEntry
$Searcher.SearchRoot = $objDomain
$Searcher.filter="(objectClass=Group)"
$Result = $Searcher.FindAll()
Foreach($obj in $Result){
$obj.Properties.name
}
name 속성에 적절히 필터 걸어서 특정 그룹 멤버 뽑기. 멤버 목록만 가져오려고 member 속성만 띄운 거임.
$domainObj = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
$PDC = ($domainObj.PdcRoleOwner).Name
$SearchString = "LDAP://"
$SearchString += $PDC + "/"
$DistinguishedName = "DC=$($domainObj.Name.Replace('.', ',DC='))"
$SearchString += $DistinguishedName
$Searcher = New-Object System.DirectoryServices.DirectorySearcher([ADSI]$SearchString)
$objDomain = New-Object System.DirectoryServices.DirectoryEntry
$Searcher.SearchRoot = $objDomain
$Searcher.filter="(name=GROUPNAME)"
$Result = $Searcher.FindAll()
Foreach($obj in $Result){
$obj.Properties.member
}
로그인한 유저 및 활성 유저 세션 (Logged-in users and active user sessions)
PowerView 명령어
더 보려면 여기 참고 https://book.hacktricks.xyz/windows/basic-powershell-for-pentesters/powerview
PS> Set-ExecutionPolicy Unrestricted
PS> Import-Module .\PowerView.ps1
PS> Get-NetLoggedon -ComputerName [computer_name] # 로그인한 유저 확인
PS> Get-NetSession -ComputerName [domain_controller] # 활성 유저 세션 확인
SPN (AD 서비스 계정 / Service Principal Names)
SPN은 호스트에서 도는 서비스 고유 이름인데, AD 서비스 계정이랑 묶을 때 씀. SPN 훑어서 AD 연동된 서버에서 도는 앱 IP랑 포트 번호 알아내는 것임. 도메인 컨트롤러에 쿼리 날려서 SPN 찾음.
SPN 예시 CIFS/MYCOMPUTER$ - 파일 공유 접근. LDAP/MYCOMPUTER$ - LDAP 통해서 AD 정보 쿼리. HTTP/MYCOMPUTER$ - IIS 같은 웹 서비스. MSSQLSvc/MYCOMPUTER$ - MSSQL DB.
예를 들어 파워쉘 스크립트 수정해서 serviceprincipalname 속성에 http 들어간 것만 필터링해 웹 서버 도는지 확인하는 방법:
$domainObj = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
$PDC = ($domainObj.PdcRoleOwner).Name
$SearchString = "LDAP://"
$SearchString += $PDC + "/"
$DistinguishedName = "DC=$($domainObj.Name.Replace('.', ',DC='))"
$SearchString += $DistinguishedName
$Searcher = New-Object System.DirectoryServices.DirectorySearcher([ADSI]$SearchString)
$objDomain = New-Object System.DirectoryServices.DirectoryEntry
$Searcher.SearchRoot = $objDomain
$Searcher.filter="serviceprincipalname=*http*"
$Result = $Searcher.FindAll()
Foreach($obj in $Result){
Foreach($prop in $obj.Properties)
{
$prop
}
}
서비스 호스트명으로 nslookup 해보기 -> 진입점 있나 확인.
SPN 수집 자동화 스크립트들:
# Kerberoast: https://github.com/nidem/kerberoast/blob/master/GetUserSPNs.ps1
PS> .\GetUserSPNs.ps1
# Powershell Empire: https://github.com/compwiz32/PowerShell/blob/master/Get-SPN.ps1
PS> .\Get-SPN.ps1