หลายคนที่ใช้งาน Windows หรือเคยได้ลองใช้งานมาบ้าง คงต้องเคยได้ใช้งานฟังก์ชันค้นหาไฟล์ หรือค้นหาข้อมูลผ่าน Start Menu กันซักนิดซักหน่อย ซึ่ง @sleepya จำได้ว่าเคยเกิดกรณีการส่งข้อมูลกลับไปยังบริษัทผู้พัฒนา และไม่สามารถปิดทางเมนูปกติได้ แอดก็เลยอาสานำเรื่องนี้มาขยายความต่อโดยจะมุ่งไปที่ Windows Search จนได้ข้อสรุปว่าในปัจจุบันทาง Microsoft ก็ยังคงมีการส่งข้อมูลที่พบภายในเครื่องของผู้ใช้กลับไปยังเซิร์ฟเวอร์ของ Bing ผ่านระบบ Windows Search ส่วนจะมีข้อมูลอะไรบ้างเราจะมาพูดถึงกันในลำดับถัดไป
สรุปการทดลองแบบสั้น ๆ
การค้นหาของ Windows มีการส่งข้อมูลต่างๆ ที่ไม่เกี่ยวข้องกับ Web Search ใน Bing กลับไปยังเซิร์ฟเวอร์ด้วย
- มีการส่งทุก keystroke ที่ผู้ใช้งานพิมพ์ไปที่ bing.com ถึงแม้ว่าจะพิมพ์เร็วแล้วก็ตาม เช่นพิมพ์คำว่า “line” จะมีการส่งไปที่ bing.com ว่ามีการพิมพ์ “l”, “li”, “lin”, “line”
- พบว่ามีการส่งข้อมูลที่เป็นผลการค้นหาไฟล์แบบ Full Path ของบาง keystroke ที่พบภายในเครื่องกลับไปยังเซิร์ฟเวอร์ของ Microsoft Bing เช่น ผู้ใช้งานพิมพ์คำว่า “line” แต่มีการส่งผลการค้นหาภายในเครื่องของคำว่า “li” ที่มี path เกี่ยวกับโปรแกรมที่ลงไว้ในเครื่องไปด้วย ตามรูปข้างล่าง
- ไฟล์ LineLauncher.exe ซึ่งคือโปรแกรม Line พร้อม path
- ไฟล์ license.txt ของโปรแกรม HxD พร้อม path คือ “C:\Program Files\HxD”
- ไฟล์ COPY.txt ที่มี license อยู่ข้างในของโปรแกรม Dev-Cpp พร้อม path
- จากการส่ง 3 ผลลัพธ์ข้างบน bing.com สามารถรู้ได้ว่าเครื่องผู้ใช้มีการติดตั้งโปรแกรม Line, HxD และ Dev-Cpp พร้อม path ที่ลงเอาไว้ในเครื่อง
- Note: “{6D809377–6AF0–444b-8957-A3773F02200E}” และ “{7C5A40EF-A0FB-4BFC-874A-C0F2E0B9FA8E}” เป็นวิธีระบุ path อีกแบบหนึ่งของ Microsoft Windows ซึ่งดูได้ที่ Reference: KNOWNFOLDERID
- มีการระบุเครื่องต้นทางของข้อมูลบน HTTP Header ที่ชื่อว่า X-Device-MachineID กลับไปด้วย ซึ่งค่านี้จะเป็นค่าเฉพาะของเครื่องๆ นั้น ไม่ซ้ำกับเครื่องอื่น
- มีการส่งข้อมูลการตั้งค่าของเครื่องผู้ใช้งาน
สรุปขั้นตอนที่ทดสอบ
- ตรวจสอบการใช้งานเครือข่ายของ Process ผ่าน Resource Monitor
- ตรวจสอบการใช้งานเครือข่ายและ Library ของ Process ผ่าน Process Explorer
- ใช้ WinDBG Preview ในการ Inspect ที่ฟังก์ช้นเพื่อดูรายละเอียดของแต่ละ HTTP Request
- ใช้ Python Script เรียกใช้งาน Frida ในการ Hook Process เพื่อ Inspect ที่ฟังก์ชันเพื่อดูรายละเอียดของแต่ละ HTTP Request แบบ Realtime และให้อ่านง่ายยิ่งขึ้น
- ใช้ MitMProxy ในการดักดูข้อมูลแบบภาพรวมว่ามีการส่งข้อมูลอะไรบ้าง
ขั้นตอนการทดสอบ
ผู้ทดสอบจะทดสอบที่ Windows 10 version 1909
ในขั้นแรกลองมาสังเกต Process มีการเชื่อมต่อเครือข่ายกันก่อนผ่าน Resource Monitor ซึ่งสามารถเข้าถึงได้จากหน้า Task Manager และพบว่ามีเพียง System และ svchost ซึ่งทั้งคู่ก็เป็น System Process ของระบบปฏิบัติการทั้งคู่
ต่อมาลองคลิกที่ปุ่ม Start
และลองพิมพ์ cmd เพื่อค้นหา Command Prompt ภายในเครื่อง
นอกจากนี้ได้ลองค้นหาคำทั่ว ๆ ไปที่ไม่มีอยู่จริง Windows ก็จะแสดงผลเป็นด้วยผลลัพท์จาก Bing Search Engin แทน
หลังจากนั้นกลับมาดูที่ Resource Monitor พบว่ามี Process ที่ชื่อว่า SearchUI.exe ได้มีการติดต่อสื่อสารกับเครือข่ายภายนอก (ตามที่ได้วงสีแดงไว้)
หลังจากนั้นแล้วก็มาลองดูการเรียกใช้งาน Library ของ Process ดังกล่าวผ่านชุดเครื่องมือ SysInternal ที่ชื่อว่า Process Explorer ซึ่งสามารถดาวส์โหลดได้จากลิงก์ที่ท้ายบทความ และพบว่ามีการเรียกใช้งาน wininet.dll ซึ่งโดยปกติแล้วจะเอาไว้ใช้สำหรับเชื่อมต่อด้วยโพรโทคอล FTP, HTTP
รายละเอียดของ Wininet จาก Official Website ของ Microsoft
แอดก็เลยไปลองค้นหาตัวอย่างการเรียกใช้งาน API จึงได้พบตัวอย่างหนึ่งที่ดูน่าสนใจและดูง่ายดี
จากรูปแบบการเรียกใช้งานก็พบว่ามีฟังก์ชัน InternetOpen, InternetConnect และ HttpOpenRequest ที่เป็นการเรียกใช้งาน HTTP Request
จากนั้นแอดก็ได้กลับมาดูที่ Official Document ของ Microsoft ที่ฟังก์ชัน InternetOpen จากรูปจะสังเกตได้ว่าจะมี A และ W ห้อยท้ายอยู่ซึ่ง A จะรับข้อมูลอักษรแบบ ANSI ส่วน W จะรับข้อมูลอักษรแบบ UTF-16 ในส่วนนี้สามารถไปอ่านรายละเอียดเพิ่มเติมได้ที่ Working with Strings ที่ด้านล่างบทความ
หลังจากได้ข้อมูลที่เป็นรูปแบบการเรียกใช้งานของ Windows API แล้วว่าเป็นอย่างไรบ้าง แอดก็เลยใช้ WinDBG ในการ Attach ไปที่ Process ดังกล่าว (SearchUI.exe) แล้วก็กำหนด Break Point ให้แสดงข้อมูลเมื่อ มีการเรียกใช้งานฟังก์ชัน HttpOpenRequestW และให้แสดงข้อมูลของอากิวเมนต์ lpszObjectName และ lpszVersion โดยจะมีการเรียกดูข้อมูลผ่าน Register อย่าง RDX และ R8 ตามลำดับของ Calling Convention โดยสามารถดูรายละเอียดเรื่อง Calling Convention เพิ่มเติมได้ที่ Windows x64 Calling Convention ที่ด้านล่างของบทความ
แอดทดลองพิมพ์ค้นหาคำว่า “eiei” ที่ Start Menu
กลับมาที่หน้าจอของ WinDBG ผู้ทดสอบก็พบว่ามีการส่งข้อมูลผ่านเว็บไซต์ Bing ซึ่งเป็นการค้นหาผ่านเว็บทั่วไป จากนั้นก็หาต่อไป …
ลองเพิ่ม Break Point เพื่อดู HttpAddRequestHeadersW เข้าไปอีกหน่อยเพื่อดู HTTP Request Header ที่มีการใช้งาน
แหนะ! พบว่ามี HTTP Headers น่าสนใจอยู่หลายอันที่เอ๊ะ! ข้อมูลเครื่องเราเปล่าหว่า ก็ลองต่อไป
ก็เลยลองเพิ่ม Break Point ไปอีกว่าข้อมูลก่อนที่จะส่งไปจริง ๆ เนี้ยเนื้อหาเป็นอย่างไร
สังเกตได้ว่าข้อมูลมีลักษณะเป็น XML ก็เลยลอง Copy ออกมาซะหน่อย
ลองเอาข้อมูลที่ได้มาใส่ Text Editor แล้วก็ให้มันช่วยจัดเรียงให้อ่านง่ายขึ้น งืมๆๆ
แล้วก็เลื่อน ๆ สลับกับค้นหาไปก็พบว่ามีข้อมูลบางอย่างที่น่าสนใจ ว่าทำไมต้องส่งข้อมูลที่เป็นภายในเครื่องกลับไปด้วย (ข้อมูลที่ลองพิมพ์เป็น cmd)
ระหว่างนั้นจะนั่งไล่ดูก็อ่านยากไปหน่อย แอดก็เลยเลือกใช้ Frida ในการ Hook ไปที่ SearchUI.exe แล้วก็ให้ Inspect ที่ฟังก์ชันต่าง ๆ ที่เราสนใจ แล้วก็มาแสดงผลให้อ่านง่าย ๆ ดู (Source Code จะอยู่ด้านล่าง)
ลองรันสคริปต์ที่เขียนด้วยภาษา Python ก็ปรากฏข้อมูลออกมาเหมือนกับที่ได้ทำบน WinDBG แล้ว
สังเกตได้ว่ามีการส่งข้อมูลภายในเครื่องกลับไปด้วย
เพราะไฟล์ดังกล่าวเป็นของที่ผู้ทดสอบได้สร้างไว้เองตอนทำแลป
ทำให้มันดูง่ายขึ้นอีกหน่อย ผู้ทดสอบมาแก้ไขสคริปต์เพิ่มอีกนิดหน่อย ให้ดูง่ายขึ้นว่าระบบเจออะไรบ้างก่อนส่งข้อมูลกลับไป
ในส่วนนี้จะแสดงข้อมูลที่อยู่ภายในเครื่องตามเงื่อนไขที่ได้ค้นหา
ส่วนนี้จะแสดงผลลัพธ์ที่ได้ส่งกลับไปยังเซิร์ฟเวอร์ของ Bing ซึ่งจะสังเกตได้ว่ามีการระบุถึง ไฟล์ที่พบเจอบนเครื่องที่ทดสอบด้วย
ในส่วนนี้จะแสดงข้อมูลที่ค้นหาผ่าน Bing Search
ส่วนนี้จะแสดงผลลัพธ์ที่ได้ส่งกลับไปยังเซิร์ฟเวอร์ของ Bing
หลังจากนั้นผู้ทดสอบได้เปลี่ยนมาใช้ MitMProxy ในการดูข้อมูลแทน เพื่อความสะดวกในการดูภาพรวมทั้งหมด โดยให้เครื่อง Windows 10 ส่งข้อมูลมาที่เครื่องผู้ทดสอบ
ลองเข้าไปที่ HTTP Request ที่มีการส่งข้อมูล ก็เห็น HTTP Header ที่มีข้อมูลน่าสนใจหลายส่วน เช่น x-device-machineid และรายละเอียดการตั้งค่าต่าง ๆ ของเครื่องที่ใช้งาน เป็นต้น
จากค่า device-machineid ดังกล่าว ไปค้นหาใน Registry และพบว่ามีค่าดังกล่าวปรากฏหลายส่วน
สำหรับวิธีการแก้ไข
ขั้นแรกให้ไปที่ Start Menu
แล้วพิมพ์ regedit เพื่อเข้าไปตั้งค่า Registry ของ Windows
ให้เข้าไปที่ Computer\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Search
แล้วค้นหา BingSearchEnabled ถ้าไม่มีให้สร้างใหม่เป็นแบบ DWORD แล้วกำหนดค่าเป็น 0
ตัวอย่างก่อนการตั้งค่าและหลังการตั้งค่า พบว่ามีการปิดในส่วนของผลลัพธ์ที่ได้จาก Bing Search และไม่มีการส่งข้อมูลใด ๆ ไปยังเซิร์ฟเวอร์แล้ว
References
- ตัวอย่างสคริปต์ที่ใช้ทดสอบ (https://github.com/thatsa9/Frida_SearchUI)
- KNOWNFOLDERID (https://docs.microsoft.com/en-us/windows/win32/shell/knownfolderid)
- About WinINet (https://docs.microsoft.com/en-us/windows/win32/wininet/about-wininet)
- Working with Strings (https://docs.microsoft.com/en-us/windows/win32/learnwin32/working-with-strings)
- Process Explorer (https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer)
- Windows x64 Calling Convention (https://docs.microsoft.com/en-us/cpp/build/x64-calling-convention)
by Thatsanai Detdamrongpreecha, DATAFARM Research Team, Datafarm Company Limited