📄 sendip.txt
字号:
三、TCP报文的构造
先看man文件中显示支持可以构造的TCP报文字段有哪些,然后在参数后直接说明该字段的含义。构造报文首先要求对报文的各个字段非常熟悉,所以先看一下TCP首部的图表:
TCP首部:
0 15 16 31
16位源端口号 16位目的端口号
32位序列号
32位确认号
4位
首部
长度 6位
保留 U
R
G ACK P
S
H RST S
Y
N FIN 16位窗口大小
16位TCP检验和 16位紧急指针
选项(若有)
数据(若有)
sendip_表2
Arguments for module ./tcp.so:
-ts x TCP source port
构造TCP的源端口,默认为0。
-td x TCP destination port
构造TCP的目的端口,默认为0。
-tn x TCP sequence number
构造TCP的序列号,默认为随机。
-ta x TCP ack number
构造TCP的应答号,默认为0。
-tt x TCP data offset
构造TCP的首部长度,默认是正确值,标准是20字节,最大60字节。
-tr x TCP header reserved field EXCLUDING ECN and CWR bits
TCP头部保留位。
-tfe x TCP ECN(Explicit Congestion Notification)bit (rfc2481)
TCP标志位中保留的ECN字段,默认为0,选项为0、1或r。
-tfc x TCP CWR(Congestion Window Reduced)bit (rfc2481)
TCP标志位中保留的CWR字段,默认为0,选项为0、1或r。
注意:ECN和CWR
-tfu x TCP URG bit
构造TCP标志位中的URG,表示紧急指针有效。当紧急指针(Urgent Pointer)字段有内容时有效。默认为0,选项为0、1或r。
-tfa x TCP ACK bit
构造TCP标志位中的ACK,表示确认ack number有效。默认为0,选项为0、1或r。
-tfp x TCP PSH bit
构造TCP标志位中的PSH,表示接收方应该尽快将这个报文段交给应用层。默认为0,选项为0、1或r。
-tfr x TCP RST bit
构造TCP标志位中的RST,表示需要重建连接,断开目前的连接。默认为0,选项为0、1或r。
-tfs x TCP SYN bit
构造TCP标志位中的SYN,表示使用同步序号用来发起一个连接。默认为1,选项为0、1或r。
-tff x TCP FIN bit
构造TCP标志位中的FIN,表示完成了发送任务。默认为0,选项为0、1或r。
-tw x TCP window size
构造TCP的期望接收的窗口大小值,默认为65535字节。
-tc x TCP checksum
构造TCP的checksum,检验和覆盖了整个TCP的报文段。默认为正确值。可以用于测试DUT设备是不是检验TCP报文的checksum值。
-tu x TCP urgent pointer
构造紧急指针,所谓紧急指针是一个正的位偏移量,和序号字段中的值相加可以得出紧急数据最后一个字节的序号。默认配置为0。注意这个值只有在-tfu置1时才有效,默认情况下如果有-tu参数,-tfu会自动为1,但是强制把-tfu置为1的话会导致-tu的参数无效。
-tonum x
TCP option as string of hex bytes (length is always correct)
选项字段的长度,但是标准字段没有这个选项。默认是没有选项字段的内容。
-toeol TCP option: end of list
选项字段结束的标识符。
-tonop TCP option: no op
没有任何意义,表示无操作,碰到这个字段可以忽略。
-tomss x
表示最长报文大小,每个连接方通常都在通信的第一个报文段中指明这个选项。
-towscale x
TCP option: window scale (rfc1323)
-tosackok
TCP option: allow selective ack (rfc2018)
-tosack x
TCP option: selective ack (rfc2018), format is l_edge1:r_edge1,l_edge2:r_edge2...
-tots x
TCP option: timestamp (rfc1323), format is tsval:tsecr
关于一些不常见的tcp选项字段的含义,以后继续补充。
四、UDP报文的构造
先看man文件中显示支持可以构造的UDP报文字段有哪些,然后在参数后直接说明该字段的含义。构造报文首先要求对报文的各个字段非常熟悉,所以先看一下UDP首部的图表:
UDP首部:
0 15 16 31
16位源端口号 16位目的端口号
16位UDP长度 16位UDP检验和
数据(若有)
sendip_表3
Arguments for module ./udp.so:
-us x UDP source port
构造UDP报文的源端口,默认为0。
-ud x UDP destination port
构造UDP报文的目的端口,默认为0。
-ul x UDP packet length
构造UDP报文的报文长度,这个值可以任意输入,测试在接收端抓包的结果显示是参数值,但是ethereal会自动分析出实际的报文长度。默认是正确的长度,8个字节。
-uc x UDP checksum
构造checksum的值,覆盖了首部和数据字段。可以用于测试DUT设备是不是检验UDP报文的checksum值。这里有点需要注意,在测试的过程中,发现如果length字段不正确,网卡在收到报文后不会检查checksum,如果length是正确的,checksum才会被认出来不正确,从ethereal的抓包来看是这样的。默认是正确的checksum。
实例:
[root@FC5 ~]# sendip -v -p ipv4 -is 192.168.96.7 -id 192.168.96.1 -p udp -us 8000 -ud 4000 192.168.96.1 –d asdfasdf
发送一个源地址为192.168.96.7,源端口为8000的udp包,到目的为192.168.96.1,目的端口为4000设备上,数据包的内容是asdfasdf,如果要直接引用一个文件的内容的话可以使用-f参数,后面写文件的路径即可。
五、ICMP报文的构造
先看man文件中显示支持可以构造的ICMP报文字段有哪些,然后在参数后直接说明该字段的含义。构造报文首先要求对报文的各个字段非常熟悉,所以先看一下UDP首部的图表:
ICMP结构:
0 15 16 31
8位类型 8位代码 16位检验和
其它一些细节信息内容
sendip_表4
Arguments for module ./icmp.so:
-ct x ICMP message type
构造ICMP报文类型,一个字节。内容比较多,最常见的类型如下:
0 表示Echo Reply
3 表示Eestination Unreachable
这个又分很多类型,这里不作分析,具体可以参见资料。
4 Source Quench
5 Redirect
8 Echo
10 Router Selection
11 Time Exceeded
13 Timestamp
-cd x ICMP code
构造代码字段,取值范围0-255,超过255后变为0,默认配置为0。
-cc x ICMP checksum
构造checksum字段,2个字节。默认是正确内容。
[root@FC5 ~]# sendip -v -p ipv4 -is 192.168.96.253 192.168.96.202 -p icmp -ct 3
发送一个源地址为192.168.96.253的类行为3的icmp报文给192.168.96.202这个地址。
小结:
这篇文档主要是介绍sendip的报文构造方式,而sendip的缺陷就在于它不能连续的发送报文,所以这里提供一个简单的perl脚本,来循环的发送数据包,虽说不能形成flood的效果,但是对于测试可以达到数量控制的目的,有助于自动化脚本的测试,提高测试的效率。
#!/usr/bin/perl -w
$i=1;
while ($i<2)
{
for($j=0;$j<=65;++$j)
{
system "sendip -v -d r64 -p ipv4 -iv 4 -ih 5 -il 20 -ifm 1 -if 0 -iy 8 -is 13.1.1.2 -id 192.168.98.173 -p udp -us $j -ud $j -ul 56 192.168.98.173";
system "sendip -v -d r64 -p ipv4 -iv 4 -ih 5 -il 20 -ifm 0 -if 0x3 -iy 8 -is 13.1.1.2 -id 192.168.98.173 -p udp -us $j -ud $j -ul 56 192.168.98.173";
system "sendip -v -d r64 -p ipv4 -iv 4 -ih 5 -il 65535 -ifm 1 -if 10 -iy 4 -is 13.1.1.2 -id 192.168.98.173 -p tcp -ts $j -td $j -tt 8 192.168.98.173";
}
++$i
}
//i代表循环的次数,j代表端口,本来是65535,我修改了一下,可以根据需要来调整次数和//端口范围,这个脚本感谢吴梦洁的提供,我只是做了注释和修改。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -