at5a nhom2 nessus

76
Tìm hiu xây dng Plugin cho Nessus sdng NASL Trang 1 MC LC TÓM TT NỘI DUNG ĐỀ TÀI .............................................................................6 LI MĐẦU ...........................................................................................................7 CHƢƠNG 1. TNG QUAN VNESSUS ............................................................8 1.1 LCH SHÌNH THÀNH VÀ PHÁT TRIN CA NESSUS .....................8 1.2 CÁC THÀNH PHN CA NESSUS .............................................................8 1.2.1 Kiến trúc ca Nessus vi 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 HIU VNGÔN NGNASL .............................................11 2.1 TNG QUAN VNGÔN NGNASL .......................................................11 2.1.1 Lch sngôn ngNASL ..........................................................................11 2.1.2 Điểm khác bit gia NASL1 và NASL2 .................................................13 2.1.3 NASL2 ngôn ngthông dch, ta C ........................................................14 2.2 CU TRÚC NGÔN NGNASL2................................................................15 2.2.1 Sơ bvquy tc viết chương trình ..........................................................15 2.2.2 Cú pháp ....................................................................................................15 2.2.3 Kiu dliu..............................................................................................20 2.2.4 Các toán t...............................................................................................20 2.2.4.1 Các toán tthông thường.....................................................................20 2.2.4.2 Các phép toán shc ...........................................................................21 2.2.4.3 Các toán tta C .................................................................................21 2.2.4.4 Toán txlý chui ..............................................................................21 2.2.4.5 Toán tso sánh ....................................................................................22 2.2.4.6 Toán tlôgic ........................................................................................22 2.2.4.7 Phép toán xlý bit ...............................................................................22 2.2.4.8 Các phép xlý đặc bit ........................................................................23

Upload: nguyen-thanh

Post on 14-Feb-2015

85 views

Category:

Documents


8 download

TRANSCRIPT

Page 1: 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

Page 2: At5a Nhom2 Nessus

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

Page 3: At5a Nhom2 Nessus

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

Page 4: At5a Nhom2 Nessus

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

Page 5: At5a Nhom2 Nessus

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

Page 6: At5a Nhom2 Nessus

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.

Page 7: At5a Nhom2 Nessus

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.

Page 8: At5a Nhom2 Nessus

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,

Page 9: At5a Nhom2 Nessus

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.

Page 10: At5a Nhom2 Nessus

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.

Page 11: At5a Nhom2 Nessus

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

Page 12: At5a Nhom2 Nessus

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.

Page 13: At5a Nhom2 Nessus

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).

Page 14: At5a Nhom2 Nessus

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) {

Page 15: At5a Nhom2 Nessus

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

Page 16: At5a Nhom2 Nessus

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

Page 17: At5a Nhom2 Nessus

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

Page 18: At5a Nhom2 Nessus

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

Page 19: At5a Nhom2 Nessus

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.

Page 20: At5a Nhom2 Nessus

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

Page 21: At5a Nhom2 Nessus

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.

Page 22: At5a Nhom2 Nessus

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.

Page 23: At5a Nhom2 Nessus

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

Page 24: At5a Nhom2 Nessus

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.

Page 25: At5a Nhom2 Nessus

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

Page 26: At5a Nhom2 Nessus

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;

Page 27: At5a Nhom2 Nessus

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).

Page 28: At5a Nhom2 Nessus

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

Page 29: At5a Nhom2 Nessus

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.

Page 30: At5a Nhom2 Nessus

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ụ

Page 31: At5a Nhom2 Nessus

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ụ:

Page 32: At5a Nhom2 Nessus

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ọ.

Page 33: At5a Nhom2 Nessus

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

Page 34: At5a Nhom2 Nessus

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.

Page 35: At5a Nhom2 Nessus

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

Page 36: At5a Nhom2 Nessus

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;

Page 37: At5a Nhom2 Nessus

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

Page 38: At5a Nhom2 Nessus

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.

Page 39: At5a Nhom2 Nessus

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'.

Page 40: At5a Nhom2 Nessus

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

Page 41: At5a Nhom2 Nessus

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.

Page 42: At5a Nhom2 Nessus

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.

Page 43: At5a Nhom2 Nessus

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.

Page 44: At5a Nhom2 Nessus

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.

Page 45: At5a Nhom2 Nessus

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 -*-

Page 46: At5a Nhom2 Nessus

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);

Page 47: At5a Nhom2 Nessus

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:

Page 48: At5a Nhom2 Nessus

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.

Page 49: At5a Nhom2 Nessus

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)

Page 50: At5a Nhom2 Nessus

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)

Page 51: At5a Nhom2 Nessus

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à

[email protected].

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.

Page 52: At5a Nhom2 Nessus

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.

Page 53: At5a Nhom2 Nessus

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.

Page 54: At5a Nhom2 Nessus

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

Page 55: At5a Nhom2 Nessus

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

Page 56: At5a Nhom2 Nessus

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.

Page 57: At5a Nhom2 Nessus

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.

Page 58: At5a Nhom2 Nessus

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.

Page 59: At5a Nhom2 Nessus

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.

Page 60: At5a Nhom2 Nessus

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.

Page 61: At5a Nhom2 Nessus

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.

Page 62: At5a Nhom2 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.

Page 63: At5a Nhom2 Nessus

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à.

Page 64: At5a Nhom2 Nessus

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.

Page 65: At5a Nhom2 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.

Page 66: At5a Nhom2 Nessus

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ý.

Page 67: At5a Nhom2 Nessus

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.

Page 68: At5a Nhom2 Nessus

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.

Page 69: At5a Nhom2 Nessus

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

Page 70: At5a Nhom2 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

Page 71: At5a Nhom2 Nessus

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à

Page 72: At5a Nhom2 Nessus

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

Page 73: At5a Nhom2 Nessus

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:

Page 74: At5a Nhom2 Nessus

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.

Page 75: At5a Nhom2 Nessus

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 đó.

Page 76: At5a Nhom2 Nessus

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