NASL脚本编写教程

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

th_seq :, [th_x2 :], th_off :, th_win :, th_urp :, th_sum :, [data :]);

其中,标志参数th_flags必须是TH_SYN、TH_ACK、TH_FIN、TH_PUSH或者TH_RST,这些标 志可以使用│操作符结合到一块。th_flags还可以使用一个整数值。ip_packet必须首先 由forge_ip_packet()函数产生或者使用send_packet()、pcap_next()函数得到的返回值 。

函数set_tcp_elements()能够修改TCP报文的内容,其原型如下: set_tcp_elements( tcp :, [th_sport :,] [th_dport :,] [th_flags :,] [th_seq :,] [th_ack :,] [th_x2 :,] [th_off :,] [th_win :,] [th_urp :,] [th_sum :,] [data :]);

除非你自己设置th_sum参数,否则函数会自动计算报文的校验和。 函数get_tcp_element()用来设置TCP报文的内容,其原型如下: element = get_tcp_elements( tcp :,

element :);

element_name必须是\、\、\、\、\、\th_x2\、\、\、\、\其中之一。注意:引号是不可缺少 的。

3.2.3.构造UDP报文

UDP报文构造函数forge_udp_packet()和TCP构造函数极为类似,其原型如下: udp = forge_udp_packet( ip :,

uh_sport :, uh_dport :, uh_ulen :, [uh_sum :,] [data :]);

而set_udp_elements()和get_udp_elements()函数和TCP报文对应的处理函数用法也相同 。

3.2.4.构造ICMP报文 3.2.5.构造IGMP报文 3.2.6.发送报文

构造报文的操作完成之后,你可以使用send_packet()函数将它们发送出去,其原型如下 :

reply = send_packet(packet1,packet2,....,packetN, pcap_active:, pcap_filter:);

如果pcap_active参数为TRUE,这个函数就会等待目标的回应。pcap_filter用来设置你 需要得到的报文类型,详情请参考pcap或者tcpdump的手册页。 3.2.7.读取报文

你可以使用pcap_next()函数读取一个报文,其原型如下: reply = pcap_next();

这个函数将从你使用的最后一个接口读取一个报文,报文的类型取决于最后设置的pcap 类型。 3.3.工具函数

NASL还提供了一些工具函数以简化你的编程。 this_host()

获得运行脚本的主机IP地址,没有参数。 get_host_name()

返回当前被测试主机的主机名,没有参数。 get_host_ip()

返回当前被测试主机的IP地址,没有参数。 get_host_open_port()

获得远程主机打开的第一个端口号,没有参数。这个函数对于某些脚本(例如:land)非 常有用,有些TCP序列号分析程序需要通过这个函数获得远程主机一个打开的端口。 get_port_stat()

如果TCP端口打开或者其状态是未知,就返回TRUE。 telnet_init()

在一个打开的套接字上初始化一个telnet会话,并且返回telnet数据的第一行。例如:

soc = open_sock_tcp(23); buffer = telnet_init(soc);

display(\,\tcp_ping()

如果远程主机应答TCP ping请求(发送一个设置ACK标志的TCP报文),本函数就返回TRUE ,没有参数。 getrcpport()

获得远程主机的RPC端口号,原型为:

result = getrpcport(program :]);

如果远程主机的程序没有在RPC portmap监控进程中注册就返回0。 4.字符串处理函数

NASL允许你象处理数字一样处理字符串。因此,你能够安全地使用==、<和>等操作符。 例如:

a = \b = \if(a

#因为version 1.2.3比version 1.4.1低 #因此,开始执行这里的代码 }

c = \if(a == c){ #两个字符串相等 #因此执行这里的代码 }

在NASL中,也可以获得一个字符串的某个字符,和C语言完全相同,例如: a = \

b = a[1]; #b等于\

你也可以在一个字符串中加、减一个字符串,例如: a = \

b = a - \等于\a = \b = \

c = a - b; #c等于\a = \c = \

c = a - b; #a等于\

除此之外,><也可以用于字符串的处理。NASL有很多函数来构造或者修改字符串: 4.1.处理正则表达式的ereg()函数

在NASL中,模式匹配是由ereg()函数完成的。原型如下: result = ereg(pattern:)

正则表达式的语法是egrep风格的。细节请参考egrep的手册页。例如: if(ereg(pattern:\{

display(\}

mystring=recv(socket:soc,length:1024); if(ereg(pattern:\{

display(\}

4.2.egrep()函数

egrep()函数返回一个多行文本中,匹配的第一行。如果对单行文本使用这个 函数,它就相当于ereg()。如果没有匹配的行,它就返回FALSE。其原型如下: str=egrep(pattern:,string:) 示例:

soc=open_soc_tcp(80);

str=string(\send(socket:soc,data:str); r=recv(socket:soc,length:1024);

server=egrep(pattern:\.*\if(server)display(server); 4.3.crap()函数

crap()函数非常便于测试缓冲区溢出,有两种原型: crap()

获得一个以'X'填充的长度为的字符串。 crap(length:,data:)

高一个长度为的字符串,并使用填充字符串。例如: a=crap(5); #a=\

b=crap(4096); #b=\个X) c=crap(length:12,data:\4.4.string()函数

这个函数用来定制字符串。其原型为: string(,[,...,]); 它能够解释字符串中\\n、\\t等特殊字符。例如: name=\

a=string(\等于\#末尾回行

b=string(1,\等于\

c=string(\等于\个X) #后面是一个回车和一个回行 4.5.strlen()函数

strlen()函数返回一个字符串的长度,例如: a==strlen(\等于4 4.6.raw_string()函数

这个函数能够把数字转换为对应的字符,例如:

a=raw_string(80,81,82); #80、81、82分别对应ASCII字符的PQR 4.7.strtoint()函数

这个函数把一个NASL整数转换为一个二进制整数。原型为: value=strtolen(number:,size:);

这个函数比较适合于和raw_string()函数一块使用。size参数是NASL整数的字节数,可 以是:1、2、4。 4.8.tolower()函数

这个函数能够把一个字符串中的所有大写字符转换为小写字符。原型为: string2=tolower(); 例如:

a=\

b=tolower(a); #b等于\5.总结

这是NASL Reference Guide的第一部分,主要介绍了NASL的各种函数。在下一部分我们

联系合同范文客服:xxxxx#qq.com(#替换为@)