อย่าเชื่อเครื่องมือมากเกินไป …

เมื่อเดือนมีนาคม 2561 ผมได้ทำการทดสอบเครื่องมือเจาะระบบ “N”  (ใช้ทดสอบว่าระบบเป้าหมายมีช่องโหว่ใดให้โจมตีบ้าง) ภายใต้ภาระกิจ “Honeypot” เพื่อทดสอบว่า เครื่องมือดังกล่าว สามารถรับรองความปลอดภัยของระบบปฏิบัติการของเครื่องเซิร์ฟเวอร์ ก่อนที่จะอนุญาตให้เข้าถึงได้จากอินเตอร์เน็ตได้หรือไม่

*** การทดลองนี้อยู่ในสภาวะควบคุมที่รัดกุม เป็นระบบที่สร้างขึ้นมา แยกออกจากระบบอื่นที่อาจจะได้รับผลกระทบ และเป็นการทดลองเพื่อวัดความสามารถของเครื่องมือ ไม่ได้มุ่งโจมตีผู้ใด หรือระบบใด ***

วิธีการทดสอบ

จัดให้มีเครื่องทดสอบ ชื่อ honeypot.in.psu.ac.th อยู่บน VM และใช้เครื่องมือเจาะระบบ “N” ตรวจสอบ 2 ครั้ง โดยครั้งแรก (Baseline 01) เป็นการติดตั้งระบบปฏิบัติการ Ubuntu 16.04 LTS แบบ Default และ Update ให้เป็นปัจจุบันที่สุด แล้วรีบแจ้งให้ “N” ตรวจสอบ ครั้งที่ 2 (Baseline 02) ทำการติดตั้ง Web Server, PHP, MySQL และติดตั้งช่องโหว่อย่างง่ายที่พัฒนาขึ้นเอง (https://github.com/nagarindkx/honeypot) ลงไป โดยภาพรวมดังภาพที่ 1 แล้วรีบแจ้งให้ “N” ตรวจสอบ

ภาพที่1: ภาพรวมของ Honeypot

honeypot.in.psu.ac.th ประกอบด้วยโครงสร้างไฟล์ ดังภาพที่ 2

ภาพที่ 2: โครงสร้างไฟล์ของ honeypot

เมื่อคลิก Login with SQL Injection Vulnerable  จะได้ภาพที่ 3 ซึ่งจะส่งไปที่ไฟล์ badform.html โดยในฟอร์มนี้จะมีช่องโหว่ SQL Injection ทำให้สามารถเข้าเป็น admin ได้โดยลองใส่ username/password ดังนี้

ภาพที่ 3: http://honeypot.in.psu.ac.th/badform.html

ซึ่งจะได้ผลว่า สามารถเข้าเป็น admin ได้โดยไม่ต้องทราบรหัสผ่านที่แท้จริง แต่อาศัยการเขียน SQL Statement ที่ไม่รัดกุม และไม่ตรวจสอบ Input ก่อน ดังภาพที่ 4

ภาพที่ 4: ช่องโหว่ SQL Injection

เมื่อคลิก  Simple Non Persistent XSS   จะได้ภาพที่ 5  ซึ่งจะส่งไปยัง simple.php โดยจะเห็นได้ว่า สามารถใส่ชื่อ นามสกุล ลงไปใน URL ได้เลย ผ่านตัวแปร name  (ต้องลองใช้กับ FireFox ถ้าเป็น Google Chrome จะมี XSS Auditor ไม่ได้รับผลกระทบ)

ภาพที่ 5: ช่องโหว่ Non Persistent XSS

 

ช่องโหว่นี้ ทำให้ Hacker นำเว็บไซต์นี้ไป ดักเอา Cookie Session ของผู้อื่น หรือ Session HiJacking ดังภาพที่ 6
ด้วย URL นี้
http://honeypot.in.psu.ac.th/simple.php?name=%3Cscript%3Ealert(escape(document.cookie))%3C/script%3E

ภาพที่ 6: Session HiJacking

หรือ เปลี่ยนเปลี่ยน URL ที่ “Click to Download” ไห้ยังเว็บไซต์ที่ต้องการได้ เช่นเป็น hacked.com เป็นต้น ดังภาพที่ 7 ด้วย URL นี้
http://honeypot.in.psu.ac.th/simple.php?name=%3Cscript%3Ewindow.onload=function()%20{%20var%20link=document.getElementsByTagName(%22a%22);%20link[0].href=%27http://hacked.com%27}%3C/script%3E

ภาพที่ 7: HTML Injection

เมื่อคลิก Login to Test Permanent XSS จะได้ภาพที่ 8  ซึ่งจะส่งไปยัง goodlogin.php

ภาพที่ 8:ช่องโหว่ Persistent XSS

ซึ่ง เป็น Form ที่ป้องกัน SQL Injection และ ไม่ยอมรับ username/password ว่าง หากไม่ทราบรหัสผ่านจริงๆ ก็จะเข้าไม่ได้ ดังภาพที่ 9

ภาพที่ 9: กรณี Login ไม่สำเร็จ

หาก Login เป็น user1 สำเร็จ จะสามารถเปลี่ยน Display Name ได้ ดังภาพที่ 10
ทดลองด้วย

username: user1
password: user1123**

ภาพที่ 10: user1 เมื่อ Login สำเร็จ สามารถเปลี่ยน Display Name ได้

หาก user1 ต้องการดัก Session HiJack จาก Admin สามารถทำได้โดย แก้ Display Name ดังนี้

<a href=”#” onclick=alert(escape(document.cookie))>User1</a>

เมื่อกดปุ่ม Update จะได้ภาพที่ 11

ภาพที่ 11: user1 วาง Session HiJacking สำเร็จ

เมื่อ admin เข้ามาในระบบ ด้วย

username: admin
password: admin123**

จะได้ภาพที่ 12

ภาพที่ 12: admin จะมองเห็นรายชื่อ users ทั้งหมด ในที่จะเห็น user1 ที่มี display name ของตนเองเป็น Link

เมื่อ admin ติดกับดัก ลองคลิก link ที่เขียนโดย user1 ก็จะเปิดเผย (และสามารถส่ง session กลับไปให้ user1 ได้หลายวิธี) ก็จะได้ผลดังภาพที่ 13

ภาพที่ 13: แสดง Session ของ Admin ซึ่งในช่วงเวลานั้นๆ user1 สามารถเข้ามาเป็น admin ได้โดยไม่ต้องทราบรหัสผ่านของ admin

*** และ มี Backdoor ที่อยู่ใน /uploads/ ไฟล์ image.php ที่ ไม่ได้แสดงใน index.php หน้าแรก ซึ่งจะสามารถส่งคำสั่งเข้าไปให้ Execute ได้ เช่น ls -l ดังภาพที่ 14 หรือ แม้แต่ wget ไฟล์จากภายนอกมาไว้ในนี้ได้ เพื่อสร้าง Backdoor ในที่ต่างๆ ซึ่งเรียกว่า Remote Code Execution

ภาพที่ 14: Backdoor ใน /uploads/image.php ที่ไม่ได้อยู่ใน index.php หน้าแรกของ honeypot

ผลการทดสอบ

จากผลการทดสอบด้วย “N” เมื่อ Mon, 12 Mar 2018 13:57:16 ICT ผลดังภาพที่ 15

ภาพที่ 15: แสดงรายการช่องโหว่ “N”  ตรวจพบ ประกอบด้วย 1 High, 5 Medium Risk

ผลการทดสอบสามารถสรุปเป็นตารางได้ ดังตารางที่ 1

ตารางที่ 1: แสดงผลเปรียบเทียบสิ่งที่ honeypot วางไว้ กับสิ่งที่ “N” ตรวจพบ ตามตำแหน่งไฟล์ต่างๆ

ตำแหน่งไฟล์Honeypot วาง“N” ตรวจพบ
badform.htmlSQL Injectionยอมรับได้
– Web Application Potentially Vulnerable to Clickjacking (เป็น Form ที่ยอมให้เว็บอื่นเอาไปใส่ใน iframe ได้)
login.phpJavaScript Injectionเป็น False Positive
เพราะ Login Fail

– CGI Generic SQL Injection (blind)
– CGI Generic XSS (quick test)
– CGI Generic Cookie Injection Scripting
– CGI Generic XSS (comprehensive test)
– CGI Generic HTML Injections (quick test)
ยอมรับได้
– Web Application Potentially Vulnerable to Clickjacking (เป็น Form ที่ยอมให้เว็บอื่นเอาไปใส่ใน iframe ได้)


ไม่เข้าไปตรวจ JavaScript Injection เพราะไม่ได้ตรวจสอบ SQL Injection จากหน้า badform.html
simple.phpNon-Persistent XSSยอมรับได้
– CGI Generic XSS (quick test)
– CGI Generic Cookie Injection Scripting
– CGI Generic XSS (comprehensive test)
– CGI Generic HTML Injections (quick test)
goodlogin.phpเป็น False Positive เพราะ Login Fail
– CGI Generic SQL Injection (blind)

ยอมรับได้
– Web Application Potentially Vulnerable to Clickjacking (เป็น Form ที่ยอมให้เว็บอื่นเอาไปใส่ใน iframe ได้)
home.phpPersistent XSSไม่เข้าไปตรวจ เพราะไม่สามารถเดารหัสผ่านที่ถูกต้องได้
/uploads/image.phpBackdoor (Remote Code Execution)ไม่เข้าไปตรวจ เพราะไม่มี Link จากหน้าแรก

สรุปผลการทดสอบ

  1. น่าตกใจ ที่ “N” ไม่สามารถตรวจพบ SQL Injection ได้ในหน้า badform.html
  2. “N” ตรวจพบ XSS ในหลายรูปแบบในหน้า simple.php ซึ่งนับว่าดี
  3. “N” ตรวจสอบได้เฉพาะ URL ที่สามารถติดตามไปจากหน้าแรกได้เท่านั้น จะเห็นได้ว่า ไม่สาามารถเข้าไปตรวจสอบ home.php ซึ่งต้องเดารหัสผ่านให้ได้ก่อน และ /uploads/image.php ซึ่งไม่มีการเรียกจากหน้าแรก ซึ่งโดยทางปฏิบัติ Hacker เมื่อเจาะเข้ามาวางไฟล์ได้แล้ว จะเอา URL นั้นไปโพสต์ประกาศในกลุ่ม หรือ บนหน้าเว็บไซต์อื่นๆ เช่น zone-h.org เป็นต้น ทำให้ เราตรวจด้วย “N” ยังไงก็ไม่เจอ แต่ Google ตรวจเจอเพราะไปตรวจสอบเว็บไซต์ของกลุ่ม Hacker อีกที
  4. “N” ทำงานเป็นลำดับ ดังนั้น เมื่อ ไม่ตรวจพบ SQL Injection ในหน้า badform.html ก็ไม่ตรวจ JavaScript Injection ในหน้า login.php
  5. “N” เตือนเรื่องสามารถนำ Form ไปอยู่ใน iframe ของเว็บไซต์อื่นๆได้ ซึ่งนับว่าดี

อภิปรายผลการทดสอบ

การมีเครื่องมือในการเจาะระบบอย่าง “N” เป็นเรื่องดี ทำให้สามารถลดงานของผู้ดูแลระบบได้ อย่างน้อยก็เรื่องการตรวจสอบ Version ของ OS, Software ที่ใช้ ว่าได้รับผลกระทบต่อช่องโหว่ที่สำคัญ ซึ่งจะประกาศเป็นเลข CVE เอาไว้แล้ว ทำให้ตรวจสอบภาพรวมๆได้ และตรวจสอบได้ตาม Signature ที่บริษัทเค้ากำหนดมาเท่านั้น

อย่างไรก็ตาม ในทางปฏบัติ “N” หรือ เครื่องมืออื่นๆที่ทำงานแบบ Outside-In อย่างนี้ จะไม่มีทางตรวจสอบ ช่องโหว่ ที่อยู่ “ภายใน” เครื่องได้ หากแต่ การตรวจสอบ Log File และ การตรวจสอบเครื่องเซิร์ฟเวอร์จากภายใน จึงเป็นสิ่งจำเป็นอย่างยิ่ง นอกจากจะทำให้เราตรวจพบช่องโหว่ต่างๆก่อนจะโดนรายงาน แล้ว ยังเป็น การสะสมความรู้ซึ่งสำคัญยิ่่งกว่า เพราะเราจะได้ทำการ ป้องกัน ก่อนที่จะต้องมาตามแก้ไข อย่างเช่นในปัจจุบัน