Clear
Lead Graphic Papers

Nmap Scripting Engine

ผู้เขียน: ธงชัย ศิลปวรางกูร
วันที่เผยแพร่: 11 เมษายน 2556
ปรับปรุงล่าสุด: 11 เมษายน 2556

Share on Facebook Share on Twitter Share on Google+

สำหรับท่านที่เคยศึกษาหรือมีประสบการณ์ในการทำงานด้านการดูแลระบบสารสนเทศมาก่อน อาจรู้จักหรือคุ้นเคยกับโปรแกรมที่มีชื่อว่า Nmap เนื่องจากเป็นเครื่องมือที่สามารถใช้ในการตรวจสอบข้อมูลเบื้องต้นของระบบได้เป็นอย่างดี มีฟังก์ชันการใช้งานให้เลือกที่หลากหลาย และที่สำคัญคือสามารถใช้งานได้ฟรี อย่างไรก็ตาม ความสามารถของ Nmap ไม่ได้ถูกจำกัดอยู่เพียงแค่การใช้งานโดยทั่วไป เช่น การสแกนระบบเป้าหมายเพื่อค้นหา Service และหมายเลขพอร์ตที่เปิดใช้งาน หรือรายละเอียดของระบบปฏิบัติการที่ทำงานบนระบบดังกล่าวเท่านั้น แต่เรายังสามารถใช้ Nmap ในการทดสอบความมั่นคงปลอดภัยของระบบ และสืบหาข้อมูลในมุมมองอื่น ๆ ได้อีกด้วย โดยใช้ความสามารถที่เรียกว่า Nmap Scripting Engine

ข้อมูลเบื้องต้นเกี่ยวกับ Nmap Scripting Engine

Nmap Scripting Engine (NSE) เป็นความสามารถที่มีมาพร้อมกับ Nmap อย่างเป็นทางการตั้งแต่เวอร์ชัน 4.50 ซึ่งเผยแพร่เมื่อปี 2007 [1] โดยมีจุดเด่นอยู่ที่ความสามารถในการเรียกใช้สคริปต์ที่มีชื่อว่า NSE script ซึ่งผู้ใช้สามารถเขียนสคริปต์ดังกล่าวขึ้นมาใช้งานได้เอง ทำให้ความสามารถในการทำงานของ Nmap นั้นถูกขยายขอบเขตออกไปขึ้นอยู่กับฟังก์ชันการทำงานของสคริปต์ที่ถูกเรียกใช้ ในปัจจุบัน (ณ วันที่เผยแพร่บทความ) สคริปต์ถูกแบ่งออกเป็นหมวดย่อยต่าง ๆ ดังนี้

  • auth: สคริปต์ที่เกี่ยวข้องกับการยืนยันตัวบุคคลเพื่อเข้าใช้งานระบบ เช่น การทดสอบเข้าใช้งานระบบโดยใช้ชื่อบัญชีผู้ใช้และรหัสผ่านที่เป็นค่าเริ่มต้น
  • broadcast: สคริปต์ที่ใช้ในการค้นหาอุปกรณ์หรือเครื่องแม่ข่ายที่ทำงานอยู่บนระบบเครือข่ายประเภทต่าง ๆ
  • brute: สคริปต์ที่ใช้ในการเดาสุ่มรหัสผ่านของ Service ต่าง ๆ
  • default: สคริปต์ที่ใช้ในการสืบหาข้อมูลพื้นฐานของระบบ
  • discovery: สคริปต์ที่ใช้ในการค้นหาข้อมูลเชิงลึกของระบบเป้าหมาย
  • dos: สคริปต์ที่ใช้ทดสอบการโจมตีระบบด้วยวิธี Denial-of-Service
  • exploit: สคริปต์ที่ใช้ทดสอบการเจาะระบบผ่านทางช่องโหว่ของ Service ต่าง ๆ
  • external: สคริปต์ที่ใช้ในการค้นหาข้อมูลเพิ่มเติมจากบริการภายนอก เช่น WHOIS
  • fuzzer: สคริปต์ที่ใช้ในการทำ Fuzzing ซึ่งเป็นเทคนิคการตรวจสอบซอฟต์แวร์ด้วยการป้อนข้อมูลสุ่มในรูปแบบที่คาดว่าจะทำให้เกิดการทำงานที่ผิดพลาด
  • intrusive: สคริปต์ที่เกี่ยวข้องกับการทดสอบโจมตีระบบเป็นหลัก ส่วนใหญ่เป็นสคริปต์ที่อยู่ในหมวด brute, exploit และ dos
  • malware: สคริปต์ที่ใช้ตรวจสอบระบบว่ากำลังติดมัลแวร์ หรือมีช่องโหว่ที่อาจถูกโจมตีโดยมัลแวร์หรือไม่
  • safe: สคริปต์ที่ใช้ในการค้นหาข้อมูลต่าง ๆ โดยการทำงานของสคริปต์ที่อยู่ในหมวดนี้ ไม่มีความเสี่ยงที่จะทำให้เกิดผลกระทบต่อการทำงานของระบบ
  • version: สคริปต์ที่ใช้ในการค้นหารายละเอียดของ Service ที่ทำงานอยู่บนระบบเป้าหมาย
  • vuln: สคริปต์ที่ใช้ตรวจสอบหาช่องโหว่ของ Service ที่ทำงานอยู่บนระบบเป้าหมาย

การเรียกใช้ NSE Script

การใช้โดยระบุหมวดหมู่ของสคริปต์

วิธีนี้เป็นการเรียกใช้สคริปต์ทั้งหมดที่อยู่ในหมวดที่ระบุไว้ โดยมีรูปแบบคำสั่งการใช้งานโดยทั่วไปดังนี้

nmap --script <category-name> <target>

ซึ่งการเรียกใช้คำสั่งนั้นสามารถทำได้ผ่านทางโปรแกรม Command Prompt บน Windows หรือ Terminal บน Linux และ Mac OS

Pp2013te003-1.jpg
รูปที่ 1 ตัวอย่างการใช้คำสั่งโดยระบุชื่อหมวดหมู่ของสคริปต์ และผลลัพธ์ส่วนหนึ่งที่ได้

จากรูปที่ 1 เป็นการใช้คำสั่ง nmap --script auth 192.168.1.2 ซึ่งจะไปเรียกใช้สคริปต์ที่อยู่ในหมวด auth เพื่อทำการตรวจสอบว่า ระบบเป้าหมายที่มี IP address เป็น 192.168.1.2 นั้นมีข้อมูลใด ๆ ก็ตามที่เกี่ยวข้องกับกระบวนการยืนยันตัวบุคคลหรือไม่ จากส่วนหนึ่งของผลลัพธ์ที่ได้จะพบว่า บริการ FTP ของระบบดังกล่าวมีการตั้งค่าอนุญาตให้บุคคลใด ๆ สามารถเข้าใช้งานระบบ FTP ก็ได้ (Anonymous FTP)

ทั้งนี้ในการใช้งาน Nmap โดยทั่วไปที่มีการระบุตัวแปร -sC, -sV หรือ -A อยู่ในคำสั่ง ก็จะมีการเรียกใช้สคริปต์จากทั้งหมวดหมู่โดยอัตโนมัติอยู่แล้ว โดยตัวแปร -sC จะกำหนดให้เรียกใช้สคริปต์ที่อยู่ในหมวด default ส่วนตัวแปร -sV จะกำหนดให้เรียกใช้สคริปต์ที่อยู่ในหมวด version และตัวแปร -A จะกำหนดให้เรียกใช้สคริปต์ที่อยู่ในหมวด default และ version รวมถึงการตรวจสอบระบบปฏิบัติการและการทำ Traceroute

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

การใช้โดยระบุชื่อของสคริปต์

ในกรณีที่ต้องการเรียกใช้สคริปต์ตัวใดตัวหนึ่ง สามารถทำได้โดยมีรูปแบบคำสั่งโดยทั่วไปดังนี้

nmap --script <script-name>|<script-path> <target>

Pp2013te003-2.jpg
รูปที่ 2 ตัวอย่างการใช้คำสั่งโดยระบุชื่อของสคริปต์ และผลลัพธ์ส่วนหนึ่งที่ได้

จากรูปที่ 2 เป็นการเรียกใช้คำสั่ง nmap --script mysql-info 192.168.1.2 ซึ่งจะไปเรียกใช้สคริปต์ที่มีชื่อว่า mysql-info เพื่อสืบหารายละเอียดของ MySQL บนระบบเป้าหมายที่มี IP address เป็น 192.168.1.2 ผลลัพธ์ที่ได้คือเวอร์ชันของ MySQL (5.0.51a-3ubuntu5) และรายละเอียดปลีกย่อยอื่น ๆ ในกรณีนี้สคริปต์ที่ถูกเรียกใช้นั้นอยู่ใน Directory ที่ถูกสร้างขึ้นตั้งแต่ตอนติดตั้งโปรแกรม Nmap อยู่แล้ว (ซึ่งก็คือ C:\Program Files\Nmap\scripts สำหรับ Windows และ /usr/share/nmap/scripts หรือ /usr/local/share/nmap/scripts สำหรับ Linux ตามที่ได้กล่าวไว้ในตอนต้น) แต่ถ้าต้องการเรียกใช้สคริปต์ที่อยู่ภายนอก Directory ดังกล่าว ในคำสั่งจะต้องระบุ Absolute path ของไฟล์สคริปต์นั้น ๆ เช่น หากไฟล์ mysql-info.nse อยู่ใน /home/user/Desktop คำสั่งที่ใช้ก็จะเปลี่ยนเป็น nmap --script /home/user/Desktop/mysql-info.nse 192.168.1.2

การระบุ Argument ของสคริปต์

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

nmap --script <script-name> --script-args <arg1>=<val1>[,<arg2>=<val2>,...] <target>

ในคำสั่งส่วนที่เป็นการระบุ Argument นั้น ผู้ใช้สามารถระบุเพียง Argument ตัวเดียวหรือหลายตัวก็ได้ หากระบุ Argument หลายตัวจะต้องคั่นด้วยเครื่องหมาย Comma และหากค่าของ Argument มีช่องว่างให้ครอบด้วยเครื่องหมาย Double quote ตัวอย่างของคำสั่งที่มีการระบุ Argument เช่น

nmap --script http-enum --script-args http-enum.category=general http.useragent="Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)" 192.168.1.2

จากตัวอย่างข้างบนเป็นการเรียกใช้สคริปต์ที่ชื่อ http-enum ซึ่งใช้สำหรับสแกนหาชื่อ Directory ที่นิยมใช้กันใน Web application ต่าง ๆ โดยระบุค่าของ Argument ที่ชื่อ http-enum.category เป็น general ซึ่งจะทำการค้นหาเฉพาะชื่อ Directory ทั่วไป และ http.useragent เป็น HTTP user agent ที่แสดงตัวเป็นผู้ใช้เว็บเบราว์เซอร์ Internet Explorer 10 บน Windows 7

ข้อดีของ Nmap ของการเรียกใช้สคริปต์โดยระบุุ Argument คือ ผู้ใช้ไม่จำเป็นที่จะต้องระบุ Argument ให้ตรงกับ Argument ที่สคริปต์รองรับ แต่ Nmap จะเป็นตัวจัดการเองว่าสคริปต์นั้น ๆ รองรับ Argument ที่ระบุไว้ได้หรือไม่ ซึ่งหากไม่รองรับก็ไม่ได้มีผลกระทบต่อการเรียกใช้สคริปต์ดังกล่าวแต่อย่างใด และข้อดีอีกประการหนึ่งก็คือ Argument บางตัวสามารถใช้กับสคริปต์ได้หลายตัว ทำให้เวลาที่จะเรียกใช้สคริปต์ครั้งละหลาย ๆ ตัวที่เกี่ยวข้องกับโพรโทคอลหรือ Service เดียวกัน สามารถใช้ Argument ร่วมกันได้ เช่น http.useragent ที่ใช้ในตัวอย่างคำสั่งข้างต้น สามารถใช้ร่วมกับสคริปต์อื่น ๆ ที่มีชื่อขึ้นต้นด้วย http ได้ทั้งหมด ไม่ว่าจะเป็น http-auth, http-headers หรือ http-php-version เป็นต้น

ผู้ใช้สามารถศึกษาข้อมูลเพิ่มเติมเกี่ยวกับสคริปต์แต่ละตัวได้จาก NSEDoc Reference Portal [2] ซึ่งจะมีรายละเอียดเกี่ยวกับ Argument ที่สคริปต์แต่ละตัวรองรับ หรือในกรณีที่ผู้ใช้ใช้งาน Zenmap ซึ่งเป็นโปรแกรม Nmap เวอร์ชันที่มี GUI ก็สามารถเรียกดูข้อมูลดังกล่าวทางอ้อมได้จากตัวโปรแกรมเองเช่นกัน โดยเริ่มจากเปิดโปรแกรม Zenmap แล้วเลือกเมนู Profile จากนั้นเลือกเมนู New Profile or Command หรือ Edit Selected Profile จะพบกับหน้าต่าง Profile Editor ให้เลือกแท็บ Scripting ก็จะพบกับรายการสคริปต์ทั้งหมด และรายละเอียดการใช้งานของสคริปต์แต่ละตัวดังรูปที่ 7 ซึ่งจากหน้าต่างนี้ ผู้ใช้สามารถเลือกคำสั่งและกำหนดค่า Argument ต่าง ๆ แล้วบันทึกเก็บไว้เป็น Profile เพื่อที่จะสามารถเรียกใช้คำสั่งดังกล่าวได้ในภายหลัง

Pp2013te003-3.jpg
รูปที่ 3 หน้าต่าง Profile Editor ในโปรแกรม Zenmap

คำสั่งอื่น ๆ

การเรียกดูคำอธิบายการใช้งานของสคริปต์

ผู้ใช้สามารถเรียกดูคำอธิบายการใช้งานสคริปต์เบื้องต้นได้ โดยใช้คำสั่งดังนี้

nmap --script-help <script-name>

การตรวจสอบการทำงานของสคริปต์

ในกรณีเกิดปัญหาระหว่างการเรียกใช้สคริปต์ ผู้ใช้สามารถเปิดการทำงานในโหมด Debug เพื่อตรวจสอบการทำงานเบื้องหลังของสคริปต์ได้ โดยระบุตัวแปร -d (หรือ -dd หากต้องการดูรายละเอียดการทำงานมากยิ่งขึ้น) ลงในคำสั่ง ตัวอย่างเช่น

nmap --script http-headers -d 192.168.1.2

Pp2013te003-4.jpg
รูปที่ 4 ผลลัพธ์ส่วนหนึ่งที่ได้จากการทำงานในโหมด Debug

การอัพเดทฐานข้อมูลของสคริปต์

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

nmap --script-updatedb

หมายเหตุ: ผู้อ่านสามารถศึกษาวิธีการเรียกใช้ NSE script เพิ่มเติมได้จาก Nmap documentation [3] ซึ่งมีคำอธิบายวิธีการใช้งานในรูปแบบอื่น ๆ เช่น การเรียกใช้สคริปต์ครั้งละหลายตัวหรือหลายหมวดโดยใช้ Wildcard หรือ Logical operator หรือการระบุ Argument ของสคริปต์ในรูปแบบที่ซับซ้อนขึ้น เป็นต้น

สรุป

Nmap เป็นโปรแกรมที่มีความสามารถหลากหลาย ซึ่งนอกจากจะใช้ในการสำรวจข้อมูลทั่วไปของระบบแล้ว ยังสามารถใช้ในการตรวจสอบหาช่องโหว่ของระบบ หรือแม้กระทั่งทดสอบการเจาะระบบได้ อย่างไรก็ตาม Nmap ไม่ได้ถูกพัฒนาขึ้นเพื่อนำมาใช้ทดแทนเครื่องมืออื่น ๆ ที่ทำหน้าที่เฉพาะทางอย่างเช่นโปรแกรมจำพวก Vulnerability scanner หรือ Password cracker แต่เราก็สามารถใช้ Nmap ในการตรวจสอบระบบเบื้องต้นอย่างคร่าว ๆ เพื่อนำผลลัพธ์ไปวิเคราะห์ว่าควรทำการตรวจสอบเชิงลึกในด้านใดต่อไปได้ ข้อสำคัญอีกประการคือ โปรแกรมส่วนใหญ่ที่ใช้ในการทดสอบความมั่นคงปลอดภัยของระบบรวมถึง Nmap ด้วยนั้น ก็เปรียบเสมือนกับดาบสองคมที่อาจถูกนำไปใช้งานในทางที่ไม่ดีหรือไม่ถูกต้อง จนก่อให้เกิดความเสียหายต่อระบบได้ ดังนั้น ผู้ใช้จึงควรศึกษาวิธีการใช้งานให้ดีก่อนที่จะใช้งานจริง และระลึกเสมอว่าควรใช้เครื่องมือเหล่านี้กับระบบที่ตนเองเป็นผู้ดูแลรับผิดชอบ หรือเป็นระบบที่ได้รับการอนุญาตจากเจ้าของหรือผู้ดูแลให้สามารถทำการทดสอบได้เท่านั้น

อ้างอิง

  1. http://insecure.org/stf/Nmap-4.50-Release.html
  2. http://nmap.org/nsedoc
  3. http://nmap.org/book/nse-usage.html
Clear