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 1 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 Trang 2 KẾT LUẬN . .56 TÀI LIỆU THAM KHẢO . .57 PHỤ LỤC . .58 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. 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.
Trang 1MỤ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
Trang 22.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
Trang 3KẾT LUẬN 56 TÀI LIỆU THAM KHẢO 57 PHỤ LỤC 58
Trang 4DANH MỤC CÁC BẢNG
Bảng 2.1 Độ ưu tiên của các phép toán .23Bảng 2.2 Một số hàm thư viện của Nessus .51
Trang 5DANH 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
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
Trang 7LỜ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
Trang 8CHƯƠ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,
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 Server Firewall
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
Trang 101.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
requestresult
requestresult
Kiểm qua 1 trang web qua mạng
Nessus Plugin
Web Server
Hình 1.2 Mô hình hoạt động của Nessus Plugin
Trang 11CHƯƠ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
Trang 12qua 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
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
Trang 13Dễ 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)
Trang 14NASL2 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 <noamr@securiteam.com> #
script_copyright(english:"This script is Copyright (C) 1999 SecuriTeam");
family["english"] = "Denial of Service";
Trang 152.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
- 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 ++;
Trang 16[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
Trang 17[repeat_loop]repeat instr until expr ;
[foreach_loop]foreach identifier ( array ) instr
Trang 19[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
Trang 202.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ố
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
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ố
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
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
! phép “not” lôgic Ví dụ: !x=TRUE, nếu x=FALSE
&& phép “and” lôgic
Trang 23Nế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
Trang 245 * / % Trái qua phải
7 << >> >>> Trái qua phải
11 < <= > >= == != <> =~ !~
>!< ><
Không
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
Trang 252.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:
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
Trang 26dị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ố
Ví dụ về hàm có đối số không được định tên:
function fact() #hàm không có đối số
Trang 27Hằ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:
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)
Trang 28o 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”
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
Trang 30get_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)
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ụ
Trang 31o 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à
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ụ:
Trang 32script_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):
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ọ
Trang 33script_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ủ
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
Trang 342.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
Trang 35islocalnet 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
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;
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ó:
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
Trang 38ereg 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ố:
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