At5a Nhom2 Nessus
-
Upload
nguyen-thanh -
Category
Documents
-
view
85 -
download
8
Transcript of At5a Nhom2 Nessus
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 1
MỤC LỤC
TÓM TẮT NỘI DUNG ĐỀ TÀI ............................................................................. 6
LỜI MỞ ĐẦU ........................................................................................................... 7
CHƢƠNG 1. TỔNG QUAN VỀ NESSUS ............................................................ 8
1.1 LỊCH SỬ HÌNH THÀNH VÀ PHÁT TRIỂN CỦA NESSUS ..................... 8
1.2 CÁC THÀNH PHẦN CỦA NESSUS ............................................................. 8
1.2.1 Kiến trúc của Nessus với mô hình Client-Server ...................................... 8
1.2.2 Mô hình Nessus Knowledge Base ............................................................. 9
1.2.3 Mô hình Nessus Plugin ............................................................................10
CHƢƠNG 2. TÌM HIỂU VỀ NGÔN NGỮ NASL .............................................11
2.1 TỔNG QUAN VỀ NGÔN NGỮ NASL .......................................................11
2.1.1 Lịch sử ngôn ngữ NASL ..........................................................................11
2.1.2 Điểm khác biệt giữa NASL1 và NASL2 .................................................13
2.1.3 NASL2 ngôn ngữ thông dịch, tựa C ........................................................14
2.2 CẤU TRÚC NGÔN NGỮ NASL2 ................................................................15
2.2.1 Sơ bộ về quy tắc viết chương trình ..........................................................15
2.2.2 Cú pháp ....................................................................................................15
2.2.3 Kiểu dữ liệu ..............................................................................................20
2.2.4 Các toán tử ...............................................................................................20
2.2.4.1 Các toán tử thông thường .....................................................................20
2.2.4.2 Các phép toán số học ...........................................................................21
2.2.4.3 Các toán tử tựa C .................................................................................21
2.2.4.4 Toán tử xử lý chuỗi ..............................................................................21
2.2.4.5 Toán tử so sánh ....................................................................................22
2.2.4.6 Toán tử lôgic ........................................................................................22
2.2.4.7 Phép toán xử lý bit ...............................................................................22
2.2.4.8 Các phép xử lý đặc biệt ........................................................................23
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 2
2.2.5 Độ ưu tiên các phép toán .........................................................................23
2.2.6 Vòng lặp và các câu lệnh điều khiển .......................................................24
2.2.7 Khai báo biến, hàm ..................................................................................25
2.2.7.1 Khai báo biến .......................................................................................25
2.2.7.2 Khai báo hàm .......................................................................................25
2.2.7.3 Lấy đối số của hàm ..............................................................................25
2.2.7.4 Gọi hàm ................................................................................................26
2.3 THƢ VIỆN NASL2 ........................................................................................27
2.3.1 Các hằng số được định nghĩa từ trước .....................................................27
2.3.2 Các hàm tích hợp sẵn ...............................................................................29
2.3.2.1 Các hàm cơ bản (Knowledge base functions) .....................................29
2.3.2.2 Các hàm báo cáo ..................................................................................30
2.3.2.3 Các hàm chỉ dẫn ...................................................................................31
2.3.2.4 Các hàm gắn kết ...................................................................................33
2.3.2.5 Các hàm về mạng .................................................................................34
2.3.2.6 Các hàm xử lý chuỗi ............................................................................37
2.3.2.7 Các hàm HTTP ....................................................................................40
2.3.2.8 Các hàm Raw IP ...................................................................................41
2.3.2.9 Các hàm mật mã ...................................................................................44
2.3.2.10 Các hàm không an toàn ....................................................................44
2.3.3 Các file thư viện NASL ...........................................................................45
2.3.3.1 dump.inc ...............................................................................................47
2.3.3.2 ftp_func.inc ..........................................................................................47
2.3.3.3 http_func.inc ........................................................................................47
2.3.3.4 http_keepalive.inc ................................................................................48
2.3.3.5 nfs_func.inc ..........................................................................................49
2.3.3.6 smb_nt.inc ............................................................................................49
2.3.3.7 smtp_func.inc .......................................................................................51
2.3.3.8 Các hàm thư viện khác .........................................................................51
2.4 XÂY DỰNG PLUGIN CHO NESSUS .........................................................53
2.4.1 Thông dịch script tự xây dựng .................................................................53
2.4.2 Thử nghiệm script ....................................................................................54
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 3
KẾT LUẬN .............................................................................................................56
TÀI LIỆU THAM KHẢO .....................................................................................57
PHỤ LỤC ................................................................................................................58
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 4
DANH MỤC CÁC BẢNG
Bảng 2.1 Độ ưu tiên của các phép toán. ..................................................................23
Bảng 2.2 Một số hàm thư viện của Nessus. .............................................................51
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 5
DANH MỤC CÁC HÌNH
Hình 1.1 Mô hình kiến trúc Nessus dạng Client-Server. ........................................... 9
Hình 1.2 Mô hình hoạt động của Nessus Plugin. ....................................................10
Hình 2.1 Địa chỉ host FTP của kmasecurity.net ......................................................55
Hình 2.2 Kết quả banner trả về của host FTP kmasecurity.net ...............................55
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 6
TÓM TẮT NỘI DUNG ĐỀ TÀI
Đề tài thực hiện 2 nhiệm vụ chính:
Tìm hiểu về hoạt động của Nessus: cách cài đặt, chạy Nessus. Tìm hiểu về
các thành phần cơ bản của Nessus: Nessus Engine, Nessus Plugin, Nessus
Knowledge Base.
Tìm hiểu về ngôn ngữ script NASL của Nessus: cấu trúc ngôn ngữ, các hàm
cơ bản của NASL, các file định nghĩa (.inc), các file script (.nasl), cách viết
và thực thi script nasl. Tiến tới tự xây dựng một plugin mới để quét lỗ hổng.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 7
LỜI MỞ ĐẦU
Trong quá trình bảo mật hệ thống mạng cho một công ty hay tổ chức việc sử dụng
các công cụ mạnh để kiểm tra hay phát hiện các lỗi bảo mật nhằm nâng cao tính an
toàn của hệ thống và toàn mạng là rất quan trọng. Trong đó Nessus và GFI
LanGuard là hai trong số các chương trình rà soát lỗ hổng bảo mật mạng hàng đầu
hiện nay. Nhưng GFI LanGuard là một phần mềm thương mại, trong khi đó Nessus
lại là một phần mềm miễn phí hoàn toàn cho người dùng cá nhân, với cơ sở dữ liệu
về các lỗ hổng có thể được rất phong phú cho cả hệ thống chạy Window hay Linux
và được cập nhật thường xuyên. Theo thống kê của trang sectools.org, Nessus là
phần mềm quét lỗ hổng bảo mật phổ biến nhất trong các năm 2000, 2003 và 2006.
Hãng Tenable ước tính rằng nó được sử dụng rộng rãi bởi hơn 75000 tổ chức trên
toàn thế giới.
Việc dò tìm các lỗ hổng bảo mật đóng một vai trò rất quan trọng với các quản
trị viên hệ thống, các chuyên gia bảo mật v.v… nhằm tìm ra các biện pháp tăng
cường bảo mật cho hệ thống, và cả những kẻ muốn tấn công thực sự. Tuy nhiên
việc tìm thêm các lỗ hổng mới tương đối khó khăn, một phần do các lỗ hổng cũ sau
khi công bố một thời gian, các nhà sản xuất sẽ tìm cách “vá” lại những lổ hổng đó,
một phần do những người tìm ra những lỗ hổng mới đó không muốn công khai
rộng rãi. Việc dò quét các lỗ hổng của Nessus được thực hiện dựa trên hai thành
phần chính là Nessus Engine và Nessus Plugin. Nessus Engine đóng vai trò như
một trình biên dịch để thực hiện các câu lệnh của Nessus Plugin. Công cụ để xây
dựng các plugin đó chính là ngôn ngữ kịch bản NASL (Nessus Attrack Scripting
Language).
Nội dung của báo cáo được chia làm 2 phần:
Chương 1: Tìm hiểu về các thành phần, cách cài đặt và sử dụng Nessus.
Chương 2: Tìm hiểu ngôn ngữ NASL, tiến tới tự xây dựng plugin cho
Nessus.
Do thời gian tìm hiểu ngắn và kiến thức còn hạn chế, nên một số nội dung như
Nessus Engine, nhóm sẽ không đi sâu vào nghiên cứu.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 8
CHƢƠNG 1. TỔNG QUAN VỀ NESSUS
1.1 LỊCH SỬ HÌNH THÀNH VÀ PHÁT TRIỂN CỦA NESSUS
Ban đầu, Nessus là một dựa án nguồn mở “Nessus Project”, được đề xuất bởi
Renaud Deraison vào năm 1998, mã nguồn của các thành phần đều được công bố
công khai (các phiên bản Nessus 2 trở về trước). Từ tháng 10 năm 2005, Tenable
Network Security, một công ty do Renaud Deraison đồng sáng lập, đã phát hành
Nessus 3 dưới dạng mã nguồn đóng. Tháng 8 năm 2008, hãng Tenable đưa ra
phiên bản cho phép người dùng cá nhân được sử dụng đầy đủ các plugin. Tháng 4
năm 2009, hãng phát hành Nessus 4.0.0, đến tháng 2 năm 2012 phát hành Nessus
5.0.
Nessus có thể chạy trên nhiều nền tảng hệ điều hành khác nhau, bao gồm cả
UNIX, Linux, Mac OS X, Windows. Hiện tại phiên bản Nessus 5.0 chạy trên giao
diện web, do đó có thể dễ dàng truy cập, sử dụng trên mọi hệ điều hành.
1.2 CÁC THÀNH PHẦN CỦA NESSUS
Nessus có các thành phần chính:
- Nessus Engine: nhận, thực thi và trả lời lại các yêu cầu quét của người
dùng. Việc quét các lỗ hổng được thực hiện theo các chỉ dẫn của các plugin
(một tập các câu lệnh script của ngôn ngữ kịch bản NASL).
- Nessus Plugin: hệ thống file của ngôn ngữ kịch bản NASL, gồm các file
định nghĩa .inc và file kịch bản .nasl.
- Nessus Server (nessusd): thực hiện nhận các yêu cầu quét của người dùng,
sau đó phân tích, tổng hợp, trả lại kết quả cho Nessus client.
- Nessus Client: hiển thị kết quả quét lại cho người dùng thông qua trình
duyệt web.
- Nessus Knowledge Base: “Cơ sở dữ liệu đã biết” của Nessus cho phép các
plugin sau tận dụng dữ liệu kết quả của Plugin trước đó. Điều này giúp
Nessus dễ dàng mở rộng và tăng tốc độ thực thi.
1.2.1 Kiến trúc của Nessus với mô hình Client-Server
Ban đầu, Server sẽ tổng hợp tất cả các lỗi bảo mật hiện nay. Khi một máy tính
Client yều cầu được kiểm tra các lỗi có tồn tại trên máy tính của mình hay không,
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 9
đầu tiên chúng phải được kiểm tra xem có kết nối tới server hay không, sau khi đã
kiểm tra kết nối chúng sẽ được quét tùy thuộc vào các mức độ yêu cầu khi quét.
Mô hình này sẽ dựa vào kết quả sau khi máy Client yêu cầu kiểm tra, và dựa
vào những lỗi đã được xác định có thể đưa ra những những hướng giải quyết một
cách nhanh nhất.
Database
Nessus ServerFirewall
Internet
Clents User và
thiết bị yêu cầu
kiểm tra
Hình 1.1 Mô hình kiến trúc Nessus dạng Client-Server.
1.2.2 Mô hình Nessus Knowledge Base
Mô hình Nessus Knowledge Base là gì?
- Mô hình này khá đơn giản nó thu thập danh sách các lỗi bảo mật khác đang
được thử nghiệm. Nó cho phép bổ sung, hoặc chia sẻ những thông tin về hệ
thống đang được kiểm tra.
Phương thức hoạt động của Nessus Knowledge Base:
Giả sử chúng ta thực hiện quét kiểm tra lỗi bảo mật trên trang Server
at5akma.com, quá trình kiểm tra hoàn tất và không thấy một lỗi bảo mật nào có
trên đó. Lúc này Nessus Knowledge Base được tạo ra cho máy chủ này
(/usr/local/var/nessus/users/mh/ kbs/at5a.com) cho thấy khoảng 1800 lỗi, Người ta
phải nhớ rằng Nessus Knowledge Base cũng chỉ có khoảng 1725 lỗi đã được
trusted. Và những thông số đó được sử dụng cho những nghiên cứu sau này để
đảm bảo rằng liên tục cập nhật những lỗi bảo mật mới nhất.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 10
1.2.3 Mô hình Nessus Plugin
Nessus Plugin là gì?
- Là một chương trình dùng để kiểm tra tính bảo mật của một trang web từ xa,
máy tính cục bộ hay những thiết bị bảo vệ thông tin...
Hoạt động của Nessus Plugin:
Mô hình hoạt động của Nessus Plugin khá đơn giản, ta có thể dùng gia diện
hoặc dùng command line để quét. Bằng việc sử dụng Plugin đã có sẵn sau khi cài
để kiểm tra tính bảo mật.
request
result
request
result
Kiểm qua 1 trang web
qua mạng
Nessus PluginWeb Server
Hình 1.2 Mô hình hoạt động của Nessus Plugin.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 11
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 12
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 13
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 14
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 <[email protected]> #
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 15
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 16
[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 17
[repeat_loop]repeat instr until expr ;
[foreach_loop]foreach identifier ( array ) instr
[array]expr
[aff_func]aff
post_pre_incr
func_call
/*nothing */
[rep]func_call x expr
[string]STRING1 STRING2
[inc]include ( string )
[func_call]identifier ( arg_list )
[arg_list]arg_list_1
/*nothing*/
[arg_list_1]arg
arg , arg_list_1
[arg]expr
identifier : expr
[aff]lvalue = expr
lvalue += expr
lvalue -= expr
lvalue *= expr
lvalue /= expr
lvalue %= expr
lvalue >>= expr
lvalue >>>= expr
lvalue <<= expr
[lvalue]identifier
array_elem
[identifier]IDENTIFIER
x
[array_elem]identifier [ array_index ]
[array_index]expr
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 18
[post_pre_incr]++ lvalue
- lvalue
lvalue ++
lvalue -
[expr]( expr )
logic_expr
arith_expr
bit_expr
post_pre_incr
compar INTEGER STRING2 STRING1
var
aff
cst_array
ipaddr
[logic_expr]expr and expr
! expr
expr or expr
[arith_expr]expr + expr
expr - expr
- expr
expr * expr
expr / expr
expr % expr
expr ** expr
[bit_expr]~ expr
expr & expr
expr ^ expr
expr | expr
expr >> expr
expr >>> expr
expr <<expr
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 19
[compar]expr >< expr
expr >!< expr
expr =~ string
expr !~ string
expr < expr
expr > expr
expr == expr
expr != expr
expr >= expr
expr <= expr
[var]identifier
num_arg
array_elem
func_call
[ipaddr]INTEGER . INTEGER . INTEGER . INTEGER
[num_arg]$INTEGER
$*
[cst_array][ l_array ]
[l_array]array_data
array_data , l_array
[array_data]atom
string => atom
[atom]integer
string
[loc]local_var arg_decl
[glob]global_var arg_decl
[INTEGER] số nguyên - là một chuối số thập phân, hoặc bắt đầu bằng 0 cho hệ
cơ số 8, hoặc 0x cho hệ cơ số 16.
[IDENTIFIER] định danh - là một chuỗi ký tự (chữ hoa, chữ thường, số, dấu
gạch dưới).
[STRING1] là một chuỗi ký tự giữa 2 dấu nháy đơn.
[STRING2] là một chuỗi ký tự giữa 2 dấu nháy kép.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 20
2.2.3 Kiểu dữ liệu
NASL2 có các kiểu dữ liệu sau:
1. Kiểu số nguyên: mọi chuỗi bao gồm các chữ số, có thể có thêm dấu ở đầu
(+,-) để phân biệt số dương, số âm. NASL2 sử dụng cú pháp của C, hệ cơ số
8 bắt đầu bằng 0 và hệ 16 bắt đầu bằng 0x, ví dụ: 0x10 = 020 = 16
2. Kiểu chuỗi: có 2 dạng chuỗi, chuỗi không thể chuyển đổi và chuỗi có thể
chuyển đổi.
a) Chuỗi không thể chuyển đổi: là chuỗi được nhập vào giữa 2 dấu nháy
kép, ví dụ “abcde”, khi đó mọi ký tự của chuỗi đều được giữa nguyên,
dấu gạch chéo ngược vẫn giữ nguyên là dấu gạch chéo ngược. Có thể
chuyển sang chuỗi có thể chuyển đổi bằng các hàm xử lý chuỗi.
b) Chuỗi có thể chuyển đổi: là chuỗi được nhập vào giữa 2 dấu nháy
đơn, ví dụ „abcd\n‟, khi đó một vài ký tự của chuỗi sẽ được tự động
chuyển đổi.
3. Mảng: Hỗ trợ mảng một chiều, phần tử đầu tiên được đánh thứ tự là [0], có
thể dùng mảng để chứa dữ liệu kiểu số nguyên hoặc kiểu chuỗi.
4. Kiểu NULL: được gán cho các biến chưa khởi tạo giá trị.
5. Kiểu Boolean (kiểu lôgic): cho giá trị 0 – FALSE, 1- TRUE. Một vài giá trị
được tự động gán:
Giá trị không được định nghĩa hoặc Null là FALSE.
Số nguyên là TRUE nếu không rỗng, 0 là FALSE.
Chuỗi là TRUE nếu không rỗng và khác “0”.
Mảng luôn mang giá trị TRUE, cho dù có rỗng hay không.
2.2.4 Các toán tử
2.2.4.1 Các toán tử thông thường
= dùng để gán giá trị. Ví dụ:
- x = 42; gán giá trị 42 vào biến x
- x = y; gán giá trị y cho x
[] dùng đánh chỉ số mảng
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 21
- Một biến không thể vừa mang giá trị kiểu “nguyên tử” (như integer,
string, null) vừa mang giá trị kiểu mảng ở cùng một thời điểm. Nếu ta
chuyển đổi kiểu, giá trị trước đó sẽ bị mất.
- Có thể dùng để tách giá trị của một chuỗi. Ví dụ:
s = “abcde” , khi đó s[2] = “c”
- y[1]=42; tạo một mảng y, và gán giá trị 42 cho phần tử thứ hai của
mảng. Nếu y không phải là một mảng, đó là giá trị đàu tiên không
được định nghĩa.
2.2.4.2 Các phép toán số học
NASL2 không có quy định chặt chẽ về kiểu số nguyên. Trình thông dịch cài đặt
với kiểu “int” nguyên mẫu của C, là kiểu 32 bit trên hầu hết các hệ thống, hoặc 64
bit trên một số hệ thống khác. Không có cơ chế bảo vệ chống tràn số.
+ phép cộng 2 số nguyên.
- phép trừ 2 số nguyên.
* phép nhân 2 số nguyên.
/ phép chia lấy phần nguyên. Chú ý rằng NASL2 không có kiểu số thực.
Phép chia cho 0 sẽ trả lại 0 hoặc gây lỗi trình thông dịch.
% phép chia lấy phần dư.
** phép mũ, lũy thừa.
2.2.4.3 Các toán tử tựa C
NASL2 cài đặt một số phép toán giống C.
++ phép tăng giá trị biến lên 1 đơn vị, ví dụ: (++x) hoặc (x++) .Ý nghĩa
tương tự như trong C.
- giảm giá trị biến đi 1 đơn vị, ví dụ: (-x) hoặc (x-). Trong C phép toán này
là (--x) hoặc (x--).
+= -= *= %= có ý nghĩa tương tự như trong C.
<<= và >>= , có thêm >>>=
2.2.4.4 Toán tử xử lý chuỗi
+ phép cộng chuỗi, tuy nhiên nên sử dụng với các hàm xử lý chuỗi.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 22
- phép trừ chuỗi, nó loại bỏ các chuỗi đầu tiên mà nó tìm thấy trong chuỗi
cần trừ. Ví dụ: ‘abcd’ – ‘bc’ sẽ được ‘ad’.
[] dùng tách ký tự từ chuỗi. Ví dụ s = ‘abcde’, khi đó s[2] = ‘c’.
>< so sánh chuỗi trùng khớp, nếu một trong 2 chuỗi có chứa chuỗi còn lại sẽ
cho kết quả là TRUE, ngược lại là FALSE.
„abcde‟ >< „bc‟ là TRUE, „abcde‟ >< „xxxx‟ là FALSE
>!< so sánh chuỗi không trùng khớp, nó sẽ trả về kết quả TRUE nếu chuỗi
này không chứa chuỗi kia, ngược lại là FALSE.
„abcde‟ >!< „xxxx‟ là TRUE, „abcde‟ >!< „bc‟ là FALSE.
=~ (regex match) tương tự như khi gọi hàm trong ereg nhưng nhanh hơn, bởi
vì kiểu diễn đạt thông thường được biên dịch một lần khi script được phân
tích.
s =~ “[ab]*x+” tương đương với ereg(string:s, pattern:"[ab]*x+",
icase:1)
!~ (regex don‟t match) tương tự như trên.
2.2.4.5 Toán tử so sánh
== mang giá trị TRUE nếu 2 giá trị so sánh bằng nhau, ngược lại là FALSE.
!= mang giá trị TRUE nếu 2 giá trị so sánh khác nhau, ngược lại là FALSE.
> so sánh lơn hơn.
>= so sánh lớn hơn hoặc bằng.
< so sánh nhỏ hơn.
<= so sánh nhỏ hơn hoặc bằng.
2.2.4.6 Toán tử lôgic
! phép “not” lôgic. Ví dụ: !x=TRUE, nếu x=FALSE.
&& phép “and” lôgic.
|| phép “or” lôgic.
2.2.4.7 Phép toán xử lý bit
~ phép “not” bit. Ví dụ: ~0=1, ~1=0
& phép “and” bit. Ví dụ: 1 &1 =1, 1 & 0 =0.
| phép “or” bit.
^ phép “xor” bit.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 23
<< phép dịch trái bit.
>> phép dịch phải bit.
>>> phép chuyển bit dấu sang phải, thay bằng 0.
2.2.4.8 Các phép xử lý đặc biệt
break có thể (nhưng không nên sử dụng) dùng để thoát khỏi hàm trong
script.
Nếu các đối số khác kiểu, phép + sẽ tiến hành chuyển đổi kiểu tự động.
- Với chuỗi có thể chuyển đổi:
“AB\n” + „de‟ sẽ được „AB\\nde‟ (trong đó “AB\n” là chuỗi không
chuyển đổi, „de‟ là chuỗi có thể chuyển đổi).
- Nếu một trong 2 đối số là kiểu chuỗi không chuyển đổi, đối số còn lại
sẽ được tự động chuyển thành kiểu chuỗi không chuyển đổi:
“ABC” + 2 sẽ được “ABC2”.
- Nếu một trong các đối số là kiểu nguyên, đối số còn lại sẽ được
chuyển sang kiểu nguyên, kết quả cuối cùng là kiểu nguyên.
- Trong các trường hợp khác, giá trị NULL được trả về.
Phép trừ có cùng kiểu chuyển đổi như đối với phép cộng.
Không nên sử dụng các biến chưa được khởi tạo. Tuy nhiên để các script cũ
có thể hoạt động, giá trị NULL được định nghĩa thành 0 hoặc “” (kiểu
integer hoặc chuỗi). Đó là lý do tại sao ta nên sử dụng isnull để kiểm tra
xem biến đã được định nghĩa và khởi tạo hay chưa.
2.2.5 Độ ƣu tiên các phép toán
Độ ưu tiên từ cao xuống thấp:
Bảng 2.1 Độ ưu tiên của các phép toán.
STT Phép toán Trình tự kết hợp
1. ++ -- Không
2. ** Phải qua trái
3. ~ - Trái qua phải
4. ! Trái qua phải
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 24
5. * / % Trái qua phải
6. + - Trái qua phải
7. << >> >>> Trái qua phải
8. & Trái qua phải
9. ^ Trái qua phải
10. | Trái qua phải
11. < <= > >= == != <> =~ !~
>!< ><
Không
12. && Trái qua phải
13. || Trái qua phải
14. = += -= *= /= %= <<= >>=
>>>=
Phải qua trái
2.2.6 Vòng lặp và các câu lệnh điều khiển
for (expr1; cond; expr2) block;tương tự như trong C, tương đương
với expr1; while(condition) block; expr2;
Ví dụ in các giá trị từ 1 đến 10:
for(i=1;i<=10;i++) display(i,'{\n');
foreach var (array) block;lặp với tất cả các phần tử trong mảng. Chú ý
biến vòng lặp var có giá trị được lưu trữ trong mảng, không phải chỉ số của
mảng. Nếu ta muốn dùng chỉ số, dùng lệnh: foreach var (keys(array))
block;
while(cond) block; thực hiện khối lệnh khi điều kiện kiểm tra là TRUE,
dừng việc thực hiện nếu điều kiện kiểm tra là FALSE.
repeat block; until (cond); thực hiện khối lệnh cho đến khi điều kiện
kiểm tra là TRUE. Khối lệnh được thực hiện ít nhất một lần (khác với while,
có thể khối lệnh chưa được thực hiện lần nào).
break dùng để thoát khỏi vòng lặp hiện tại, nếu ta không ở trong vòng lặp,
kết quả là không xác định.
continue bỏ qua điều kiện kiểm tra, nhảy đến vòng lặp tiếp theo. Nếu
không ở trong vòng lặp, kết quả là không xác định.
return trả về kết quả của hàm hiện tại.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 25
2.2.7 Khai báo biến, hàm
2.2.7.1 Khai báo biến
NASL1 chỉ có biến toàn cục. NASL2 sử dụng biến toàn cục và biến cục bộ. Biến
cục bộ được tạo bên trong hàm, và được giải phóng khi hàm trả về kết quả. Khi
trình thông dịch kiểm tra biến nào đó, nó sẽ kiểm tra trong hàm hiện tại trước, sau
đó kiểm tra các hàm bao trùm bên ngoài khác, cho tới khi đến hàm chứa biến toàn
cục.
Thông thường ta không cần phải khai báo biến: hoặc là do nó đã tồn tại,
hoặc ta đã sử dụng nó trong hàm hiện tại, hoặc nó đang được gọi bởi một hàm
khác. Tuy nhiên, điều này trở nên nguy hiểm trong một vài trường hợp:
Nếu bạn muốn thay đổi tới biến cục bộ từ bên trong một hàm mà không thể
chắc chắn biến được tạo ở hàm ngoài cùng, hoặc được tạo như biến cục bộ
trong hàm gọi đến.
Nếu bạn muốn chắc chắc rằng mình đang tạo một biến cục bộ mà không ghi
đè lên biến toàn cục trùng tên.
Để thực hiện, ta có thể khai báo biến như sau:
local_var var;
global_var var;
Nếu biến đã tồn tại trong hàm chỉ định, ta sẽ nhận được thông điệp báo lỗi, nhưng
nó vẫn hoạt động được.
2.2.7.2 Khai báo hàm
function_name (argname1, argname2) block;
Chú ý danh sách đối số có thể trống, nhưng phải có tên hàm. Các đối số có thể
dùng trực tiếp mà không cần phải khai báo.
2.2.7.3 Lấy đối số của hàm
Trong một hàm NASL, các đối số được định tên, có thể truy cập bởi mọi biến cục
bộ. Các đối số không được định tên, được cài đặt thông qua mảng đặc biệt
_FCT_ANON_ARGS. Những biến này sẽ mang giá trị NULL với các trình thông
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 26
dịch dưới NASL_LEVEL 2190. Ta nên khai báo ở đầu script nếu cần dùng hàm
này:
if (NASL_LEVEL < 2190) exit(0); # _FCT_ANON_ARGS is not implemented
1. Thiết lập tới giá trị _FCT_ANON_ARGS chưa được định nghĩa. Lúc này,
bộ nhớ bị lãng phí, mà không thể đọc lại giá trị.
2. Sử dụng _FCT_ANON_ARGS để đọc các đối số được định tên cũng không
tốt. Lúc này, có sự bảo vệ, giá trị NULL được trả lại.
2.2.7.4 Gọi hàm
Sau đây là ví dụ về hàm có đối số được định tên:
function fact(x) # x đóng vai trò làm đối số
{
local_var i, f;
f = 1;
for (i = 1; i <= n; i ++) f *= i;
return f;
}
display("3 ! = ", fact(x: 3), "\n");
Ví dụ về hàm có đối số không được định tên:
function fact() #hàm không có đối số
{
local_var i, f;
f = 1;
for (i = 1; i <= _FCT_ANON_ARGS[0]; i ++) f *= i;
return f;
}
display("3 ! = ", fact(3), "\n");
Ví dụ khác, trộn 2 kiểu:
function fact(prompt)
{
local_var i, f;
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 27
f = 1;
for (i = 1; i <= _FCT_ANON_ARGS[0]; i ++)
{
f *= i;
display(prompt, i, '! = ', f, '\n');
}
return f;
}
n = fact(3, prompt: '> ');
2.3 THƯ VIỆN NASL2
2.3.1 Các hằng số đƣợc định nghĩa từ trƣớc
Hằng thực ra là các biến, ta có thể chỉnh sửa lại giá trị trong script. Sau đây là một
số hằng được định nghĩa trước:
Hằng lôgic
o FALSE=0
o TRUE=1
Các loại plugin
o ACT_INIT: plugin chỉ thiết lập vài KB các mục (các loại biến toàn
cục cho tất cả các plugin).
o ACT_SCANNER: plugin này làm nhiệm vụ quét cổng hoặc một vài
tác vụ tương tự (như ping).
o ACT_SETTINGS: giống ACT_INIT nhưng chạy sau khi bộ quét
thực hiện, khi chúng ta chắc chắn rằng máy host vẫn đang hoạt động.
o ACT_GATHER_INFO: plugin định danh dịch vụ, thu thập dữ liệu,
xử lý banner, v.v…
o ACT_ATTACK: plugin khởi động phần mềm tấn công, ví dụ phần
mềm quét các thư mục web.
o ACT_MIXED_ATTACK: plugin khởi động tấn công mà có thể gây
ra các tác dụng nguy hiểm khác (gây ra hỏng hầu hết các dịch vụ thời
gian).
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 28
o ACT_DESTRUCTIVE_ATTACK: plugin cố gắng tiêu hủy dữ liệu
hoặc khởi động tấn công nguy hiểm (ví dụ việc kiểm tra lỗi tràn bộ
đệm có thể gây ra hỏng hóc với các dịch vụ dễ bị tổn thương).
o ACT_DENIAL: plugin cố gắng gây ra hỏng hóc dịch vụ.
o ACT_KILL_HOST: plugin cố gắng gây ra hỏng hóc cho máy đích,
hoặc vô hiệu một vài dịch vụ quan trọng.
o ACT_FLOOD: plugin cố gắng gây ra hỏng hóc cho máy đích, hoặc
vô hiệu hóa bằng cách gây ngập lụt với các gói tin hoặc request không
xác định. Nó có thể ảnh hưởng tới mạng, gây hỏng hóc cho thiết bị
định tuyến, chuyển mạch hoặc lọc gói trên đường đi.
Hằng Network
o Nessus “encapsulation” (đóng gói)
ENCAPS_IP = 1; đây là giá trị “transport” cho TCP socket.
ENCAPS_SSLv23 = 2; đây là giá trị “transport” cho kết nối
SSL trong chế độ tương thích. Chú ý plugin find_service sẽ
không bao giờ khai báo cổng với loại đóng gói này, tuy nhiên ta
vẫn có thể dùng nó trong script.
ENCAPS_SSLv2 = 3; phiên bản SSL cũ chỉ hỗ trợ chứng chỉ
phía máy chủ.
ENCAPS_SSLv3 = 4; phiên bản SSL mới, hỗ trợ chứng chỉ
phía máy chủ và máy client, hỗ trợ nhiều phương pháp mã hóa.
ENCAPS_TLSv1 = 5; TLSv1 được định nghĩa trong RFC
2246, đôi khi người ta gọi nó là “SSL v3.1”.
o Sockets options
MSG_OOB; tùy chọn socket, dùng gửi dữ liệu.
o Raw sockets
IPPROTO_ICMP; được định nghĩa như trong file header của
C.
IPPROTO_IGMP
IPPROTO_IP
IPPROTO_TCP
IPPROTO_UDP
pcap_timeout = 5
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 29
TH_ACK = 0x10; Cờ TCP xác định gói tin hợp lệ.
TH_FIN = 0x01; Cờ TCP xác định gói tin báo kết thúc phiên
kết nối.
TH_PUSH = 0x08
TH_RST = 0x04; Cờ TCP xác định kết nối bị từ chối hoặc
reset lại.
TH_SYN = 0x02; Khởi tạo quá trình bắt tay 3 bước.
TH_URG = 0x20; Cờ TCP xác định gói tin chứa dữ liệu quan
trọng.
Các hằng khác
o NULL giá trị không được định nghĩa.
Nessusd glue
o Description được thiết lập thành 1 khi nessusd phân tích script lần
đầu (lấy tên, chỉ dẫn, tóm tắt, v.v…), thành 0 khi nó chạy.
o COMMAND_LINE được thiết lập thành 0 khi script được chạy bởi
nessusd hoặc thành 1 khi nó chạy bởi trình thông dịch nasl.
2.3.2 Các hàm tích hợp sẵn
Các hàm được tích hợp sẵn bao gồm hàm có đối số và hàm không có đối số. Một
vài hàm kết hợp cả hai.
2.3.2.1 Các hàm cơ bản (Knowledge base functions)
Các hàm này được dùng cho các plugin tương tác.
set_kb_item tạo danh mục mới trong KB (Knowledge base).
Nó nhận 2 chuỗi đối số: tên và giá trị.
Thực hiện khoản mục vài lần tạo ra một danh sách.
get_kb_item nhận khoản mục từ KB.
Nó nhận đối số không được định tên (tên của khoản mục KB).
Nếu khoản mục là một danh sách, plugin sẽ chia nhỏ cho các tiến trình con,
và sử dụng giá trị khác. Nessus sẽ ghi nhớ tiến trình con nhận giá trị nào:
đọc một khoản mục trùng tên, nó sẽ không chia nhỏ lần nữa.
Ta không nên sử dụng hàm này khi có vài kết nối đang mở, tránh diễn ra
tình trạng có nhiều tiến trình cùng cố gắng đọc ghi vào cùng một socket.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 30
get_kb_list nhận nhiều khoản mục từ KB. Nó nhận đối số không được định
danh, có thể tên danh mục KB hoặc mặt nạ. Giá trị trả về là một kết quả tóm
lược, ví dụ một mảng với khả năng có 2 chỉ số, vì vậy ta cần chuyển đổi nó
với make_list() hoặc sử dụng foreach để truy cập mỗi phần tử (hàm
make_array cho phép tạo ra những bảng băm như vậy).
Ví dụ sử dụng hàm get_kb_list:
# Retrieves the list of all the web servers
webservers = get_kb_list("Services/www");
# Retrieves the list of all the services
services = get_kb_list("Services/*");
# Retrieves the whole KB
services = get_kb_list("*");
replace_kb_item thêm khoản mục mới vào trong KB hoặc thay thế giá trị
cũ.
Nó nhận 2 đối số được định danh: tên và giá trị.
Thực hiện khoản mục một vài lần không tạo ra danh sách, nó chỉ ghi đè giá
trị cũ.
Hàm này không được định nghĩa lại trong mọi phiên bản của Nessus, để an
toàn ta cần kiểm tra giá trị đã được định nghĩa trước đó bằng cách gọi đến
hàm này hoặc sử dụng hàm replace_or_set_kb_item của NASL.
2.3.2.2 Các hàm báo cáo
Những hàm này gửi lại thông tin cho Nessus deamon.
scanner_status báo cáo quá trình quét cổng (nếu plugin là plugin quét
cổng). Nó nhận 2 đối số nguyên:
o current, số cổng đang quét.
o total, tổng số cổng cần quét.
security_note gửi kết quả các thông tin khác.
Nó nhận đối số là một số nguyên (số hiệu cổng), hoặc vài đối số được định
danh khác:
o data là dữ liệu báo cáo dạng text.
o port là số hiệu cổng TCP hoặc UDP của dịch vụ
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 31
o proto (hoặc protocol) tên giao thức (mặc định là “tcp”, giá trị khác là
“udp”).
security_hole báo cáo về các lỗ hổng nghiêm trọng.
Nó có thể nhận một đối số không được định danh là một số nguyên (số hiệu
cổng), hoặc một vài đối số được định danh khác:
o data là dữ liệu báo cáo dạng text.
o port là số hiệu cổng TCP hoặc UDP của dịch vụ
o proto (hoặc protocol) tên giao thức (mặc định là “tcp”, giá trị khác là
“udp”).
security_warning báo cáo về các lỗ hổng nhẹ.
o Nó có thể nhận một đối số không được định danh là một số nguyên
(số hiệu cổng), hoặc một vài đối số được định danh khác:
o data là dữ liệu báo cáo dạng text.
o port là số hiệu cổng TCP hoặc UDP của dịch vụ
o proto (hoặc protocol) tên giao thức (mặc định là “tcp”, giá trị khác là
“udp”).
2.3.2.3 Các hàm chỉ dẫn
Với tất cả các hàm, ngoại trừ hàm script_get_preference chỉ được sử dụng trong
phần chỉ dẫn của plugin, ví dụ một khối lệnh được chạy khi biến description mang
giá trị 1. Nó chỉ có ý nghĩa trong môi trường Nessus, không có tác dụng khi plugin
chỉ chạy với trình thông dịch nasl.
script_add_preference thêm các lựa chọn vào plugin. Nó nhận 3 đối số
được định danh:
o name là tên tùy chọn
o type kiểu tùy chọn, có thể là:
checkbox
entry
password
radio
o value là giá trị mặc định (yes hoặc no cho hộp chọn checkbox, chuỗi
ký tự cho khoản mục hoặc mật khẩu). Ví dụ:
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 32
script_add_preference (name:"Reverse traversal", type:"radio", value:"none; Basic; Long URL");
script_bugtraq_id nó nhận một hoặc nhiều đối số nguyên không được định
danh.
script_category thiết lập loại plugin.
Thông thường nó nhận đối số nguyên không được định danh là một trong
các hằng được định nghĩa trước (ACT_xxx):
o ACT_INIT
o ACT_SCANNER
o ACT_SETTINGS
o ACT_GATHER_INFO
o ACT_ATTACK
o ACT_MIXED_ATTACK
o ACT_DESTRUCTIVE_ATTACK
o ACT_DENIAL
o ACT_KILL_HOST
script_copyright thiết lập chuỗi bản quyền của plugin (thường là tên tác
giả).
Nó nhận đối số kiểu chuỗi bất kỳ, hoặc một vài chuỗi được định danh khác:
english, francais, deutsch, portuguese.
script_cve_id thiết lập CVE IDs cho các lỗ hổng kiểm tra bởi script.
Nó có thể nhận bất kỳ đối số là số hoặc chuỗi không định danh. Nó thường
có dạng như “CVE-2002-042” hoặc “CAN-2003-666”.
script_dependencie thiết lập danh sách script cần chạy trước khi chạy script
này. Nó có thể nhận bất kỳ đối số là số hoặc chuỗi không định danh.
script_dependencies có ý nghĩa giống như script_dependencie.
script_description thiết lập chỉ dẫn của plugin.
Nó nhận chuỗi bất kỳ làm đối số, hoặc một trong các chuỗi được xác định
trước: english, francais, deutsch, portuguese. Giá trị mặc định là english.
script_exclude_keys thiết lập danh sách “KB item” không được chạy ở
script này trong chế độ tối ưu hóa.
script_family thiết lập các plugin cùng họ.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 33
script_get_preference đọc các tùy chọn. Nó nhận chuỗi bất kỳ làm đối số.
Nó có thể trả về kết quả là chuỗi rỗng, nếu ta chỉ chạy script với trình thông
dịch nasl.
script_get_preference_file_content đọc các tùy chọn về file. Nó nhận
chuỗi bất kỳ làm đối số, kết quả trả về là nội dung file đã được chuyển từ
máy trạm Nessus tới máy chủ.
Chú ý: script script_get_preference_file_content và
script_get_preference_file_location được giới hạn chỉ chạy với các
plugin tin cậy.
script_get_preference_file_location nó chỉ có tác dụng nếu kiểu xử lý là
kiểu file. Nó sẽ trả về đường dẫn của file copy. Hàm script_get_preference
sẽ luôn trả về đường dẫn của file trên máy trạm, điều này cũng không thực
sự cần thiết.
script_id thiết lập số nguyên để định danh script.
script_name thiết lập tên của plugin.
script_require_keys thiết lập danh sách trong “KB item” cần phải chạy khi
chạy script này ở chế độ tối ưu.
script_require_ports thiết lập danh sách các cổng TCP cần mở khi chạy
script này ở chế độ tối ưu.
script_require_udp_ports thiết lập danh sách cổng UDP cần mở khi chạy
script này ở chế độ tối ưu.
script_summary thiết lập chỉ dẫn tóm tắt của plugin.
script_timeout thiết lập thời gian thoát của plugin. Nó nhận số nguyên bất
kỳ làm đối số. Nếu giá trị này được thiết lập thành 0 hoặc -1, thời gian
timeout bằng vô cùng.
script_version thiết lập phiên bản của plugin. Nó nhận chuỗi bất kỳ làm đối
số.
2.3.2.4 Các hàm gắn kết
get_preference nhận chuỗi bất kỳ làm đối số, và trả lại giá trị được ưu tiên.
Hàm này cần thiết khi cần nhận vài tùy chọn từ server. Ví dụ:
p = get_preference('port_range'); # returns something like 1-65535
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 34
2.3.2.5 Các hàm về mạng
Chú ý kiểu dữ liệu socket được sử dụng trong các hàm này thực ra là số nguyên.
Trong trường hợp có lỗi, tất cả các hàm trả về một giá trị có thể thông dịch là
FALSE.
close đóng socket.
end_denial không cần đối số, trả về TRUE nếu máy host vẫn đang hoạt
động (alive), FALSE nếu nó chết. Ta cần gọi hàm start_denial trước khi
kiểm tra.
ftp_get_pasv_port gửi câu lệnh “PASV” tới socket đang mở. Phân tích dữ
liệu nhận được, trả lại số hiệu cổng thụ động đã chọn. Nó nhận một đối số
định danh: socket.
get_host_name không cần đối số, trả lại tên máy host đang quét.
get_host_ip không cần đối số, trả lại địa chỉ IP máy đích.
get_host_open_port không cần đối số, trả lại tên số hiệu các cổng TCP
đang mở trên máy đích.
get_port_transport nhận số nguyên bất kỳ (socket) làm đối số, trả lại giá trị
đóng gói (encapsulation).
get_port_state nhận số nguyên bất kỳ (số hiệu cổng TCP), trả lại TRUE nếu
cổng đó đang mở, FALSE ngược lại.
Một vài cổng TCP sẽ không biết được trạng thái, do không thể quét được.
Cách ứng xử của hàm này có thể chỉnh sửa lại, coi các cổng không quét
được như đã đóng, với tùy chọn toàn cục. Khi tùy chọn này được thiết lập lại
(default), hàm sẽ trả về giá trị TRUE với các cổng không biết trạng thái,
FALSE khi ta đặt thiết lập như trên.
get_source_port nhận số nguyên bất kỳ làm đối số (TCP socket), trả lại số
hiệu cổng nguồn (ví dụ cổng server Nessus).
get_tcp_port_state tương tự như get_port_state.
get_udp_port_state trả lại giá trị TRUE nếu cổng UDP đang mở, FALSE
ngược lại. Chú ý việc quét cổng UDP có thể không đáng tin cậy.
islocalhost không cần đối số, trả lại TRUE nếu máy đích là chính máy local,
ngược lại FALSE.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 35
islocalnet không cần đối số, trả lại TRUE nếu máy đích cùng mạng với máy
local, ngược lại FALSE.
join_multicast_group nhận chuỗi làm đối số (địa chỉ IP multicast), trả lại
TRUE nếu có thể tham gia vào cùng nhóm địa chỉ multicast, nếu đã ở sẵn
trong nhóm, hàm tăng biến đếm số lần tham gia.
leave_multicast_group nhận chuỗi làm đối số (địa chỉ IP multicast). Nếu
hàm join_multicast_group được gọi vài lần, mỗi lần gọi hàm
leave_multicast_group nó sẽ giảm biến đếm, thoát khỏi nhóm khi biến
đếm bằng 0.
open_priv_sock_tcp mở socket TCP đặc quyền tới máy đích. Nó nhận 2 đối
số nguyên:
o dport là cổng máy đích.
o sport là cổng nguồn, thường nhỏ hơn 1024.
open_priv_sock_udp mở socket UDP đặc quyền tới máy đích. Nó nhận 2
đối số nguyên:
o dport là cổng máy đích.
o sport là cổng nguồn, thường nhỏ hơn 1024.
open_sock_tcp mở socket TCP tới máy đích. Nó nhận đối số nguyên bất kỳ
(số hiệu cổng) và 2 đối số nguyên bổ sung:
o bufsz nếu muốn tùy chỉnh kích cỡ bộ đệm In/Output (mặc định bị vô
hiệu hóa). Tham số này được thêm vào từ sau phiên bản Nessus
2.0.10.
o timeout, nếu muốn thay đổi giá trị timeout mặc định.
o transport, yêu cầu Nessus chuyển sang chế độ “transport” chỉ định.
Các giá trị có thể là:
ENCAPS_IP
ENCAPS_SSLv23
ENCAPS_SSLv2
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 36
ENCAPS_SSLv3
ENCAPS_TLSv1
open_sock_udp mở socket UDP tới máy đích. Nó nhận đối số nguyên bất
kỳ (số hiệu cổng).
recv nhận dữ liệu từ socket TCP hoặc UDP. Với socket UDP, nếu không thể
đọc dữ liệu, NASL sẽ giả sử rằng datagram gửi cuối cùng bị mất, nó sẽ gửi
lại sau một khoảng thời gian. Nó nhận ít nhất 2 đối số trong các đối số sau:
o socket được trả về bởi hàm như open_sock_tcp
o length số byte mà ta muốn nhận.
o min là lượng dữ liệu nhỏ nhất phải đọc được, mặc định là 0.
o timeout có thể thay đổi khác với giá trị default.
recv_line nhận dữ liệu từ socket, và dừng ngay khi nhận được ký hiệu
xuống dòng. Độ dài byte dữ liệu và thời gian timeout cần phải định trước.
send gửi dữ liệu tới socket. Các đối số là:
o socket
o data khối dữ liệu, bắt buộc phải kiểu chuỗi (nằm giữa hai dấu nháy
đơn hoặc nháy kép).
o length tùy chọn độ dài dữ liệu cần gửi, nếu không thiết lập, nó sẽ gửi
toàn bộ.
o option cờ khi gọi hàm send(), không nên sử dụng kiểu số, tốt nhất nên
dùng hằng MSG_OOB.
scanner_add_port khai báo mở cổng với tiến trình chủ nessusd. Nó nhận 2
đối số được định danh, và không có dữ liệu trả về:
port là số hiệu cổng.
proto là “tcp” hoặc “udp”.
scanner_get_port nhận danh sách cổng đang mở bởi nessusd. Nó nhận một
đối số nguyên, một chỉ số, trả lại số hiệu cổng hoặc giá trị 0 khi kết thúc
danh sách. Ví dụ:
i = 0;
while (port = scanner_get_port(i++))
{
do_something_with_port;
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 37
}
tcp_ping thực hiện lệnh ping TCP đến máy đích, ví dụ nó thử mở một kết
nối TCP và xem có bất cứ thứ gì phản hồi lại (gói SYNACK hoặc RST).
Nhận một đối số nguyên (số hiệu cổng), nếu không chỉ định, nó sẽ sử dụng
các cổng thông thường trong danh sách.
telnet_init khởi tạo kết nối telnet trên socket đang mở. Hàm này nhận đối số
bất kỳ (socket đang mở), trả lại dữ liệu nhận được (nhiều hay ít phụ thuộc
vào telnet banner nhận được).
this_host không cần đối số, trả về kết quả địa chỉ IP của máy local.
this_host_name không cần đối số, trả về tên máy local.
ftp_log_in thực hiện định danh/xác thực FTP trên socket đang mở. Trả lại
TRUE nếu có thể login thành công, FALSE ngược lại. Nó nhận 3 đối số:
o user là tên username, nếu không có, giá trị mặc định là “anonymous”
hoặc “ftp”.
o pass là mật khẩu truy cập, nếu không có, giá trị mặc định là email.
o socket
start_denial khởi tạo một số cấu trúc dữ liệu nội bộ cho end_denial.
2.3.2.6 Các hàm xử lý chuỗi
chomp nhận đối số kiểu chuỗi bất kỳ, loại bỏ mọi khoảng trắng ở cuối.
Khoảng trắng ở đây có thể là dấu cách, tab, Enter, xuống dòng.
crap trả về bộ đệm chiều dài yêu cầu. Hàm này chủ yếu được dùng kiểm tra
lỗi tràn bộ đệm. Các đối số của nó:
o length kích cỡ bộ đệm.
o data dữ liệu muốn lặp lại để lấp đầy bộ đệm, mặc định là ký tự „X‟.
display nhận không giới hạn số các đối số, nó gọi chuỗi, sau đó hiển thị. Nó
trả về số lượng ký tự hiển thị. Những ký tự không thể hiển thị, được thay
bằng “.”.
egrep tìm kiếm một đoạn mẫu trong chuỗi, từng dòng một, trả về kết quả
các dòng chứa mẫu ký tự cần kiểm tra. Các đối số:
o icase
o pattern
o string
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 38
ereg so sánh chuỗi lặp lại trùng khớp, nó trả về chuỗi đầu tiên tìm được. Các
đối số:
o string,
o multiline, mặc định mang giá trị FALSE, có thể thiết lập thành TRUE
để tìm kiếm trên nhiều dòng.
o pattern
o icase, mặc định mang giá trị FALSE, sửa lại thành TRUE nếu muốn
tìm kiếm phân biệt chữ hoa/chữ thường.
ereg_replace tìm kiếm và thay thế tất cả các mẫu xuất hiện trong chuỗi. Trả
về kết quả chuỗi được sửa đổi, hoặc chuỗi gốc nếu không có mẫu trùng. Các
đối số:
o string, chuỗi gốc ban đầu.
o pattern, mẫu cần so khớp.
o replace, mẫu cần thay thế.
o icase, cờ xác định tìm kiếm phân biệt chữa hoa/chữ thường.
eregmatch tìm kiếm mẫu trong chuỗi, trả về NULL nếu không trùng, hoặc
trả về mảng chứa tất cả mẫu con tìm thấy. Các đối số:
o icase
o pattern
o string
hex chuyển đổi số nguyên sang dạng hexa. Kết quả trả về là một chuỗi.
hexstr chuyển dữ liệu kiểu chuỗi ASCII sang dạng chuỗi hexa cho mỗi ký
tự. Ví dụ: hexstr('aA\n') trả về '61410a'.
insstr nhận 3 hoặc 4 đối số: chuỗi thứ nhất, chuỗi thứ 2, chỉ số bắt đầu, chỉ
số kết thúc. Chỉ số được bắt đầu từ 0. Hàm này sẽ tiến hành thay thế bắt đầu
từ chỉ số thứ nhất đến chỉ số kết thúc trong chuỗi thứ nhất bằng chuỗi thứ 2.
Ví dụ: insstr('abcdefgh','xyz',3,5)sẽ được 'abcxyzgh'.
int chuyển đổi chuỗi sang dạng số nguyên, nếu đối số không phải dạng
chuỗi, nó sẽ trả về 0.
match so sánh chuỗi với mẫu kiểm tra đơn giản, kết quả trả về TRUE hoặc
FALSE. Hàm này không mạnh bằng hàm ereg nhưng nhanh hơn do đơn
giản. Các đối số:
o icase nếu phân biệt chữ hoa/chữ thường.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 39
o string chuỗi đầu vào.
o pattern chuỗi cần tìm kiếm, có thể dùng các ký tự đại diện như *(cho
mọi ký tự), ?(cho một ký tự bất kỳ).
ord trả về mã ASCII của ký tự.
raw_string
str_replace thay thế mọi chuỗi con trong chuỗi lớn hơn, trả về chuỗi đã sửa.
Các đối số:
o string là chuỗi ban đầu.
o find là chuỗi con cần tìm.
o replace là chuỗi cần thay thế.
o count tùy chọn, nếu được thiết lập, hàm sẽ dừng sau khi đạt đến số
lần của biến count.
string nhận mọi đối số bất kỳ, trả về chuỗi có thể chuyển đổi.
strcat nhận mọi số làm đối số, trả về chuỗi có thể chuyển đổi, là kết quả của
các phép toán:
o Số nguyên được chuyển sang dạng ASCII.
o Biến chưa định nghĩa được bỏ qua.
o Mảng được chuyển sang dạng ASCII.
o Các chuỗi còn lại được giữ nguyên.
stridx nhận 2 hoặc 3 tham số bất kỳ, tìm kiếm chuỗi con trong chuỗi lớn, bắt
đầu từ vị trí tùy chọn, trả lại kết quả chỉ số của nó (hoặc -1 nếu không tìm
thấy). Các đối số:
o string chuỗi ban đầu (chuỗi cha).
o substring chuỗi con cần tìm.
o position vị trí bắt đầu tìm, mặc định là 0.
strstr nhận 2 chuỗi bất kỳ làm đối số, trả lại kết quả từ phần giống nhau cho
đến hết của chuỗi dài hơn, nếu không trùng nó trả về kết quả NULL. Ví dụ:
strstr('zabadz', 'ad') trả về 'adz'.
split tách chuỗi thành các chuỗi nhỏ hơn hoặc mảng các dòng.
strlen trả về độ dài của chuỗi, nếu đối số không phải chuỗi, kết quả nhận
được không xác định.
substr nhận 2 hoặc 3 đối số: chuỗi ký tự, chỉ số đầu, chỉ số cuối. Ví dụ:
substr('abcde', 2) trả về 'cde' và substr('abcde', 1, 3) trả về 'bcd'.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 40
tolower chuyển chuỗi bất kỳ sang dạng chữ thường.
toupper chuyển chuỗi bất kỳ sang dạng chữ hoa.
2.3.2.7 Các hàm HTTP
Để sử dụng các hàm HTTP, ta nên khai báo include(“http_function.inc”); và
include(“http_keepalive.inc”); trong script. Các hàm thư viện này cung cấp các
chức năng đơn giản, hiệu quả truy cập tới giao thức HTTP. Khi viết script sử dụng
những hàm này, ta nên thiết lập “http_version.nasl” như một plugin độc lập. Các
hàm HTTP gồm có:
cgibin không có đối số, trả về kết quả đường dẫn cgi-bin của trang web. Ta
có thể sử dụng hàm cgi_dirs() để thay thế.
http_delete gửi request http_delete tới cổng đang mở trên server. Nó tự
động xử lý HTTP_version và cookie xác thực. Nhận đối số là port và item
(the URL). Trả về kết quả là chuỗi request được định dạng.
http_get gửi request http_get tới server. Nhận đối số là port và item (the
URL). Trả về kết quả là chuỗi request được định dạng.
http_close_socket đóng socket đang mở.
http_head gửi request http_head tới server. Nhận đối số là port và item (the
URL). Trả về kết quả là chuỗi request được định dạng.
http_open_socket mở một socket trên cổng yêu cầu. Đến phiên bản Nessus
2.0.10, hàm này giống như hàm open_sock_tcp, sau đó nó thiết lập 64KB
bộ nhớ cho việc truyền nhận dữ liệu.
http_recv_headers nhận tất cả dữ liệu http_header trên socket yêu cầu (số
nguyên bất kỳ làm đối số). Nó dừng khi gặp dòng trống đầu tiên, và trả lại
chuỗi chứa tất cả headers và mã trả lời HTTP.
http_post gửi request http_post tới server. Nhận đối số là port và item (the
URL). Trả về kết quả là chuỗi request được định dạng.
http_put gửi request http_put tới server. Nhận đối số là port và item (the
URL). Trả về kết quả là chuỗi request được định dạng.
is_cgi_installed kiểm tra xem CGI có được cài đặt không, nó tìm kiếm trong
đường dẫn cgi-bin. Hàm trả về cổng của web server nếu tìm thấy. Nó nhận 2
đối số:
o item, cho đường dẫn CGI
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 41
o port, mặc định nó sẽ tìm trên tất cả web server (đọc từ danh mục KB
Services/www).
Ví dụ:
if (port = cgi_installed("vuln.cgi")) security_warning(port);
2.3.2.8 Các hàm Raw IP
dump_ip_packet dumps IP datagram.
dump_tcp_packet dumps the TCP datagrams.
dump_udp_packet dumps UDP datagrams.
forge_icmp_packet điền đầy dữ liệu IP datagrams với dữ liệu ICMP.
Trường ip_p không được cập nhật tự động. Các đối số:
o data là phần payload.
o icmp_cksum là mã kiểm tra, được tính tự động.
o icmp_code
o icmp_id
o icmp_seq là ICMP sequence number.
o icmp_type
o ip là IP datagram được cập nhật.
o update_ip_len cờ, mặc định là TRUE. NASL sẽ tính toán lại kích
thước trường IP datagram.
forge_igmp_packet điền đầy dữ liệu IP datagrams với dữ liệu IGMP.
Trường ip_p không được cập nhật tự động. Các đối số:
o code
o data
o group
o ip là IP datagram được cập nhật. Mã kiểm tra IGMP được tính tự
động.
o type
o update_ip_len cờ, mặc định là TRUE. NASL sẽ tính toán lại kích
thước trường IP datagram.
forge_ip_packet trả lại kết quả IP datagram trong gói tin. Các đối số:
o data là phần payload.
o ip_hl là độ dài IP header, kiểu số nguyên 32bit, giá trị mặc định là 5.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 42
o ip_id IP datagram ID, mặc định là giá trị ngẫu nhiên.
o ip_len chiều dài của datagram, mặc định là 20.
o ip_off địa chỉ offset của fragment, dạng số nguyên 64bit, mặc định là
0.
o ip_p IP Protocol, mặc định là 0.
o ip_src địa chỉ IP nguồn ở dạng ASCII. NASL sẽ tự động chuyển nó
sang dạng số nguyên.
o ip_sum mã kiểm tra packet header. Được tính tự động.
o ip_tos IP type of service (kiểu dịch vụ IP), mặc định là 0.
o ip_ttl trường “time to live”, mặc định là 64.
o ip_v IP version, mặc định là 4.
forge_tcp_packet điền đầy IP datagram với dữ liệu TCP. Trường ip_p
không được cập nhật tự động. Các đối số:
o data là dữ liệu phần TCP payload.
o ip là IP datagram cần điền đầy dữ liệu.
o th_ack ACK number.
o th_dport cổng đích.
o th_flags cờ TCP.
o th_off kích cỡ trường TCP header dạng số nguyên 32bit, mặc định là
5.
o th_seq TCP sequence number.
o th_sport cổng nguồn.
o th_sum mã kiểm tra TCP, được tính tự động.
o th_urp urgent pointer, mặc định là 0.
o th_win kích thước cửa sổ trượt, mặc định là 0.
o th_x2 trường dự trữ.
o update_ip_len cờ, mặc định là TRUE. NASL sẽ tính toán lại kích
thước trường IP datagram.
forge_udp_packet điền đầy IP datagram với dữ liệu UDP. Trường ip_p
không được cập nhật tự động. Các đối số:
o data là dữ liệu phần payload.
o ip là datagram cũ.
o uh_dport cổng đích.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 43
o uh_sport cổng nguồn.
o uh_sum UDP checksum.
o uh_ulen độ dài dữ liệu.
o update_ip_len cờ, mặc định là TRUE. NASL sẽ tính toán lại kích
thước trường IP datagram.
get_icmp_element lấy thông tin về trường ICMP trong datagram. Các đối
số:
o element tên trường TCP.
o icmp ICMP datagram.
get_ip_element lấy thông tin về trường nào đó trong datagram. Các đối số:
o element là tên trường, ví dụ: ip_src, ip_len.
o ip là datagram hoặc fragment.
get_tcp_element lấy thông tin về TCP trong IP datagram. Các đối số:
o element là tên trường TCP.
o tcp là IP datagram.
get_udp_element lấy thông tin về UDP trong IP datagram. Các đối số:
o element là tên trường TCP.
o udp là IP datagram.
insert_ip_options thêm tùy chọn IP trong datagram, trả lại datagram được
chỉnh sửa. Các đối số:
o code số cho tùy chọn.
o length tùy chọn độ dài dữ liệu.
o ip là datagram cũ.
o value là dữ liệu tùy chọn.
pcap_next lắng nghe, ghi lại packet. Các đối số:
o interface tên giao diên mạng.
o pcap_filter bộ lọc BPF filter. Mặc định nó sẽ lắng nghe mọi thứ.
o timeout mặc định là 5 giây.
set_ip_elements chỉnh sửa một số trường của datagram.
set_tcp_elements chỉnh sửa trường TCP của datagram.
set_udp_elements chỉnh sửa trường UDP của datagram.
send_packet gửi các packet, sau đó lắng nghe và phản hồi. Các đối số:
o length độ dài packet.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 44
o pcap_active mặc định là TRUE.
o pcap_filter bộ lọc BPF.
o pcap_timeout mặc định là 5 giây.
2.3.2.9 Các hàm mật mã
Các hàm này chỉ được cài đặt nếu Nessus đã được liên kết với thư viện OpenSSL.
HMAC_DSS(data, key): trả lại kết quả chuỗi xác thực thông báo.
HMAC_MD2(data, key): trả lại kết quả chuỗi xác thực thông báo.
HMAC_MD4(data, key): trả lại kết quả chuỗi xác thực thông báo.
HMAC_MD5(data, key): trả lại kết quả chuỗi xác thực thông báo.
HMAC_RIPEMD160(data, key): trả lại kết quả chuỗi xác thực thông báo.
HMAC_SHA(data, key): trả lại kết quả chuỗi xác thực thông báo.
HMAC_SHA1(data, key): trả lại kết quả chuỗi xác thực thông báo.
MD2(String): trả lại kết quả chuỗi tóm lược.
MD4(String): trả lại kết quả chuỗi tóm lược.
MD5(String): trả lại kết quả chuỗi tóm lược.
RIPEMD160(String): trả lại kết quả chuỗi tóm lược.
SHA(String): trả lại kết quả chuỗi tóm lược.
SHA1(String): trả lại kết quả chuỗi tóm lược.
2.3.2.10 Các hàm không an toàn
Các hàm này chỉ được phép thực thi từ những script được đánh dấu là tin cậy.
find_in_path tìm kiếm câu lệnh trong đường dẫn $PATH, trả lại TRUE nếu
tìm thấy, FALSE ngược lại.
pread khởi động một tiến trình, các đối số:
o cmd tên chương trình, có thể ở dạng tuyệt đối, nếu ở dạng tương đối,
nó sẽ tìm kiếm trong $PATH.
o argv danh sách đối số, argv[0] là tên chương trình, argv[1] là đối số
thứ nhất...
o cd biến lôgic, mặc định là FALSE.
o nice xác định độ ưu tiên của tiến trình.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 45
file_close đóng file đang mở, trả lại 0 nếu thành công, NULL nếu có lỗi xảy
ra.
file_open mở file. Có các đối số:
o mode chế độ mở file. Ví dụ: r(read), w(write)
o name tên file.
file_read đọc nội dung file. Có các đối số:
o fp biến file cần đọc.
o length độ dài dữ liệu cần đọc.
file_seek đọc file bắt đầu từ vị trí chỉ định.
o fp biến file cần đọc.
o offset địa chỉ offset tuyệt đối (tính từ vị trí bắt đầu của file).
file_stat nhận thông tin về trạng thái của file.
file_write ghi dữ liệu vào file. Có các đối số:
o fp biến file cần ghi.
o data là dữ liệu cần ghi.
fread đọc file từ Nessus server. Nhận đối số là chuỗi tên file. Trả về nội
dung file nếu thành công, NULL nếu có lỗi.
fwrite ghi file lên Nessus server. Nếu thành công nó sẽ trả về các byte ghi
được, nếu có lỗi trả về NULL. Nhận 2 đối số:
o data là dữ liệu cần ghi lên.
o file là tên file cần ghi.
get_tmp_dir trả về đường dẫn chứa các file tạm thời.
unlink loại bỏ file trên Nessus server. Nhận đối số là tên file.
2.3.3 Các file thƣ viện NASL
Các file thư viện của NASL có ý nghĩa tương tự như với các file header của C, nó
có phần mở rộng “.inc”, được khai báo ở đầu các file script .nasl với câu lệnh như
include(“http_func.inc”). Trong các file thư viện, cài đặt các hàm tích hợp
sẵn (built-in function).
Ví dụ một phần nội dung file http_func.inc:
# -*- Fundamental -*-
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 46
#
# (C) Tenable Network Security, Inc.
# get_http_port (C) Georges Dagousset
# $Revision: 1.115 $
function get_http_banner(port)
{
local_var soc, sb, banner, req, body;
if ( get_kb_item("Services/www/" + port + "/broken") ) return NULL;
if (! get_port_state(port)) return (0);
sb = strcat("www/real_banner/", port);
banner = get_kb_item(sb);
if(banner) return(banner);
sb = strcat("www/banner/", port);
banner = get_kb_list(sb);
if ( !isnull(banner) )
{
banner = make_list(banner);
return banner[0];
}
soc = http_open_socket(port);
if(!soc) return (NULL);
req = http_get(item:"/", port:port);
send(socket:soc, data:req);
banner = http_recv_headers2(socket:soc);
#body = http_recv_body(socket:soc, headers: banner);
http_close_socket(soc);
if(banner)
replace_kb_item(name: sb, value: banner);
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 47
return(banner);
}
2.3.3.1 dump.inc
dump(ddata, dtitle): In toàn bộ dữ liệu, tiêu đề ra kênh xuất chuẩn. Thường
dùng ở chế độ gỡ rối.
hexdump(ddata): In dữ liệu dưới dạng hexa.
2.3.3.2 ftp_func.inc
Cung cấp các hàm thư viện để tương tác với giao thức FTP.
ftpclose(socket): tiến hành đóng kết kết FTP bằng cách gửi request “QUIT”,
sau đó đợi trả lời và đóng kết nối.
get_ftp_banner(port): lấy FTP banner, đối số là tên cổng.
ftp_recv_line(socket): lấy dữ liệu trên dòng từ socket, cho đến khi nhận
được ký tự thứ 4 khác “-”. Dùng khi muốn dừng nhận banner quá dài.
2.3.3.3 http_func.inc
Cung cấp các hàm xử lý giao thức HTTP.
check_win_dir_trav(port, url, quickcheck): kiểm tra đường dẫn thư mục
Window trên URL chỉ định.
get_cgi_path(port): lấy đường dẫn cgi-bin trên server.
get_http_banner(port): lấy HTTP banner trên port đang kết nối.
get_http_port(default): lấy số hiệu cổng HTTP.
http_40x(port,code): trả lại giá trị TRUE nếu mã HTTP trả lời trong khoản
400 – 409, ngược lại là FALSE.
http_is_dead(port, retry): Cố gắng kiểm tra xem http server có còn hoạt
động hay không. Kết quả trả lời là TRUE nếu thuộc một trong các trường
hợp sau:
o Kết nối bị từ chối.
o Không nhận được phản hồi HTTP hợp lệ.
o Lỗi 502 (bad gateway), 503(service unavailable).
http_recv_body(socket, headers, length): đọc N byte từ socket. N được
định nghĩa như sau:
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 48
Nếu header là trường không được định nghĩa, nó sẽ gọi hàm
http_recv_headers; trường “Content-Length” được lấy từ header.
o Nếu trường length được thiết lập:
Nếu content_length có thể lấy từ header,
N = max(length, content_length)
Nếu không N=length.
o Nếu content_length có thể lấy từ header, N= content_length
o Nếu khác, mặc định N= 8192 bytes.
http_recv(socket, code): lấy HTTP header và dữ liệu từ socket. Code là
tham số tùy chọn.
http_recv_length(socket, bodylength): lấy HTTP header, sau đó gọi hàm
http_recv_body với length=bodylength, sau đó trả lại header và nội dung.
locate_cgi(port, item): tìm kiếm ứng dụng chạy CGI trên webserver.
php_ver_match(banner, pattern): kiểm tra phiên bản PHP trên server. Nếu
trùng trả về TRUE, ngược lại FALSE.
Ví dụ:
if (php_ver_match(banner:banner,
pattern:".*PHP/((3.*)|(4\.0.*)|(4\.1\.[01].*))"))
security_hole(port);
cgi_dirs(): trả về tất cả đường dẫn CGI (thường là /cgi-bin và /scripts).
2.3.3.4 http_keepalive.inc
Từ phiên bản Nessus 2.0.1 bắt đầu hỗ trợ kết nối HTTP keep-alive, tránh việc phải
đóng mở lại socket sau mỗi phiên kết nối. Giúp tiết kiệm băng thông, CPU và đặc
biệt là kết nối SSL/TLS. Để các hàm hoạt động tốt, ta nên khai báo
include(“http_func.inc”); vào trong chương trình.
http_keepalive_send_recv(port, req): gửi request req tới server từ xa trên
port đang kết nối. req là một HTTP request, tương tự như http_get().
is_cgi_installed_ka(port, item): tương tự như is_cgi_installed() nhưng
với kết nối kept-alive.
check_win_dir_traversal_ka(port, url, quickcheck): tương tự như
check_win_dir_traversal() nhưng với kết nối kept-alive.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 49
2.3.3.5 nfs_func.inc
Chứa các hàm hỗ trợ xử lý với hệ thống file mạng. Ta nên khai báo
include(“misc.inc”); và include(“nfs_func.inc”); để tránh lỗi.
Khi làm việc với giao thức NFS, ta cần 2 socket UDP đặc quyền (cổng 1024 hoặc
thấp hơn); một để tương tác với nfsd deamon (RPC 100003), và một để truy cập tới
mountd deamon (RPC 100005).
Sau đây là ví dụ:
nfsd_port = get_rpc_port(program:100003, proto:IPPROTO_UDP);
if (! nfsd_port) exit(0);
nfsd_socket = open_priv_sock_udp(dport:nfsd_port);
mountd_port = get_rpc_port(program:100005, proto:IPPROTO_UDP);
if (! mountd_port) exit(0);
mountd_socket = open_priv_sock_udp(dport:mountd_port);
Các hàm được cài đặt với giao thức NFS:
mount(soc, share): tiến hành gắn kết thư mục chia sẻ. soc ở đây là socket
UDP đang kết nối tới máy chia sẻ. Trả về NULL nếu có lỗi, hoặc danh sách
file nếu thành công.
umount(soc, share): dừng gắn kết thư mục chia sẻ.
readdir(soc, fid): đọc nội dung thư mục trỏ bởi fid. soc ở đây là socket UDP
đang kết nối tới máy chia sẻ.
cwd(soc, fid, dir): lệnh chuyển thư mục. soc ở đây là socket UDP đang kết
nối tới máy chia sẻ, fid là thư mục hiện tại, dir là thư mục muốn chuyển
sang.
2.3.3.6 smb_nt.inc
Thư viện SMB cung cấp các hàm tương tác với hệ thống file chia sẻ của Windows
sử dụng giao thức SMB, qua cổng 139 hoặc 445. Do hầu hết các giao thức của
Microsoft không có tài liệu miêu tả đầy đủ, nên các hàm được thiết kế nhờ vào quá
trình phân tích gói tin.
Các hàm thiết lập phiên kết nối SMB:
o smb_session_request(soc, remote)
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 50
o smb_neg_prot(soc)
o smb_session_setup(soc, login, password, domain, prot)
o session_extract_uid(reply)
Hàm kết nối và đọc các dữ liệu chia sẻ:
o smb_tconx(soc, name, uid, share)
o tconx_extract_tid(reply)
o OpenAndX(socket, uid, tid, file)
o ReadAndX(socket, uid, tid, count, off)
o smb_get_file_size(socket, uid, tid, fid)
Truy cập registry từ xa
o smbntcreatex(soc, uid, tid)
o smbntcreatex_extract_pipe(reply)
o pipe_accessible_registry(soc, uid, tid, pipe)
o registry_access_step_1(soc, uid, tid, pipe)
o registry_get_key(soc, uid, tid, pipe, key, reply)
o registry_get_item_sz(soc, uid, tid, pipe, item, reply)
o registry_decode_sz(data)
o registry_get_item_dword(soc, uid, tid, pipe, item, reply)
o registry_decode_dword(data)
o registry_get_key_security(soc, uid, tid, pipe, reply)
o registry_key_writeable_by_non_admin(security_descriptor)
Truy cập SAM
o OpenPipeToSamr(soc, uid, tid)
o SamrConnect2(soc, tid, uid, pipe, name)
o _SamrEnumDomains(soc, uid, tid, pipe, samrhdl)
o SamrDom2Sid(soc, tid, uid, pipe, samrhdl, dom)
o SamrOpenDomain(soc, tid, uid, pipe, samrhdl, sid)
o SamrOpenBuiltin(soc, tid, uid, pipe, samrhdl)
o SamrLookupNames(soc, uid, tid, pipe, name, domhdl)
o SamrOpenUser(soc, uid, tid, pipe, samrhdl, rid)
o SamrQueryUserGroups(soc, uid, tid, pipe, usrhdl)
o SamrQueryUserInfo(soc, uid, tid, pipe, usrhdl)
o SamrQueryUserAliases(soc, uid, tid, pipe, usrhdl, sid, rid)
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 51
2.3.3.7 smtp_func.inc
Chứa các hàm giúp làm việc với giao thức gửi mail SMTP.
smtp_send_socket(socket, from, to, body): gửi thông điệp SMTP tới socket
đang mở. Trả lại TRUE nếu thông báo được chấp nhận hoặc chuyển đi,
FALSE nếu có lỗi.
smtp_send_port(port, from, to, body): mở socket trên cổng chỉ định, để gửi
thông báo SMTP , sau đó đóng socket. Trả lại TRUE nếu thông báo được
chấp nhận hoặc chuyển đi, FALSE nếu có lỗi.
smtp_from_header(): lấy giá trị trường “From” từ header. Nếu khoản mục
SMTP/headers/from trong KB không được thiết lập, giá trị mặc định là
smtp_to_header(): lấy giá trị trườn “To” từ header. Nếu khoản mục
SMTP/headers/from trong KB không được thiết lập, giá trị mặc định là
postmaster@[1.2.3.4] , trong đó 1.2.3.4 là địa chỉ IP cần gửi đến.
get_smtp_banner(port): lấy banner SMTP.
smtp_recv_banner(socket): đọc dữ liệu theo từng dòng từ socket, trả lại
dòng đầu tiên không bắt đầu bằng “220-”.
2.3.3.8 Các hàm thư viện khác
Trên Windows, các hàm thư viện (.inc) được lưu trữ cùng với các script (.nasl) tại
đường dẫn: C:\Program Files\Tenable\Nessus\nessus\plugins
Bảng 2.2 Một số hàm thư viện của Nessus.
Tên thư viện Giao thức Chỉ dẫn
aix.inc N/A Thư viện quét các máy chạy hệ thống AIX.
backport.inc N/A Kiểm tra bản vá mới nhất của một phiên bản
hệ điều hành.
byte_func.inc N/A Hàm xử lý byte.
charset_func.inc N/A Chuyển đổi giữa các kiểu bảng mã
ASCII/EBCDIC.
cisco_func.inc Cisco Lấy thông tin từ các thiết bị của hãng Cisco.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 52
Devices
crypto_func.inc N/A Các hàm thư viện mã hóa như MD5, MD4,
NTLM, DES, RC4, …
dns_func.inc DNS Hàm thư viện xử lý truy vấn DNS.
ftp_func.inc FTP Hàm thao tác với giao thức FTP.
hostlevel_func.inc R-
PROTOCOL
Hàm thư viện cho các giao thức truy cập từ xa
như rmote, rlogin, rexec, …
hpux.inc N/A Thư viện quét các hệ thống HPUX.
http_func.inc HTTP Thư viện tương tác với HTTP.
imap_func.inc IMAP Thư viện tương tác với giao thức IMAP.
ip.inc/ip6.inc IPv4, IPv6 Thư viện IPv4, IPv6.
kerberos_func.inc KRB Thư viện tương tác với giao thức Kerberos.
ldap.inc LDAP Thư viện tương tác với LDAP.
misc_func.inc N/A Thư viện Knowledge Base function.
mysql_func.inc MYSQL Thư viện tương tác với CSDL MySQL.
nfs_func.inc NFS Thư viện tương tác hệ thống file mạng NFS.
nntp_func.inc NNTP Thư viện tương tác với giao thức NNTP
(Network New Transport Protocol).
pop3_func.inc POP3 Thư viện tương tác với giao thức POP3.
raw.inc N/A Thư viện xử lý gói tin “raw packet”.
smb_file_funcs.inc SMB Thư viện nhận file chia sẻ.
smb_func.inc SMB Thư viện SMB.
smtp_func.inc SMTP Thư viện tương tác với giao thức SMTP.
smnp_func.inc SMNP Thư viện tương tác với giao thức SNMP
(Simple Network Managent Protocol).
solaris.inc N/A Thư viện quét các hệ thống chạy Solaris.
ssh_func.inc SSH Thư viện tương tác với SSH (Secure Shell).
ssl_funcs.inc SSL Thư viện tương tác với SSL, HTTPS.
tcp.inc TCP Thư viện tương tác với TCP (IPv4, IPv6).
telnet_func.inc Telnet Thư viện tương tác với Telnet.
tftp.inc TFTP Thư viện tương tác với TFTP.
udp.inc UDP Thư viện tương tác với UDP.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 53
url_func.inc N/A Thư viện encode, decode URL theo RFC
2396/RFC2732.
2.4 XÂY DỰNG PLUGIN CHO NESSUS
2.4.1 Thông dịch script tự xây dựng
Khi tự viết script NASL, thông thường để kiểm tra ta dùng trình thông dịch
command-line nasl . Tiện ích nasl được cài đặt sẵn trong quá trình cài Nessus, nó
nhận các tham số sau:
nasl [options] script1.nasl [script2.nasl …]
Các tùy chọn của trình thông dịch gồm có:
Bảo mật:
o -S: Tạo chữ ký cho file script .nasl đang chạy. Quá trình tạo chữ ký
này cho phép script có thể có được nhiều quyền truy cập vào Nessus
Engine. Khi ký yêu cầu phải có cặp khóa công khai/bí mật RSA.
o -X: Chạy script ở chế độ đã được xác thực, cho phép các script đã
được ký được nhiều quyền truy cập vào tài nguyên của Nessus
Engine.
Công cụ phân tích ngữ pháp:
o -L: Thực hiện kiểm tra bổ sung cho lỗi ngữ pháp và phân tích cú pháp.
Nó sẽ kiểm tra mọi thành phần của script. Trước khi phát hành một
plugin, ta nên kiểm tra với tùy chọn này.
o -V: Hiển thị thông tin về script như script ID, script name, …
o -T <tracefile>: Lần vết thực hiện của script. Tùy chọn này yêu cầu
trình thông dịch ghi các thông tin gỡ rối ra một file cụ thể.
Môi trường thực thi:
o -t target: Thực hiện script lại một lần nữa với máy đích. Địa chỉ máy
đích ở đây có thể là địa chỉ IP, tên máy mà ta muốn kiểm tra script.
Các hàm thư viện mạng NASL không cho phép chỉ định địa chỉ đích
khác khi đang thực hiện kết nối hoặc gửi các gói “raw packet”. Nếu
tùy chọn này không được chỉ định cụ thể, tất cả kết nối sẽ được thực
hiện trên địa chỉ loopback 127.0.0.1 (localhost).
o -k <file>: tải KB file từ file chỉ định.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 54
o -D: Chỉ chạy phần chỉ dẫn của plugin.
o -s: chỉ định script chạy ở chế độ kiểm tra an toàn. Tất cả các plugin
được đánh dấu ACT_DESTRUCTIVE_ATTACK,
ACT_KILL_HOST, ACT_DENIAL, hoặc ACT_FLOOD sẽ không
được thực thi.
Tùy chọn khác:
o -h: Hiển thị trợ giúp.
o -v: Hiển thị tên phiên bản của trình thông dịch nasl.
2.4.2 Thử nghiệm script
Ví dụ một script đơn giản, thực hiện kết nối đến cổng FTP (21), đọc banner,
sau đó hiển thị lên màn hình. Đoạn script sau thực hiện tác vụ trên:
soc = open_sock_tcp(21);
if ( ! soc ) exit(0);
banner = recv_line(socket:soc, length:4096);
display(banner);
Lưu script với tên “test.nasl” chẳng hạn, sau đó thực hiện từ dòng lệnh. Nếu
trên Linux, nasl có đường dẫn đầy đủ là “/usr/local/bin/nasl”, còn trên Windows,
nó nằm trong thư mục “C:\Program Files\Tenable\Nessus\nasl.exe”:
$ /usr/local/bin/nasl –t ftp.nessus.org test.nasl
** WARNING : packet forgery will not work
** as NASL is not running as root
220 ftp.nessus.org Ready
Để tránh bị lỗi, ta nên chạy nasl với quyền quản trị, trên Linux là root (hoặc tài
khoản có quyền sudo), trên Windows là Administrator.
Nhóm thử dùng đoạn script trên để lấy banner host FTP của trang
http://kmasecurity.net:
Tìm địa chỉ host FTP của trang web: Ta có thể sử dụng công cụ như
http://www.whoishostingthis.com
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 55
Hình 2.1 Địa chỉ host FTP của kmasecurity.net
Ping và lấy thử banner của host FTP:
Hình 2.2 Kết quả banner trả về của host FTP kmasecurity.net
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 56
KẾT LUẬN
Qua quá trình tìm hiểu, thực hiện nhóm đã đạt được một số kết quả sau:
- Đã tìm hiểu được cấu trúc, các thành phần cơ bản của Nessus.
- Biết cách sử dụng Nessus để quét các lỗ hổng.
- Đã tiến hành tìm hiểu về cấu trúc của ngôn ngữ scipt NASL, thử nghiệm một
số script đơn giản.
Với yêu cầu của đề tài, việc thiết kế một plugin riêng, hoàn toàn mới để quét lỗi
bảo mật, nhóm chúng em đã gặp phải một số khó khăn như:
- Nhóm không thể tiến hành kiểm tra một lượng rất lớn các Plugin có sẵn của
nhà cung cấp (với phiên bản 5.0 hiện tại có khoảng 130 file .inc và 48460
file .nasl) để kiểm tra xem Plugin định xây dựng liệu có trùng với Plugin có
sẵn hay không.
- Việc thiết kế Plugin riêng đòi hỏi phải có hiểu biết sâu sắc về một lĩnh vực
bảo mật nhất định.
Từ kết quả nghiên cứu của đề tài, và từ những hạn chế trên, nhóm đặt ra vấn đề và
định hướng mới trong tương lai, đó là:
- Tiếp tục nghiên cứu, tìm hiểu sâu thêm về ngôn ngữ NASL. Đồng thời tăng
cường việc thử nghiệm các script NASL để có thể thực hiện “nhuần nhuyễn”
các tác vụ quét lỗ hổng bảo mật cơ bản.
- Tìm hiểu sâu thêm về các lỗi bảo mật, cách kiểm tra và khai thác lỗi bảo
mật.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 57
TÀI LIỆU THAM KHẢO
[1] Michel Arboi, “The NASL2 reference manual”, Revision 1.65, 2005.
[2] Russ Rogers, Mark Carey, Paul Criscuolo, Mike Petruzzi, “Nessus Network
Auditing, Second Edition”, Syngress Publishing, Inc. ISBN 13: 978-1-59749-208-
9, 2008.
[3] “Nessus 5.0 User Guide”, Tenable Network Security, Inc. Revision 6, 2012.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 58
PHỤ LỤC
A. Hướng dẫn cài đặt và sử dụng Nessus 5.0 trên Windows:
1. Download nessus:
- Đầu tiên ta vào trang http://www.nessus.org/products/nessus/nessus-
download-agreement và chấp nhận điều khoản của Tenable Network
Security.Sau khi chấp nhận điều khoản chúng ta sẽ được đưa đến trang
download và tùy chọn cho các phiên bản và các hệ điều hành. Ở đây chúng
ta cài đặt trên Windows ta sẽ tải gói Nessus-5.0.1-i386.msi( 32 bit), hoặc
Nessus-5.0.1-x86_64.msi(64 bit).
2. Cài đặt:
- Đầu tiên phải đảm bảo rằng user đang sử dụng phải có đủ quyền thực thi và
cài đặt các chương trình.
Trong quá trình cài đặt Nessus sẽ nhắc nhở một số thông tin cơ bản trước khi
bắt đầu bạn phải đồng ý để vào bước tiếp theo.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 59
Để thực hiện các bước cài đặt tiếp theo phải chấp nhận license.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 60
Chọn đường dẫn lưu trữ file cài đặt.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 61
Lựa chọn Complete sau đó chọn Install để tiến hành cài đặt Nessus lên máy.
Chọn Finish để hoàn tất cài đặt.
Nessus Home
Directory
Nessus Sub-Directoris Purpose
Program
Files\Tenable\Nessus
\conf file cấu hình
\nessus\plugin nessus plugin
\nessus\user\<username>kbs User knowledgebase
saved on disk
\nessus\logs nessus log file
Để chạy được nessus bạn phải thực hiện các bước cấu hình sau đây:
- Đăng ký cho nessus bằng cách truy cập vào trang nessus.org để nhận được
những bản cập nhật.
- Thực hiện một bản cập nhật plugin.
- Cấu hình lựa chọn là máy chủ Nessus hoặc Client.
- Quản lý người dùng Nessus.
- Khởi động hoặc dùng Nessus.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 62
Để Chuyển đến Nessus manager bạn chuyển đến Star menu và thực tiến hành
truy câp bằng cách sau: Start -> Programs -> Tenable Network Security ->
Nessus(64) -> Nessus web Client.
Bạn phải Click vào Continue to this website.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 63
Sau đó bạn Click và trang http://www.nessus.org/register để đăng ký thông tin.
Tại đây có 2 mục lựa chọn làm việc tại nhà hoặc cho công ty nào đó. Ở đây mình
chọn làm việc tại nhà.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 64
Sau đó ta được chuyển đến 1 trang và phải chấp nhận các điều khoản của công ty.
Tiếp theo tiến hành đăng ký thông tin để lấy code active cho Nessus.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 65
Hoàn tất quá trình đăng ký. Sau đó truy cập vào mail đã đăng ký để lấy code
active.
Sau đó quay trở lại trang register và chọn Get started.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 66
Tại trang này cần thiết lập user và pasword, user này là quyền root(cao nhất có thể
phân quyền, thêm chỉnh sửa và xóa user mới, thực thi nessus).
Bước tiếp theo tiến hành nhập code để active. sau đó chọn Next. bạn phải chắc
rằng đã được kết nối internet thì mới hoàn tất được quá trình đăng ký.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 67
Quá trình đăng ký xong và chọn Next: Download plugins để cập nhật.
Đây là quá trình cập nhật Plugins.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 68
Quá trình cài đặt hoàn tất và chuyến đến trang xác thực user và đăng nhập vào
Nessus.
Tìm hiều về các chính sách của Nessus
Sau khi tiến hành xác thực user xong, chúng ta được chuyến đến trang có
giao diện như sau.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 69
Trong phần User liệt kê tất cả các user đã đươc khởi tạo, tại đây bạn có thể tiến
hành thêm bớt, chỉnh sửa các quyền hạn với mỗi user.
Tổng quan về các chính sách trong Nessus
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 70
Một chính sách của Nessus bao gồm các cấu hình tùy chọn để thực thi trong quá
trình kiểm tra lỗi bảo mật. Các tùy chọn này bao gồm, nhưng chúng không giới hạn
các thông số kiểm soát các khía cạnh kĩ thuật quét như thời gian tạm ngưng, số
lượng máy chủ, các loại cổng máy quét và nhiều hơn nữa.
Cấp quyền cho phép quét tại local (ví dụ: Window, SSH), phải xác thực quét
cơ sở dữ liệu Oracle, HTTP, FTP, POP, IMAP, hoặc xác thực dựa trên Kerberos.
Dựa trên các thông số quét Granular family hoặc plugin based.
Cơ sở dữ liệu phải tuân thủ các chính sách kiểm tra, độ dài của báo cáo, thiết
lập các service phát hiện khi quét, Unix tuân thủ kiểm tra...
Các chính sách mặc định của Nessus
Nessus có một số chính sách mặc định được cung cấp bởi công ty Tenable
Network Security.Họ cung cấp một số các chính sách mẫu để hợ trỡ bạn trong việc
tạo ra các chính sách tùy chọn cho các đợn vị hoặc sử dụng để quét các tài nguyên
của bạn.Chắc chắn rằng bạn phải hiểu được được các chính sách tùy chỉnh từ đó
bạn sẽ tạo ra được các chính sách mới trong việc kiểm tra hệ thống của bạn.
Policy Name Description
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 71
External Network Scan Tùy chỉnh này dùng để quét các máy
ở bên ngoài. Plugin sẽ liên kết với
các ứng dụng lỗ hổng web đã
biết(CGI Abuses and CGI Abuses:
XSS plugin families). Ngoài ra, tất cả
các 65536 cổng (Port 0 thông qua
cổng cắm riêng biệt) thì được quét
qua từng target.
Internal Network Scan Chính sách này được điều chỉnh cho
hiệu suất tốt hơn, có tính đến tài
khoản mà nó có thể được sử đụng để
quét các mạng nội bộ với nhiều máy
chủ, một vài các dịch vụ đang được
sử dụng, và một vài thiết bị được gắn
vào hệ thống như là máy in. “CGI
Abuse” plugins không được kết nối
và một bộ chuẩn cài đặt cho các cổng
được quét, không phải tất cả 65536
port.
Web App Tests Nếu bạn muốn quét cho hệ thống của
bạn và Nessus có tự lựa chọn biết và
không biết những lỗi bảo mật trong
ứng dụng web của bạn. Đây chính là
chính sách dùng cho bạn để quét.
Những mắt xích liên kết trong chính
sách của Nessus được kết nối, Nó
được dùng để phát hiện những web
site và tìm các lỗi bảo mật trong mỗi
thông số như : XSS, SQL, command
injection....
Prepare for PCI DSS
audits
Chính sách này cho phép xây dựng
trong kiểm tra tuân thủ PCI DSS, so
sánh kết quả với các Standards và
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 72
Produces và đưa ra một bản ghi chi
tiết cho việc xây dụng một hệ thống
phù của bạn. Nó rất quan trọng trong
việc đánh giá và xây dựng hệ thống
theo chuẩn PCI DSS.
Kiểm thử:
Để tiến hành thực hiện kiểm tra lỗi bảo mật ta chuyển đến mục Scans
Tiếp theo ta chọn Add
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 73
Tại giao diện này trong phần:
- Name :tên của trang web bạn muốn scan, ở đây mình scan trang
at4akma.com.
- Type: Kiều thực hiện, tùy chọn lúc này là Run Now thực hiện ngay bây giờ.
- Polocy: Trong phần này có 4 mục lựa chọn, đây là polocy mặc mặc của
Nessus, vì kiểm tra web lên ta chọn là Web App Test.
- Scan Target: trong mục này bạn phải điền tên miền hoặc tên địa chỉ của
trang web, ở đây mình sẽ điền tên miền.
Tiến hành điền đầy đủ thông tin:
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 74
Sau khi điền đầy đủ thông tin ta chọn Launch Scan.
Giao diện sau khi chọn Launch Scan.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 75
Để tiến hành kiểm tra xem qua trình Scan có phát hiện lỗ hổng gì hay không
ta click đúp vào và sẽ hiện ra một bảng kết quả trong quá trình kiểm tra.
Đây là kết quả kiểm tra trang at4akma.com và vẫn còn đang tiếp tục kiểm
tra. Để xem thông tin thêm về lỗi này ta click tiếp vào lỗi đó.
Tìm hiểu xây dựng Plugin cho Nessus sử dụng NASL Trang 76
B. Phân công công việc trong nhóm:
STT Nội dung công việc Thành viên phụ trách
1. - Viết báo cáo chương 1: tìm hiểu về tổng
quan, các thành phần cơ bản của Nessus.
- Thực hiện cài đặt, sử dụng Nessus trên
Windows.
Hà Văn Khánh
2. - Viết báo cáo chương 2: tìm hiểu về ngôn
ngữ NASL, cấu trúc ngữ pháp, các hàm,
tiến hành thông dịch, thử nghiệm script.
Nguyễn Vân Luân
3. - Cài đặt, đăng ký, chạy thử Nessus.
- Kiểm tra thử các thành phần trong
Nessus.
Đặng Văn Cường
4. - Chụp các hình cài đặt, quay video màn
hình.
- Chỉnh sửa lại ngữ pháp, cách trình bày
văn bản.
Trần Côn