Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AutomatedLabを使って内部ペンテストを勉強しよう! -やられ社内ネットワークの自動構築-

Nao
July 19, 2024

AutomatedLabを使って内部ペンテストを勉強しよう! -やられ社内ネットワークの自動構築-

2024年7月19日に行われた「PentestSecJP_ver1」の発表資料です。
@n_etupirka
https://pentestsecjp.connpass.com/event/317082/

Nao

July 19, 2024
Tweet

More Decks by Nao

Other Decks in Technology

Transcript

  1. $ whoami • 小松 奈央(Nao Komatsu) • Job ◦ Penetration

    Testing / Red Teaming ◦ Mobile Application Security ◦ Security Training Instructor • SNS / Blog ◦ https://x.com/n_etupirka ◦ https://n-etupirka.net 2024/7/19 2
  2. 今日の話題 • 内部ペンテストにはやられ社内ネットワークが必要不可欠 ◦ ペンテスト系ツールの動作検証(内製・OSS問わず) ◦ 顧客環境で脆弱性を見つけた際に、設定を再現して対策方法を検討 する ◦ もちろんペンテストの学習にも利用可能

    • AutomatedLabを使ってやられ社内ネットワークを自動構築 したい ◦ 本発表においては、やられ社内ネットワーク = 色々な脆弱性を作り 込んだActive Directory環境のこと 2024/7/19 3
  3. Index • AutomatedLabとは • AutomatedLabのセットアップ • AutomatedLabの基本的な使い方 • 脆弱性の作り込みの例 •

    まとめ • 参考文献 2024/7/19 5 【注意】 本スライドの内容は犯罪行為を助長するものではありません。 サイバー空間の安心・安全な環境を確保する目的にのみ利用し、絶対に悪用しないでください。
  4. AutomatedLabとは • Microsoftによって提供されるオープンソースのPowerShell モジュール ◦ PowerShellスクリプトを使用してHyper-VやAzure上に複雑なラボ環 境を自動構築できる ◦ GitHub: https://github.com/AutomatedLab/AutomatedLab

    ◦ ドキュメント: https://automatedlab.org/en/latest/ ◦ 以下のような製品に対応している ◦ 2008 R2から2022までのすべてのWindows ◦ 一部のLinuxディストリビューション ◦ Active Directory、Exchange、PKI(ADCS)、IIS、MSSQLなどMicrosoft製品 2024/7/19 7
  5. AutomatedLabを使う際の注意点 • Windows 11 HomeではHyper-Vの利用ができない ◦ Windows 11 Enterprise、Pro、Educationが必要 •

    ラボ環境の規模によっては潤沢なリソースが必要 ◦ 今日紹介するラボ環境の場合、各仮想マシンに割り当てるRAMを最 小にしても合計で12GB必要 ◦ ビルドに時間がかかるのでNVMe接続のSSDが理想 • 各仮想マシンのOS言語はen-US推奨 ◦ トラブルシュートには楽だけど、対策方法を案内する際に日本語表 記を別途確認する手間が発生する 2024/7/19 9
  6. • 管理者権限でPowerShellを起動し、以下のコマンドを実行する AutomatedLabのインストール # NuGetのインストール PS C:\> Install-PackageProvider -Name Nuget

    -Force # AutomatedLabのインストール PS C:\> Install-Module -Name AutomatedLab -SkipPublisherCheck -AllowClobber # Pesterのインストール PS C:\> Install-Module -Name Pester -Force # ソースフォルダを作成する(別ドライブを指定可能) # 以下の場合、D:\LabSourcesに必要なファイルやフォルダが作成される PS C:\> New-LabSourcesFolder -DriveLetter D 2024/7/19 13
  7. • ビルドしたいラボ環境に必要なISOファイルをダウンロードする ◦ Windows Server 2019, Windows Server 2022, Windows

    10, Windows 11, MSSQL Server 2019, etc... ◦ ISOファイルはD:\LabSources\ISOsに保存する(Dドライブの場合) ISOファイルのダウンロード # ISOファイルが正しく認識されているか確認(MSSQL Serverは表示されない) PS C:\> Get-LabAvailableOperatingSystem -Path D:\LabSources | Format-Table OperatingSystemImageName OperatingSystemImageName ------------------------ Windows Server 2022 Standard Evaluation Windows Server 2022 Standard Evaluation (Desktop Experience) Windows Server 2022 Datacenter Evaluation Windows Server 2022 Datacenter Evaluation (Desktop Experience) 2024/7/19 14
  8. • 以下のPowerShellスクリプト(.ps1)を管理者権限で実行する 基本のスクリプト # ラボ環境の定義 New-LabDefinition -Name GettingStarted -DefaultVirtualizationEngine HyperV

    # 仮想マシンの定義 Add-LabMachineDefinition -Name DC -Roles RootDC -DomainName contoso.com -OperatingSystem "Windows Server 2022 Standard Evaluation (Desktop Experience)" Add-LabMachineDefinition -Name Client -DomainName contoso.com -OperatingSystem "Windows 11 Pro" # ラボのインストール Install-Lab # 構築したラボの概要を出力 Show-LabDeploymentSummary -Detailed 2024/7/19 16
  9. 仮想マシンへの接続 # RDP接続(Windows標準のRDPクライアント) PS C:\> mstsc.exe /v:<コンピュータ名> # RDP接続(ALのコマンドレット) PS

    C:\> Connect-LabVM -ComputerName <コンピュータ名> # WinRMによる接続 PS C:\> $Password = ConvertTo-SecureString <パスワード> -AsPlainText -Force PS C:\> $Cred = New-Object System.Management.Automation.PSCredential (<ユーザ名>, $Password) PS C:\> $Session = New-LabPSSession -ComputerName <コンピュータ名> -Credential $Cred PS C:\> Enter-PSSession -Session $Session [192.168.11.3]: PS C:\Users\Administrator\Documents> whoami contoso\administrator 2024/7/19 18
  10. PostInstallationActivity • 各仮想マシンのOSインストール後、仮想マシン内で任意のPowerShell スクリプトを実行する機能 • この機能によって、ドメインユーザの追加やグループポリシーの適用 といった複雑な設定を行うことができる 2024/7/19 19 $PostInstallationFolder

    = ".\PostInstallationActivities" # 実行するPowerShellスクリプトと依存関係にあるフォルダを指定 # (指定したフォルダが仮想マシン内のCドライブ直下に一時的にコピーされる) $PostInstallationActivity = Get-LabPostInstallationActivity -ScriptFileName Setup- DC.ps1 -DependencyFolder $PostInstallationFolder # OSインストール後に指定したPowerShellスクリプトが実行される Add-LabMachineDefinition -Name DC -Roles RootDC -DomainName contoso.com -OperatingSystem "Windows Server 2022 Standard Evaluation (Desktop Experience)" -PostInstallationActivity $PostInstallationActivity
  11. フォルダ構成のイメージ 2024/7/19 20 ルートフォルダ (GettingStarted) PostInstallationActivities ラボ構築用スクリプト (GettingStarted.ps1) PostInstallationActivity 用スクリプト

    (Setup-DC.ps1) 必要なファイル (Users.csvなど) PostInstallationActivitiesフォルダごと 仮想マシン内に一時的にコピーされる 構築用スクリプトから PostInstallationActivity用スクリプト が呼び出される
  12. • 以下のスクリプトをDCのPostInstallationActivityとして実行する ドメインユーザの追加 Start-Transcript -Path C:\Windows\Temp\PostInstallation.log -append $ScriptsFolder = "C:\PostInstallationActivities"

    # ドメインユーザの情報をインポート(「Username,Password」の形式) # CSVファイルは事前に用意し、スクリプトと同じフォルダに保存しておく $Users = Import-Csv -Path "$ScriptsFolder\Users.csv" -Encoding UTF8 # ドメインユーザの追加 foreach ($User in $Users) { $Password = $User.Password | ConvertTo-SecureString -AsPlainText -Force New-ADUser -Name $User.Username -AccountPassword $Password ` -PasswordNeverExpires $true -Enabled $true -Verbose } Stop-Transcript 2024/7/19 21
  13. • 以下のスクリプトをDCのPostInstallationActivityとして実行する グループポリシーの適用 Start-Transcript -Path C:\Windows\Temp\PostInstallation.log -append $ScriptsFolder = "C:\PostInstallationActivities"

    # GPOの一覧をインポート(CSVファイルは前ページで作成したもの) $GPOs = Import-Csv -Path "$ScriptsFolder\GPOs.csv" -Encoding UTF8 # ドメインユーザの追加 foreach ($GPO in $GPOs) { Import-GPO -CreateIfNeeded -BackupGpoName $GPO.GPOName -TargetName $GPO.GPOName -Path "$ScriptsFolder" New-GPLink -Name $GPO.GPOName -Target "DC=contoso,DC=com" } Stop-Transcript 2024/7/19 23
  14. よく使うコマンドレット # ラボの一覧を表示 PS C:\> Get-Lab -List # ラボ環境の情報のインポート PS

    C:\> Import-Lab -Name <ラボ名> # ラボの概要を表示 PS C:\> Show-LabDeploymentSummary -Detailed # ラボ内のマシン一覧の表示 PS C:\> Get-LabVM # ラボの削除 PS C:\> Remove-Lab -Name <ラボ名> 2024/7/19 25
  15. よく使うコマンドレット # ラボ内のマシンの起動 PS C:\> Start-LabVM [-ComputerName <コンピュータ名> | -All]

    # ラボ内のマシンの停止 PS C:\> Stop-LabVM [-ComputerName <コンピュータ名> | -All] # チェックポイントの作成 PS C:\> Checkpoint-LabVM [-ComputerName <コンピュータ名> | -All] -SnapshotName <スナップショット名> # スナップショットの確認 PS C:\> Get-LabVMSnapshot -ComputerName <コンピュータ名> # スナップショットの復元 PS C:\> Restore-LabVMSnapshot [-ComputerName <コンピュータ名> | -All] -SnapshotName <スナップショット名> 2024/7/19 26
  16. Victim(Hyper-V Virtualization) PentestingLab(ALによる自動化の範囲) Attacker(Azure) 普段使っている環境のイメージ図 2024/7/19 29 インターネット C2サーバ 悪意のある

    Webサイト MSSQLサーバ ドメイン コントローラ ファイルサーバ CAサーバ プロキシサーバ ドメイン管理用端末 クライアント端末
  17. Kerberoast 2024/7/19 30 クライアント端末 ドメインコントローラ (前提)以下のようなSPNがDCに登録されている ・SPN:HTTP/WEB.contoso.com ・サービスアカウント:contoso\iis_admin TGT ①TGTを送信し、対象SPNに該当するSTを要求

    ST ③TGTを検証し、STを送信 ④サービスチケットを解析する ことで平文パスワードを特定 ST ②サービスチケットをサービス アカウントのNTLMハッシュで 暗号化
  18. • 以下のスクリプトをDCのPostInstallationActivityとして実行する Kerberoast Start-Transcript -Path C:\Windows\Temp\PostInstallation.log -append # ドメインユーザの追加(省略) #

    GPOの追加(省略) # サービスアカウントにドメインユーザを指定したSPNを登録 setspn.exe -S "HTTP/IIS.contoso.com" "contoso\iis_admin" Stop-Transcript 2024/7/19 31
  19. Steal NetNTLM hash from MSSQL 2024/7/19 33 (前提)以下のようなMSSQLサーバが存在する ・サービスアカウント:contoso\sql_admin ・任意のDomain

    UsersがMSSQLへログイン可能 ③クライアント端末上のフォルダへアクセス (このときサービスアカウントの NetNTLMv2ハッシュが送信される) ①予めクライアント端末上で SMBサーバを起動しておく クライアント端末 MSSQLサーバ ②MSSQLに対してSMBで共有している クライアント端末上のフォルダへアクセスさせる SQLクエリ(xp_dirtree)を実行 ④取得したNetNTLMv2ハッシュを 解析することで平文パスワードを特定 NetNTLMv2 NetNTLMv2
  20. • ラボ構築用スクリプトに以下を追加する Steal NetNTLM hash from MSSQL $PostInstallationFolder = ".\PostInstallationActivities"

    # MSSQLサーバのロールを定義 Add-LabIsoImageDefinition -Name SQLServer2019 -Path (Join-Path -Path $LabSources -ChildPath "ISOs\SQLServer2019-x64-ENU.iso") # MSSQLサーバのPostInstallationActivity用スクリプトを指定 $PostInstallationActivity = Get-LabPostInstallationActivity -ScriptFileName Setup-SQL.ps1 -DependencyFolder $PostInstallationFolder # MSSQLサーバの定義 Add-LabMachineDefinition -Name SQL -DomainName contoso.com -Roles SQLServer2019 -OperatingSystem "Windows Server 2022 Standard Evaluation (Desktop Experience)" -PostInstallationActivity $PostInstallationActivity 2024/7/19 34
  21. • 以下のスクリプトをSQLのPostInstallationActivityとして実行する Steal NetNTLM hash from MSSQL # MSSQLのサービスアカウントをドメインユーザに変更 [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SqlWmi

    Management") $SMOWmiserver = New- Object("Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer") SQL $ChangeService = $SMOWmiserver.Services | Where-Object { $_.Name -eq "MSSQLSERVER" } $ChangeService.SetServiceAccount("contoso\sql_admin", "Somepass1") # MSSQLへ任意のドメインユーザがログインできるように変更 Copy-Item -Path "C:\PostInstallationActivities\SqlServer" -Destination "C:\Program Files\WindowsPowerShell\Modules" -Recurse powershell.exe -Command "Add-SqlLogin -ServerInstance SQL -LoginName 'contoso\Domain Users' -LoginType WindowsGroup -GrantConnectSql -Enable" 2024/7/19 35
  22. Steal NetNTLM hash from MSSQL 2024/7/19 36 HackTricks. "MSSQL AD

    Abuse". https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/abusing-ad-mssql ①低権限アカウントでSQLクエリが 発行可能なサーバを検出 ②当該MSSQLサーバがドメインユーザによっ て起動されていることを確認し、xp_dirtreeで 手元の共有フォルダへアクセスさせる ③共有フォルダアクセス時に発生する認証に よって、NetNTLMv2ハッシュを取得
  23. Steal NetNTLM hash from MSSQL 2024/7/19 37 HackTricks. "MSSQL AD

    Abuse". https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/abusing-ad-mssql ④取得したハッシュを解析して平文パス ワードを特定
  24. ADCS Attacks - ESC1 2024/7/19 38 クライアント端末 ドメインコントローラ (前提)ESC1に対して脆弱な証明書 テンプレートが公開されている

    ①脆弱な証明書テンプレートを使用し、SANに 高権限アカウントを設定した証明書をリクエスト ②SANに高権限アカウントが 設定された証明書を発行 CAサーバ 証明書 証明書
  25. • ラボ構築用スクリプトに以下を追加し、ADCSを構築する ADCS Attacks - ESC1(準備) $PostInstallationFolder = ".\PostInstallationActivities" #

    ADCSサーバのPostInstallationActivity用スクリプトを指定 $PostInstallationActivity = Get-LabPostInstallationActivity -ScriptFileName Setup-CA.ps1 -DependencyFolder $PostInstallationFolder # ADCSサーバの定義 Add-LabMachineDefinition -Name CA -DomainName contoso.com -Roles CaRoot -OperatingSystem "Windows Server 2022 Standard Evaluation (Desktop Experience)" -PostInstallationActivity $PostInstallationActivity 2024/7/19 39
  26. • ADCSTemplateモジュールを使い、作成した証明書テンプレートをエ クスポートする • エクスポートした証明書テンプレートはPostInstallationActivitiesフォ ルダに格納しておく ADCS Attacks - ESC1(準備)

    # ADCSTemplateモジュールのインストール PS C:\> Install-Module -Name ADCSTemplate # 脆弱な証明書テンプレートをエクスポート PS C:\> Export-ADCSTemplate -DisplayName VulnESC1 | Out-File VulnESC1.json 2024/7/19 41
  27. • DCのPostInstallationActivity用スクリプトに以下を追加する ADCS Attacks - ESC1 # エクスポートした証明書テンプレート(JSON)の一覧を取得 $CATemplates =

    Get-ChildItem -Path " C:\PostInstallationActivities\CATemplates" # ADCSTemplateモジュールをコピー Copy-Item -Path "C:\PostInstallationActivities\ADCSTemplate" -Destination "C:\Program Files\WindowsPowerShell\Modules" -Recurse # 脆弱な証明書テンプレートをインポート foreach($CATemplate in $CATemplates) { $TemplateName = [System.IO.Path]::GetFileNameWithoutExtension($CATemplate.FullName) New-ADCSTemplate -DisplayName $TemplateName -JSON (Get-Content $CATemplate.FullName -Raw) -Identity "Domain Users" -Publish } 2024/7/19 42
  28. ADCS Attacks - ESC1 2024/7/19 43 HackTricks. "AD CS Domain

    Escalation". https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/ad-certificates/domain-escalation ①脆弱な証明書テンプレートの検出 ②SANに高権限アカウントを設定した 証明書をリクエストし、取得した証明 書をcert.pemとして保存する
  29. ADCS Attacks - ESC1 2024/7/19 44 HackTricks. "AD CS Domain

    Escalation". https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/ad-certificates/domain-escalation ③opensslなどでcert.pemをpfx形式 に変換し、Pass-the-Ticketによっ て任意のアカウントになりすますこ とができる ④ドメイン管理者アカウントになり すますことで、DCの管理共有へア クセス可能
  30. 参考文献 • [1] "AutomatedLab". https://github.com/AutomatedLab/AutomatedLab • [2] "AutomatedLab - Lab

    automation from users for users". https://automatedlab. org/en/latest/ • [3] "AutomatedLabでAD構築を自動化しよう". https://devblog.lac.co.jp/entry/2021 0622 2024/7/19 46