วิธีใช้สคริปต์ Nmap Script Engine (NSE) ใน Linux
Nmap เป็นเครื่องสแกนความปลอดภัยเครือข่ายบรรทัดคำสั่งและเครื่องมือสำรวจยอดนิยม ทรงพลัง และข้ามแพลตฟอร์ม นอกจากนี้ยังช่วยให้คุณเห็นภาพรวมของระบบที่เชื่อมต่อเครือข่ายของคุณ คุณสามารถใช้มันเพื่อค้นหาที่อยู่ IP ทั้งหมดของโฮสต์สด สแกนพอร์ตที่เปิดและบริการที่ทำงานบนโฮสต์เหล่านั้น และอื่นๆ อีกมากมาย
หนึ่งในคุณลักษณะที่น่าสนใจของ Nmap คือ Nmap Script Engine (NSE) ซึ่งเพิ่มความยืดหยุ่นและประสิทธิภาพมากยิ่งขึ้น ช่วยให้คุณสามารถเขียนสคริปต์ของคุณเองในภาษาการเขียนโปรแกรม Lua และอาจแชร์สคริปต์เหล่านี้กับผู้ใช้ Nmap คนอื่น ๆ
อ่านเพิ่มเติม: 29 ตัวอย่างการใช้งานจริงของคำสั่ง Nmap สำหรับ Linux
สคริปต์ NSE มีสี่ประเภท ได้แก่ :
- สคริปต์กำหนดล่วงหน้า – เป็นสคริปต์ที่ทำงานก่อนการสแกนของ Nmap โดยจะดำเนินการเมื่อ Nmap ยังไม่ได้รวบรวมข้อมูลใดๆ เกี่ยวกับเป้าหมาย
- สคริปต์โฮสต์ – คือสคริปต์ที่ดำเนินการหลังจากที่ Nmap ดำเนินการตามปกติ เช่น การค้นหาโฮสต์ การสแกนพอร์ต การตรวจจับเวอร์ชัน และการตรวจจับระบบปฏิบัติการกับโฮสต์เป้าหมาย
- สคริปต์บริการ – คือสคริปต์ที่ทำงานกับบริการเฉพาะที่รับฟังบนโฮสต์เป้าหมาย
- สคริปต์ Postrule – คือสคริปต์ที่ทำงานหลังจาก Nmap สแกนโฮสต์เป้าหมายทั้งหมดแล้ว
จากนั้นสคริปต์เหล่านี้จะถูกจัดกลุ่มตามหมวดหมู่ต่างๆ รวมถึงประเภทสำหรับการตรวจสอบสิทธิ์ (การตรวจสอบสิทธิ์), การค้นหาโฮสต์ (การออกอากาศ), การโจมตีแบบ bruteforce เพื่อคาดเดาข้อมูลรับรองการตรวจสอบสิทธิ์ (brute<) การค้นพบเพิ่มเติมเกี่ยวกับเครือข่าย (การค้นพบ) ทำให้เกิดการปฏิเสธการให้บริการ (สิ่งที่ควรทำ) การใช้ประโยชน์จากช่องโหว่บางอย่าง (การหาประโยชน์) ฯลฯ สคริปต์จำนวนหนึ่งอยู่ในหมวดหมู่เริ่มต้น
หมายเหตุ: ก่อนที่เราจะไปไกลกว่านี้ คุณควรทราบประเด็นสำคัญเหล่านี้:
- อย่ารันสคริปต์จากบุคคลที่สามโดยไม่ได้พิจารณาอย่างมีวิจารณญาณหรือเฉพาะในกรณีที่คุณเชื่อถือผู้เขียนเท่านั้น เนื่องจากสคริปต์เหล่านี้ไม่ได้ทำงานในแซนด์บ็อกซ์และอาจสร้างความเสียหายให้กับระบบของคุณโดยไม่คาดคิดหรือเป็นอันตรายหรือบุกรุกความเป็นส่วนตัวของคุณ
- ประการที่สอง สคริปต์เหล่านี้จำนวนมากอาจทำงานเป็นสคริปต์ prerule หรือ postrule เมื่อพิจารณาถึงสิ่งนี้ ขอแนะนำให้ใช้กฎเบื้องต้นเพื่อจุดประสงค์ของความสม่ำเสมอ
- Nmap ใช้ฐานข้อมูล scripts/script.db เพื่อค้นหาสคริปต์และหมวดหมู่เริ่มต้นที่มีอยู่
หากต้องการดูตำแหน่งของสคริปต์ NSE ที่มีอยู่ทั้งหมด ให้เรียกใช้ยูทิลิตีการค้นหาบนเทอร์มินัล ดังนี้:
locate *.nse
/usr/share/nmap/scripts/acarsd-info.nse
/usr/share/nmap/scripts/address-info.nse
/usr/share/nmap/scripts/afp-brute.nse
/usr/share/nmap/scripts/afp-ls.nse
/usr/share/nmap/scripts/afp-path-vuln.nse
/usr/share/nmap/scripts/afp-serverinfo.nse
/usr/share/nmap/scripts/afp-showmount.nse
/usr/share/nmap/scripts/ajp-auth.nse
/usr/share/nmap/scripts/ajp-brute.nse
/usr/share/nmap/scripts/ajp-headers.nse
/usr/share/nmap/scripts/ajp-methods.nse
/usr/share/nmap/scripts/ajp-request.nse
/usr/share/nmap/scripts/allseeingeye-info.nse
/usr/share/nmap/scripts/amqp-info.nse
/usr/share/nmap/scripts/asn-query.nse
...
สคริปต์ NSE ถูกโหลดโดยใช้แฟล็ก --script
ซึ่งยังช่วยให้คุณเรียกใช้สคริปต์ของคุณเองได้โดยระบุหมวดหมู่ ชื่อไฟล์สคริปต์ หรือชื่อของไดเร็กทอรีที่มีสคริปต์ของคุณอยู่
ไวยากรณ์สำหรับการเปิดใช้งานสคริปต์มีดังนี้:
nmap -sC target #load default scripts
OR
nmap --script filename|category|directory|expression,... target
คุณสามารถดูคำอธิบายของสคริปต์ได้ด้วยตัวเลือก --script-help
นอกจากนี้ คุณยังสามารถส่งผ่านอาร์กิวเมนต์ไปยังสคริปต์บางตัวได้ผ่านทางตัวเลือก --script-args
และ --script-args-file
ซึ่งอันหลังจะใช้เพื่อระบุชื่อไฟล์แทนที่จะใช้ หาเรื่องบรรทัดคำสั่ง
หากต้องการสแกนด้วยสคริปต์เริ่มต้นส่วนใหญ่ ให้ใช้แฟล็ก -sC
หรือใช้ --script=default
ดังที่แสดง
nmap -sC scanme.nmap.org
OR
nmap --script=default scanme.nmap.org
OR
nmap --script default scanme.nmap.org
ผลลัพธ์ตัวอย่าง
Starting Nmap 7.01 ( https://nmap.org ) at 2017-11-15 10:36 IST
Nmap scan report for scanme.nmap.org (45.33.32.156)
Host is up (0.0027s latency).
Not shown: 999 filtered ports
PORT STATE SERVICE
80/tcp open http
|_http-title: Go ahead and ScanMe!
Nmap done: 1 IP address (1 host up) scanned in 11.74 seconds
หากต้องการใช้สคริปต์เพื่อวัตถุประสงค์ที่เหมาะสม ก่อนอื่น คุณสามารถขอคำอธิบายโดยย่อเกี่ยวกับหน้าที่ของสคริปต์ได้จริง เช่น http-headers
nmap --script-help http-headers scanme.nmap.org
ผลลัพธ์ตัวอย่าง
Starting Nmap 7.01 ( https://nmap.org ) at 2017-11-15 10:37 IST
http-headers
Categories: discovery safe
https://nmap.org/nsedoc/scripts/http-headers.html
Performs a HEAD request for the root folder ("/") of a web server and displays the HTTP headers returned.
กำลังโหลดสคริปต์ NSE เพื่อทำการสแกน Nmap
คุณสามารถเลือกหรือโหลดสคริปต์เพื่อทำการสแกนด้วยวิธีการต่างๆ ที่อธิบายไว้ด้านล่างนี้
การใช้ชื่อสคริปต์
เมื่อคุณรู้ว่าสคริปต์ทำอะไรได้บ้าง คุณสามารถทำการสแกนโดยใช้สคริปต์นั้นได้ คุณสามารถใช้สคริปต์เดียวหรือป้อนรายการชื่อสคริปต์ที่คั่นด้วยเครื่องหมายจุลภาค คำสั่งด้านล่างจะช่วยให้คุณดูส่วนหัว HTTP ที่กำหนดค่าไว้บนเว็บเซิร์ฟเวอร์ที่โฮสต์เป้าหมายได้
nmap --script http-headers scanme.nmap.org
Starting Nmap 7.01 ( https://nmap.org ) at 2017-11-15 10:39 IST
Nmap scan report for scanme.nmap.org (45.33.32.156)
Host is up (0.27s latency).
Not shown: 996 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
| http-headers:
| Date: Wed, 15 Nov 2017 05:10:04 GMT
| Server: Apache/2.4.7 (Ubuntu)
| Accept-Ranges: bytes
| Vary: Accept-Encoding
| Connection: close
| Content-Type: text/html
|
|_ (Request type: HEAD)
179/tcp filtered bgp
31337/tcp open Elite
Nmap done: 1 IP address (1 host up) scanned in 20.96 seconds
การใช้หมวดหมู่
คุณยังสามารถโหลดสคริปต์จากหมวดหมู่เดียวหรือจากรายการหมวดหมู่ที่คั่นด้วยเครื่องหมายจุลภาคได้ ในตัวอย่างนี้ เราใช้สคริปต์ทั้งหมดในหมวดหมู่เริ่มต้นและการออกอากาศเพื่อทำการสแกนบนโฮสต์ 192.168.56.1
nmap --script default,broadcast 192.168.56.1
การใช้ * ไวด์การ์ด
สิ่งนี้มีประโยชน์เมื่อคุณต้องการเลือกสคริปต์ที่มีรูปแบบชื่อที่กำหนด ตัวอย่างเช่น หากต้องการโหลดสคริปต์ทั้งหมดที่มีชื่อขึ้นต้นด้วย ssh ให้รันคำสั่งด้านล่างบนเทอร์มินัล:
nmap --script "ssh-*" 192.168.56.1
การใช้นิพจน์บูลีน
คุณยังสามารถเลือกสคริปต์โดยใช้นิพจน์บูลีนซึ่งคุณสามารถสร้างได้โดยใช้ตัวดำเนินการ และ, หรือ และ ไม่ และชื่อในนิพจน์บูลีนอาจเป็นหมวดหมู่ ชื่อไฟล์จาก script.db หรือทั้งหมด
คำสั่งต่อไปนี้จะโหลดสคริปต์จากหมวดหมู่เริ่มต้นหรือหมวดหมู่การออกอากาศ
nmap --script "default or broadcast" 192.168.56.10
ซึ่งเทียบเท่ากับ:
nmap --script default,broadcast 192.168.56.10
หากต้องการโหลดสคริปต์ทั้งหมดโดยไม่อยู่ในหมวดหมู่ vuln ให้รันคำสั่งนี้บนเทอร์มินัล
nmap --script "not vuln" 192.168.56.10
คำสั่งถัดไปดูซับซ้อนเล็กน้อยแต่เข้าใจง่าย โดยจะเลือกสคริปต์ตามค่าเริ่มต้นหรือหมวดหมู่การออกอากาศ ยกเว้นคำสั่งที่มีชื่อขึ้นต้นด้วย ssh-:
nmap --script "(default or broadcast) and not ssh-*" 192.168.56.10
ที่สำคัญ คุณสามารถรวมหมวดหมู่ ชื่อสคริปต์ ไดเร็กทอรีที่มีสคริปต์ที่คุณกำหนดเอง หรือนิพจน์บูลีนเพื่อโหลดสคริปต์ได้ ดังนี้:
nmap --script broadcast,vuln,ssh-auth-methods,/path/to/custom/scripts 192.168.56.10
การส่งผ่านอาร์กิวเมนต์ไปยังสคริปต์ NSE
ด้านล่างนี้คือตัวอย่างที่แสดงวิธีส่งอาร์กิวเมนต์ไปยังสคริปต์ด้วยตัวเลือก –script-args:
nmap --script mysql-audit --script-args "mysql-audit.username='root', \
mysql-audit.password='password_here', mysql-audit.filename='nselib/data/mysql-cis.audit'"
หากต้องการส่งหมายเลขพอร์ต ให้ใช้ตัวเลือก -p nmap:
nmap -p 3306 --script mysql-audit --script-args "mysql-audit.username='root', \
mysql-audit.password='password_here' , mysql-audit.filename='nselib/data/mysql-cis.audit'"
คำสั่งดังกล่าวจะเรียกใช้การตรวจสอบการกำหนดค่าความปลอดภัยของเซิร์ฟเวอร์ฐานข้อมูล MySQL โดยเทียบกับส่วนต่างๆ ของเกณฑ์มาตรฐาน CIS MySQL v1.0.2 คุณสามารถสร้างไฟล์การตรวจสอบแบบกำหนดเองที่เป็นประโยชน์สำหรับการตรวจสอบ MySQL อื่นๆ ได้เช่นกัน
แค่นั้นแหละสำหรับตอนนี้ คุณสามารถค้นหาข้อมูลเพิ่มเติมได้ที่หน้า Nmap man หรือตรวจสอบการใช้งาน NSE
หากต้องการเริ่มต้นเขียนสคริปต์ NSE ของคุณเอง โปรดดูคู่มือนี้: https://nmap.org/book/nse-tutorial.html
บทสรุป
Nmap เป็นเครื่องมือที่ทรงพลังและมีประโยชน์จริงๆ ที่ผู้ดูแลระบบหรือเครือข่ายทุกคนต้องการในคลังแสงความปลอดภัยของตน NSE เพียงแค่เพิ่มประสิทธิภาพให้กับมันมากขึ้นเท่านั้น
ในบทความนี้ เราได้แนะนำให้คุณรู้จักกับ Nmap Script Engine และดูวิธีค้นหาและใช้สคริปต์ต่างๆ ที่มีอยู่ภายใต้หมวดหมู่ต่างๆ หากคุณมีคำถามใด ๆ อย่าลังเลที่จะเขียนกลับมาหาเราผ่านแบบฟอร์มความคิดเห็นด้านล่าง