ค้นหาเว็บไซต์

พื้นฐานของการสำรวจ LDAP ด้วย PowerShell


ในโพสต์แนะนำของซีรีส์นี้ เราได้ตรวจสอบว่าบัญชีบริการ Active Directory (AD) คืออะไร อธิบายว่าทำไมบัญชีที่ได้รับสิทธิพิเศษเหล่านี้จึงมีความเสี่ยงด้านความปลอดภัยอย่างร้ายแรง และสัญญาว่าจะให้รายละเอียดการโจมตี 4 ประเภทในบัญชีบริการในโพสต์ต่อๆ ไป โพสต์นี้จะสำรวจการโจมตีครั้งแรก: การลาดตระเวน LDAP ซึ่งผู้โจมตีสามารถใช้เพื่อค้นหาบัญชีบริการในสภาพแวดล้อมด้านไอทีในขณะที่หลีกเลี่ยงการตรวจจับ

โดยเฉพาะในโพสต์นี้ เราจะสำรวจว่าผู้โจมตีที่ไม่มีสิทธิ์พิเศษ เช่น ผู้ดูแลระบบโดเมน หรือแม้แต่สิทธิ์ของผู้ดูแลระบบในเครื่อง สามารถใช้คำสั่ง PowerShell แบบง่ายๆ เพื่อค้นหาบัญชีบริการได้อย่างไร โดยไม่ต้องติดตั้งหรือเรียนรู้เครื่องมือพิเศษ เช่น Bloodhound

ค้นหาบัญชีพิเศษ

Active Directory มอบคุณประโยชน์ด้านความปลอดภัยและการจัดการมากมาย แต่ยังสามารถทำให้สิ่งต่างๆ ง่ายเกินไปสำหรับผู้โจมตีที่อยากรู้อยากเห็นอีกด้วย เนื่องจากสถาปัตยกรรมของ AD เมื่อผู้โจมตีแทรกซึมเข้าไปในคอมพิวเตอร์ที่เข้าร่วมโดเมน พวกเขาสามารถสืบค้นไดเร็กทอรีและอ็อบเจ็กต์ของไดเร็กทอรีได้ และเนื่องจากตามค่าเริ่มต้น Active Directory จะไม่มีกลไกในการตรวจสอบและแจ้งเตือนเกี่ยวกับกิจกรรมที่น่าสงสัย จึงมักจะสามารถหลีกเลี่ยงการตรวจจับได้

ต่อไปนี้คือวิธีที่ผู้โจมตีสามารถค้นพบบัญชีบริการโดยการสืบค้น LDAP

การค้นพบชื่อหลักบริการ (SPN)

บัญชีบริการใช้ประโยชน์จาก SPN เพื่อรองรับการตรวจสอบสิทธิ์ Kerberos แม้ว่าสิ่งนี้จะช่วยเพิ่มความปลอดภัย แต่ก็ยังทิ้งร่องรอยว่าบัญชีเหล่านี้ถูกใช้ที่ไหนและใช้เพื่ออะไร ผู้โจมตีสามารถใช้ประโยชน์จากข้อมูลนี้ได้อย่างง่ายดาย SPN มักใช้เพื่อเรียกใช้บริการเพื่อรองรับแอปพลิเคชันเช่น Microsoft SQL Server และ SharePoint

ในบล็อกโพสต์อื่น เราจะสาธิตวิธีการลาดตระเวน AD ขั้นสูง อย่างไรก็ตาม มีวิธีที่ง่ายกว่าในการรับข้อมูลที่เราต้องการเพื่อวัตถุประสงค์ของเราที่นี่ เมื่อใช้แบบสอบถาม LDAP แบบง่ายต่อไปนี้ ผู้โจมตีสามารถรับรายการบัญชี AD ที่ลงทะเบียน SPN รวมถึงคอมพิวเตอร์ แอปพลิเคชัน และข้อมูลที่พวกเขาให้สิทธิ์ในการเข้าถึง:

#Build LDAP filters to look for users with SPN values registered for current domain
$ldapFilter = "(&(objectclass=user)(objectcategory=user)(servicePrincipalName=*))"
$domain = New-Object System.DirectoryServices.DirectoryEntry
$search = New-Object System.DirectoryServices.DirectorySearcher
$search.SearchRoot = $domain
$search.PageSize = 1000
$search.Filter = $ldapFilter
$search.SearchScope = "Subtree"
#Execute Search
$results = $search.FindAll()
#Display SPN values from the returned objects
foreach ($result in $results)
{
    $userEntry = $result.GetDirectoryEntry()
    Write-Host "User Name = " $userEntry.name
    foreach ($SPN in $userEntry.servicePrincipalName)
    {
        Write-Host "SPN = " $SPN      
    }
    Write-Host ""   
}

ค่า SPN ในผลลัพธ์จะเปิดเผยว่าแต่ละบัญชีลงทะเบียนที่ไหนและบริการใดที่ลงทะเบียนในระบบนั้น ตัวอย่างเช่น นี่คือค่า SPN สำหรับบัญชีบริการ SQL:

การค้นพบบัญชีบริการโดยใช้แอตทริบิวต์ออบเจ็กต์ทั่วไป

แม้ว่า SPN จะมีความน่าเชื่อถือและให้ข้อมูลได้ดีมาก แต่ก็จะไม่สร้างรายชื่อบัญชีบริการที่ครอบคลุม เนื่องจากบัญชีจำนวนมากไม่ได้รวมเข้ากับ Kerberos ผ่าน SPN และจะไม่มีการตั้งค่า SPN อย่างไรก็ตาม ผู้โจมตีที่ไม่มีสิทธิ์โดเมนมักจะยังสามารถค้นพบบัญชีบริการด้วยวิธีอื่นได้ โดยเฉพาะอย่างยิ่ง องค์กรส่วนใหญ่ใช้หลักการตั้งชื่อ เช่น ตั้งชื่อบัญชีบริการทั้งหมดที่ขึ้นต้นด้วย "SVC" หรือชื่อที่คล้ายกัน และโดยทั่วไปแล้วบัญชีบริการจะอยู่ในหน่วยองค์กร (OU) หรือกลุ่มของตนเอง

การค้นหาบัญชีบริการตามแบบแผนการตั้งชื่อบัญชี

นี่คือสคริปต์ PowerShell ที่จะค้นหาบัญชีทั้งหมดที่มี "svc" อยู่ในชื่อ:

#Build LDAP filter to find service accounts based on naming conventions
$ldapFilter = "(&(objectclass=Person)(cn=*svc*))"
$domain = New-Object System.DirectoryServices.DirectoryEntry
$search = New-Object System.DirectoryServices.DirectorySearcher
$search.SearchRoot = $domain
$search.PageSize = 1000
$search.Filter = $ldapFilter
$search.SearchScope = "Subtree"

#Add list of properties to search for
$objProperties = "name"
Foreach ($i in $objProperties){$search.PropertiesToLoad.Add($i)}

#Execute Search
$results = $search.FindAll()
#Display values from the returned objects
foreach ($result in $results)
{
    $userEntry = $result.GetDirectoryEntry()
    Write-Host "User Name = " $userEntry.name
    Write-Host ""   
}

ค้นหาบัญชีบริการตาม OU

และนี่คือตัวกรอง LDAP ที่สามารถแทนที่ในสคริปต์ก่อนหน้าเพื่อค้นหา OU ใดๆ ที่มี “บริการ” หรือ “svc” อยู่ในชื่อ:

$ldapFilter = "(&(objectClass=organizationalUnit)(|name=*Service*)(name=*svc*)))"

ผู้โจมตีสามารถค้นหา OU เหล่านั้นสำหรับออบเจ็กต์ผู้ใช้ทั้งหมดเพื่อค้นหาบัญชีบริการของคุณ สคริปต์นี้เน้นที่ OU หนึ่งรายการที่มี "บริการ" ในชื่อ:

$search = New-Object System,DirecoryServices.DirectorySearcher
$search.SearchRoot = "LDAP://OU=Service Accounts,OU=JEFFLAB,DC=local"
$search.PageSize = 1000
$search.Filter = $ldapFilter
$search.SearchScope = "Subtree"

การค้นพบบัญชีบริการผ่านการควบคุมบัญชีผู้ใช้

อีกวิธีหนึ่งในการค้นหา Active Directory สำหรับบัญชีบริการคือการตรวจสอบการตั้งค่าการควบคุมบัญชี เนื่องจากบัญชีบริการมักจะมีการตั้งค่าที่แตกต่างจากบัญชีผู้ใช้ทั่วไป ตัวอย่างที่ดีที่สุดของกรณีนี้คือการตั้งค่า “รหัสผ่านไม่มีวันหมดอายุ” บัญชีบริการอาจมีรหัสผ่านที่ตั้งค่าไว้ไม่มีวันหมดอายุ เนื่องจากการรีเซ็ตรหัสผ่านอาจเป็นเรื่องที่น่าเบื่อและส่งผลให้แอปพลิเคชันหรือบริการหยุดทำงาน

ด้วย PowerShell คุณสามารถค้นหาบัญชีทั้งหมดที่เปิดใช้งานค่านี้ได้ โดยใช้ตัวกรอง LDAP ที่ซับซ้อนกว่าเล็กน้อย:

$ldapFilter = "(&(objectclass=user)(objectcategory=user)(useraccountcontrol:1.2.840.113556.1.4.803:=65536))"

การค้นพบสิทธิพิเศษ

แม้ว่าโพสต์นี้จะเน้นไปที่วิธีการค้นหาบัญชีบริการโดยไม่ต้องใช้สิทธิพิเศษใดๆ แต่หากผู้โจมตีพบบัญชีที่มีสิทธิ์บนระบบตั้งแต่หนึ่งระบบขึ้นไปภายในเครือข่าย ก็มีวิธีอื่นๆ มากมายที่มีประสิทธิภาพในการค้นหาบัญชีบริการ ประกอบด้วย:

  • การระบุบริการบนปลายทางและการแยกบัญชีชื่อเริ่มต้น
  • ค้นหาสตริงการเชื่อมต่อใน web.config สคริปต์และตำแหน่งอื่นๆ ที่บัญชีบริการอาจถูกฮาร์ดโค้ด
  • สำรวจนโยบายท้องถิ่นสำหรับผู้ใช้ที่ได้รับสิทธิ์ "เข้าสู่ระบบเป็นบริการ"
  • แยกบันทึกเหตุการณ์สำหรับประเภทการเข้าสู่ระบบแบบไม่โต้ตอบ
  • ค้นหากลุ่มแอปพลิเคชันและบัญชีบริการแอปพลิเคชันเว็บอื่นๆ

การใช้ประโยชน์จากบัญชีที่ค้นพบ

เมื่อฝ่ายตรงข้ามมีรายชื่อบัญชีบริการแล้ว ขั้นตอนต่อไปคือการหาประโยชน์จากบัญชีเหล่านั้น ค้นพบตัวเลือกบางส่วนได้ในโพสต์ต่อไปนี้:

  • แยกรหัสผ่านบัญชีบริการด้วย Kerberoasting
  • การแสวงหาประโยชน์จากบัญชีบริการแบบกำหนดเป้าหมายด้วยตั๋วเงิน
  • การใช้บัญชีบริการ KRBTGT สำหรับ Golden Tickets

เรียนรู้เพิ่มเติมเกี่ยวกับการสำรวจ LDAP และเทคนิคการโจมตีอื่นๆ ในแค็ตตาล็อกการโจมตีของ Netwrix

บทความที่เกี่ยวข้อง