HỌC VIỆN KỸ THUẬT MẬT MÃ
KHOA AN TỒN THƠNG TIN
BÀI TẬP LỚN
MƠN AN TỒN INTERNET VÀ THƯƠNG MẠI ĐIỆN TỬ
Đề tài:
TÌM HIỂU XÂY DỰNG PLUGIN CHO NESSUS SỬ
DỤNG NASL
Giảng viên: Nguyễn Hồng Hà
Sinh viên thực hiện:
Nguyễn Tuấn Anh
Nguyễn Thị Hồng Ngoan
Nguyễn Thu Thùy
Lớp: AT7A
HÀ NỘI, 2014
MỤC LỤC
LỜI NĨI ĐẦU
Ngày nay, cơng nghệ thơng tin phát triển như vũ bão song hành với sự phát triển của
nó là sự phát triển của những phần mềm độc hại,sâu, virus… nhằm phá hoại hệ thống của
chúng ta. Chúng tận dụng những điểm yếu của hệ thống để phá hoại . Vì vậy, chúng ta phải
đánh giá những điểm yếu của hệ thống từ đó đưa ra hướng giải quyết. Trong đó Nessus là
chương trình rất nổi tiếng để dị, quét ra các lỗ hổng. Nessus thực hiện nhiệm vụ dựa theo các
kịch bản đã được định nghĩa sẵn gọi là các plugin. Các plugin này được viết bằng ngôn ngữ
NASL (Nessus Attack Scripting Language).
Vì vậy, nhóm xin trình bày đề tài tìm hiểu xây dựng plugin cho Nessus sử dụng
NASL. Trong giới hạn của đề tài, nhóm chia đề tài thành hai chương như sau:
•
Chương 1: Tổng quan về Nessus: Chương này nhóm sẽ tìm hiểu tổng quan về Nessus
•
như chức năng, kiến trúc.
Chương 2: Viết plugin cho Nessus trên NASL: Chương này nhóm sẽ tìm hiểu về
ngơn ngữ NASL, cách sử dụng các hàm, tìm hiểu các thư viện và viết một plugin đơn
giản cho Nessus.
Nhóm sinh viên thực hiện
Chương 1: TỔNG QUAN VỀ NESSUS
1.
Lỗ hổng là gì? Điểm yếu là gì?
Lỗ hổng là bất kì lỗi lập trình hoặc cấu hình sai mà có thể cho phép một kẻ xâm nhập
truy cập trái phép. Điều này bao gồm bất cứ điều gì từ một mật khẩu yếu đến một chương
trình chưa được vá lỗi trong dịch vụ mạng. Lỗ hổng đã trở thành yếu tố đằng sau hầu hết sâu
mạng, các phần mềm gián điệp và những mã độc khác.
Điểm yếu là nơi trong hệ thống dễ bị tấn cơng nhất nhưng nó chưa bị khai thác để thực
hiện hành vi trái phép.
Việc đánh giá các lỗ hổng được một công cụ thực hiện rất đầy đủ là Nessus.
2.
Cơng cụ qt lỗ hổng Nessus
2.1.Lịch sử hình thành
Vào năm 1998, danh sách các lỗ hổng vẫn chưa phát triển thành một cơ sở dữ liệu đầy
đủ và việc nghiên cứu được thực hiện kín trên ngân sách eo hẹp. Các máy qt lỗ hổng
thương mại thì có chi phí đắt đỏ. Còn máy quét lỗ hổng mã nguồn mở mới nhất, the Security
Administrator Tool for Analyzing Networks(SATAN), thì khơng thể vượt qua được máy quét
thương mại. Internet thì phát triển tăng vọt dẫn đến sự gia tăng các thử nghiệm để kiểm tra
tính an tồn của nó. Từ đó, Renaud Deraison[2] đã tạo ra dự án mã nguồn mở được gọi là
Nessus. Đó là câu trả lời cho việc giá của máy quét thương mại ngày càng tăng và sự trì trệ
của dự án SATAN. Ngay lập tức, cộng đồng sử dụng Nessus đã phát triển nhanh chóng.
Ngày 5 tháng 10 năm 2005, Tenable Network Security, một công ty do Renaud
Deraison đồng sáng lập, thông báo rằng phiên bản tiếp theo của Nessus, Nessus 3, sẽ khơng
cịn mã nguồn mở nữa. Cơ cấu( engine) của Nessus 3 thì vẫn miễn phí cho phép cộng đồng
phát hành các bản cập nhật plugin nhưng chi phí cho dịch vụ và rà sốt lỡ hổng mới nhất thì
được tính. Một vài nhà phát triển đã chia thành 2 hướng phát triển độc lập dựa trên Nessus
như OpenVAS và Porz-Wahn[2].
Nessus 2 vẫn được cập nhật khi Nessus 3 đã phát hành được một thời gian.
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.
Nessus cho phép bạn quét từ xa để xác định mạng của mình có bị xâm nhập hay khơng
và nó cũng cung cấp các tính năng để qt cục bộ trên một máy tính cụ thể.
Dowload phiên bản mới nhất về cài đặt tại:
/>
2.2.Các kiến trúc cơ bản của Nessus
Các thuật ngữ:
•
•
•
•
•
Policy – thiết lập cấu hình cho tiến trình quét.
Scan – kết hợp danh sách IPs và/hoặc tên miền với chính sách.
Report – kết quả của việc quét.
Plugin – một kiểm tra an ninh hay một cửa sổ cài đặt quét.
Plugin family – một nhóm plugin với một điểm chung ( ví dụ: FTP, Web
servers, Cisco)
Kiến trúc của Nessus bao gồm[1]:
•
•
•
Nessus Client và Server
Nessus plugins
Nessus Knowledge Base
2.2.1. Client và Server
Đầu tiên, máy quét lỗ hổng đều dựa trên client. Một nhà tư vấn dùng máy tính của
mình để vào trang web của khách hàng và đứng ở vị trí tốt nhất trong mạng để tiến hành qt.
Qt trong bất kì khơng gian địa chỉ mạng nào có thể mất một ngày hoặc đến vài ngày, phụ
thuộc vào chiều rộng của mạng và độ sâu của thông số quét. Điều này làm cho máy tính
khơng làm được gì trong thời gian qt. Nessus đã đưa ra mơ hình client/server để giải quyết
vẫn đề trên. Sau khi kết nối đến Server, server sẽ phân tách client để quét lỗ hổng và client
vẫn có thể dùng tài nguyên của mình cho việc khác đến khi cơng việc hồn thành. Mơ hình
kiến trúc này cung cấp sự linh hoạt để triển khai máy quét (server) và kết nối với giao diện đồ
họa của khách hàng (client) từ bất kì máy tính nào với một trình duyệt web. Điều này giúp
giảm chi phí quản lý, một máy chủ có thể được truy cập bởi nhiều máy khách.
Hình 1.: Mơ hình kiến trúc client-server
2.2.2. Plugins
Các máy quét an ninh truyền thống yêu cầu cập nhật từ nhà cung cấp để kiểm tra
những lỗ hổng mới nhất và thường phát hành các bản cập nhật không kịp thời. Nessus cung
cấp NASL (Nessus Attack Scripting Language) – sẽ được tìm hiểu cụ thể vào chương 2 – cho
phép phân tích để nhanh chóng tạo ra plugin cho việc kiểm tra lỗ hổng.
2.2.3. Knowledge Base
Kiến trúc Knowledge base cho phép những plugin của ngày hôm nay tận dụng dữ liệu
thu thập được bởi các plugin trước đó. Nó đơn giản là danh sách các thơng tin thu thập được
về một máy chủ. Ta xét một kiểm tra an ninh để kiểm tra sự tồn tại của một máy chủ web và
nếu tìm được thì kiểm tra xem HTTP có thực sự đang chạy khơng? Plugin có khả năng thiết
lập giá trị biến trong Nessus knowledge base cho host. Các kịch bản NASL sẽ thực thi và tìm
thấy Apache đang chạy trên host từ xa. Các plugin sau đó sẽ thiết lập biến cơ sở cho máy chủ
cụ
thể
“www/banner/80”
đến
“Apache/1.3.29(Unix)PHP/4.3.4
mod_ssl/2.8.16
Openssl/0.9.7a”[2]. Điều này cho phép tất cả các plugin sau đó có thể đọc giá trị của
“www/banner/80”. Giả sử, một plugin khác đọc giá trị này. Nếu nó tìm thấy chuỗi
“Openssl/0.9.7a” trong giá trị trả về, nó thơng báo rằng máy chủ có thể bị tổn thương do một
phiên bản lỗi thời của Openssl. Như vậy, mỗi plugin sử dụng thông tin đã thu được bằng cách
bổ sung các plugin trước. Điều này sẽ giúp mở rộng khả năng của Nessus và tăng hiệu suất
của các tính năng plugin.
Knowledge base được lưu trên Nessus server và được tạo mặc định trên đường dẫn
/opt/nessus/var/nessus/users/<username>/kbs , <username> là người muốn kiểm tra.
2.3. Tường lửa trên server
Nếu Nessus server được cấu hình trên máy chủ với một phần mềm firewall chuyên
nghiệp thì các kết nối phải được sự cho phép của địa chỉ IP client. Theo mặc định thì cổng
8834 được dùng cho Nessus web server[5].
Tuy nhiên, Firewall thường có bảng dịch địa chỉ và những kết nối nhanh của Nessus
dẫn đến firewall để mất những kết nối cũ hơn[2]. Việc này làm ảnh hưởng đến cả người dùng
và việc quét lỗ hổng. Bằng cách phân phối các máy chủ Nessus xuyên suốt mạng mà vấn đề
trên được bỏ qua và có thể tự động quét định kì, đảm bảo một mạng tổng thể mạnh mẽ hơn.
Mơ hình như sau:
Hình 1.: Tường lửa dựa vào máy chủ Nessus
2.4. Nền (Background)
•
Qt thơng minh: Nessus khơng cho rằng một dịch vụ nhất định được chạy trên
một cổng cố định. Vì vậy, nếu bạn chạy máy chủ web trên cổng 1234 thì nó sẽ
•
phát hiện và kiểm tra một cách thích hợp.
Modulo kiến trúc: kiến trúc khách chủ cũng cấp sự linh hoạt để triển khai các
•
máy qt (server) và client.
Tương thích CVE: hầu hết các plugin liên kết đến CVE để quản trị viên lấy
thêm thông tin về các lỗ hổng cơng cộng. chúng cũng bao gồm tài liệu để
•
Bugtraq( BID), OSVDB, và cảnh báo của nhà cung cấp.
Kiến trúc plugin: mỗi kiểm tra ninh được viết như một plugin và nhóm lại vào
•
một trong 42 họ( families). Danh sách plugin Nessus có sẵn tại
/>NASL: Nessuss Attack Scripting Language – một ngơn ngữ đặc biệt để viết các
•
script – đoạn mã.
Up – to – date cơ sở dữ liệu bảo mật: tập trung vào phát triển các kiểm tra an
ninh cho những lỗ hổng mới được tiết lộ. Cơ sở dữ liệu của chúng ta được cập
nhật hàng ngày và tất cả các kiểm tra bảo mật mới nhất có sẵn tại:
/>
•
Báo cáo: Nessus không chỉ cho biết máy bạn tồn tại những lỗ hổng gì mà có
thơng báo cả mức độ nguy cơ (info, low, medium, high, critical), và nó cịn
•
cung cấp các giải pháp.
Hỗ trợ đầy đủ ssl: có khả năng kiểm tra các dịch vụ được cung cấp trên ssl như
•
https, smtps, imaps,…
Diễn đàn mở: các câu hỏi về Nessus? Thảo luận tại:
•
/>Hỗ trợ IPv6: nó hỗ trợ quét trên tài nguyên dựa trên IPv6[5]. Windows XP hay
server 2003 khơng có hỗ trợ này.
Điều kiện phần cứng để dùng Nessus:
Hình 1.: Phần cứng cần thiết
Nessus có thể chạy trong môi trường máy ảo, nhưng nếu các máy ảo sử dụng Network
Address Translation(NAT) để nối mạng thì các kiểm tra lỗ hổng của Nessus, host, hệ điều
hành sẽ bị ảnh hưởng[2].
Chương 2: VIẾT PLUGIN CHO NESSUS TRÊN NASL
1. NASL là gì?[3][4]
NASL (Nessus Attack Scripting Language) là một ngôn ngữ kịch bản được thiết
kế cho các máy quét Nessus. Nó cho phép bất cứ ai cũng có thể viết một thử nghiệm cho một
lỗ hổng bất kỳ. NASL là một ngôn ngữ thông dịch, cho phép người sử dụng có thể thực thi
ngay câu lệnh vừa được đưa vào. NASL có một thuận lợi lớn cho người muốn tìm hiểu, đó là
cú pháp của nó gần giống với ngôn ngữ C (về cách khai báo, các toán tử, vòng lặp…). Nó
không có các thành phần phức tạp con trỏ trong C, khi thực hiện viết một script chúng ta cũng
không cần quan tâm đến loại đối tượng, không cần phải khai báo các biến trước khi sử dụng
chúng mà chỉ cần tập trung vào các thử nghiệm bảo mật mà chúng ta muốn sử dụng. Chính
những điều này đã khiến cho ngữ pháp của NASL trở lên đơn giản và dễ hiểu hơn với người
dùng.
Đầu tiên là NASL1 ra đời với hơn 1000 lỗi kiểm tra bảo mật. Ban đầu tốc độ không
được xem là vấn đề đáng quan tâm nhất. Khi số lượng plugin tăng lên, người dùng sử dụng
Nessus để quét nhiều host hơn thì NASL1 thực sự trở lên chậm hơn cho những tác vụ này.
Năm 2001, khi Michel Arboi viết lại thư viện libnasl để thực hiện mở rộng ngôn ngữ và sửa
chữa những khuyết điểm của NASL1, thư viện được viết lại có tên NASL2. Kể từ phiên bản
3.0, NASL2 được tích hợp sẵn vào trong engine.
Quy tắc cơ bản với NASL:
•
Chú thích được bắt đầu với một dấu “#” và chỉ có tác dụng chú thích trên dòng
•
hiện tại. Chú thích sẽ được trình thơng dịch bỏ qua khi đọc đến nó.
Có thể thêm các khoảng trắng tùy ý giữa 2 toán tử.
o Chuỗi sẽ được phân tích bởi bộ phân tích từ vựng Bộ phân tích sẽ trả
lại thông báo quá dài nếu nó gặp một diễn tả như: a+++++b (nó sẽ hiểu
thành a++ ++ + b). Khi đó ta nên viết : a++ + ++b.
o Không thể thêm khoảng trắng vào giữa chuỗi đa ký tự. Ví dụ: x = a + +
(nên viết x = a++)
2. Cấu trúc ngôn ngữ NASL
2.1 Kiểu dữ liệu
Kiểu nguyên
NASL2 sử dụng cấu trúc như C, hệ cơ số 8 bắt đầu là 0 và hệ cơ số 16 bắt đầu bằng
0x.
Kiểu chuỗi[3][4]
Có hai dạng chuỗi là chuỗi không thể chuyển đổi và chuỗi có thể chuyển đổi:
•
Chuỗi không thể chuyển đổi: là chuỗi được nhập vào giữa hai dấu nháy
kép “” (ví dụ: “hello\n”), khi đó mọi ký tự của chuỗi sẽ được giữ
nguyên (dấu \ vẫn sẽ được giữ nguyên). Có thể chuyển chuỗi này sang
•
ch̃i có thể chủn đởi bằng cách sử dụng các hàm xử lý chuỗi.
Chuỗi có thể chuyển đổi: là chuỗi được nhập vào giữa hai dấu nháy đơn
‘’ (ví dụ: ‘hello\n’), khi đó một vài ký tự của chuỗi sẽ được tự động
chuyển đổi (dấu \n sẽ thực hiện tự động xuống dòng).
Mảng
Hỗ trợ mảng 1 chiều, chỉ số của mảng sẽ được đánh số bắt đầu từ 0. Các phần tử trong
mảng có thể là dữ liệu kiểu nguyên hoặc kiểu chuỗi.
Null
Được gán cho các biến chưa khởi tạo giá trị hay là giá trị trả về cho những hàm khi
gặp lỗi.
Booleans
Không phải là một kiểu dữ liệu độc lập. Các toán tử so sánh sẽ trả về về 0 nếu là
FALSE hay 1 nếu là TRUE. Hay những giá trị chủn đởi khác như:
•
•
•
•
Giá trị chưa xác định hay giá trị null sẽ là FALSE.
Số nguyên là TRUE nếu không phải là NULL, là FALSE nếu là 0.
Chuỗi sẽ là TRUE nếu nó không phải là chuỗi rỗng, không bằng 0.
Mảng sẽ luôn là TRUE cho dù nó là rỗng hay không.
2.2 Các toán tử
Toán tử thơng thường
• = toán tử gán
o x = 66. Đặt 66 vào biến x. Giá trị x được gán trước đó sẽ mất.
o x = y. Lấy giá trị của biến y gán cho biến x.
• [ ] toán tử chỉ chỉ số mảng
o Một biến không thể vừa là giá trị nguyên, hay là chuỗi, là null mà
lại vừa là kiểu mảng tại cùng một thời điểm. Nếu ta thay đổi kiểu
dữ liệu thì kiểu dữ liệu trước đó sẽ bị mất.
o Ta có thể trích xuất ký tự từ một chuỗi (ví dụ: str = “hello” -> str[1]
= e).
o Đặt từng giá trị cho từng phần tử của mảng. (ví dụ: str[1] = “i or
h”) -> str = hi or hello.
Toán tử toán học
NASL2 không có quy định chặt chẽ với kiểu ngun. 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. Các phép toán học có thể dùng:
•
+ :phép cộng 2 số nguyên.
•
- : phép trừ 2 số nguyên.
•
*:phép nhân 2 số ngun.
•
/ :phép chia lấy phần ngun. NASL2 khơngcókiểusốthực.
Phép chia cho 0 sẽtrảlại 0 hoặcgâylỗitrìnhthơngdịch.
•
%: phép chia lấyphầndư.
•
**: phépmũ, lũythừa.
Toán tử tựa C[3][4]
NASL2cung cấp mợt sớ toán tử giớng C:
•
++: thực hiện cộng trước (++x: tăng biến x lên 1 đơn vị và trả về kết
quả x sau khi tăng) hoặc thực hiện cộng sau (x++: tăng biến x lên 1 đơn
•
vị nhưng trả về giá trị x trước khi tăng).
-: thực hiện trừ trước (-x) hoặc thực hiện trừ sau (x-). Giá trị trả về
tương tự như với ++.
• +=, -=, *=, /=, %=: có chứcnăngtươngtự như C.
• <<= và >>= tương tự như trong C.
Toán tử ch̃i
• +: phép nới ch̃i.
• -: loại bỏ các phần của ch̃i.
• []: trích x́t mợt ký tự của ch̃i.
• ><: so sánh chuỗi có chứa trong nhau hay không, nếu 1 trong 2 chuỗi
chứa chuỗi còn lại sẽ cho kết quả là TRUE, ngược lại là FALSE. Ví dụ:
•
s1 = “hi”; s2 = “hello”. “h” >< “hello” sẽ trả về TRUE.
>!<: so sánh chuỗi không chứa trong nhau. Nếu 2 ch̃i khơng chứa
•
trong nhau thì sẽ trả về TRUE, ngược lại là FALSE
=~: là một toán tử (regex match), có chức năng như mợt lời gọi tới hàm
ereg.
• !~: là một toán tử (regex don’t match), có chức năng ngược với ereg.
Toán tử so sánh
• ==: so sánh 2 giá trị, nếu bằng nhau là TRUE, ngược lại là FALSE.
• !=: sẽ trả về TRUE nếu 2 giá trị khác nhau và là FALSE nếu 2 giá trị
khác nhau.
• >: so sánh 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.
Toán tử logic
• !: phép phủ định của logic. Ví dụ, !TRUE _ FALSE.
• &&: phép “and” logic.
• ||: phép “or” logic.
Toán tử với bit
• ~: thuật toán phủ định. Ví dụ: ~0 = 1.
• &: thuật toán and.
• |: thuật toán or.
• ^: thuật toán phép xor.
• <<: phép dịch trái bit
• >>: phép dịch phải bit.
• >>>: phép dịch logic sang phải.
Các phép xử lý khác
• Break: dùng break để thoát khỏi mợt hàm hoặc mợt script.
• Nếu các đới sớ khác kiểu nhau, phép + có thể được dùng để đổi kiểu tự
động:
o Một chuỗi không chuyển đổi cộng với một chuỗi chuyển đổi sẽ
cho ta một chuỗi chuyển đổi. ví dụ: “hello\n” + ‘hi’ ->
‘hello\\nhi’.
o Nếu một trong 2 đối số là chuỗi không chuyển đổi thì đối số
còn lại sẽ được chuyển thành kiểu chuỗi không chuyển đổi. Ví
dụ: “hello” + 2 -> “hello2”.
o Nếu một trong các đối số là kiểu ngun, đới sớ còn lại sẽ được
•
•
chủn sang kiểu nguyên.
o Trong các trường hợp khác sẽ được trả về giá trị NULL.
Phép trừ sẽ có chuyển đổi tương tự như phép cộng.
Không nên sử dụng các biến chưa được khởi tạo. Để các script có thể
hoạt động, giá trị NULL sẽ được định nghĩa thay bằng giá trị 0 hoặc “”
(có thể là integer hoặc string). Vì vậy cần kiểm tra xem biến đã được
định nghĩa và khởi tạo hay chưa bằng isnull () trước khi dùng.
2.3 Vòng lặp và luồng điều khiển
for (expr1; cond; expr2) block; tương tự như cấu trúc for trong C.
ví dụ: sử dụng vòngfor in ra các số từ 1 ->10
for(i=1;i<=10;i++){ display(i,’\n’)};
foreachvar
(array) block;lặp tất cả cácphầntử trongmảng.
Lặpcácgiá trị lưutrongmỗiphầntử củamảng.
while(cond) block;thựchiệnkhốilệnhvớiđiềukiện là TRUE, sẽ bỏ
qua khốilệnhkhôngthựchiệnnếuđiềukiện là FALSE.
repeat block; until (cond);thựchiệnkhốilệnhvớiđiềukiện là TRUE.
Khốilệnhđượcthựchiệnítnhất 1 lần.
Break;thựchiệnthoátkhỏivònglặp.
Continue;bỏ qua vònglặphiệntạivàthựchiệnvònglặptiếptheo.
Return;trả về giá trị củahàmhiệntại.
2.4 Khai báo biến, hàm
Khai báo biến:[3][4]
NASL1 chỉ có biến toàn cục, với NASL2 có sử dụng cả biến toàn cục và biến cục bộ.
Biến cục bộ được tạo và tồn tại trong các hàm, được giải phóng khi kết thúc hàm. Trình thông
dịch sẽ thực hiện kiểm tra biến trong hàm hiện tại được thực hiện rồi kiểm tra bao quát ra
ngoài hàm cho đến khi thấy xuất hiện biến toàn cục.
Thường thì chúng ta sẽ không cần khai báo biến: bởi hoặc là nó đã tồn tại, hay nó
được sử dụng trong hàm hiện tại, hay nó được gọi bởi hàm khác. Tuy nhiên, điều này có thể
trở lên khơng an toàn trong mợt sớ trường hợp sau:
•
Khi chúng ta muốn dùng một biến toàn cục bên trong một hàm và không thể
chắc chắn được rằng biến đã được tạo ra ở hàm chính, hay được tạo ra như
•
mợt biến cục bợ trong hàm được gọi tới.
Khi chúng ta muốn chắc chắn là đang tạo ra một biến cục bộ và không ghi đè
lên biến toàn cục cùng tên.
Vì vậy, chúng 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 thì ta sẽ nhận được một thông báo lỗi,
nhưng nó vẫn sẽ làm viêc.
Khai báo hàm:
Cấu trúc: function name (argname1, argname2) block;
Danh sách các đối số có thể là rỗng, nhưng không được trùng tên hàm. Đối số có thể
được dùng mà không cần khai báo.
Truy xuất tham số hàm:
Trong một hàm NASL, đối số được truy cập như một biến cục bộ. Nếu hàm nhận đối
số không định danh, việc truy xuất được thực hiện thông qua mảng _FCT_ANON_ARGS15.
Biến này sẽ là NULL nếu trình thông dịch thấp hơn NASL_LEVEL 2190. Ta nên khai báo ở
đầu của script nếu cần đến biến này.
if (NASL_LEVEL < 2190) exit(0); # _FCT_ANON_ARGS
is not implemented
•
Chúng ta đang thiết lập tới biến _FCT_ANON_ARGS chưa được
định nghĩa. Lúc này bộ nhớ sẽ lãng phí và ta khơng thể đọc lại giá
trị.
• Việc sử dụng _FCT_ANON_ARGS để đọc các đối số được định
danh là không nên. Lúc này sẽ xuất hiện một sự bảo vệ, giá trị
NULL sẽ được trả về.
Gọi hàm:
• Ví dụ với hàm có đối số:
function fact(x)
{
local_var i, f;
f = 1;
for (i = 1; i <= x; i ++) f *= i;
return f;
}
display("3 ! = ", fact(x: 3), "\n");
•
Ví dụ với hàm có đối số không định danh:
function fact()
{
local_var i, f;
f = 1;
for (i = 1; i <= _FCT_ANON_ARGS[0]; i ++) f *= i;
return f;
}
display("3 ! = ", fact(3), "\n");
•
Kết hợp cả 2 phương pháp trên:
function fact(prompt)
{
local_var i, f;
f = 1;
for (i = 1; i <= _FCT_ANON_ARGS[0]; i ++)
{
f *= i;
display(prompt, i, ’! = ’, f, ’\n’);
}
return f;
}
n = fact(3, prompt: ’> ’);
3. Thư viện NASL
3.1 Hằng sớ
Booleans
• TRUE = 1
• FALSE = 0
Plugin
•
ACT_INIT: plugin thiết lập một vài KB (loại biến toàn cục cho tất cả
•
plugin).
ACT_SCANNER: plugin thực hiện quét cởng hoặc thực hiện chức
•
năng tương tự (ví dụ: ping)
ACT_SETTINGS: hoạt đợng giớng như ACT_INIT, nhưng được thực
•
•
•
hiện sau quá trình quét và khi chắc chắn là host vẫn đang hoạt động.
ACT_GATHER_INFO: plugin lấy thông tin dịch vụ.
ACT_ATTACK: plugin khởi động phần mềm tấn công.
ACT_MIXED_ATTACK: plugin tạo một đính kèm có thể gây ra các
•
nguy hiểm khác.
ACT_DESTRUCTIVE_ATTACK: plugin cớ gắng phá hủy data16 hoặc
khởi động một tấn công nguy hiểm (thử nghiệm lỡi tràn bợ đệm có khả
•
•
năng làm sụp đở mợt dịch vụ dễ bị tổn thương).
ACT_DENIAL: plugin cố gắng làm sụp đổ một dịch vụ.
ACT_KILL_HOST: plugin cố gắng làm sụp đở máy mục tiêu hoặc vơ
•
hiệu hóa nó.
ACT_FLOOD: plugin làm sụp đổ mục tiêu hoặc vô hiệu hóa nó bằng
cách gây ngập lụt sử dụng các gói tin hay request lỡi.
Network
• Nessus “encapsulation”:
o ENCAPS_IP = 1: đây là giá trị “transport” cho TCP socket.
o ENCAPS_SSLv23 = 2: đây là giá trị “transport” cho một kết
nối SSL trong chế độ tương thích.
o ENCAPS_SSLv2 = 3: phiên bản SSL cũ chỉ cung cấp chứng chỉ
phía máy chủ.
o ENCAPS_SSLv3 = 4: phiên bản mới SSL cung cấp chứng chỉ ở
cả phía máy chủ và máy khách, cung cấp nhiều thuật toán mã
hóa, sửa chữa một số lỗ hổng an ninh.
o ENCAPS_TLSv1 = 5: TLSv1 được định nghĩa trong RFC 2246.
•
•
Có thể gọi là SSL v3.1.
Sockets option
o MSG_OOB: tùy chọn socket dùng để gửi dữ liệu.
Raw sockets
o IPPROTO_ICMP: được định nghĩa trong C bao gồm các tập tin.
o IPPROTO_IGMP
o IPPROTO_IP
o IPPROTO_TCP
o IPPROTO_UDP
o PCAP_TIMEOUT = 5
o TH_ACK = 0x10: cờ TCP chỉ ra các gói tin có chứa một xác
nhận hợp lệ.
o TH_FIN = 0x01: cờ TCP chỉ ra gói tin kết thúc phiên kết nối.
o
o
o
o
TH_PUSH = 0x08
TH_RST = 0x04: cờ TCP cho biết kết nối bị từ chối.
TH_SYN = 0x02: khởi tạo kết nối.
TH_URG = 0x20: cờ TCP chỉ gói tin có chứa dữ liệu khẩn.
Hằng khác
• NULL: giá trị khơng được định nghĩa.
Nessusd glue
• Description: được thiết lập là 1 khi nessus thực hiện script lần đầu tiên,
•
sau đó gán là 0 khi đã được thực thi.
COMMAND_LINE: được thiết lập là 0 khi script chạy bởi Nessus hoặc
1 khi nó chạy trên trình thông dịch của NASL.
3.2 Một số hàm tích hợp sẵn
Hàm cơ bản: hàm được sử dụng cho các plugin giao tác.
• set_kb_item: tạo ra mợt mục mới trong KB, hàm có 2 đới sớ là “name”
•
và “value”. Tạo một mục nhiều lần sẽ tạo thành một list.
get_kb_item: lấy ra một mục từ KB, hàm nhận một đối sốkhông định
danh (“name” của KB). Nếu mục là một list, plugin sẽ được phân
nhánh và mỗi tiến trình con sẽ dùng 1 giá trị khác nhau. Nessus sẽ nhớ
các giá trị, việc đọc lại một mục lần thứ 2 sẽ không thực hiện phân
nhánh. Chúng ta không nên gọi chức năng này khi nhiều kết nới đang
•
được mở tránh sự xung đột giữa các tiến trình.
get_kb_list: lấy ra nhiều mục từ KB, hàm nhận mợt đới sớ khơng định
•
danh hoặc một mặt nạ. Giá trị trả về là giá trị băm.
replace_kb_item: thêm hoặc thay thế một mục trong KB. Hàm nhận 2
đối số là “name” và “ value”. Việc tạo một mục nhiều lần không tạo ra
một list mà nó sẽ ghi đè lên giá trị cũ.
Hàm báo cáo: hàm gửi lại thơng tin cho Nessus daemon.
• scanner_status: báo cáo về tiến trình quét cổng. Hàm nhận 2 đối số
nguyên “current” – số lượng cổng đang quét và “total” - tởng sớ cởng
•
cần được quét.
Security_note: báo cáo các thơng tin khác. Hàm nhận một đối số
nguyên không định danh (số cổng) hoặc một tập các đối số có tên sau:
“data” – dữ liệu báo cáo; “port” – số cổng TCP hoặc UDP của dịch vụ;
•
“proto/protocol” – là giao thức (mặc định là TCP, còn lại là UDP).
security_hole: báo cáo một lỗ hổng nghiêm trọng. Hàm nhận một đối
số nguyên không định danh (số cổng), hoặc một tập các đối số có tên
sau: “data” – dữ liệu báo cáo; “port” – số cổng TCP hoặc UDP của dịch
vụ dễ bị tổn thương; “proto/protocol” – giao thức (mặc định là TCP,
còn lại là UDP).
•
security_warning: báo một lỗ hổng nhẹ. Hàm nhận một đối số nguyên
không định danh (số cổng), hoặc một tập các đối số có tên sau: “data” –
dữ liệu báo cáo; “port” – số cổng TCP hoặc UDP của dịch vụ dễ bị tổn
thương; “proto/protocol” – giao thức (mặc định là TCP, còn lại UDP).
Hàm mô tả: tất cả các hàm ngoại trừ hàm script_get_preference chỉ được sử
dụng trong 1 phần mô tả của plugin (là các khối được chạy khi description =
1). Các hàm chỉ có ý nghĩa khi được thực thi trong môi trường Nessus và
không có hiệu lực khi các plugin chạy trên trình thông dịch độc lập nasl.
• script_add_preference: cho phép thêm mợt tùy chọn cho plugin. Hàm
cần một tập đối số như sau: “name” – tên của tùy chọn; “type” – loại
tùy chọn (có thể là checkbox/entry/password/radio); “value” – là giá trị
•
mặc định tương ứng với từng “type”.
script_bugtraq_id: thiết lập SecurityFocus “bid”. Hàm cần một hoặc
•
nhiều đới sớ ngun khơng định danh.
script_category: đặt “category” cho các plugin. Thường thì hàm cần
đối số nguyên không định danh là mợt trong những hằng sớ được xác
•
định trước.
script_copyright: đặt một chuỗi bản quyền cho các plugin. Hàm cần
một đối số chuỗi không định danh, hoặc một hay một sớ đới sớ có tên
•
khác.
script_cve_id: thiết lập định danh cho mã CVE của các lỡ hởng được
•
thử nghiệm bởi script.
script_description: thiết lập mô tả cho plugin. Hàm cần một đối số
chuỗi có tên hoặc một hay một số các đối sớ có tên khác như: english,
•
francais, deutsch, portuguese ( mặc định là english).
script_id: thiết lập định danh cho script. Hàm cần mợt đới sớ ngun
•
khơng định danh.
script_name: thiết lập tên cho plugin. Hàm cần mợt đới sớ ch̃i
•
khơng định danh.
script_summary: thiết lập một mô tả ngắn cho plugin. Hàm cần mợt
•
đới sớ ch̃i khơng định danh.
script_timeout: thiết lập thời gian chờ của plugin. Hàm cần một đối số
nguyên không định danh. Nếu đối số là 0 hay -1 thì thời gian chờ là vơ
•
hạn.
script_version: đặt phiên bản cho plugin. Hàm cần một đối số chuỗi
không định danh.
Hàm “glue”
•
get_preference: hàm có một đối số chuỗi không định danh và trả về
giá trị “preference”. Hàm này cần thiết để thực hiện lấy một số tùy chọn
của máy chủ.
Hàm về mạng
• close: thực hiện đóng socket.
• end_denial: hàm khơng cần đối số và trả về TRUE nếu máy nạn nhân
vẫn tồn tại và FALSE nếu nó đã chết. Chúng ta cần gọi start_denial
•
trước khi thực hiện thử nghiệm.
get_host_name: hàm không cần đối số và thực hiện trả về tên của máy
•
nạn nhân.
get_host_ip: hàm khơng cần đới sớ và thực hiện trả về địa chỉ IP của
•
máy nạn nhân.
get_host_open_port: hàm khơng cần đới sớ và cho ta biết cởng TCP
•
được mở trên máy nạn nhân.
get_port_transport: hàm cần một đối số ngun khơng định danh
•
(socket) và thực hiện đóng gói.
get_port_state: hàm nhận một đối số nguyên không định danh (số
cổng TCP). Hàm trả về TRUE nếu nó được mở và FALSE nếu ngược
•
lại.
get_source_port: hàm nhận mợt đới sớ ngun khơng định danh và trả
•
về sớ hiệu cởng ng̀n.
get_udp_port_state: hàm trả về TRUE nếu cởng UDP đang mở,
•
FALSE nếu ngược lại.
islocalhost: hàm không có đối số và trả về TRUE nếu host của máy nạn
•
nhân tương tự như host của máy tấn công.
islocalnet: hàm không có đối số và trả về TRUE nếu máy nạn nhân
•
cùng mạng với máy tấn cơng.
open_priv_sock_tcp: mở một socket TCP đặc quyền tới máy nạn
nhân. Hàm nhận 2 đối số nguyên có định danh: “dport” – cổng đích;
•
“sport” – cởng ng̀n.
open_priv_sock_udp: mở mợt socket UDP đặc qùn tới máy nạn
nhân. Hàm nhận 2 đối số nguyên có định danh: “dport” – cởng đích;
•
“sport” – cởng ng̀n.
open_sock_tcp: mở một socket TCP tới máy nạn nhân. Hàm nhận một
đối số nguyên không định danh (số cổng) và 2 đối số nguyên có tên tùy
chọn: “bufsz” – nếu muốn tùy chỉnh bợ đệm vào/ra; “timeout” – thay
•
đởi thời gian chờ; “transport” – chuyển sang chế độ “transport”.
open_sock_udp: mở một socket UDP trên máy nạn nhân. Hàm nhận
một đối số nguyên không định danh (số hiệu cổng).
•
•
recv: nhận dữ liệu từ socket TCP/UDP.
send: gửi dữ liệu trên socket. Hàm nhận các đối số có tên: “socket”;
“data” – dữ liệu ; “length” – độ dài của dữ liệu cần gửi; “option” – là cờ
cho lời gọi hệ thớng send(), khơng nên dùng kiểu sớ, nên dùng hằng
•
MSG_OOB.
scanner_add_port: khai báo cổng mở với nessusd. Hàm nhận 2 đối số
có tên: “port” – số hiệu cổng; “proto” – tcp/udp và hàm khơng có giá trị
•
trả về.
scanner_get_port: đưa ra danh sách cổng đang mở bởi nessusd. Hàm
nhận một đối số nguyên không định danh, một chỉ số và trả về sớ hiệu
•
cởng hoặc giá trị 0 khi kết thúc danh sách.
tcp_ping: thực hiện lệnh ping tới máy nạn nhân. Hàm nhận đối số
nguyên có tên là số hiệu cổng. Nếu khơng cài đặt nó sẽ tự đưa ra các
•
cởng dịch vụ có sẵn.
telnet_init: khởi tạo kết nối telnet trên socket đang mở. Hàm nhận mợt
•
•
•
đới sớ khơng định danh (socket đang mở) và trả về dữ liệu đọc được.
this_host: hàm không cần đối số và trả về địa chỉ IP của máy hiện tại.
this_host_name: hàm không cần đối số và trả về nên của máy hiện tại.
ftp_log_in: thực hiện định danh và xác thực FTP trên socket đang mở.
Hàm cần 3 đối số có tên: “user” – tên người dùng; “pass” – mật khẩu;
“socket”. Hàm trả về TRUE nếu xác thực thành cơng.
Hàm xử lý ch̃i
• crap: trả về kích thước của bộ đệm yêu cầu. Hàm thường dùng để kiểm
tra lỗi tràn bộ đệm. Hàm nhận các đối số: “length” – kích thước bộ
đệm; “data” – khối dữ liệu muốn lặp lại để làm đầy bộ đệm (mặc định
•
là ký tự “X”).
egrep: tìm kiếm mợt đoạn ch̃i hay từng dòng mợt và trả về các dòng
•
có chứa ch̃i cần tìm. Hàm có các đối số: “icase”; “pattern”; “string”.
hex: thực hiện chuyển một đối số nguyên sang dạng hex. Hàm nhận
•
mợt đới sớ ngun khơng định danh.
hexstr: thực hiện chủn mợt ch̃i mã ASCII thành ch̃i hex. Hàm
•
•
nhận mợt đối số chuỗi không định danh.
int: thực hiện chuyển đổi một chuỗi thành số nguyên.
ord: hàm nhận một đối số ch̃i khơng định danh và trả về mã ASCII
•
của ký tự đầu của chuỗi.
tolower: chuyển một đối số chuỗi không định danh về dạng viết
thường.
• toupper: chủn mợt đới sớ chuỗi không định danh về dạng viết hoa.
Hàm HTTP
•
http_delete: định dạng một yêu cầu HTTP DELETE cho máy chủ trên
•
cởng đang mở. Hàm nhận đới sớ: “port” và “item”.
http_get: định dạng một yêu cầu HTTP GET cho máy chủ trên cởng
•
•
đang mở.Hàm nhận đới sớ: “port” và “item”.
http_close_socket: đóng một socket.
http_head: định danh một yêu cầu HTTP HEAD tới máy chủ trên cởng
•
•
đang mở. Hàm nhận đới sớ: “port” và “item”.
http_open_socket: mở ra một socket trên cổng nhất định.
http_recv_headers: đọc tất cả các header trên một socket (đối sớ
•
ngun khơng định danh).
http_post: định dạng mợt u cầu HTTP POST cho máy chủ trên cởng
•
đang mở. Hàm nhận đới số “port”; “item” (URL); “data”.
http_put: định dạng một yêu cầu HTTP PUT tới máy chủ trên cổng
đang mở. Hàm nhận đối số “port”; “item” (URL); “data”.
Hàm raw IP
Các hàm làm việc trên các khối dữ liệu được thực hiện như với các “chuỗi thuần túy”.
Điều này có nghĩa rằng chúng ta có thể thay đổi chúng bằng các hàm thao tác với ch̃i.
•
dump_ip_packet: thực hiện kết x́t mợt gói tin IP. Hàm nhận bất kỳ
•
•
•
mợt đới sớ khơng định danh (chuỗi).
dump_tcp_packet: thực hiện kết xuất các phần của gói tin TCP.
dump_udp_packet: thực hiện kết xuất các phần của gói tin UDP.
get_icmp_element: thực hiện trả về một phần tử ICMP từ gói tin IP.
Hàm trả về một khối dữ liệu hoặc mợt sớ ngun theo kiểu của phần tử.
•
Hàm nhận đối số: “element” – tên của trường TCP; “icmp” – gói tin IP.
get_ip_element: thực hiện trích ra một trường từ gói tin. Hàm trả về
một số nguyên hoặc một chuỗi phụ thuộc vào loại phần tử. Hàm nhận 2
đối số chuỗi có tên: “element” – tên trường; “ip” – là gói dữ liệu hoặc
•
fragment.
get_tcp_element: thực hiện trả về mợt phần tử TCP của gói tin IP. Nó
trả về một khối dữ liệu hoặc một số nguyên theo kiểu của phần tử. Hàm
•
nhận đới sớ: “element” – tên của trường TCP; “tcp” – gói dữ liệu IP.
get_udp_element: thực hiện trả về một phần tử UDP từ gói tin IP. Hàm
trả về một khối dữ liệu hoặc một số nguyên theo kiểu của phần tử. Hàm
•
•
nhận đới sớ: “element” – tên của trường UDP; “udp” – gói dữ liệu IP.
insert_ip_options: thực hiện thêm một tùy chọn IP cho gói dữ liệu.
pcap_next: thực hiện nghe một gói dữ liệu. Hàm nhận đối số:
“interface” – giao diện mạng; “pcap_filter” – bộ lọc BPF (mặc định là
lắng nghe mọi thứ.); “timeout” – thời gian chờ mặc định là 5s.
Hàm mật mã: hàm chỉ được thực hiện nếu Nessus liên kết với OpenSSL.
•
HMAC_DSS(data, key): trả về ch̃ixácthựcthơngbáo.
•
HMAC_MD2(data, key): trảvề chuỗixácthựcthơngbáo.
•
HMAC_MD4(data, key):
trảvề chuỗixácthựcthơngbáo.
HMAC_MD5(data, key):
trảvề chuỗixácthựcthơngbáo.
HMAC_RIPEMD160(data,
key):
trảvề
chuỗixácthựcthơngbáo.
•
HMAC_SHA(data, key): trảvề chuỗixácthựcthơngbáo.
•
HMAC_SHA1(data, key): trảvề chuỗixácthựcthơngbáo.
•
MD2(String): trả về mã hash củach̃i.
•
MD4(String): trả về mã hash củach̃i.
•
MD5(String): trả về mã hash củach̃i.
•
RIPEMD160(String): trả về mã hash củach̃i.
•
SHA(String): trả về mã hash củach̃i.
•
SHA1(String): trả về mã hash củach̃i.
Hàm khơng an tồn
• find_in_path: tìm kiếm mợt câu lênh trong $PATH. Trả về TRUE nếu
•
•
tìm thấy, FALSE nếu không. Hàm cần một đối số chuỗi (tên lệnh).
file_close: thực hiện đóng file.
file_open: thực hiện mở file. Hàm có 2 đới sớ có tên: “mode” – chế đợ
•
(r/w); “name” – tên file.
file_read: thực hiện đọc file. Hàm nhận 2 đới sớ ngun có tên: “fp” –
•
mơ tả file; “length” – độ dài dữ liệu muốn đọc.
file_seek: đọc file bắt đầu từ vị trí chỉ định. Hàm cần 2 đối sớ ngun
•
có tên: “fp” – mơ tả file; “offset” – địa chỉ offset của file (vị trí bắt đầu).
file_write: thực hiện ghi file. Hàm nhận 2 đối số có tên: “fp” – mơ tả
•
file; “data” – dữ liệu cần ghi.
fread: đọc file trên máy chủ Nessus, hàm nhận một đối số chuỗi không
định danh là tên file.
•
fwrite: thực hiện ghi file trên máy chủ Nessus. Hàm cần 2 đới sớ ch̃i
•
có tên: “data” - dữ liệu sẽ ghi lên file; “file” – tên file.
unlink: xóa một file trên máy chủ Nessus. Hàm cần một đối số chuỗi
không định danh (tên file).
3.3 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 cài đặt các
hàm tích hợp sẵn:
dump.inc
• dump(ddata, dtitle):thực hiện in toàn bộ dữ liệu, tiêu đề. Thường dùng
ở chế độ gỡ lỡi.
• hexdump(ddata): thực hiện in dữ liệu ở dưới dạng hex.
ftp_func.inc
• ftpclose(socket): thực hiện đóng mợt kết nới FTP (gửi “QUIT” và chờ
•
câu trả lời rời đóng socket.).
get_ftp_banner(port): thực hiện trả về banner FTP mà được lưu trữ
trong KB ở đường dẫn “ftp/banner/port_number”. Nếu trong KB khơng
•
có, hàm sẽ thực hiện kết nối đế server FTP và lấy banner về.
ftp_recv_line(socket): lấy dữ liệu trên từng dòng từ socket cho đến khi
nhận được ký tự thứ 4 khác “-”. Dùng khi ḿn dừng nhận banner quá
dài.
http_func.inc
• get_http_banner(port): trả về banner của HTTP mà đã được lưu trong
KB theo đường dẫn “www/banner/port_number”. Nếu KB này không
tồn tại, hàm sẽ thực hiện kết nối tới HTTP server, gửi một yêu cầu GET
•
và lưu trữ kết quả nhận được vào KB.
get_http_port(default): thực hiện đọc KB “Services/www”, xác nhận
•
rằng cởng được mở, rằng có một HTTP server được mở tại cổng đó.
http_recv(socket, code): thực hiện đọc header và nợi dung HTTP từ
•
socket.
http_is_dead(port, retry): thực hiện kiểm tra máy chủ còn tồn tại hay
không.
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): thực hiện gửi mợt u cầu req
tới máy chủ web từ xa và lắng nghe trên “port” đã kết nới. req là mợt
u cầu HTTP tương tự http_get().
misc_func.inc
• register_service(port, proto, ipproto): thực hiện đăng ký mợt dịch vụ.
• known_service(port, iproto): thực hiện trả về tên của dịch vụ nếu dịch
•
vụ được mở trên cởng.
get_unknown_banner(port, dontfetch, ipproto): thực hiện đọc theo
đường dẫn “unknown/banner/port” từ KB. Nếu không có, hàm sẽ kết
nối tới cổng, đọc và lấy banner về lưu trong KB. “ipproto” mặc định là
•
TCP.
set_unknown_banner(port,
•
“unknown/banner/port” vào banner trong KB. Ipproto mặc định là TCP.
service_is_unknown(port, ipproto): trả về TRUE nếu dịch vụ đã được
banner,
ipproto):
thực
hiện
đặt
đăng ký. Ipproto mặc định là TCP.
nfs_func.inc
Chứa các hàm hỗ trợ xử lý với hệ thống file mạng.
•
mount(soc, share): thực hiện gắn kết thư mục chia sẻ. soc là socket
•
•
UDP được mở kết nới tới máy chia sẻ.
umount(soc, share): thực hiện dừng kết nối chia sẻ thư mục.
readdir(soc, fid): thực hiện đọc nội dung thư mục được trỏ bởi fid. soc
•
ở đây là socket UDP được mở kết nối đến máy chia sẻ.
cwd(soc, fid, dir): thực hiện chuyển thư mục. soc là socket UDP được
mở kết nối đến máy chia sẻ, fid là thư mục hiện tại, dir là thư mục
muốn chuyển đến.
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.
Hàm thiết lập mợt phiên SMB
• smb_session_request(soc, remote): thực hiện thiết lập trước một phiên
kết nối tới máy chủ từ xa. “soc” là một socket được mở tới cởng 139
•
hoặc 445. “remote” là tên NetBIOS của máy chủ từ xa.
smb_neg_prot(soc): Negociates là giao thức được sử dụng để đăng
nhập vào máy chủ từ xa. Hàm này yêu cầu giao thức xác thực
NTLMv1(nếu có). “soc” phải là một socket được mở cho các máy chủ
•
SMB từ xa.
smb_session_setup(soc, login, password, domain, prot): thiết lập một
phiên SMB cho máy chủ từ xa. Nó ghi lại đăng nhập bằng mật khẩu và
domain. “prot” là bộ đệm được trả về bởi hàm smb_neg_prot(). “soc”
•
phải là socket được mở cho máy chủ SMB từ xa.
session_extract_uid(reply): trích xuất ra ID của người dùng từ “reply”.
Hàm được sử dụng mỗi lần một SMB mới được gọi để thực hiện.
Hàm truy cập vào registry từ xa
• smbntcreatex(soc, uid, tid): hàm tạo một kết nối tới đường ống. “soc”
– là một socket kết nối tới máy chủ SMB từ xa. “uid” – là ID của người
•
dùng. “tid” – trỏ tới vùng chia sẻ đặc biệt IPC$.
smbntcreatex_extract_pipe(reply): trích xuất ID của đường ớng từ bợ
•
đệm được trả về bởi hàm smbntcreatex().
registry_access_step_1(soc, uid, tid, pipe): thực hiện mở một
HIVE_KEY_LOCAL_MACHINE và trả về mợt bợ đệm phù hợp để sử
•
dụng với registry_get_key() và registry_get_key_security().
registry_get_key(soc, uid, tid, pipe, key, reply): thực hiện mở khóa
registry
và
trả
về
bộ
registry_get_item_dword(),
đệm
phù
hợp
để
sử
dụng
registry_get_item_sz()
với
hoặc
registry_get_key_security(). “reply” là bợ đệm được trả về bởi
•
registry_access_step_1().
registry_get_item_sz(soc, uid, tid, pipe, item, reply): trả về nợi dung
•
trong mục của khóa đang mở. “item” là một chuỗi khóa.
registry_decode_sz(data): giải mã các giá trị được trả về bởi
•
registry_get_item_sz().
registry_get_item_dword(soc, uid, tid, pipe, item, reply): trả về nợi
•
dung của mục trong khóa đang mở. “item” phải là một giá trị nguyên.
registry_decode_dword(data): thực hiện giải mã các giá trị được trả
•
về bởi registry_get_item_dword().
registry_get_key_security(soc, uid, tid, pipe, reply):thu được ACL
liên quan đến khóa được mở với hàm registry_get_key(). “reply” là bợ
•
đệm được trả về bởi hàm registry_get_key().
registry_key_writeable_by_non_admin(security_descriptor):
mã bộ đệm được trả về bởi hàm registry_get_security().
Hàm truy cập vào file SAM
• OpenPipeToSamr(soc, uid, tid)
• SamrConnect2(soc, tid, uid, pipe, name)
giải
• _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)
smtp_func.inc
• smtp_send_socket(socket, from, to, body): gửi mợt tin nhắn SMTP
•
trên socket đang mở.
smtp_send_port(port, from, to, body): mở mợt socket tới “port”, gửi
•
mợt tin nhắn SMTP và đóng socket.
smtp_from_header(): trả về địa chỉ “from” mặc định. Nếu mục
SMTP/headers/from trong KB khơng cài đặt, thì địa chỉ mặc định sẽ
•
được đặt
smtp_to header(): trả về địa chỉ “to” mặc định. Nếu mục
SMTP/headers/to
•
khơng
cài
đặt
thì
địa
chỉ
mặc
định
là
postmaster@[1.2.3.4] (1.2.3.4 là địa chỉa IP của máy mục tiêu).
get_smtp_banner(port): thực hiện đọc mục smtp/banner/port trong
KB.
telnet.inc
• get_telnet_banner(port):
thực
hiện
đọc
trong
đường
dẫn
“telnet/banner/port” từ KB. Nếu trong KB không có nó sẽ thực hiện kết
•
nới đến cởng lấy banner và lưu vào trong KB.
set_telnet_banner(port, banner): thực hiện ghi banner vào trong KB
tại đường dẫn “telnet/banner/port”.
4. Viết plugin cho Nessus sử dụng NASL
4.1 Giới thiệu về plugin
Plugin được viết trên chương trình Notepad và được thơng dịch bằng NASL. Plugin có
nhiệm vụ hiển thị các thông tin như hostname, IP, HTTP header,FTP header và quét các cổng
đang được mở trên máy mục tiêu.
Plugin được thực hiện trên window.
4.2 Nội dung trong plugin
Đầu tiên ta cần khai báo các thư viện được sử dụng cho plugin: