发布时间 : 星期四 文章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: 从套接字 的,以秒为单位。 recv_line(socket: 这个函数和recv()函数类似,只是如果遇到换行(\\n)操作终止。这个函数只能用于TCP套 接字。 send(socket: 从套接字 如果没有设置超时参数,读函数(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: 尝试通过 向远程FTP服务器发出一个PASV命令,获得连接的端口。NASL脚本可以通过这个端口从F TP服务器下载数据。如果发生错误函数将返回FALSE。 is_cgi_installed( 测试远程WEB服务器是否安装了名为 # 针对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函数的原形如下: ip_ttl : 其中,ip_sum参数是可选的,如果没有使用,NASL会自动计算报文的校验和。ip_p参数 可以是一个整数值,或者是IPPROTO_TCP、IPPROTO_UDP、IPPROTO_ICMP、IPPROTO_IGMP 或者IPPROTO_IP等常量中的某个值。 get_ip_element()函数的原型如下: element :\│\│ip_tos\│\│ \│\│\│\│ \│\│\ get_ip_element()将返回报文中的某个域的值。element参数必须是\、\、 ip_tos\、\、\、\、\、\、\、\、 \中的一个,而且引号是必不可少的。 set_ip_elements()函数的原型如下: set_ip_elements( ip : 这个函数可以改变IP报文 最后,还有一个函数dump_ip_packet()需要说明一下,这个函数能够以可读的方式把IP 报文的内容输出到屏幕。这个函数应该只用于调试目的。 3.2.2.构造一个TCP报文 forge_tcp_packet()用来构造TCP报文。函数原型如下: tcppacket = forge_tcp_packet( ip :