25 thg 3, 2016

Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL

CHƢƠNG 2. TÌM HIỂU VỀ NGÔN NGỮ NASL 2.1 TỔNG QUAN VỀ NGÔN NGỮ NASL 2.1.1 Lịch sử ngôn ngữ NASL Vào năm 1998, phiên bản đầu tiên của Nessus được phát hành với khả năng kiểm tra khoảng 50 lỗi bảo mật, nó còn được biết như các plugin. Những plugin này được cài đặt như các thư viện dùng chung, được viết bằng ngôn ngữ lập trình C, với phần mở rộng .nes. Mục đích của phương pháp này nhằm phân tách riêng module đảm nhận việc quét (engine scanning) với các module hướng dẫn, chỉ thị quét. Điều này giúp cho Nessus có kiến trúc modul và dễ dàng mở rộng. Vào thời điểm đó, việc dùng các thư viện dùng chung để viết các plugin có rất nhiều ý nghĩa, giúp nhanh chóng tạo các plugin dựa trên những chương trình C sẵn có. Tác giả đã viết một script nhỏ gọi là "plugin-factory" giúp biên dịch các plugin viết bằng C sang các thư viện dùng chung (.nes). Ý tưởng là khi người dùng muốn update các plugin, họ sẽ download các plugin viết bằng C mới nhất trên web, sau đó biên dịch và cài đặt chúng. Quá trình này mang lại nhiều nguy cơ không an toàn về bảo mật, vì thế ý tưởng không được phát triển. Sau khi tìm kiếm các ngôn ngữ script hiện tại, Perl có lẽ là ngôn ngữ tốt nhất để viết các plugin cho Nessus, tuy nhiên vào thời điểm đó Perl có một số hạn chế: Chiếm dung lượng bộ nhớ lớn. Không hỗ trợ tốt quá trình gửi/nhận các gói tin thô (raw packet). Không có cách nào đáng tin cậy để kiểm tra dưới các máy ảo cơ bản. Điểm cuối cùng là quan trọng nhất. Từ một góc nhìn mức cao, mỗi một quá trình quét đều giống nhau: nó kết nối đến một số cổng trên máy khách từ xa, thực hiện một số tác vụ, sau đó suy ra máy khách từ xa có dễ bị tổn thương với một số luật đã cho trước hay không. Cách tốt nhất là điều chỉnh tất cả các tác vụ quét, để không phải điều chỉnh chúng một cách riêng rẽ, chuyển cho máy ảo thực hiện. Ví dụ, khi ta thêm khả năng hỗ trợ SSL vào trong Nessus, ta không phải sửa từng plugin, ta chỉ cần chỉnh sửa hàm socket thực hiện kết nối. Một mối quan tâm khác tới việc dùng Perl làm ngôn ngữ để viết các Plugin là các hàm bổ sung chỉ tồn tại Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 11 qua các plugin bên ngoài. Những module này lại yêu cầu những gói và hàm thư viện hệ thống riêng. Tác giả đã quyết định viết một ngôn ngữ Script mới gọi là NASL dùng riêng cho Nessus (Nessus Attrack Scripting Language), với các mục tiêu hướng đến: Mỗi script được chứa trong một file. Dễ cài đặt với người dùng cuối. Dễ tìm hiểu cho các nhà phân phối, phát triển. Chiếm ít dung lượng bộ nhớ. Thiết kế riêng cho quét lỗ hổng an ninh mạng. Độ bảo mật cao. Dễ chỉnh sửa và mở rộng. Hỗ trợ đa ngôn ngữ. Kết quả là ngôn ngữ NASL1 được ra đời, trong đó có một số điểm chưa được hoàn thiện: nó rất chậm và quá lỏng lẻo về các lỗi cú pháp, nhưng tổng thể nó đã làm tốt công việc của mình. Hơn 1000 lỗi kiểm tra bảo mật được viết bởi NASL1. Ban đầu tốc độ không phải là điều đáng quan tâm nhất, bởi thời gian để thiết lập một phiên kết nối TCP luôn mất nhiều hơn là thời gian trình thông dịch NASL xử lý, phân tích cú pháp mã plugin. Tuy nhiên, khi số lượng plugin tăng lên, người dùng bắt đầu sử dụng Nessus quét nhiều host hơn, NASL1 thực sự trở nên chậm cho những tác vụ này. Mã nguồn gốc khó mở rộng, và quyết định đơn giản là viết lại NASL. Vào năm 2001, thư viện libnasl được viết lại bởi Michel Arboi để mở rộng ngôn ngữ, và sửa chữa những khuyết điểm của NASL1. Thư viện viết lại này, được gọi với tên NASL2, trở thành thành phần lớn nhất trong Nessus 2.0. Kể từ phiên bản 3.0, ngôn ngữ NASL2 được tích hợp vào trong engine. Những ưu điểm của NASL2: Script được gói gọn: mỗi script NASL chứa cả code để kiểm tra các luật và các chỉ dẫn cho plugin của chính nó. Các file script có phần mở rộng đơn giản là .nasl. Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 12 Dễ cài đặt với người dùng cuối: NASL có dạng tự đóng gói, có thể cấu hình sử dụng với thư viện OpenSSL. Người dùng có thể dùng trình biên dịch GCC và GNI Bison (bison) dễ dàng xây dựng và cài đặt trình thông dịch NASL. Dễ dàng tìm hiểu với các nhà phân phối, phát triển: NASL trông rất giống C, với một vài điểm của Perl. Nếu chúng ta đã từng lập trình với những ngôn ngữ trên, thì việc học NASL khá dễ. Điểm khác biệt lớn nhất giữa NASL và C là nó không có phần con trỏ và quản lý bộ nhớ. Chiếm ít dung lượng bộ nhớ: Thông thường, Nessus chỉ yêu cầu vài trăm KB bộ nhớ, nó có thể load được nhiều plugin đồng thời. Thiết kế dành riêng cho kiểm tra bảo mật mạng: NASL được thiết kế để thiết lập kết nối, gửi nhận dữ liệu, xử lý kết quả. Nó có số lượng lớn các hàm thư viện cài đặt cho các giao thức mức cao. Ví dụ như các giao thức SMB, NFS, RPC, SMTP, HTTP, v.v… Tất cả những thư viện này đều được viết bằng NASL. Độ bảo mật cao: NASL không thể truy cập vào hệ thống file cục bộ, thực hiện các câu lệnh hệ thống, hoặc kết nối tới một máy khách bên thứ 3 (nó chỉ có thể kết nối tới host đang thực hiện kiểm tra). Việc không có con trỏ và quản lý bộ nhớ, giúp nó tránh được các lỗi như tràn bộ đệm. Điều này làm cho NASL trở thành một ngôn ngữ rất an toàn và giảm thời gian thiết kế những plugin mới. Dễ chỉnh sửa và mở rộng: Phiên bản của trình thông dịch NASL có ngôn ngữ rất trong sáng, giúp việc thêm các toán tử và hàm mới rất dễ, có khả năng tương thích ngược với các thư viện cũ. Hỗ trợ đa ngôn ngữ: NASL hỗ trợ đa ngôn ngữ, nhưng giới hạn ở các ngôn ngữ có thể mã hóa với bảng ký tự ASCII. Có nhiều ngôn ngữ như Nhật Bản, không thể biểu diễn bằng bảng mã ASCII mở rộng. 2.1.2 Điểm khác biệt giữa NASL1 và NASL2 NASL2 sử dụng trình phân tích cú pháp Bison, nó chặt chẽ hơn và có thể xử lý những kiểu diễn đạt phức tạp. NASL2 có nhiều hàm xây dựng sẵn (mặc dù hầu hết những hàm này đều có thể chuyển tương thích với NASL1). Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 13 NASL2 có nhiều toán tử được tích hợp. NASL2 nhanh hơn (khoản tầm 16 lần). Hầu hết script NASL2 không thể chạy với NASL1. Một vài script NASL1 không thể chạy với NASL2 (nhưng việc sửa tương đối dễ dàng). NASL2 có hàm chức năng xử lý mảng. 2.1.3 NASL2 ngôn ngữ thông dịch, tựa C “Thông dịch” là đặc điểm chung các ngôn ngữ script. Nhưng NASL2 có một thuận lợi lớn cho những người muốn tìm hiểu, đó là cú pháp của nó gần giống ngôn ngữ lập trình C (từ cách khai báo biến, các toán tử, vòng lặp, v.v…). Nó không có các thành phần phức tạp như trong C (biến con trỏ, quản lý vòng lặp), khiến cho ngữ pháp của NASL2 trở nên đơn giản, dễ hiểu hơn. Ví dụ nội dung của một file script test-yahoo.nasl: # This script was written by Noam Rathaus # if(description) { script_id(10326); script_version ("$Revision: 1.12 $"); script_cve_id("CAN-2000-0047"); name["english"] = "Yahoo Messenger Denial of Service attack"; script_name(english:name["english"]); desc["english"] = " It is possible to cause Yahoo Messenger to crash by sending a few bytes of garbage into its listening port TCP 5010. Solution: Block those ports from outside communication Risk factor : Low"; script_copyright(english:"This script is Copyright (C) 1999 SecuriTeam"); family["english"] = "Denial of Service"; script_family(english:family["english"]); exit(0); } # # The script code starts here # if (get_port_state(5010)) { sock5010 = open_sock_tcp(5010); if (sock5010) { Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 14 send(socket:sock5010, data:crap(2048)); close(sock5010); sock5010_sec = open_sock_tcp(5010); if ( !sock5010_sec ) { security_hole(5010); } else close(sock5010_sec); } } Ta có thể chạy thử một script NASL2 bằng câu lệnh đơn giản từ command-line: nasl –t 192.168.1.100 test-yahoo.nasl 2.2 CẤU TRÚC NGÔN NGỮ NASL2 2.2.1 Sơ bộ về quy tắc viết chƣơng trình Chú thích bắt đầu tính từ dấu “#” ở đầu dòng, khi đó nó sẽ được trình thông dịch bỏ qua. Có thể thêm các khoảng trắng tùy ý giữa 2 từ, toán tử. Khoảng trắng ở đây có thể là dấu cách, tab. Chuỗi được phân tích bởi bộ phân tích từ vựng, sau đó trả lại kết quả phân tích ngữ pháp. - Bộ phân tích sẽ trả lại thông báo quá dài, nếu nó gặp kiểu diễn tả như a+++++b, khi đó nó sẽ hiểu thành a++ ++ + b hoặc (a++ ++) + b giống như trong ANSI C. Khi đó ta nên viết a++ + ++b - Không thể thêm khoảng trắng vào giữa chuỗi đa ký tự. Ví dụ x = a + +; sẽ không được chấp nhận, nên viết x = a ++; 2.2.2 Cú pháp Cú pháp các câu lệnh của NASL: [decl_list]instr_decl instr_decl instr_decl_list [instr_decl]instr func_decl; [func_decl]function identifier ( arg_decl ) block Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 15 [arg_decl]/*nothing*/ arg_decl_1 [arg_decl_1]identifier identifier , arg_decl_1 [block]{ instr_list } {} [instr_list]instr instr instr_list [instr]s_instr ; block if_block loop [s_instr]aff post_pre_incr rep func_call ret inc loc glob break continue /*nothing*/ [ret]return expr return [if_block]if ( expr ) instr if ( expr ) instr else instr [loop]for_loop while_loop repeat_loop foreach_loop [for_loop]for ( aff_func ; expr ; aff_func ) instr [while_loop]while ( expr ) instr Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 16

Không có nhận xét nào:

Đăng nhận xét