หน้าเว็บ

วันอังคารที่ 6 พฤษภาคม พ.ศ. 2557

รู้จักกับ NMAP Script Engine กันเถอะ

Credit By: http://www.mindterra.com/


มารู้จักกับ NMAP Script Engine กันเถอะ

สวัสดีคับ หลังจากห่างหายการอัพเดทกันไปนาน แต่ตอนนี้ผมกลับมาแล้วคับ พี่น้อง!!!! กลับมาคราวนี้ผมก็มาพร้อมกับข้อมูลที่ดีๆ ที่มีประโยชน์กันอีกเช่นเคยนะคับ
วันนี้เรามาเรื่องเบาๆ กับ NMAP Script Engine กันคับ
ถ้ากล่าวถึง Nmap แล้ว ผู้ที่ชื่นชอบเกี่ยวกับเรื่องความมั่นคงของคอมพิวเตอร์คงจะรู้กันดีว่ามันมีประโยชน์ยังไง ในที่นี้ผมขอเล่าถึงเรื่องราวเกี่ยวกับ Nmap คล่าวๆ ว่ามันคืออะไร เอาไว้ใช้ทำอะไร ก่อนแล้วกันคับ
Nmap ย่อมาจาก Network Mapper สร้างขึ้นโดยคุณ Gordon Lyons (เขามีนามสมมติอีกชื่อนึงเป็นภาษารัสเซียว่า Fyodor Vaskovich) โดย Nmap เป็นเครื่องมือที่เอาไว้ตรวจสอบและค้นหา service ที่ทำงานอยู่บนเครื่องเป้าหมาย เมื่อใช้ Nmap ตรวจสอบและค้นหาแล้ว แน่นอนว่าสิ่งที่เราจะรู้คือ เครื่องเป้าหมายมันเปิดหรือมันปิดอยู่ ถ้ามันเปิดอยู่แล้วมันเป็นเครื่องที่ใช้ทำงานประเภทไหน เช่น เราจะทำการตรวจสอบเครื่องเป้าหมายเครื่องนึงโดยใช้ Nmap ว่าเครื่องเป้าหมายเครื่องนั้นมันเปิด service อะไรอยู่
clip_image002
(จากรูปข้างบนเราจะทำการตรวจสอบเครื่องเป้าหมายโดยมีเลขที่อยู่คือ 192.168.5.130)
 
-sT คือ การสแกนโดยใช้เทคนิค TCP full connect (3 way handshake)
-sV คือ การให้ service แสดงแบนเนอร์ (ตามรูปจะแสดงในคอลัมน์ VERSION)

เมื่อสแกนเสร็จแล้วเราจะได้ผลลัพธ์ออกมาว่าเครื่องเป้าหมายเปิดใช้งานประเภทเว็บ (พอร์ท 80 และ แบนเนอร์ Apache) และ ประเภทถ่ายโอนไฟล์ (พอร์ท 21 และแบนเนอร์ vsftpd)

เบื้องต้นเราก็จะรู้แล้วว่า Nmap มันใช้ทำอะไร ทีนี้เราจะมาเข้าเรื่องกัน!!!!!
NSE หรือ Nmap Script Engine เป็นความสามารถหนึ่งของ Nmap ที่อนุญาตให้เราสามารถเขียนปรับแต่งสคริปต์สแกนง่ายๆด้วยตัวเราเอง2 ซึ่งปกติแล้ว Nmap จะมีสคริปต์ที่ถูกเขียนไว้แล้วอยู่ที่พาธ <NMAP_HOME>/script
ในที่นี้เราจะมาลองหัดเขียน NSE ง่ายๆโดยภาษาที่ต้องใช้เขียนใน NSE คือ Lua (http://www.lua.org/start.html) ซึ่งเป็นภาษาที่จะใช้ในการฝังเข้ากับแอปพลิเคชันอื่นๆ
ส่วนประกอบหลักๆของ NSE จะมีอยู่สามส่วนได้แก่ HeadRule และ Action

The Head

ในส่วนนี้จะเป็นส่วนที่ใช้บอกข้อมูลต่างๆเกี่ยวกับสคริปต์นี้โดยในส่วนนี้จะประกอบไปด้วยฟิลด์

The Rule

ส่วนนี้เป็นส่วนที่เกี่วข้องกับ Action เพราะจะเป็นส่วนที่คอยบอกว่าเราจะเข้าไปประมวลผลในส่วนของ Action หรือเปล่า ถ้าตรงกับเงื่อนไขก็ประมวลผล ถ้าไม่ตรงในส่วนของ Action ก็จะถูกละเลยไป

The Action

ส่วนสุดท้ายเป็นส่วนที่เราจะใช้หาข้อมูลที่เราต้องการทราบโดยในส่วนนี้จะทำการสร้างการเชื่อมต่อไปยังเครื่องเป้าหมายเพื่อเก็บเอาข้อมูลมาแสดงผล
เราจะมาลองเขียนสคริปต์ที่ใช้หาช่องโหว่ของ FTP โดยตรวจสอบเวอร์ชันจากแบนเนอร์
เริ่มแรกก็สร้างไฟล์นามสกุล .nse ขึ้นมาโดยเอาไฟล์ไปอยู่ที่พาธ <NMAP_HOME/script>
clip_image004
จากนั้นก็เริ่มเขียนในส่วนแรกก่อนก็คือ Head
clip_image006
- – หมายถึง คอมเมนต์
description อธิบายจุดประสงค์ของสคริปต์
categories หมวดหมู่ของสคริปต์ เช่น fuzzing, discovery
license ใบอนุญาต, ข้อตกลง
ในส่วนถัดไปคือ Rule ในที่นี้เราจะทำการตรวจสอบเฉพาะ FTP ซึ่งมีพอร์ท 21 เป็นค่าปริยาย เพราะฉะนั้นสิ่งที่เราต้องระบุใน Rule จะมี
โปรโตคอล คือ TCP (FTP ใช้ TCP เป็น Transport protocol(OSI model layer 4))
พอร์ท คือ 21
สถานะ คือ เปิดใช้งาน (Open)
โดยเงื่อนไขทั้ง 3 ข้างบนจะนำไปเขียนเป็นเงื่อนไขตามรูปข้างล่าง
clip_image008
- – หมายถึงคอมเม้นต์
portrule และ function คือ ฟังก์ชันที่จะเรียกโฮสต์หรือเลขที่อยู่และพอร์ทมาตรวจสอบ
return คือ ให้นำค่ามาตรวจสอบโดยให้ระบุเป็นเงื่อนไข จากตัวอย่างจะนำค่า protocol, port number, port state มาระบุเป็นเงื่อนไขที่เราระบุไว้ข้างบน
ส่วนสุดท้ายคือ Action โดยมีข้อแม้ว่าเงื่อนไขที่เราตั้งในส่วน Rule จะต้องตรงทุกข้อถึงจะเข้ามาประมวลผลในส่วนนี้ได้ เช่น ในกรณีที่เราตั้งว่าต้องเป็นพอร์ท 21 ส่วนของ Action จะประมวลผลก็ต่อเมื่อสแกนแล้วเจอเป็นพอร์ท 21 เท่านั้น ในส่วนนี้เราจะทำการอ่านแบนเนอร์จาก service ที่รันอยู่โดยเราจะตรวจสอบว่ามีช่องโหว่จากเวอร์ชัน
Nmap มีสคริปต์ไว้ตรวจสอบแบนเนอร์อยู่แล้วชื่อว่า banner.nse เราจะทำการคัดลอกเอาฟังก์ชัน grab_banner() , output(), replace_nonprint() และ extra_output() มาใส่ไว้ด้านล่างสุด
function grab_banner(host, port)
local opts = {}
.
.
return response:match(“^%s*(.-)%s*$”);
end
function output( out )
if type(out) ~= “string” or out == “” then return nil end
.
.
return table.concat(t,”\n”)
end
function replace_nonprint( s, len )
local t = {}
.
.
return table.concat(t)
end
function extra_output()
return (nmap.verbosity()-nmap.debugging()>0 and nmap.verbosity()-nmap.debugging()) or 0
end
ฟังก์ชันที่เราจะเอามาใช้ในสคริปต์ของเราซึ่งอยู่ใน banner.nse
จากนั้นเราจะทำการเรียกเฉพาะฟังก์ชัน grab_banner(), output() มาใช้ตามรูป
clip_image010
ในที่นี้เราจะลองจำลองการหาช่องโหว่จากแบนเนอร์แบบง่ายๆโดยสมมติว่าถ้า FTP เป็น CesarFTP เวอร์ชัน 0.99g ให้บอกว่ามีช่องโหว่และอ้างอิงถีงโค๊ดที่ใช้โจมตีช่องโหว่
local bnnr คือ ตัวแปรที่จะเก็บผลลัพธ์จากฟังก์ชัน grab_banner
local final_bnnr คือ ตัวแปรที่จะเก็บผลลัพธ์จากฟังก์ชัน output ซึ่งเป็นฟังก์ชันที่จัดการรูปแบบของผลลัพธ์
if และ else คือ ถ้าตัวแปร final_bnnr มีอักขระ “CesarFTP 0.99g” อยู่ก็ให้บอกว่ามีช่องโหว่ ถ้าไม่มีก็บอกว่าไม่มีช่องโหว่
สุดท้ายบันทึกแล้วก็สแกนด้วยคำสั่ง nmap – -script ftp-vuln-check -p 21 <เป้าหมาย>
clip_image012
สำหรับวันนี้เอาแค่นี้ก่อน ให้เพื่อนๆ ได้รู้จัก NSE กันก่อน แล้วกลับมาพบกันอีกนะคับ คราวนี้จะไม่หายไปนานแล้วคับ ^^
http://en.wikipedia.org/wiki/Nmap
http://nmap.org/book/man-nse.html
http://www.lua.org/start.html
http://nmap.org/book/nse-tutorial.html
http://thesprawl.org/research/writing-nse-scripts-for-vulnerability-scanning/

ไม่มีความคิดเห็น:

แสดงความคิดเห็น