วิธีการใช้งาน Nuclei tool 101

วันนี้เราจะมาแนะนำเครื่องมือที่ใช้เป็นประจำในการทำ Pentest นั่นก็คือ Nuclei ซึ่งเป็นเครื่องมือสำหรับสแกนหาช่องโหว่และการตั้งค่าของระบบ มาดูกันว่า Nuclei คืออะไร และมีคำสั่งพื้นฐานอะไรที่น่าสนใจบ้าง!

Nuclei นั้นคืออะไร
Nuclei เป็นเครื่องมือ Open Source ที่ใช้สำหรับเเสกนตรวจจับและโจมตีช่องโหว่ ในเว็บแอปพลิเคชันและบริการเครือข่ายอื่น ๆ โดยอัตโนมัติ เหมาะสำหรับนักทดสอบเจาะระบบ (Pentester) และนักวิจัยด้านความปลอดภัยใช้งาน
การทำงานของ Nuclei
ใช้ Template ที่กำหนดเอง เพื่อระบุชุดของ HTTP Pequest ที่จะส่งไปยังเป้าหมาย มีกฎจับคู่ (Matching Rules) เพื่อช่วยตรวจจับช่องโหว่หรือการตั้งค่าที่ผิดพลาดของระบบเป้าหมาย
สรุปง่ายๆ คือ Nuclei ช่วยให้สแกนหาช่องโหว่ได้เร็วขึ้น โดยใช้ Template ที่เรากำหนด Payload (ข้อมูลหรือโค้ดที่ถูกส่งไปยังเป้าหมายเพื่อให้เกิดผลบางอย่าง) ที่ออกแบบไว้
วิธีการติดตั้ง Nuclei
git clone https://github.com/projectdiscovery/nuclei.git
cd nuclei/cmd/nuclei
go build
mv nuclei /usr/local/bin/
nuclei -version

Nuclei Cheatsheet รวม command ที่มีการใช้งานบ่อย

การใช้งานพื้นฐาน
สแกนหาช่องโหว่เป้าหมายเดียว
nuclei -u http://example.com
หรือ
nuclei -target http://example.com
สแกนมากกว่า 1 เป้าหมายจากไฟล์ หากมีรายการเป้าหมายในไฟล์ (เช่น targets.txt) สามารถสแกนแต่ละรายการด้วยคำสั่ง
nuclei -l targets.txt
*ซึ่งในการเเสกนหากไม่ได้ระบุ Template จะเป็นการสแกนโดยใช้ Template เริ่มต้นทั้งหมด*
สแกนร่วมกับเครื่องมืออื่น
subfinder -d targetdomain.site -silent | httpx | nuclei
● ใช้ subfinder เพื่อหา List Subdomain (โดเมนย่อย) ของเป้าหมาย และ -silent ทำให้ผลลัพธ์แสดงเฉพาะชื่อ Subdomain โดยไม่มีข้อความอื่น ๆ
● แล้วใช้ httpx เพื่อตรวจสอบดูว่า Subdomain ที่หาได้สามารถเข้าถึงได้จริงหรือไม่
● สุดท้ายนำผลลัพท์ Subdomain ที่ได้มา มาเเสกนหาช่องโหว่ต่อด้วย nuclei
การสแกน Nuclei ร่วมกับ Template
*Path ของ Template จะอยู่ที่ /home/
สแกนด้วยโฟลเดอร์ Template สามารถสแกนโดยใช้ Template ทั้งหมดในโฟลเดอร์ โดยระบุด้วย Flag -t เช่น ใช้ Template ทั้งหมดในโฟลเดอร์ http/exposures/ ในการสแกน:
nuclei -t http/exposures/
สแกนโดยใช้ Template เเบบเฉพาะเจาะจง สามารถระบุได้ด้วยด้วย Flag -t
nuclei -t http/technologies/tech-detect.yaml -t http/technologies/nginx/nginx-version.yaml
สแกนด้วยTag ของ Template ในเเต่ละ Template จะมี Tag เพื่อให้ง่ายต่อการจัดระเบียบและใช้งาน สามารถระบุ Tag เพื่อใช้ Template ที่ตรงกับเกณฑ์ที่เราต้องการได้
nuclei -u https://jira.targetdomain.site -tags jira,generic
สแกนโดยใช้ Template กรองตามความรุนแรง สามารถกรอง Template ตามระดับความรุนแรงของช่องโหว่เพื่อมุ่งเน้นเเสกนหาเฉพาะช่องโหว่ที่สำคัญในระบบได้
nuclei -u https://targetdomain.site -s critical,high,medium
ยกเว้นTemplate เพื่อไม่ให้ใช้ Template ที่ระบุไว้ในการสแกน ใช้ Flag -et
nuclei -et http/fuzzing/
การตั้งค่า Header
ตั้งค่า Header ที่กำหนดเอง สามารถตั้งค่า Header ที่กำหนดเองเพื่อใช้ในการ Request HTTP ระหว่างการสแกน เช่น การตั้งค่า User-Agent header หรือ Authorizes header
nuclei -H ‘User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36’ -l targets.txt
การตั้งค่า Rate limits (การจำกัดอัตราการร้องขอ)
จำกัดจำนวน Request และ Thread ควบคุมอัตราการสแกนโดยกำหนดจำนวน Request ต่อวินาทีใช้ Flag -rl และจำนวน Thread ที่ทำงานพร้อมกันได้โดยใช้ Flag -c
nuclei -l targets.txt -rl 20 -c 5
คำสั่งนี้จำกัดให้ Nuclei ส่ง Request เพียง 20 ครั้งต่อวินาที และใช้ Thread พร้อมกันสูงสุด 5 Thread เพื่อรักษาสมดุลระหว่างความเร็วและโหลดของเซิร์ฟเวอร์
*Thread เป็นหน่วยประมวลผลย่อยภายในโปรแกรมที่ช่วยให้สามารถทำงานแบบขนาน (parallel execution) ได้ โดยแต่ละ Thread จะทำงานแยกกันภายใน Process เดียวกัน*
ตั้งค่า Timeout (ค่าเริ่มต้น คือ 10) ยิ่งตั้งค่าน้อยจะเป็นการลดระยะเวลาการส่ง Request และเพิ่มความเร็วในการสแกน
nuclei -l targets.txt -timeout 3
การตั้งค่า Optimizations (ปรับแต่ง) ต่างๆ
ข้ามการสเเกนเป้าหมายหลังจากเกิดข้อผิดพลาด 5 ครั้ง
nuclei -l targets.txt — max-host-errors 5
ตั้งค่าการลองเเสกนใหม่อีกครั้งสูงสุดเป็น 3 ครั้ง (ค่าเริ่มต้นคือ 1):
nuclei -l targets.txt -retries 3
ตั้งค่า Scan strategy (กลยุทธ์ที่ใช้ในการสแกน) สามารถเลือกกลยุทธ์การสแกนเพื่อปรับสมดุลระหว่างโหลดของระบบและประสิทธิภาพการสแกน
nuclei -l targets.txt -ss host-spray
มีโหมดให้เลือกเป็น
● auto: ใช้กลยุทธ์ template-spray
● host-spray: รันทุกTemplate บนเป้าหมายเดียก่อนย้ายไปเป้าหมายถัดไป
● template-spray:รัน Template เดียวกันบนหลายเป้าหมายเพื่อลดภาระบนเป้าหมายเดียว
การจัดการ Output (ผลลัพธ์)
Nuclei มีตัวเลือกหลากหลายสำหรับการบันทึกและจัดรูปแบบผลลัพธ์การสแกน
บันทึก Output ลงไฟล์
nuclei -l targets.txt -o nuclei.log
คำสั่งนี้บันทึก Output การสแกนลงในไฟล์ nuclei.log
พิมพ์เเสดง Output ในรูปแบบ JSONL
nuclei -l targets.txt -jsonl
คำสั่งนี้พิมพ์ Output เป็นรูปแบบ JSON Lines (JSONL) เพื่อให้ง่ายต่อการนำไปใช้ในเครื่องมืออื่น
แสดง stat (สถิติ) ระหว่างการสแกน แสดง stat ระหว่างการสแกนเพื่อตรวจสอบความคืบหน้าและประสิทธิภาพ
nuclei -l targets.txt -stats
บันทึกผลลัพธ์ในรูปแบบ Markdown
nuclei -l targets.txt -me results/
คำสั่งนี้บันทึก Output เป็นไฟล์ Markdown ในโฟลเดอร์ results/ เพื่อให้ง่ายต่อการสร้างเป็นรายงาน
การทดสอบ Out of Band
การทดสอบ OOB เป็นการทดสอบที่เกิดขึ้นนอกเหนือจากกรอบการ Request-Response แบบปกติ
ปิดการทดสอบ OOB
nuclei -l targets.txt -ni
คำสั่งนี้ปิดการทดสอบ OOB
ใช้เซิร์ฟเวอร์ Interactsh ของตัวเอง
nuclei -l targets.txt -iserver
คำสั่งนี้กำหนดให้ใช้เซิร์ฟเวอร์ Interactsh แบบ self-hosted พร้อม Token ที่ระบุไป
*Interactsh เป็น Open-Source ที่รวบรวม Open-Source tools ต่าง ๆ เพื่อใช้ในการทดสอบและทำ Security Automation ในรูปแบบต่าง ๆ*
กำหนดเวลารอสำหรับการโต้ตอบ
nuclei -l targets.txt -interactions-eviction 120
คำสั่งกำหนดให้เก็บข้อมูลการโต้ตอบ (interactions) กับเซิร์ฟเวอร์ของเป้าหมายเป็นเวลา 120 วินาที ก่อนจะลบข้อมูลนั้นออกจากหน่วยความจำ
*interactions-eviction มักใช้ในกรณีที่สแกนช่องโหว่ที่ต้องมีการโต้ตอบกับ DNS, HTTP หรือ OOB interactions*
กำหนดระยะเวลาการ polling แบบกำหนดเอง (ค่าเริ่มต้นคือ 5)
nuclei -l targets.txt -interactions-poll-duration 10
คำสั่งกำหนดระยะเวลาการดึงข้อมูลการโต้ตอบ (poll interactions) จากเซิร์ฟเวอร์ของ Nuclei เป็นเวลา 10 วินาที
การตั้งค่าไฟล์ Config
ใช้ไฟล์ Config เพื่อใช้โหลดตั้งค่าจากไฟล์ YAML เพื่อทำให้กระบวนการสแกนเป็นไปตามมีมาตรฐานที่เราตั้งค่าไว้
nuclei -config nuclei.yaml -l targets.txt
*ไฟล์ Config เริ่มต้นของ Nuclei อยู่ที่ ~/.config/nuclei/config.yaml*
ตัวอย่างConfig:
header:
- ‘X-BugBounty-Hacker: h1/nickname’
templates:
- cves/
- vulnerabilities/
- misconfiguration/
tags: exposures,cve
severity: critical,high,medium
include-templates:
- vulnerabilities/xxx
- misconfiguration/xxxx
exclude-tags: info,fuzz
exclude-templates:
- vulnerabilities/xxx
- misconfiguration/xxxx
# การตั้งค่า Rate Limit
rate-limit: 50
bulk-size: 20
concurrency: 20
ไฟล์การตั้งค่านี้จะมีการกำหนด
● Headers ที่กำหนดเอง
● Path ของ Template ที่ใช้เป็นค่าเริ่มต้น
● ระดับความรุนแรงของช่องโหว่ที่ใช้ในการสเเกนเริ่มต้น
● การรวมเอา Template ที่ต้องการใช้ในการเเสกน และการยกเว้น Template ออกจากการสแกน
● การการตั้งค่าจำกัด Rate Limit (อัตราการส่งคำขอ)
การอัปเดต Nuclei
ปิดการตรวจสอบการอัปเดตอัตโนมัติ
nuclei -l targets.txt -duc
อัปเดตTemplate
nuclei -ut
คำสั่งนี้อัปเดตTemplateเป็นเวอร์ชันล่าสุด
อัปเดต Nuclei
nuclei -up
คำสั่งนี้อัปเดต Nuclei เป็นเวอร์ชันล่าสุด
ตัวอย่างวิธีการเขียนโครงสร้าง Template เเบบขั้นต้น
id: example-template # รหัสประจำตัวของTemplate
info:
name: Example Template # ชื่อTemplate
author: Your Name # ชื่อผู้สร้าง
severity: high # ระดับความรุนแรง (low, medium, high, critical)
requests:
- method: GET # ใช้ method HTTP GET
path: “{BaseURL}” # URL เป้าหมาย
headers: # กำหนด Header เพิ่มเติม (ถ้ามี)
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
matchers: # กำหนดเงื่อนไขเพื่อตรวจสอบผลลัพธ์
- type: word # ตรวจหาคำ (word matching)
words:
- “Example” # คำที่ต้องการค้นหาใน Response หลังจากที่เราส่ง payload ไป
attacks: # ส่ง payload ทดสอบช่องโหว่
- payload: ”’ OR true - ” # ทดสอบ SQL Injection
คำอธิบายแต่ละส่วน
● id — รหัสประจำตัวของTemplate ใช้เพื่ออ้างอิงในคำสั่ง Nuclei
● info — ข้อมูลเกี่ยวกับTemplate เช่น ชื่อ, ผู้สร้าง, ระดับความรุนแรง
● requests — รายการ HTTP Request ที่จะส่งไปยังเป้าหมาย
● method — ระบุประเภทของ Request เช่น GET, POST
● path — ระบุ Path ของ URL ที่ต้องการทดสอบซึ่งในที่นี่ถ้าใช้เป็น {BaseURL} จะเอาเป็นค่าตามที่เราระบุในเป้าหมายเลย
● headers — กำหนดส่วนของ HTTP headers (เช่น User-Agent)
● matchers — กำหนดเงื่อนไขเพื่อตรวจสอบผลลัพธ์จากเซิร์ฟเวอร์
● type — วิธีการตรวจสอบ เช่น word, regex, status
● words — คำที่ต้องการค้นหาใน Response
● attacks — (ตัวเลือกเพิ่มเติม) ใช้เพื่อทดสอบช่องโหว่
● payload — ค่าที่ใช้โจมตี เช่น SQL Injection, XSS
สรุปได้ว่าTemplateนี้จะทำอะไรบ้าง
● Templateนี้จะส่งคำขอ GET ไปยังเว็บไซต์
● ทดสอบ SQL Injection ด้วย payload “‘ OR true — “
● ตรวจสอบว่ามีคำว่า “Example” อยู่ใน Response หรือไม่หลังจากส่ง payload ไปหรือไม่ ถ้ามีจะผลการสแกนจะเป็นพบช่องโหว่นี้
Nuclei เป็นเครื่องมือที่ทรงพลังในการค้นหาช่องโหว่และการตั้งค่าที่ผิดพลาดของระบบหวังว่าบทความนี้จะช่วยให้คุณเข้าใจพื้นฐานและนำไปใช้งานได้อย่างมีประสิทธิภาพ อย่าลืมทดลองใช้งานและปรับแต่งตามความต้องการ เพื่อให้ได้ผลลัพธ์ที่ดีที่สุด!
อ้างอิง: