BARK ย่อมาจาก BloodHound Attack Research Kit เป็นสคริปต์ PowerShell ที่สร้างขึ้นเพื่อช่วยทีม BloodHound Enterprise ในการค้นคว้าและตรวจสอบการละเมิดแบบดั้งเดิมอย่างต่อเนื่อง ปัจจุบัน BARK มุ่งเน้นไปที่ชุดผลิตภัณฑ์และบริการ Azure ของ Microsoft
BARK ไม่จำเป็นต้องพึ่งพาบุคคลที่สาม ฟังก์ชั่นของ BARK ได้รับการออกแบบให้เรียบง่ายและบำรุงรักษาได้มากที่สุด ฟังก์ชันส่วนใหญ่เป็น wrappers ที่เรียบง่ายสำหรับส่งคำขอไปยังจุดสิ้นสุด REST API ต่างๆ ฟังก์ชันพื้นฐานของ BARK ไม่จำเป็นต้องใช้ซึ่งกันและกัน คุณสามารถดึงฟังก์ชัน BARK เกือบทั้งหมดออกจาก BARK ได้ และมันจะทำงานได้อย่างสมบูรณ์แบบในฐานะฟังก์ชันสแตนด์อโลนในสคริปต์ของคุณเอง
ผู้เขียนหลัก: Andy Robbins @_wald0
ผู้ร่วมให้ข้อมูล:
มีหลายวิธีในการนำเข้าสคริปต์ PowerShell นี่เป็นวิธีหนึ่ง:
ขั้นแรก ดาวน์โหลด BARK.ps1 โดยการโคลน repo นี้ หรือเพียงคัดลอก/วางเนื้อหาดิบจาก GitHub
git clone https://github.com/BloodHoundAD/BARK
ตอนนี้ cd ลงในไดเร็กทอรีที่ PS1 อยู่:
cd BARK
สุดท้าย คุณสามารถนำเข้า PS1 ได้ดังนี้:
. .BARK.ps1
กด Enter จากนั้นอินสแตนซ์ PowerShell ของคุณจะสามารถเข้าถึงฟังก์ชันทั้งหมดของ BARK ได้
ด้วยข้อยกเว้นเพียงเล็กน้อย ตำแหน่งข้อมูล Azure API จำเป็นต้องมีการรับรองความถูกต้องจึงจะโต้ตอบได้ BARK มาพร้อมกับฟังก์ชันบางอย่างที่จะช่วยให้คุณได้รับโทเค็นที่จำเป็นสำหรับการโต้ตอบกับ MS Graph และ Azure REST API ฟังก์ชัน BARK ใดๆ ที่โต้ตอบกับ Azure API ที่ต้องมีการตรวจสอบสิทธิ์จะต้องให้คุณระบุโทเค็น
สมมติว่าคุณต้องการแสดงรายการผู้ใช้ทั้งหมดในผู้เช่า Entra ID ก่อนอื่นคุณต้องได้รับโทเค็นที่กำหนดขอบเขตสำหรับ MS Graph มีหลายวิธีในการรับโทเค็นนี้:
หากคุณมีชื่อผู้ใช้/รหัสผ่านรวมกันสำหรับผู้ใช้ Entra ในผู้เช่านั้น คุณสามารถรับโทเค็นการรีเฟรชสำหรับผู้ใช้ได้ก่อนโดยใช้ฟังก์ชัน Get-EntraRefreshTokenWithUsernamePassword ของ BARK:
$MyRefreshTokenRequest = Get-EntraRefreshTokenWithUsernamePassword -username "[email protected]" -password "MyVeryCoolPassword" -TenantID "contoso.onmicrosoft.com"
ออบเจ็กต์ผลลัพธ์ที่คุณเพิ่งสร้างขึ้น $MyRefreshTokenRequest จะมีโทเค็นการรีเฟรชสำหรับผู้ใช้ของคุณเป็นส่วนหนึ่งของมัน ตอนนี้คุณสามารถขอโทเค็นที่กำหนดขอบเขต MS Graph ได้โดยใช้โทเค็นการรีเฟรชนี้:
$MyMSGraphToken = Get-MSGraphTokenWithRefreshToken -RefreshToken $MyRefreshTokenRequest.refresh_token -TenantID "contoso.onmicrosoft.com"
ตอนนี้วัตถุใหม่นี้ $MyMSGraphToken จะมีหนึ่งในค่าคุณสมบัติ JWT ที่มีการกำหนดขอบเขต MS Graph สำหรับผู้ใช้ของคุณ ตอนนี้คุณพร้อมที่จะใช้โทเค็นนี้เพื่อแสดงรายการผู้ใช้ทั้งหมดในผู้เช่า Entra:
$MyUsers = Get-AllEntraUsers -Token $MyMSGraphToken.access_token -ShowProgress
เมื่อเสร็จแล้ว ตัวแปร $MyEntraUsers จะถูกเติมด้วยอ็อบเจ็กต์ที่แสดงถึงผู้ใช้ทั้งหมดในผู้เช่า Entra ของคุณ
Get-AzureKeyVaultTokenWithClientCredentials ร้องขอโทเค็นจาก STS ด้วย Azure Vault ที่ระบุว่าเป็นทรัพยากร/กลุ่มเป้าหมายที่ใช้รหัสไคลเอ็นต์และข้อมูลลับGet-AzureKeyVaultTokenWithUsernamePassword ร้องขอโทเค็นจาก STS ด้วย Azure Vault ที่ระบุว่าเป็นทรัพยากร/ผู้ชมเป้าหมายโดยใช้ชื่อผู้ใช้และรหัสผ่านที่ผู้ใช้ระบุGet-AzurePortalTokenWithRefreshToken ร้องขอโทเค็นการรีเฟรช Azure Portal Auth ด้วยโทเค็นการรีเฟรชที่ผู้ใช้ระบุGet-AzureRMTokenWithClientCredentials ร้องขอ JWT ที่กำหนดขอบเขต AzureRM พร้อมด้วยรหัสไคลเอ็นต์และความลับ มีประโยชน์สำหรับการตรวจสอบสิทธิ์เป็นบริการหลักของ EntraGet-AzureRMTokenWithPortalAuthRefreshToken ร้องขอ JWT ที่มีขอบเขต AzureRM พร้อมด้วยโทเค็น Azure Portal Auth Refresh ที่ผู้ใช้ระบุGet-AzureRMTokenWithRefreshToken ร้องขอ JWT ที่กำหนดขอบเขต AzureRM พร้อมด้วยโทเค็นการรีเฟรชที่ผู้ใช้ระบุGet-AzureRMTokenWithUsernamePassword ร้องขอ JWT ที่กำหนดขอบเขต AzureRM ด้วยชื่อผู้ใช้และรหัสผ่านที่ผู้ใช้ระบุGet-EntraRefreshTokenWithUsernamePassword ร้องขอคอลเลกชันของโทเค็น รวมถึงโทเค็นการรีเฟรช จาก login.microsoftonline.com ด้วยชื่อผู้ใช้และรหัสผ่านที่ผู้ใช้ระบุ สิ่งนี้จะล้มเหลวหากผู้ใช้มีข้อกำหนดการตรวจสอบสิทธิ์แบบหลายปัจจัยหรือได้รับผลกระทบจากนโยบายการเข้าถึงแบบมีเงื่อนไขGet-MSGraphTokenWithClientCredentials ร้องขอ JWT ที่มีขอบเขตกราฟ MS พร้อมรหัสไคลเอ็นต์และความลับ มีประโยชน์สำหรับการตรวจสอบสิทธิ์เป็นบริการหลักของ EntraGet-MSGraphTokenWithPortalAuthRefreshToken ร้องขอ JWT ที่มีขอบเขตเป็น MS Graph พร้อมด้วยโทเค็น Azure Portal Auth Refresh ที่ผู้ใช้ระบุGet-MSGraphTokenWithRefreshToken ร้องขอ JWT ที่มีขอบเขตเป็น MS Graph พร้อมด้วยโทเค็นการรีเฟรชที่ผู้ใช้ระบุGet-MSGraphTokenWithUsernamePassword ร้องขอ JWT ที่มีขอบเขตเป็น MS Graph ด้วยชื่อผู้ใช้และรหัสผ่านที่ผู้ใช้ระบุParse-JWTToken จะใช้ JWT ที่เข้ารหัส Base64 เป็นอินพุตและแยกวิเคราะห์ให้คุณ มีประโยชน์สำหรับการตรวจสอบผู้ชมโทเค็นและการอ้างสิทธิ์ที่ถูกต้องฟังก์ชันที่ใช้โทเค็นการรีเฟรชใน BARK นั้นอิงตามฟังก์ชันใน TokenTactics โดย Steve Borosh
Get-AllEntraApps รวบรวมวัตถุการลงทะเบียนแอปพลิเคชัน Entra ทั้งหมดGet-AllEntraGroups รวบรวมกลุ่ม Entra ทั้งหมดGet-AllEntraRoles รวบรวมบทบาทผู้ดูแลระบบ Entra ทั้งหมดGet-AllEntraServicePrincipals รวบรวมออบเจ็กต์หลักของบริการ Entra ทั้งหมดGet-AllEntraUsers รวบรวมผู้ใช้ Entra ทั้งหมดGet-EntraAppOwner รวบรวมเจ้าของการลงทะเบียนแอป EntraGet-EntraDeviceRegisteredUsers รวบรวมผู้ใช้อุปกรณ์ EntraGet-EntraGroupMembers รวบรวมสมาชิกของกลุ่ม EntraGet-EntraGroupOwner รวบรวมเจ้าของกลุ่ม EntraGet-EntraRoleTemplates รวบรวมเทมเพลตบทบาทของผู้ดูแลระบบ EntraGet-EntraServicePrincipal รวบรวมหลักการบริการของ EntraGet-EntraServicePrincipalOwner รวบรวมเจ้าของบริการหลักของ EntraGet-EntraTierZeroServicePrincipals รวบรวมหลักการบริการของ Entra ที่มีบทบาทผู้ดูแลระบบ Entra Tier Zero หรือการกำหนดบทบาทแอป Tier Zero MS GraphGet-MGAppRoles รวบรวมบทบาทของแอปที่มีให้โดยบริการหลักของ MS Graph Get-AllAzureManagedIdentityAssignments รวบรวมการกำหนดข้อมูลประจำตัวที่ได้รับการจัดการทั้งหมดGet-AllAzureRMAKSClusters รวบรวมคลัสเตอร์บริการ kubernetes ทั้งหมดภายใต้การสมัครใช้งานGet-AllAzureRMAutomationAccounts รวบรวมบัญชีอัตโนมัติทั้งหมดภายใต้การสมัครสมาชิกGet-AllAzureRMAzureContainerRegistries รวบรวมการลงทะเบียนคอนเทนเนอร์ทั้งหมดภายใต้การสมัครใช้งานGet-AllAzureRMFunctionApps รวบรวมแอปฟังก์ชันทั้งหมดภายใต้การสมัครสมาชิกGet-AllAzureRMKeyVaults รวบรวม Key Vaults ทั้งหมดภายใต้การสมัครสมาชิกGet-AllAzureRMLogicApps รวบรวมแอปลอจิกทั้งหมดภายใต้การสมัครรับข้อมูลGet-AllAzureRMResourceGroups รวบรวมกลุ่มทรัพยากรทั้งหมดภายใต้การสมัครใช้งานGet-AllAzureRMSubscriptions รวบรวมการสมัคร AzureRM ทั้งหมดGet-AllAzureRMVMScaleSetsVMs รวบรวมเครื่องเสมือนทั้งหมดภายใต้ชุดมาตราส่วน VMGet-AllAzureRMVMScaleSets รวบรวมชุดมาตราส่วนเครื่องเสมือนทั้งหมดภายใต้การสมัครใช้งานGet-AllAzureRMVirtualMachines รวบรวมเครื่องเสมือนทั้งหมดภายใต้การสมัครสมาชิกGet-AllAzureRMWebApps รวบรวมเว็บแอปทั้งหมดภายใต้การสมัครสมาชิกGet-AzureAutomationAccountRunBookOutput รันสมุดบัญชีอัตโนมัติและดึงข้อมูลผลลัพธ์Get-AzureFunctionAppFunctionFile รวบรวมไฟล์ดิบ (โดยปกติจะเป็นซอร์สโค้ด) ของฟังก์ชันแอปฟังก์ชันGet-AzureFunctionAppFunctions รวบรวมฟังก์ชันทั้งหมดภายใต้แอปฟังก์ชันGet-AzureFunctionAppMasterKeys รวบรวมคีย์หลักทั้งหมดภายใต้แอปฟังก์ชันGet-AzureFunctionOutput รันฟังก์ชันแอปฟังก์ชันและดึงข้อมูลเอาต์พุตGet-AzureRMKeyVaultSecretValue รวบรวมค่าความลับของ Key VaultGet-AzureRMKeyVaultSecretVersions รวบรวม Key Vault Secret ทุกเวอร์ชันGet-AzureRMKeyVaultSecrets รวบรวมความลับทั้งหมดภายใต้ Key VaultGet-AzureRMRoleAssignments รวบรวมการกำหนดบทบาททั้งหมดกับวัตถุGet-AzureRMRoleDefinitions รวบรวมคำจำกัดความบทบาททั้งหมดที่อธิบายไว้ในขอบเขตการสมัครใช้งาน รวมถึงบทบาทที่กำหนดเองGet-AzureRMWebApp รวบรวมเว็บแอป Get-IntuneManagedDevices รวบรวมอุปกรณ์ที่มีการจัดการ IntuneGet-IntuneRoleDefinitions รวบรวมคำจำกัดความบทบาท Intune ที่พร้อมใช้งาน Add-MemberToEntraGroup จะพยายามเพิ่มตัวการให้กับกลุ่ม EntraEnable-EntraRole จะพยายามเปิดใช้งาน (หรือ "เปิดใช้งาน") บทบาท EntraNew-EntraAppOwner จะพยายามเพิ่มเจ้าของใหม่ในแอป EntraNew-EntraAppRoleAssignment จะพยายามมอบบทบาทแอปให้กับบริการหลัก ตัวอย่างเช่น คุณสามารถใช้สิ่งนี้เพื่อให้บทบาทแอป RoleManagement.ReadWrite.Directory แก่บริการหลักได้New-EntraAppSecret จะพยายามสร้างความลับใหม่สำหรับการลงทะเบียนแอป Entra ที่มีอยู่New-EntraGroupOwner จะพยายามเพิ่มเจ้าของใหม่ให้กับกลุ่ม EntraNew-EntraRoleAssignment จะพยายามมอบหมายบทบาทผู้ดูแลระบบ Entra ให้กับอาจารย์ใหญ่ที่ระบุNew-EntraServicePrincipalOwner จะพยายามเพิ่มเจ้าของใหม่ให้กับบริการหลักของ EntraNew-EntraServicePrincipalSecret จะพยายามสร้างข้อมูลลับใหม่สำหรับบริการหลักของ Entra ที่มีอยู่Reset-EntraUserPassword จะพยายามรีเซ็ตรหัสผ่านของผู้ใช้รายอื่น หากสำเร็จ ผลลัพธ์จะมีรหัสผ่านใหม่ที่สร้างโดย Azure ของผู้ใช้Set-EntraUserPassword จะพยายามตั้งรหัสผ่านของผู้ใช้รายอื่นเป็นค่าที่ผู้ใช้ระบุใหม่ Invoke-AzureRMAKSRunCommand จะสั่งให้คลัสเตอร์ AKS ดำเนินการคำสั่งInvoke-AzureRMVMRunCommand จะพยายามดำเนินการคำสั่งบน VMInvoke-AzureRMWebAppShellCommand จะพยายามดำเนินการคำสั่งบนคอนเทนเนอร์ของเว็บแอปInvoke-AzureVMScaleSetVMRunCommand จะพยายามดำเนินการคำสั่งบน VM Scale Set VMNew-AzureAutomationAccountRunBook จะพยายามเพิ่ม runbook ให้กับบัญชีอัตโนมัติNew-AzureKeyVaultAccessPolicy จะพยายามให้สิทธิ์ "รับ" และ "รายการ" หลักกับความลับ คีย์ และใบรับรองของ Key VaultNew-AzureRMRoleAssignment จะพยายามมอบการกำหนดบทบาท AzureRM ที่ผู้ใช้ระบุให้กับตัวการเฉพาะในขอบเขตที่กำหนดNew-PowerShellFunctionAppFunction จะพยายามสร้างฟังก์ชัน PowerShell ใหม่ในแอปฟังก์ชัน ConvertTo-Markdown ใช้สำหรับการนวดเอาต์พุตจากฟังก์ชัน Invivo-Tests สำหรับการใช้งานในแพลตฟอร์มอื่นInvoke-AllAzureMGAbuseTests ดำเนินการทดสอบการตรวจสอบการละเมิดทั้งหมดที่สามารถดำเนินการได้โดยการถือบทบาทแอป MS Graph ส่งคืนออบเจ็กต์ที่อธิบายว่าสิทธิ์ใดที่ประสบความสำเร็จในการทดสอบการละเมิดแต่ละครั้งInvoke-AllAzureRMAbuseTests ดำเนินการทดสอบการตรวจสอบการละเมิด AzureRM ทั้งหมด และส่งออกออบเจ็กต์ผลลัพธ์ที่อธิบายว่าบทบาท AzureRM ใดที่ได้รับความสามารถในการดำเนินการละเมิดแต่ละครั้งInvoke-AllEntraAbuseTests ดำเนินการทดสอบการตรวจสอบการละเมิดทั้งหมดที่สามารถทำได้โดยผู้หลักที่ได้รับบทบาทผู้ดูแลระบบ Entra ส่งคืนออบเจ็กต์ที่อธิบายว่าสิทธิ์ใดที่ประสบความสำเร็จในการทดสอบการละเมิดแต่ละครั้งNew-EntraIDAbuseTestSPs สร้างบริการหลักใหม่ตามบทบาทผู้ดูแลระบบ Entra ที่ใช้งานอยู่ และมอบบทบาทที่เหมาะสมให้กับบริการหลักแต่ละรายการ ส่งกลับข้อมูลรับรองข้อความธรรมดาที่สร้างขึ้นสำหรับแต่ละบริการหลักNew-EntraIDAbuseTestUsers สร้างผู้ใช้ใหม่ต่อบทบาทผู้ดูแลระบบ Entra ที่ใช้งานอยู่ และมอบบทบาทที่เหมาะสมให้กับผู้ใช้แต่ละราย ส่งกลับข้อมูลรับรองข้อความธรรมดาที่สร้างขึ้นสำหรับผู้ใช้แต่ละรายNew-IntuneAbuseTestUsers สร้างผู้ใช้ใหม่ตามบทบาท Intune และมอบบทบาทที่เหมาะสมให้กับผู้ใช้แต่ละราย ส่งกลับข้อมูลรับรองข้อความธรรมดาที่สร้างขึ้นสำหรับผู้ใช้แต่ละรายNew-MSGraphAppRoleTestSPs จะสร้างบริการหลักใหม่ตามบทบาทของแอป MS Graph และมอบบทบาทที่เหมาะสมให้กับบริการหลักแต่ละรายการ ส่งกลับข้อมูลรับรองข้อความธรรมดาที่สร้างขึ้นสำหรับแต่ละบริการหลักNew-TestAppReg สร้างออบเจ็กต์การลงทะเบียนแอปพลิเคชันเพื่อวัตถุประสงค์ที่ชัดเจนในการทดสอบการตรวจสอบการละเมิดNew-TestSP สร้างบริการหลักใหม่และเชื่อมโยงกับแอปที่สร้างโดยฟังก์ชันข้างต้นRemove-AbuseTestAzureRMRoles เป็นฟังก์ชันล้างข้อมูลสำหรับการลบบทบาทผู้ดูแลระบบ AzureRM ที่สร้างขึ้นระหว่างการทดสอบRemove-AbuseTestServicePrincipals จะล้างการทดสอบการละเมิดโดยการลบหลักการบริการที่สร้างขึ้นระหว่างการทดสอบTest-AzureRMAddSelfToAzureRMRole ใช้ในการทดสอบการตรวจสอบความถูกต้องในทางที่ผิดเพื่อตรวจสอบว่าบริการหลักที่มีสิทธิ์บางอย่างสามารถให้บทบาทผู้ดูแลระบบการเข้าถึงผู้ใช้แก่ตนเองผ่านการสมัครสมาชิกได้หรือไม่Test-AzureRMCreateFunction ที่ใช้ในการทดสอบการตรวจสอบความถูกต้องในทางที่ผิดเพื่อทดสอบว่าบริการหลักสามารถเพิ่มฟังก์ชันใหม่ให้กับแอปฟังก์ชันที่มีอยู่ได้หรือไม่Test-AzureRMPublishAutomationAccountRunBook ใช้เพื่อทดสอบว่าบริการหลักสามารถเผยแพร่ Runbook ใหม่ไปยังบัญชีอัตโนมัติที่มีอยู่ได้หรือไม่Test-AzureRMVMRunCommand ใช้เพื่อทดสอบว่าตัวการสามารถรันคำสั่งบน VM ที่มีอยู่ได้หรือไม่Test-MGAddMemberToNonRoleEligibleGroup ใช้เพื่อทดสอบว่าบริการหลักสามารถเพิ่มตัวเองลงในกลุ่มที่มีสิทธิ์ที่ไม่ใช่บทบาทได้หรือไม่Test-MGAddMemberToRoleEligibleGroup ใช้เพื่อทดสอบว่าบริการหลักสามารถเพิ่มตัวเองลงในกลุ่มที่มีสิทธิ์ตามบทบาทได้หรือไม่Test-MGAddOwnerToNonRoleEligibleGroup ใช้เพื่อทดสอบว่าบริการหลักสามารถให้สิทธิ์การเป็นเจ้าของกลุ่มที่มีสิทธิ์ซึ่งไม่มีบทบาทอย่างชัดเจนได้หรือไม่Test-MGAddOwnerToRoleEligibleGroup ใช้เพื่อทดสอบว่าบริการหลักสามารถให้สิทธิ์การเป็นเจ้าของกลุ่มที่มีสิทธิ์ตามบทบาทอย่างชัดเจนหรือไม่Test-MGAddRootCACert ใช้เพื่อทดสอบว่าผู้ให้บริการหลักสามารถเพิ่มใบรับรอง Root CA ใหม่ให้กับผู้เช่าได้หรือไม่Test-MGAddSecretToApp ใช้เพื่อทดสอบว่าบริการหลักสามารถเพิ่มความลับใหม่ให้กับแอปที่มีอยู่ได้หรือไม่Test-MGAddSecretToSP ใช้เพื่อทดสอบว่าบริการหลักสามารถเพิ่มข้อมูลลับใหม่ให้กับบริการหลักที่มีอยู่ได้หรือไม่Test-MGAddSelfAsOwnerOfApp ใช้ในการทดสอบการตรวจสอบการละเมิดเพื่อตรวจสอบว่าบริการหลักที่มีสิทธิ์เฉพาะสามารถให้สิทธิ์การเป็นเจ้าของแอป Entra ที่มีอยู่ได้หรือไม่Test-MGAddSelfAsOwnerOfSP ใช้ในการทดสอบการตรวจสอบความถูกต้องในทางที่ผิดเพื่อตรวจสอบว่าบริการหลักที่มีสิทธิ์เฉพาะสามารถให้สิทธิ์การเป็นเจ้าของบริการหลักของ Entra ที่มีอยู่ได้หรือไม่Test-MGAddSelfToEntraRole ใช้ในการทดสอบการตรวจสอบความถูกต้องในทางที่ผิดเพื่อพิจารณาว่าบริการหลักที่มีสิทธิ์เฉพาะสามารถเพิ่มตัวเองลงในบทบาทผู้ดูแลระบบ Entra เช่น ผู้ดูแลระบบส่วนกลาง เป็นต้นTest-MGAddSelfToMGAppRole ใช้ในการทดสอบการตรวจสอบความถูกต้องในทางที่ผิดเพื่อตรวจสอบว่าบริการหลักที่มีสิทธิ์พิเศษสามารถให้บทบาทแอป MS Graph เฉพาะแก่ตัวเองได้โดยไม่ต้องได้รับความยินยอมจากผู้ดูแลระบบหรือไม่