
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

Đăng ký:
Đăng Nhận xét (Atom)
Không có nhận xét nào:
Đăng nhận xét