พัฒนา Threat Hunting Use Case กับ CrowdStrike Events App

นอกเหนือจากความพร้อมของข้อมูลที่จะถูกใช้เพื่อระบุหาการมีอยู่ของภัยคุกคาม ปัจจัยที่มีความสำคัญอีกปัจจัยหนึ่งซึ่งจะการันตีความสำเร็จของการระบุหาภัยคุกคามในรูปแบบของ Threat hunting นั้น คือการคิดค้นและพัฒนาสมมติฐานหรือไอเดียที่จะใช้ในการระบุการมีอยู่ของภัยคุกคามดังกล่าวในเชิงรุก (proactive) รวมไปถึงการประเมินและปรับปรุงให้สมมติฐานหรือ Hunting use case นั้นสามารถใช้งานได้จริงและเกิดประสิทธิภาพ

ในบทความนี้ทีมตอบสนองภัยคุกคาม (Intelligent Response) จาก บริษัท ไอ-ซีเคียว จำกัด จะมาสาธิตการพัฒนา Hunting use case บนเทคโนโลยีซึ่งเรามีความถนัด 2 เทคโนโลยี ได้แก่ CrowdStrike Falcon ซึ่งจะทำหน้าที่เป็นส่วน Endpoint detection and response (EDR) ในการเก็บข้อมูลจากระบบต่างๆ มาระบุหาการมีอยู่ของภัยคุกคามโดยใช้ Splunk Search Processing Language (SPL) กับฟีเจอร์ CrowdStrike Events App ซึ่งใช้ Splunk เป็นเทคโนโลยีหลังบ้านหลักครับ

สำหรับสถานการณ์จำลองที่ทีมตอบสนองภัยคุกคามจะสาธิตการทำ Threat hunting นั้น เราจะทำการพัฒนา SPL โดยนำแนวคิดมาจาก Hunting use case ซึ่งถูกเผยแพร่โดย Red Canary ในงาน BlackHat USA 2019 ภายใต้หัวข้อ Fantastic Red Team Attacks and How to Find Them

Fantastic Red Team Attacks and How to Find Them - A Summary

ก่อนที่เราจะไปดูกันที่ใจความสำคัญของบล็อกนี้ เราจำเป็นที่จะต้องเข้าใจเนื้อหาและเป้าหมายของหัวข้อการบรรยายจากทาง Red Canary ก่อน สำหรับการบรรยายในหัวข้อ Fantastic Red Team Attacks and How to Find Them นั้น Casey Smith ซึ่งปัจจุบันดำรงตำแหน่ง Director of applied research ของ Red Canary ได้มีการเปิดเผยเทคนิคการโจมตีใหม่ซึ่งใช้ไบนารี dbgsrv.exe ในลักษณะของ Living Off The Land เช่น สร้างการเชื่อมต่อผ่านโปรโตคอล TCP เพื่อดาวโหลดไฟล์อื่นๆ, แก้ไขและเปลี่ยนแปลงการทำงานของโปรเซสด้วยเทคนิค Process hollowing รวมไปถึงการข้ามผ่านมาตรการด้านความปลอดภัยแบบ whitelisting

นอกเหนือจากการเปิดเผยเทคนิคการโจมตีใหม่ Ross Wolf ซึ่งปัจจุบันดำรงตำแหน่ง Senior threat research จาก Endgame ได้สาธิตการทำ Threat hunting โดยการใช้ Event Query Language (EQL) ร่วมกับข้อมูลจาก Atomic Red Team โดยมี data source เป็นข้อมูลที่ได้จาก Sysmon และประสบความสำเร็จในการตรวจพบการใช้ dbgsrv.exe ซึ่งเป็นเทคนิคการโจมตีที่ยังไม่ถูกเปิดเผยออกมาเพื่อสนับสนุนการโจมตีด้วย

Threat Hunting with CrowdStrike Events App

แนวคิดในการพัฒนา Hunting use case โดยส่วนใหญ่มักจะเริ่มต้นจากสมมติฐานซึ่งทำให้ได้ผลลัพธ์เป็นข้อมูลเป็นจำนวนมาก ก่อนจะนำผลลัพธ์ดังกล่าวมาวิเคราะห์และนำมาใช้ในการปรับปรุงสมมติฐานดังกล่าวต่อไป สมมติฐานซึ่งถูกใช้ในการระบุหาภัยคุกคามนั้นจะทำหน้าที่อย่างดีในการสะท้อนประสบการณ์และมุมมองของ Threat hunter ต่อภัยคุกคามที่เผชิญ

สำหรับในกรณีของ Ross Wolf นั้น เขาได้ทำการพัฒนาสมมติฐานที่นำมาสู่ Hunting use case ในรูปแบบของ EQL โดยสมมติฐานเหล่านี้นั้นถูกพัฒนาเพื่อระบุหาการใช้งานไบนารีที่เกี่ยวข้องกับเทคนิค Living Off The Land ซึ่ง Ross สงสัยว่าเทคนิคที่ Casey ใช้จะมีส่วนเกี่ยวข้อง ตามรายการดังต่อไปนี้ครับ

  • ค้นหาไบนารีของระบบใดๆ ที่ถูกเปลี่ยนใช้และถูกเอ็กซีคิวต์เป็นโปรเซสด้วยชื่อใหม่
  • ค้นหาการเชื่อมต่อเครือข่ายใดๆ จากโปรเซสที่เกี่ยวข้องกับเทคนิค Living Off The Land
  • ค้นหาไฟล์ซึ่งถูกสร้างโดยบัญชีซึ่งไม่ได้เป็นของระบบหรือของผู้ดูแลระบบ แต่ถูกเอ็กซีคิวต์เป็นโปรเซสและมีสิทธิ์ของระบบหรือผู้ดูแลระบบ
  • ค้นหาโปรเซส PowerShell ซึ่งถูกรันจากโปรเซส Explorer.exe และมีการเชื่อมต่อกับเครือข่ายใดๆ
  • ค้นหาการเชื่อมต่อเครือข่ายใดๆ จากโปรเซสซึ่งมักจะไม่มีการสร้างการเชื่อมต่อเครือข่าย

ต่อจากนี้คือไอเดียของการพัฒนา SPL สำหรับ CrowdStrike Events App เปรียบเทียบกับ EQL ซึ่ง Ross พัฒนาขึ้นมาครับ

Execution of Renamed Executables

ในสมมติฐานแรกนั้น จะเป็นการค้นหาไฟล์ที่ถูกเปลี่ยนชื่อและถูกเอ็กซีคิวต์เป็นโปรเซสด้วยชื่อใหม่ สมมติฐานนี้ถูกพัฒนาขึ้นเพื่อค้นหาความพยายามในการหลบหลีกการตรวจจับเมื่อใช้เทคนิค Living Off The Land ทั้งนี้ผลลัพธ์ที่ได้มาควรถูกนำไปเปรียบเทียบกับรายการของไบนารีและสคริปต์ที่เกี่ยวข้องกับเทคนิค Living Off The Land ด้วย

จากสมมติฐานนี้เราสามารถพัฒนา Hunting use case ได้ด้วยแนวคิดดังนี้ครับ

  • ระบุหาเหตุการณ์ใดๆ ที่เกี่ยวข้องกับการเปลี่ยนชื่อไฟล์หรือไบนารีไฟล์และถูกบันทึกไว้โดย CrowdStrike Falcon — พบว่า CrowdStrike Falcon มีการบันทึกเหตุการณ์ในเงื่อนไขนี้ไว้ในอีเวนท์ชื่อ NewExecutableRenamed
  • นำฟิลด์ TargetFileName ใน NewExecutableRenamed มาเชื่อมกับชื่อของไฟล์ซี่งถูกสร้างเป็นโปรเซสซึ่งอยู่ในฟิลด์ ImageFileName ของอีเวนท์ ProcessRollup2
  • นำผลลัพธ์ที่ได้มาแสดงเป็นตาราง โดยให้แสดงคอลัมน์ ComputerName, SourceFileName ImageFileName และ CommandLine

จากแนวคิดด้านบน เราจะพัฒนา Hunting use case ด้วย SPL เป็นผลลัพธ์ดังนี้ครับ

event_simpleName="NewExecutableRenamed"
| rename TargetFileName as ImageFileName
| join ImageFileName [ search event_simpleName="ProcessRollup2" ]
| table ComputerName SourceFileName ImageFileName CommandLine

ตัวอย่างของผลลัพธ์ที่ได้จาก Hunting use case

Execution of Renamed Executables

List of LOLBas With Network Connections

สมมติฐานที่สองจะเป็นการระบุหาโดยเน้นไปที่กลุ่มของไบนารีและสคริปต์ที่สามารถูกใช้ในเทคนิค Living Off The Land ที่มีการเชื่อมต่อเครือข่ายออกไป โดยจากสมมติฐานนี้เราสามารถพัฒนา Hunting use case ได้ด้วยแนวคิดดังนี้ครับ

  • ระบุหาเหตุการณ์ใดๆ ที่เกี่ยวข้องกับการเชื่อมต่อเครือข่ายและรับส่งข้อมูลและถูกบันทึกไว้โดย CrowdStrike Falcon — พบว่า CrowdStrike Falcon มีการบันทึกเหตุการณ์ในเงื่อนไขนี้ไว้ในอีเวนท์หลายรายการ อาทิ DnsRequest และ NetworkConnectIP4 โดยในกรณีนี้เราจะใช้ DnsRequest ในการระบุหาครับ
  • นำฟิลด์ ContextProcessId ใน DnsRequest มาเชื่อมกับชื่อของโปรเซสซึ่งอยู่ในฟิลด์ TargetProcessId ของอีเวนท์ ProcessRollup2
  • สร้าง sub-search เพื่อระบุเงื่อนไขในการค้นหาด้วยอีเวนท์ ProcessRollup2 เพื่อให้ค้นหาเฉพาะอีเวนท์ ProcessRollup2 ที่มีฟิลด์ FileName ตรงกับรายการไบนารีในเทคนิค Living Off The Land
  • นำผลลัพธ์ที่ได้มาแสดงเป็นตาราง โดยให้แสดงคอลัมน์ ComputerName, ImageFileName, DomainName และ CommandLine

เนื่องจากใน Hunting use case ของเรานั้นจะต้องประกอบด้วยรายการไบนารีในเทคนิค Living Off The Land เพื่อใช้ในฟิลด์ FileName เราจึงจำเป็นต้องสกัดรายการไบนารีออกมาก่อนจากโครงการ LOLBAS-Project/LOLBAS โดยผมจะใช้คำสั่ง grep ในการเอาเฉพาะส่วนที่เป็นชื่อไฟล์ไบนารีออกมาครับ

grep -Poh "(?<=Name:\s)[A-Za-z0-9_-]+.exe$" OSBinaries/*

เมื่อได้รายชื่อไฟล์ออกมาแล้ว เราจะมีข้อมูลที่ครบในการพัฒนา Hunting use case ของเราแล้ว ผลลัพธ์สุดท้ายที่ได้มาจะมีลักษะดังนี้ครับ

event_simpleName="DnsRequest"
| rename ContextProcessId as TargetProcessId
| join TargetProcessId [ search event_simpleName="ProcessRollup2" (FileName=Atbroker.exe OR FileName=Bash.exe OR FileName=Bitsadmin.exe OR FileName=Certutil.exe OR FileName=Cmd.exe OR FileName=Cmstp.exe OR FileName=Control.exe OR FileName=Cscript.exe OR FileName=Csc.exe OR FileName=Dfsvc.exe OR FileName=Diskshadow.exe OR FileName=Dnscmd.exe OR FileName=Esentutl.exe OR FileName=Eventvwr.exe OR FileName=Expand.exe OR FileName=Extexport.exe OR FileName=Extrac32.exe OR FileName=Findstr.exe OR FileName=Forfiles.exe OR FileName=Ftp.exe OR FileName=Gpscript.exe OR FileName=Hh.exe OR FileName=Ie4uinit.exe OR FileName=Ieexec.exe OR FileName=Infdefaultinstall.exe OR FileName=Installutil.exe OR FileName=Jsc.exe OR FileName=Makecab.exe OR FileName=Mavinject.exe OR FileName=Mmc.exe OR FileName=Msconfig.exe OR FileName=Msdt.exe OR FileName=Mshta.exe OR FileName=Msiexec.exe OR FileName=Odbcconf.exe OR FileName=Pcalua.exe OR FileName=Pcwrun.exe OR FileName=Presentationhost.exe OR FileName=Print.exe OR FileName=Regasm.exe OR FileName=Regedit.exe OR FileName=Register-cimprovider.exe OR FileName=Regsvcs.exe OR FileName=Regsvr32.exe OR FileName=Reg.exe OR FileName=Replace.exe OR FileName=Rpcping.exe OR FileName=Rundll32.exe OR FileName=Runonce.exe OR FileName=Runscripthelper.exe OR FileName=Schtasks.exe OR FileName=Scriptrunner.exe OR FileName=Sc.exe OR FileName=SyncAppvPublishingServer.exe OR FileName=Verclsid.exe OR FileName=Wab.exe OR FileName=Wmic.exe OR FileName=Wscript.exe OR FileName=Wsreset.exe OR FileName=Xwizard.exe) ]
| table ComputerName timestamp ImageFileName DomainName CommandLine

ตัวอย่างของผลลัพธ์ที่ได้จาก Hunting use case

List of LOLBas With Network Connections

Potential Files Relating to Elevation of Privilege

สำหรับในสมมติฐานที่สามนั้น Ross จะทำการหาไฟล์ซึ่งถูกสร้างหรือมีบัญชีซึ่งไม่ได้มีสิทธิ์ของระบบหรือผู้ดูแลระบบเป็นเจ้าของ แต่กลับมีโปรเซสที่เกิดจากไฟล์ดังกล่าวซึ่งมีสิทธิ์เป็นของระบบหรือผู้ดูแลระบบ เหตุการณ์ในลักษณะนี้มักโอกาสเมื่อผู้โจมตีพยายามยกระดับสิทธิ์ในระบบ

ในการที่จะพัฒนา Hunting use case จากสมมติฐานนี้ เราจะต้องหาเหตุการณ์ซึ่งมีข้อมูลสองส่วนต่อไปนี้และเชื่อมเข้าหากัน ได้แก่

  • เหตุการณ์ที่ไฟล์ใดๆ ถูกสร้างขึ้น โดยจะมีต้องมีการเก็บข้อมูลว่าบัญชีผู้ใช้ใดเป็นเจ้าของไฟล์หรือเป็นผู้สร้าง
  • นำข้อมูลดังกล่าวมาเชื่อมกับข้อมูลในอีเวนท์ ProcessRollup2 ซึ่งมีฟิลด์ Username และ UserSid_readable อยู่แล้ว จากนั้นนำผลลัพธ์มาแสดงผล

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

เนื่องจากไม่มีข้อมูลในส่วนแรก การพัฒนา Hunting use case จึงจำเป็นต้องอ้างอิงจากแค่แหล่งข้อมูลเพียงจุดเดียวคือจากอีเวนท์ ProcessRollup2 และจำเป็นต้องมีกระบวนการอื่นๆ เช่น การพิจารณาสภาพแวดล้อมของระบบและการตั้งค่าพื้นฐานของระบบเพื่อคัดกรองและลดข้อผิดพลาดต่อไป

Suspicious PowerShell Process with Network Connections

สมมติฐานที่ 4 เป็นสมมติฐานซึ่งเกิดจากความนิยมในการใช้ PowerShell เป็นสเตจแรกในการโจมตีซึ่งแม้ว่าในปัจจุบันนั้นระบบปฏิบัติการวินโดวส์จะมีการมาตรการในการป้องกันและตรวจจับการใช้งาน PowerShell โดยภัยคุกคามแล้ว ข้อมูลจาก Threat intelligence โดยส่วนใหญ่ก็ยังมีการตรวจพบการใช้ PowerShell ในแคมเปญการโจมตีอยู่

แนวคิดของการพัฒนา Hunting use case สำหรับสมมติฐานนี้จะมีความคล้ายคลึงกับสมมติฐานในการระบุหาโปรเซสที่เกี่ยวข้องกับเทคนิค Living Off The Land ที่มีการใช้งานเครือข่าย แตกต่างกันในส่วนที่เราจะต้องเชื่อมโปรเซสของ PowerShell ว่าถูกสร้างมาจากโปรเซส Explorer.exe ด้วยการใช้ sub-search ซ้อนกัน

  • ระบุหาเหตุการณ์ใดๆ ที่เกี่ยวข้องกับการเชื่อมต่อเครือข่ายและรับส่งข้อมูลและถูกบันทึกไว้โดย CrowdStrike Falcon ด้วยอีเวนท์ DnsRequest
  • นำฟิลด์ ContextProcessId ใน DnsRequest มาเชื่อมกับชื่อของโปรเซสซึ่งอยู่ในฟิลด์ TargetProcessId ของอีเวนท์ ProcessRollup2 และ SyntehticProcessRollup2
  • ใช้สูตร rename + join + sub search ซ้อนกันสองชั้น โดยในชั้นนอกสุดเราจะทำการหา TargetProcessID_decimal ของโปรเซสซึ่งถูกสร้างมาจากไฟล์ explorer.exe และในชั้นในเราจะนำ TargetProcessID_decimal มาเชื่อมกับ ParentProcessId_decimal ของโปรเซสซึ่งถูกสร้างมาจากไฟล์ powershell.exe
  • sub search สองชั้นจะถูกนำมาเชื่อมกับ TargetProcessID ที่ได้มาจากอีเวนท์ DnsRequest
  • นำผลลัพธ์ที่ได้มาแสดงเป็นตาราง โดยให้แสดงคอลัมน์ ComputerName, timestamp, ImageFileName, DomainName และ CommandLine

คำแนะนำ: เมื่อใดก็ตามที่ Hunting use case ของเราจำเป็นต้องใช้ข้อมูลประเภท Parent process ID มาใช้ ควรพิจารณาขยายขอบเขตการค้นหาเนื่องจากบางโปรเซสโดยเฉพาะอย่างยิ่งโปรเซสของระบบมักมีอายุยาวนานก่อนจะมาถูกใช้ร่วมกับการโจมตี

จากแนวคิดด้านบน เราจะพัฒนา Hunting use case ด้วย SPL เป็นผลลัพธ์ดังนี้ครับ

event_simpleName="DnsRequest"
| rename ContextProcessId as TargetProcessId
| join TargetProcessId
[ search (event_simpleName="ProcessRollup2" OR event_simpleName="SyntheticProcessRollup2") AND FileName="explorer.exe"
| rename TargetProcessId_decimal as ParentProcessId_decimal
| join ParentProcessId_decimal
[ search event_simpleName="ProcessRollup2" FileName="powershell.exe" ]]
| table ComputerName timestamp ImageFileName DomainName CommandLine

ตัวอย่างของผลลัพธ์ที่ได้จาก Hunting use case

Suspicious PowerShell Process with Network Connections

Suspicious Network Connections from Processes

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

  • ระบุหาเหตุการณ์ใดๆ ที่เกี่ยวข้องกับการเชื่อมต่อเครือข่ายและรับส่งข้อมูลและถูกบันทึกไว้โดย CrowdStrike Falcon ด้วยอีเวนท์ NetworkConnectIP4
  • นำฟิลด์ ContextProcessId_decimal ใน NetworkConnectIP4 มาเชื่อมกับ PID ของแต่ละโปรเซสในฟิลด์ TargetProcessId_decimal ของอีเวนท์ ProcessRollup2
  • นำผลลัพธ์ที่ได้มาแสดงเป็นตาราง โดยให้แสดงคอลัมน์ RemoteIP, RemotePort_decimal, ImageFileName, UserName และ UserSid_readable

จากแนวคิดด้านบน เราจะพัฒนา Hunting use case ด้วย SPL เป็นผลลัพธ์ดังนี้ครับ

event_simpleName="NetworkConnectIP4"
| rename ContextProcessId_decimal as TargetProcessId_decimal
| join TargetProcessId_decimal
[ search event_simpleName=ProcessRollup2 ]
| table RemoteIP RemotePort_decimal ImageFileName UserName UserSid_readable

เราสามารถเปลี่ยนจากการใช้ NetworkConnectIP4 มาเป็น DnsRequest ได้ตามสมควรครับ

Summary

ความสำเร็จของการทำ Threat hunting นั้นขึ้นอยู่กับปัจจัยหลายอย่างทั้งลักษณะของข้อมูลที่มี ความสามารถในการระบุหาภัยคุกคามจากข้อมูล รวมไปถึงทักษะและประสบการณ์ของ Threat hunter ซึ่งมีหน้าที่ในการพัฒนาสมมติฐานและนำมาใช้ในการระบุหาภัยคุกคามในเชิงรุก

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

ด้วยปัจจัยของการทำ Threat hunting ลักษณะของข้อมูลที่จะใช้ในการทำ Threat hunting ในปัจจุบันสามารถถูกทดแทนได้ด้วยโซลูชันที่ฟรี เช่นเดียวกับทักษะและประสบการณ์ของ Threat hunter ที่มีเส้นทางลัดมากมายให้ได้พัฒนาโดยไม่ต้องเสียค่าใช้จ่าย ปัญหาจึงมาตกอยู่ที่ปัจจัยสุดท้ายคือความสามารถและความพร้อมในการระบุหาภัยคุกคามจากข้อมูลซึ่งจำเป็นต้องอาศัยทรัพยากรมหาศาลทั้ง Operational/infrastructure cost รวมไปถึง Technical debt ที่อาจเกิดขึ้นจากความจำเป็นในการดูแลและรักษาระบบ การโอนภาระในส่วนนี้ไปให้กับผู้เชี่ยวชาญที่มีศักยภาพสูงกว่าในการจัดการและแสวงหาประโยชน์จากข้อมูลเพื่อระบุหาและกำจัดภัยคุกคามจึงเป็นทางเลือกหนึ่งที่ไม่ควรมองข้าม เพื่อให้สุดท้ายแล้วนั้นความมั่นคงปลอดภัยไซเบอร์จะได้รับความสำคัญเป็นอันดับหนึ่งอย่างแท้จริง