NASL脚本编写教程 联系客服

发布时间 : 星期四 文章NASL脚本编写教程更新完毕开始阅读

,造成效率的下降。因此NASL引入了一个x操作符来简化某些循环代码。例如:如果你需 要发出10次UDP报文,使用x操作符,只要下面一行代码就可以了: send_packet(udp)x10; ><操作符

><操作符是一个布尔型操作符,表示如果一个字符串A包含在另一个字符串B中,就返回 真,例如: a = \b = \if(a>

display(a \}

3.网络相关函数 3.1.套接字处理

套接字是使用TCP或者UDP协议和其它主机通讯的途径。在NASL中不允许你直接打开一个 和测试目标通讯的套接字,因此你只能使用NASL提供的函数打开套接字。 3.1.1.如何打开一个套接字

在NASL中,函数open_sock_tcp()和open_sock_udp()分别用于打开一个TCP或者UDP套接 字。这两个函数使用匿名(anonymous)参数。当前,你每次智能打开一个端口,将来的版 本将解决这个问题。例如:你可以使用如下代码分别打开一个TCP和UDP套接字: #在80端口打开一个TCP套接字 soc1=open_sock_tcp(80); #在123端口打开一个UDP套接字 soc2=open_sock_udp(123);

如果无法和远程主机建立连接,这两个函数会返回0。不过,通常open_sock_udp()不会 失败,因为没有办法确定远程主机的UDP端口是否开放,对于open_sock_tcp(),如果远 程主机的端口是关闭的,它就会返回0。

open_sock_tcp()可以用于对TCP端口的简单扫描,例如: start = prompt(\输入开始的端口 end = prompt(\输入结束的端口 for(i=start;i

soc=open_sock_tcp(i); if(soc){

display(\close(soc); } }

3.1.2.关闭一个端口

关闭一个端口使用close()函数,在close()内部,关闭端口之前,它首先会调用shutdown()函数。 3.1.3.读写套接字

根据被读写的套接字类型,可以选择使用如下函数完成这两项操作: recn(socket:,length: [,timeout:])

从套接字读取个字节,这个函数可以用于TCP和UDP。超时(timeout)参数是可选

的,以秒为单位。

recv_line(socket:,length: [,timeout:])

这个函数和recv()函数类似,只是如果遇到换行(\\n)操作终止。这个函数只能用于TCP套 接字。

send(socket:,data: [,length:])

从套接字发送数据。可选参数length告诉函数发送字节。如果 没有设置length,发送操作就在遇到NULL时终止。

如果没有设置超时参数,读函数(recv()和recv_line())就使用默认的超时时间5秒。如 果时间到,它们就返回FALSE。例如: # 以下代码用于显示远程主机的banner信息 soc = open_sock_tcp(21); if(soc) {

data = recv_line(socket:soc,length:1024); if(data) {

display(\} else {

display(\}

close(soc); }

3.1.4.高层操作

NASL有一些针对FTP和WWW协议的函数,用于简化对这两个应用层协议的某些操作。 ftp_log_in(socket:,user:,pass:)

尝试通过套接字登录到远程FP主机。如果用户名和密码都正确,就 返回TRUE,否则返回FALSE。 ftp_get_pasv_port(socket:)

向远程FTP服务器发出一个PASV命令,获得连接的端口。NASL脚本可以通过这个端口从F TP服务器下载数据。如果发生错误函数将返回FALSE。 is_cgi_installed()

测试远程WEB服务器是否安装了名为的CGI程序。这个函数向远程WEB服务器发出G ET请求实现这个目的。如果不是以斜杠(/)开头,就认为它是相对于/cgi-bin/。 这个函数也可以用于确定某个文件是否存在。 示例脚本: #

# 针对WWW服务器的测试 #

if(is_cgi_installed(\

display(\}

if(is_cgi_installed(\

display(\}

if(!is_cgi_installed(\

display(\} #

# 针对FTP服务器的测试 #

# 打开一个连接

soc = open_sock_tcp(21); # 匿名登录到远程FTP主机

if(ftp_log_in(socket:soc,user:\{

# 打开一个被动传输模式的端口 port = ftp_get_pasv_port(socket:soc); if(port) {

soc2 = open_sock_tcp(port);

#尝试获得远程系统的/etc/passwd文件 data = string(\send(socket:soc,data:data);

password_file = recv(socket:soc2,length:10000); display(password_file); close(soc2); }

close(soc); }

3.2.原始报文处理

NASL允许用户构造自己的IP报文,而且报文的定制是以一种智能的方式进行的。例如, 如果你改变了一个TCP报文的某个参数,就会造成其TCP校验和发生改变,但是你不必为 此费心,NASL会自动完成。

所有的原始报文构造函数都使用非匿名(non-anonymous)参数。参数的名字都是来自BSD 的包含文件。因此一个IP报文的长度域叫做ip_len而不是length。 3.2.1.构造IP报文

在NASL中,你可以使用forge_ip_packet()函数构造一个新的IP报文;使用set_ip_elem ent()函数获得报文某个域的值;使用set_ip_element()函数改变现有IP跋文某个域的值 。forge_ip_packet函数的原形如下: =forge_ip_packet( ip_hl :, ip_v :, ip_tos :, ip_len :, ip_id :, ip_off :,

ip_ttl :, ip_p :, ip_src :, ip_dst :, [ip_sum :]);

其中,ip_sum参数是可选的,如果没有使用,NASL会自动计算报文的校验和。ip_p参数 可以是一个整数值,或者是IPPROTO_TCP、IPPROTO_UDP、IPPROTO_ICMP、IPPROTO_IGMP 或者IPPROTO_IP等常量中的某个值。 get_ip_element()函数的原型如下: =get_ip_element( ip :,

element :\│\│ip_tos\│\│ \│\│\│\│ \│\│\

get_ip_element()将返回报文中的某个域的值。element参数必须是\、\、 ip_tos\、\、\、\、\、\、\、\、 \中的一个,而且引号是必不可少的。 set_ip_elements()函数的原型如下: set_ip_elements( ip :, [ip_hl :,] [ip_v :,] [ip_tos :,] [ip_len :,] [ip_id :,] [ip_off :,] [ip_ttl :,] [ip_p :,] [ip_src :,] [ip_dst :,] [ip_sum :] );

这个函数可以改变IP报文的值,如果你没有修改ip_sum域的值,它会自动 重新计算。这个函数没有构造报文的能力,因此需要把它放在forge_ip_packet()函数之 后。

最后,还有一个函数dump_ip_packet()需要说明一下,这个函数能够以可读的方式把IP 报文的内容输出到屏幕。这个函数应该只用于调试目的。 3.2.2.构造一个TCP报文

forge_tcp_packet()用来构造TCP报文。函数原型如下: tcppacket = forge_tcp_packet( ip :, th_sport :, th_dport :, th_flags :,