Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 42 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
42
Dung lượng
333,36 KB
Nội dung
Lời mở đầu Trong trình bảo mật hệ thống mạng cho công ty hay tổ chức việc sử dụng công cụ mạnh để kiểm tra hay phát lỗi bảo mật nhằm nâng cao tính an toàn hệ thống toàn mạng quan trọng Trong Nessus GFI LanGuard hai số chương trình rà soát lỗ hổng bảo mật mạng hàng đầu Nhưng GFI LanGuard phần mềm thương mại, Nessus lại phần mềm miễn phí hoàn toàn cho người dùng cá nhân, với sở liệu lỗ hổng phong phú cho hệ thống chạy Window hay Linux cập nhật thường xuyên Theo thống kê trang sectools.org, Nessus phần mềm quét lỗ hổng bảo mật phổ biến năm 2000, 2003 2006 Hãng Tenable ước tính sử dụng rộng rãi 75000 tổ chức toàn giới Việc dò tìm lỗ hổng bảo mật đóng vai trò quan trọng với quản trị viên hệ thống, chuyên gia bảo mật v.v… nhằm tìm biện pháp tăng cường bảo mật cho hệ thống, kẻ muốn công thực Tuy nhiên việc tìm thêm lỗ hổng tương đối khó khăn, phần lỗ hổng cũ sau công bố thời gian, nhà sản xuất tìm cách “vá” lại lổ hổng đó, phần người tìm lỗ hổng không muốn công khai rộng rãi Việc dò quét lỗ hổng Nessus thực dựa hai thành phần Nessus Engine NessusPluginNessus Engine đóng vai trò trình biên dịch để thực câu lệnh NessusPlugin Công cụ để xâydựngplugin ngôn ngữ kịch NASL (Nessus Attrack Scripting Language) Nội dung báo cáo chia làm phần: Chương 1: Tìm hiểu thành phần, cách cài đặt sử dụngNessus Chương 2: Tìm hiểu ngôn ngữ NASL, tiến tới tự xâydựngpluginchoNessus Do thời gian tìm hiểu ngắn kiến thức hạn chế, nên số nội dungNessus Engine, nhóm không sâu vào nghiên cứu CHƯƠNG 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 dựa án nguồn mở “Nessus Project”, đề xuất Renaud Deraison vào năm 1998, mã nguồn thành phần công bố công khai (các phiên Nessus trở trước) Từ tháng 10 năm 2005, Tenable Network Security, công ty Renaud Deraison đồng sáng lập, phát hành Nessus dạng mã nguồn đóng Tháng năm 2008, hãng Tenable đưa phiên cho phép người dùng cá nhân sử dụng đầy đủ plugin Tháng năm 2009, hãng phát hành Nessus 4.0.0, đến tháng năm 2012 phát hành Nessus 5.0 Nessus chạy nhiều tảng hệ điều hành khác nhau, bao gồm UNIX, Linux, Mac OS X, Windows Hiện phiên Nessus 5.0 chạy giao diện web, dễ dàng truy cập, sử dụng hệ điều hành 1.2 CÁC THÀNH PHẦN CỦA NESSUSNessus có thành phần chính: - Nessus Engine: nhận, thực thi trả lời lại yêu cầu quét người dùng Việc quét lỗ hổng thực theo dẫn plugin (một tập câu lệnh script ngôn ngữ kịch NASL) - Nessus Plugin: hệ thống file ngôn ngữ kịch NASL, gồm file định nghĩa inc file kịch nasl - Nessus Server (nessusd): thực nhận yêu cầu quét người dùng, sau phân tích, tổng hợp, trả lại kết choNessus client - Nessus Client: hiển thị kết quét lại cho người dùng thông qua trình duyệt web - Nessus Knowledge Base: “Cơ sở liệu biết” Nessuscho phép plugin sau tận dụng liệu kết Plugin trước Điều giúp Nessus dễ dàng mở rộng tăng tốc độ thực thi 1.2.1 Kiến trúc Nessus với mô hình Client-Server Ban đầu, Server tổng hợp tất lỗi bảo mật Khi máy tính Client yều cầu kiểm tra lỗi có tồn máy tính hay không, Tìm hiểu xâydựngPluginchoNessus sử dụng NASL Trang chúng phải kiểm tra xem có kết nối tới server hay không, sau kiểm tra kết nối chúng quét tùy thuộc vào mức độ yêu cầu quét Mô hình dựa vào kết sau máy Client yêu cầu kiểm tra, dựa vào lỗi xác định đưa những hướng giải cách nhanh 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 gì? - Mô hình đơn giản thu thập danh sách lỗi bảo mật khác thử nghiệm Nó cho phép bổ sung, chia sẻ thông tin hệ thống kiểm tra Phương thức hoạt động Nessus Knowledge Base: Giả sử thực quét kiểm tra lỗi bảo mật trang Server kma.com, trình kiểm tra hoàn tất không thấy lỗi bảo mật có Lúc Nessus Knowledge Base tạo cho máy chủ (/usr/local/var/nessus/users/mh/ kbs/kma.com) cho thấy khoảng 1800 lỗi, Người ta phải nhớ Nessus Knowledge Base có khoảng 1725 lỗi trusted Và thông số sử dụngcho nghiên cứu sau để đảm bảo liên tục cập nhật lỗi bảo mật 1.2.3 Mô hình NessusPluginNessusPlugin gì? - Là chương trình dùng để kiểm tra tính bảo mật trang web từ xa, máy tính cục hay thiết bị bảo vệ thông tin Hoạt động Nessus Plugin: Mô hình hoạt động NessusPlugin đơn giản, ta dùng gia diện dùng command line để quét Bằng việc sử dụngPlugin có sẵn sau cài để kiểm tra tính bảo mật Hình 1.2 Mô hình hoạt động NessusPlugin CHƯƠNG 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 Nessus phát hành với khả kiểm tra khoảng 50 lỗi bảo mật, biết plugin Những plugin cài đặt thư viện dùng chung, viết ngôn ngữ lập trình C, với phần mở rộng nes Mục đích phương pháp nhằm phân tách riêng module đảm nhận việc quét (engine scanning) với module hướng dẫn, thị quét Điều giúp choNessus có kiến trúc modul dễ dàng mở rộng Vào thời điểm đó, việc dùng thư viện dùng chung để viết plugin có nhiều ý nghĩa, giúp nhanh chóng tạo plugin dựa chương trình C sẵn có Tác giả viết script nhỏ gọi "plugin-factory" giúp biên dịch plugin viết C sang thư viện dùng chung (.nes) Ý tưởng người dùng muốn update plugin, họ download plugin viết C web, sau biên dịch cài đặt chúng Quá trình mang lại nhiều nguy không an toàn bảo mật, ý tưởng không phát triển Sau tìm kiếm ngôn ngữ script tại, Perl có lẽ ngôn ngữ tốt để viết plugincho Nessus, nhiên vào thời điểm Perl có số hạn chế: • • • Chiếm dung lượng nhớ lớn Không hỗ trợ tốt trình gửi/nhận gói tin thô (raw packet) Không có cách đáng tin cậy để kiểm tra máy ảo Điểm cuối quan trọng Từ góc nhìn mức cao, trình quét giống nhau: kết nối đến số cổng máy khách từ xa, thực số tác vụ, sau suy máy khách từ xa bị tổn thương với số luật cho trước hay không Cách tốt điều chỉnh tất tác vụ quét, để điều chỉnh chúng cách riêng rẽ, chuyển cho máy ảo thực Ví dụ, ta thêm khả hỗ trợ SSL vào Nessus, ta sửa plugin, ta cần chỉnh sửa hàm socket thực 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 Plugin hàm bổ sung tồn qua plugin bên Những module lại yêu cầu gói hàm thư viện hệ thống riêng Tác giả định viết ngôn ngữ Script gọi NASL dùng riêng choNessus (Nessus Attrack Scripting Language), với mục tiêu hướng đến: • • • • • • • • Mỗi script chứa file Dễ cài đặt với người dùng cuối Dễ tìm hiểu cho nhà phân phối, phát triển Chiếm dung lượng 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 mở rộng Hỗ trợ đa ngôn ngữ Kết ngôn ngữ NASL1 đời, có số điểm chưa hoàn thiện: chậm lỏng lẻo lỗi cú pháp, tổng thể làm tốt công việc Hơn 1000 lỗi kiểm tra bảo mật viết NASL1 Ban đầu tốc độ điều đáng quan tâm nhất, thời gian để thiết lập phiên kết nối TCP nhiều thời gian trình thông dịch NASL xử lý, phân tích cú pháp mã plugin Tuy nhiên, số lượng plugin tăng lên, người dùng bắt đầu sử dụngNessus quét nhiều host hơn, NASL1 thực trở nên chậm cho tác vụ Mã nguồn gốc khó mở rộng, định đơn giản viết lại NASL Vào năm 2001, thư viện libnasl viết lại Michel Arboi để mở rộng ngôn ngữ, sửa chữa khuyết điểm NASL1 Thư viện viết lại này, gọi với tên NASL2, trở thành thành phần lớn Nessus 2.0 Kể từ phiên 3.0, ngôn ngữ NASL2 tích hợp vào engine Những ưu điểm NASL2: • Script gói gọn: script NASL chứa code để kiểm tra luật dẫn choplugin Các file script có phần mở rộng đơn giản nasl • • • • • • • Dễ cài đặt với người dùng cuối: NASL có dạng tự đóng gói, cấu hình sử dụng với thư viện OpenSSL Người dùngdùng trình biên dịch GCC GNI Bison (bison) dễ dàng xâydựng cài đặt trình thông dịch NASL Dễ dàng tìm hiểu với nhà phân phối, phát triển: NASL trông giống C, với vài điểm Perl Nếu lập trình với ngôn ngữ trên, việc học NASL dễ Điểm khác biệt lớn NASL C phần trỏ quản lý nhớ Chiếm dung lượng nhớ: Thông thường, Nessus yêu cầu vài trăm KB nhớ, load nhiều plugin đồng thời Thiết kế dành riêng cho kiểm tra bảo mật mạng: NASL thiết kế để thiết lập kết nối, gửi nhận liệu, xử lý kết Nó có số lượng lớn hàm thư viện cài đặt cho giao thức mức cao Ví dụ giao thức SMB, NFS, RPC, SMTP, HTTP, v.v… Tất thư viện viết NASL Độ bảo mật cao: NASL truy cập vào hệ thống file cục bộ, thực câu lệnh hệ thống, kết nối tới máy khách bên thứ (nó kết nối tới host thực kiểm tra) Việc trỏ quản lý nhớ, giúp tránh lỗi tràn đệm Điều làm cho NASL trở thành ngôn ngữ an toàn giảm thời gian thiết kế plugin Dễ chỉnh sửa mở rộng: Phiên trình thông dịch NASL có ngôn ngữ sáng, giúp việc thêm toán tử hàm dễ, có khả tương thích ngược với thư viện cũ Hỗ trợ đa ngôn ngữ: NASL hỗ trợ đa ngôn ngữ, giới hạn ngôn ngữ mã hóa với bảng ký tự ASCII Có nhiều ngôn ngữ Nhật Bản, biểu diễn bảng mã ASCII mở rộng 2.1.2 Điểm khác biệt NASL1 NASL2 • NASL2 sử dụng trình phân tích cú pháp Bison, chặt chẽ xử lý kiểu diễn đạt phức tạp • NASL2 có nhiều hàm xâydựng sẵn (mặc dù hầu hết hàm chuyển tương thích với NASL1) • NASL2 có nhiều toán tử tích hợp • NASL2 nhanh (khoản tầm 16 lần) • Hầu hết script NASL2 chạy với NASL1 • Một vài script NASL1 chạy với NASL2 (nhưng việc sửa tương đối dễ dàng) NASL2 có hàm chức xử lý mảng 2.1.3 NASL2 ngôn ngữ thông dịch, tựa C “Thông dịch” đặc điểm chung ngôn ngữ script Nhưng NASL2 có thuận lợi lớn cho người muốn tìm hiểu, cú pháp gần giống ngôn ngữ lập trình C (từ cách khai báo biến, toán tử, vòng lặp, v.v…) Nó thành phần phức tạp C (biến trỏ, quản lý vòng lặp), khiến cho ngữ pháp NASL2 trở nên đơn giản, dễ hiểu Ví dụ nội dung file script test-yahoo.nasl: Ta chạy thử script NASL2 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ơ quy tắc viết chương trình • Chú thích bắt đầu tính từ dấu “#” đầu dòng, trình thông dịch bỏ qua • Có thể thêm khoảng trắng tùy ý từ, toán tử Khoảng trắng dấu cách, tab • Chuỗi phân tích phân tích từ vựng, sau trả lại kết phân tích ngữ pháp - Bộ phân tích trả lại thông báo dài, gặp kiểu diễn tả a+++++b, hiểu thành a++ ++ + b (a++ ++) + b giống ANSI C Khi ta nên viết a++ + ++b - Không thể thêm khoảng trắng vào chuỗi đa ký tự Ví dụ x = a + +; không chấp nhận, nên viết x = a ++; 2.2.2 Cú pháp Cú pháp câu lệnh NASL: • • • • • • • • • [decl_list]instr_decl instr_decl instr_decl_list [instr_decl]instr func_decl; [func_decl]function identifier ( arg_decl ) block [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 [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 10 • • ftp_log_in thực định danh/xác thực FTP socket mở Trả lại TRUE login thành công, FALSE ngược lại Nó nhận đối số: - user tên username, không có, giá trị mặc định “anonymous” “ftp” - pass mật truy cập, không có, giá trị mặc định email - socket start_denial khởi tạo số cấu trúc liệu nội 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ỏ khoảng trắng cuối Khoảng trắng dấu cách, tab, Enter, xuống dòng • crap trả đệm chiều dài yêu cầu Hàm chủ yếu dùng kiểm tra lỗi tràn đệm Các đối số nó: - length kích cỡ đệm - data liệu muốn lặp lại để lấp đầy đệm, mặc định ký tự „X‟ • display nhận không giới hạn số đối số, gọi chuỗi, sau hiển thị Nó trả số lượng ký tự hiển thị Những ký tự hiển thị, thay “.” • egrep tìm kiếm đoạn mẫu chuỗi, dòng một, trả kết dòng chứa mẫu ký tự cần kiểm tra Các đối số: - icase - pattern - string • ereg so sánh chuỗi lặp lại trùng khớp, trả chuỗi tìm Các đối số: - string, - multiline, mặc định mang giá trị FALSE, thiết lập thành TRUE để tìm kiếm nhiều dòng - pattern - icase, mặc định mang giá trị FALSE, sửa lại thành TRUE muốn tìm kiếm phân biệt chữ hoa/chữ thường • ereg_replace tìm kiếm thay tất mẫu xuất chuỗi Trả kết chuỗi sửa đổi, chuỗi gốc mẫu trùng Các đối số: - string, chuỗi gốc ban đầu - pattern, mẫu cần so khớp - replace, mẫu cần thay 28 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 chuỗi, trả NULL không trùng, trả mảng chứa tất mẫu tìm thấy Các đối số: - icase - pattern - string hex chuyển đổi số nguyên sang dạng hexa Kết trả chuỗi hexstr chuyển liệu kiểu chuỗi ASCII sang dạng chuỗi hexa cho ký tự Ví dụ: hexstr('aA\n') trả '61410a' insstr nhận đối số: chuỗi thứ nhất, chuỗi thứ 2, số bắt đầu, số kết thúc Chỉ số Hàm tiến hành thay số thứ đến số kết thúc chuỗi thứ chuỗi thứ Ví dụ: insstr('abcdefgh','xyz',3,5)sẽ 'abcxyzgh' int chuyển đổi chuỗi sang dạng số nguyên, đối số dạng chuỗi, trả match so sánh chuỗi với mẫu kiểm tra đơn giản, kết trả TRUE FALSE Hàm không mạnh hàm ereg nhanh đơn giản Các đối số: - icase phân biệt chữ hoa/chữ thường - string chuỗi đầu vào - pattern chuỗi cần tìm kiếm, dùng ký tự đại diện *(cho ký tự), ?(cho ký tự bất kỳ) ord trả mã ASCII ký tự raw_string str_replace thay chuỗi chuỗi lớn hơn, trả chuỗi sửa Các đối số: - string chuỗi ban đầu - find chuỗi cần tìm - replace chuỗi cần thay - count tùy chọn, thiết lập, hàm dừng sau đạt đến số lần biến count string nhận đối số bất kỳ, trả chuỗi chuyển đổi strcat nhận số làm đối số, trả chuỗi chuyển đổi, kết phép toán: - Số nguyên chuyển sang dạng ASCII - Biến chưa định nghĩa bỏ qua - Mảng chuyển sang dạng ASCII - Các chuỗi lại giữ nguyên - • • • • • • • • • • • 29 • • • • • • • stridx nhận tham số bất kỳ, tìm kiếm chuỗi chuỗi lớn, vị trí tùy chọn, trả lại kết số (hoặc -1 không tìm thấy) Các đối số: - string chuỗi ban đầu (chuỗi cha) - substring chuỗi cần tìm - position vị trí bắt đầu tìm, mặc định strstr nhận chuỗi làm đối số, trả lại kết từ phần giống hết chuỗi dài hơn, không trùng trả kết NULL Ví dụ: strstr('zabadz', 'ad') trả 'adz' split tách chuỗi thành chuỗi nhỏ mảng dòng strlen trả độ dài chuỗi, đối số chuỗi, kết nhận không xác định substr nhận đối số: chuỗi ký tự, số đầu, số cuối Ví dụ: substr('abcde', 2) trả 'cde' substr('abcde', 1, 3) trả 'bcd' tolower chuyển chuỗi sang dạng chữ thường toupper chuyển chuỗi sang dạng chữ hoa 2.3.2.7 Các hàm HTTP Để sử dụng hàm HTTP, ta nên khai báo include(“http_function.inc”); include(“http_keepalive.inc”); script Các hàm thư viện cung cấp chức đơn giản, hiệu truy cập tới giao thức HTTP Khi viết script sử dụng hàm này, ta nên thiết lập “http_version.nasl” plugin độc lập Các hàm HTTP gồm có: • • • • • • cgibin đối số, trả kết đường dẫn cgi-bin trang web Ta sử dụng hàm cgi_dirs() để thay http_delete gửi request http_delete tới cổng mở server Nó tự động xử lý HTTP_version cookie xác thực Nhận đối số port item (the URL) Trả kết chuỗi request định dạng http_get gửi request http_get tới server Nhận đối số port item (the URL) Trả kết chuỗi request định dạng http_close_socket đóng socket mở http_head gửi request http_head tới server Nhận đối số port item (the URL) Trả kết chuỗi request định dạng http_open_socket mở socket cổng yêu cầu Đến phiên Nessus 2.0.10, hàm giống hàm open_sock_tcp, sau thiết lập 64KB nhớ cho việc truyền nhận liệu 30 • • • • http_recv_headers nhận tất liệu http_header socket yêu cầu (số nguyên làm đối số) Nó dừng gặp dòng trống đầu tiên, trả lại chuỗi chứa tất headers mã trả lời HTTP http_post gửi request http_post tới server Nhận đối số port item (the URL) Trả kết chuỗi request định dạng http_put gửi request http_put tới server Nhận đối số port item (the URL) Trả kết chuỗi request định dạng is_cgi_installed kiểm tra xem CGI có cài đặt không, tìm kiếm đường dẫn cgi-bin Hàm trả cổng web server tìm thấy Nó nhận đối số: - item, cho đường dẫn CGI - port, mặc định tìm tất 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 liệu IP datagrams với liệu ICMP Trường ip_p không cập nhật tự động Các đối số: - data phần payload - icmp_cksum mã kiểm tra, tính tự động - icmp_code - icmp_id - icmp_seq ICMP sequence number - icmp_type o ip IP datagram cập nhật - update_ip_len cờ, mặc định TRUE NASL tính toán lại kích thước trường IP datagram • forge_igmp_packet điền đầy liệu IP datagrams với liệu IGMP Trường ip_p không cập nhật tự động Các đối số: - code - data - group - ip IP datagram cập nhật Mã kiểm tra IGMP tính tự động - type - update_ip_len cờ, mặc định TRUE NASL tính toán lại kích thước trường IP datagram 31 • • • forge_ip_packet trả lại kết IP datagram gói tin Các đối số: - data phần payload - ip_hl độ dài IP header, kiểu số nguyên 32bit, giá trị mặc định - ip_id IP datagram ID, mặc định giá trị ngẫu nhiên - ip_len chiều dài datagram, mặc định 20 - ip_off địa offset fragment, dạng số nguyên 64bit, mặc định - ip_p IP Protocol, mặc định - ip_src địa IP nguồn dạng ASCII NASL tự động chuyển sang dạng số nguyên - ip_sum mã kiểm tra packet header Được tính tự động - ip_tos IP type of service (kiểu dịch vụ IP), mặc định - ip_ttl trường “time to live”, mặc định 64 - ip_v IP version, mặc định forge_tcp_packet điền đầy IP datagram với liệu TCP Trường ip_p không cập nhật tự động Các đối số: - data liệu phần TCP payload - ip IP datagram cần điền đầy liệu - th_ack ACK number - th_dport cổng đích - th_flags cờ TCP - th_off kích cỡ trường TCP header dạng số nguyên 32bit, mặc định - th_seq TCP sequence number - th_sport cổng nguồn - th_sum mã kiểm tra TCP, tính tự động - th_urp urgent pointer, mặc định - th_win kích thước cửa sổ trượt, mặc định - th_x2 trường dự trữ - update_ip_len cờ, mặc định TRUE NASL tính toán lại kích thước trường IP datagram forge_udp_packet điền đầy IP datagram với liệu UDP Trường ip_p không cập nhật tự động Các đối số: - data liệu phần payload - ip datagram cũ - uh_dport cổng đích - uh_sport cổng nguồn - uh_sum UDP checksum - uh_ulen độ dài liệu 32 update_ip_len cờ, mặc định TRUE NASL tính toán lại kích thước trường IP datagram get_icmp_element lấy thông tin trường ICMP datagram Các đối số: - element tên trường TCP - icmp ICMP datagram get_ip_element lấy thông tin trường datagram Các đối số: - element tên trường, ví dụ: ip_src, ip_len - ip datagram fragment get_tcp_element lấy thông tin TCP IP datagram Các đối số: - element tên trường TCP - tcp IP datagram get_udp_element lấy thông tin UDP IP datagram Các đối số: - element tên trường TCP - udp IP datagram insert_ip_options thêm tùy chọn IP datagram, trả lại datagram chỉnh sửa Các đối số: - code số cho tùy chọn - length tùy chọn độ dài liệu - ip datagram cũ - value liệu tùy chọn pcap_next lắng nghe, ghi lại packet Các đối số: - interface tên giao diên mạng - pcap_filter lọc BPF filter Mặc định lắng nghe thứ - timeout mặc định giây set_ip_elements chỉnh sửa số trường datagram set_tcp_elements chỉnh sửa trường TCP datagram set_udp_elements chỉnh sửa trường UDP datagram send_packet gửi packet, sau lắng nghe phản hồi Các đối số: - length độ dài packet - pcap_active mặc định TRUE - pcap_filter lọc BPF - pcap_timeout mặc định giây - • • • • • • • • • • 2.3.2.9 Các hàm mật mã Các hàm cài đặt Nessus liên kết với thư viện OpenSSL • • • HMAC_DSS(data, key): trả lại kết chuỗi xác thực thông báo HMAC_MD2(data, key): trả lại kết chuỗi xác thực thông báo HMAC_MD4(data, key): trả lại kết chuỗi xác thực thông báo 33 • • • • • • • • • • HMAC_MD5(data, key): trả lại kết chuỗi xác thực thông báo HMAC_RIPEMD160(data, key): trả lại kết chuỗi xác thực thông báo HMAC_SHA(data, key): trả lại kết chuỗi xác thực thông báo HMAC_SHA1(data, key): trả lại kết chuỗi xác thực thông báo MD2(String): trả lại kết chuỗi tóm lược MD4(String): trả lại kết chuỗi tóm lược MD5(String): trả lại kết chuỗi tóm lược RIPEMD160(String): trả lại kết chuỗi tóm lược SHA(String): trả lại kết chuỗi tóm lược SHA1(String): trả lại kết chuỗi tóm lược 2.3.2.10 Các hàm không an toàn Các hàm phép thực thi từ script đánh dấu tin cậy • • • • • • • • • find_in_path tìm kiếm câu lệnh đường dẫn $PATH, trả lại TRUE tìm thấy, FALSE ngược lại pread khởi động tiến trình, đối số: - cmd tên chương trình, dạng tuyệt đối, dạng tương đối, tìm kiếm $PATH - argv danh sách đối số, argv[0] tên chương trình, argv[1] đối số thứ - cd biến lôgic, mặc định FALSE - nice xác định độ ưu tiên tiến trình file_close đóng file mở, trả lại thành công, NULL có lỗi xảy file_open mở file Có đối số: - mode chế độ mở file Ví dụ: r(read), w(write) - name tên file file_read đọc nội dung file Có đối số: - fp biến file cần đọc - length độ dài liệu cần đọc file_seek đọc file vị trí định - fp biến file cần đọc - offset địa offset tuyệt đối (tính từ vị trí bắt đầu file) file_stat nhận thông tin trạng thái file file_write ghi liệu vào file Có đối số: - fp biến file cần ghi - data liệu cần ghi fread đọc file từ Nessus server Nhận đối số chuỗi tên file Trả nội dung file thành công, NULL có lỗi 34 • • • fwrite ghi file lên Nessus server Nếu thành công trả byte ghi được, có lỗi trả NULL Nhận đối số: - data liệu cần ghi lên - file tên file cần ghi get_tmp_dir trả đường dẫn chứa file tạm thời unlink loại bỏ file Nessus server Nhận đối số tên file 2.3.3 Các file thư viện NASL Các file thư viện NASL có ý nghĩa tương tự với file header C, có phần mở rộng “.inc”, khai báo đầu file script nasl với câu lệnh include(“http_func.inc”) Trong file thư viện, cài đặt hàm tích hợp sẵn (built-in function) 2.3.3.1 dump.inc • dump(ddata, dtitle): In toàn liệu, tiêu đề kênh xuất chuẩn Thường dùng chế độ gỡ rối • hexdump(ddata): In liệu dạng hexa 2.3.3.2 ftp_func.inc Cung cấp 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 cách gửi request “QUIT”, sau đợi trả lời đóng kết nối get_ftp_banner(port): lấy FTP banner, đối số tên cổng ftp_recv_line(socket): lấy liệu dòng từ socket, nhận ký tự thứ khác “-” Dùng muốn dừng nhận banner dài 2.3.3.3 http_func.inc Cung cấp 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 URL định get_cgi_path(port): lấy đường dẫn cgi-bin server get_http_banner(port): lấy HTTP banner port 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 mã HTTP trả lời khoản 400 – 409, ngược lại FALSE http_is_dead(port, retry): Cố gắng kiểm tra xem http server có hoạt động hay không Kết trả lời TRUE thuộc trường hợp sau: 35 Kết nối bị từ chối Không nhận phản hồi HTTP hợp lệ Lỗi 502 (bad gateway), 503(service unavailable) http_recv_body(socket, headers, length): đọc N byte từ socket N định nghĩa sau: Nếu header trường không định nghĩa, gọi hàm http_recv_headers; trường “Content-Length” lấy từ header - Nếu trường length thiết lập: o Nếu content_length lấy từ header, N = max(length, - • • • • • content_length) o Nếu không N=length - Nếu content_length lấy từ header, N= content_length - Nếu khác, mặc định N= 8192 bytes http_recv(socket, code): lấy HTTP header liệu từ socket Code 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 nội dung locate_cgi(port, item): tìm kiếm ứng dụng chạy CGI webserver php_ver_match(banner, pattern): kiểm tra phiên PHP server Nếu trùng trả 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ả tất đường dẫn CGI (thường /cgi-bin /scripts) 2.3.3.4 http_keepalive.inc Từ phiê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 phiên kết nối Giúp tiết kiệm băng thông, CPU đặc biệt kết nối SSL/TLS Để hàm hoạt động tốt, ta nên khai báo include(“http_func.inc”); vào chương trình • • http_keepalive_send_recv(port, req): gửi request req tới server từ xa port kết nối req HTTP request, tương tự http_get() is_cgi_installed_ka(port, item): tương tự is_cgi_installed() với kết nối kept-alive 36 • check_win_dir_traversal_ka(port, url, quickcheck): tương tự check_win_dir_traversal() với kết nối kept-alive 2.3.3.5 nfs_func.inc Chứa hàm hỗ trợ xử lý với hệ thống file mạng Ta nên khai báo include(“misc.inc”); include(“nfs_func.inc”); để tránh lỗi Khi làm việc với giao thức NFS, ta cần socket UDP đặc quyền (cổng 1024 thấp hơn); để tương tác với nfsd deamon (RPC 100003), để truy cập tới mountd deamon (RPC 100005) Sau ví dụ: Các hàm 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 socket UDP kết nối tới máy chia sẻ Trả NULL có lỗi, danh sách file 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ỏ fid soc socket UDP kết nối tới máy chia sẻ cwd(soc, fid, dir): lệnh chuyển thư mục soc socket UDP kết nối tới máy chia sẻ, fid thư mục tại, dir thư mục muốn chuyển sang 2.3.3.6 smb_nt.inc Thư viện SMB cung cấp hàm tương tác với hệ thống file chia sẻ Windows sử dụng giao thức SMB, qua cổng 139 445 Do hầu hết giao thức Microsoft tài liệu miêu tả đầy đủ, nên hàm thiết kế nhờ vào trình phân tích gói tin • Các hàm thiết lập phiên kết nối SMB: 37 smb_session_request(soc, remote) smb_neg_prot(soc) smb_session_setup(soc, login, password, domain, prot) session_extract_uid(reply) Hàm kết nối đọc liệu chia sẻ: - smb_tconx(soc, name, uid, share) - tconx_extract_tid(reply) - OpenAndX(socket, uid, tid, file) - ReadAndX(socket, uid, tid, count, off) - smb_get_file_size(socket, uid, tid, fid) Truy cập registry từ xa - smbntcreatex(soc, uid, tid) - smbntcreatex_extract_pipe(reply) - pipe_accessible_registry(soc, uid, tid, pipe) - registry_access_step_1(soc, uid, tid, pipe) - registry_get_key(soc, uid, tid, pipe, key, reply) - registry_get_item_sz(soc, uid, tid, pipe, item, reply) - registry_decode_sz(data) - registry_get_item_dword(soc, uid, tid, pipe, item, reply) - registry_decode_dword(data) - registry_get_key_security(soc, uid, tid, pipe, reply) - registry_key_writeable_by_non_admin(security_descriptor) Truy cập SAM - OpenPipeToSamr(soc, uid, tid) - SamrConnect2(soc, tid, uid, pipe, name) - SamrEnumDomains(soc, uid, tid, pipe, samrhdl) - SamrDom2Sid(soc, tid, uid, pipe, samrhdl, dom) - SamrOpenDomain(soc, tid, uid, pipe, samrhdl, sid) - SamrOpenBuiltin(soc, tid, uid, pipe, samrhdl) - SamrLookupNames(soc, uid, tid, pipe, name, domhdl) - SamrOpenUser(soc, uid, tid, pipe, samrhdl, rid) - SamrQueryUserGroups(soc, uid, tid, pipe, usrhdl) - SamrQueryUserInfo(soc, uid, tid, pipe, usrhdl) - SamrQueryUserAliases(soc, uid, tid, pipe, usrhdl, sid, rid) - • • • 2.3.3.7 smtp_func.inc Chứa 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 mở Trả lại TRUE thông báo chấp nhận chuyển đi, FALSE có lỗi 38 • • • • • smtp_send_port(port, from, to, body): mở socket cổng định, để gửi thông báo SMTP , sau đóng socket Trả lại TRUE thông báo chấp nhận chuyển đi, FALSE có lỗi smtp_from_header(): lấy giá trị trường “From” từ header Nếu khoản mục SMTP/headers/from KB không thiết lập, giá trị mặc định nessus@example.com smtp_to_header(): lấy giá trị trườn “To” từ header Nếu khoản mục SMTP/headers/from KB không thiết lập, giá trị mặc định postmaster@[1.2.3.4] , 1.2.3.4 địa IP cần gửi đến get_smtp_banner(port): lấy banner SMTP smtp_recv_banner(socket): đọc liệu theo dòng từ socket, trả lại dòng không bắt đầu “220-” 2.3.3.8 Các hàm thư viện khác Trên Windows, hàm thư viện (.inc) lưu trữ với script (.nasl) đường dẫn: C:\Program Files\Tenable\Nessus\nessus\plugins Bảng 2.2 Một số hàm thư viện Nessus Tên thư viện aix.inc backport.inc byte_func.inc charset_func.inc cisco_func.inc crypto_func.inc dns_func.inc ftp_func.inc hostlevel_func.inc hpux.inc http_func.inc imap_func.inc ip.inc/ip6.inc kerberos_func.inc Giao thức N/A Chỉ dẫn Thư viện quét máy chạy hệ thống AIX N/A Kiểm tra vá phiên hệ điều hành N/A Hàm xử lý byte N/A Chuyển đổi kiểu bảng mã ASCII/EBCDIC Cisco Devices Lấy thông tin từ thiết bị hãng Cisco N/A Các hàm thư viện mã hóa MD5, MD4, NTLM, DES, RC4, … DNS Hàm thư viện xử lý truy vấn DNS FTP Hàm thao tác với giao thức FTP RHàm thư viện cho giao thức truy cập PROTOCOL từ xa rmote, rlogin, rexec, … N/A Thư viện quét hệ thống HPUX HTTP Thư viện tương tác với HTTP IMAP Thư viện tương tác với giao thức IMAP IPv4, IPv6 Thư viện IPv4, IPv6 KRB Thư viện tương tác với giao thức Kerberos 39 ldap.inc misc_func.inc mysql_func.inc nfs_func.inc LDAP N/A MYSQL NFS nntp_func.inc NNTP pop3_func.inc raw.inc smb_file_funcs.in c smb_func.inc smtp_func.inc smnp_func.inc POP3 N/A SMB solaris.inc ssh_func.inc N/A SSH ssl_funcs.inc tcp.inc telnet_func.inc tftp.inc udp.inc url_func.inc SSL TCP Telnet TFTP UDP N/A SMB SMTP SMNP Thư viện tương tác với LDAP Thư viện Knowledge Base function Thư viện tương tác với CSDL MySQL Thư viện tương tác hệ thống file mạng NFS Thư viện tương tác với giao thức NNTP (Network New Transport Protocol) Thư viện tương tác với giao thức POP3 Thư viện xử lý gói tin “raw packet” Thư viện nhận file chia sẻ Thư viện SMB Thư viện tương tác với giao thức SMTP Thư viện tương tác với giao thức SNMP (Simple Network Managent Protocol) Thư viện quét hệ thống chạy Solaris Thư viện tương tác với SSH(Secure Shell) Thư viện tương tác với SSL,HTTPS Thư viện tương tác với TCP(IPv4 IPv6) Thư viện tương tác với Telnet Thư viện tương tác với TFTP Thư viện tương tác với UDP Thư viện encode, decode URL theo RFC 2396/RFC2732 2.4 XÂYDỰNGPLUGINCHONESSUS 40 KẾT LUẬN Qua trình tìm hiểu, thực nhóm đạt số kết sau: - Đã tìm hiểu cấu trúc, thành phần Nessus Biết cách sử dụngNessus để quét lỗ hổng Đã tiến hành tìm hiểu cấu trúc ngôn ngữ script NASL, thử nghiệm số script đơn giản 41 TÀI LIỆU THAM KHẢO 42 ... - Nessus Client: hiển thị kết quét lại cho người dùng thông qua trình duyệt web - Nessus Knowledge Base: “Cơ sở liệu biết” Nessus cho phép plugin sau tận dụng liệu kết Plugin trước Điều giúp Nessus. .. hình Nessus Plugin Nessus Plugin gì? - Là chương trình dùng để kiểm tra tính bảo mật trang web từ xa, máy tính cục hay thiết bị bảo vệ thông tin Hoạt động Nessus Plugin: Mô hình hoạt động Nessus. .. Kiến trúc Nessus với mô hình Client-Server Ban đầu, Server tổng hợp tất lỗi bảo mật Khi máy tính Client yều cầu kiểm tra lỗi có tồn máy tính hay không, Tìm hiểu xây dựng Plugin cho Nessus sử