?? sendip.txt
字號(hào):
Sendip使用說明
在從事網(wǎng)絡(luò)產(chǎn)品尤其是網(wǎng)絡(luò)安全產(chǎn)品開發(fā)時(shí),我們一直面臨著一個(gè)問題,就是對(duì)產(chǎn)品的TCP/IP 協(xié)議棧進(jìn)行穩(wěn)定性或安全性測試,確保開發(fā)產(chǎn)品在遇到各種不規(guī)則的錯(cuò)誤的IP 包時(shí)仍可正常穩(wěn)定高效地工作,我們知道,在正常的網(wǎng)絡(luò)環(huán)境中,很難產(chǎn)生錯(cuò)誤的IP 包,也很難產(chǎn)生我們想要的錯(cuò)誤的IP 包,為此,要完成對(duì)產(chǎn)品的測試,我們必須自己來制造各種各樣錯(cuò)誤的IP 包,本篇的目的就是介紹如何利用各種發(fā)包工具來制造自己想要的錯(cuò)誤的IP 包。SENDIP 是一個(gè)LINUX 下的命令行工具,可以通過命令行參數(shù)的方式發(fā)送各種格式的IP 包,它有大量的命令行參數(shù)來規(guī)定各種協(xié)議的頭格式,目前可支持NTP, BGP, RIP, RIPng,TCP, UDP, ICMP 或raw IPv4 和IPv6 包格式,并且可以隨意在包中添加數(shù)據(jù)。
一、幫助文件說明
Usage: sendip [-v] [-d data] [-h] [-f datafile] [-p module] [module options] hostname
-d data add this data as a string to the end of the packet
Data can be:
rN to generate N random(ish) data bytes;
0x or 0X followed by hex digits;
0 followed by octal digits;
any other stream of bytes
-f datafile read packet data from file
-h print this message
-p module load the specified module (see below)
-v be verbose
參數(shù)含義:
-v: 詳細(xì)模式,即打印出你發(fā)送報(bào)文的內(nèi)容,類似于debug模式,建議配置該參數(shù),可以清楚的看到發(fā)送的報(bào)文內(nèi)容是否正確。
-d: 添加data字段的內(nèi)容,有option字段的話放在options字段之后,任意添加。也可以一次用文件導(dǎo)入,不過參數(shù)是下面的-f。
-h: 顯示上面的幫助文件。
-f: 在data字段添加參數(shù)后所指的文件里的內(nèi)容,參數(shù)后跟的內(nèi)容就是一個(gè)文件名。
-p: 指定發(fā)送報(bào)文的類型,選項(xiàng)就是幫助提示中的ipv4 ipv6 icmp tcp udp bgp rip ntp的8種類型,注意各個(gè)協(xié)議之間的搭配使用,例如ntp是用udp傳輸,而rip是用tcp傳輸。這個(gè)參數(shù)可以復(fù)用來更加精確的確定一個(gè)報(bào)文的類型和各個(gè)字段,例如:-p ipv4 –p tcp –p rip是可以一起用的。該參數(shù)必須配置。
hostname: 直接輸入ip地址即可,也可以是主機(jī)名,但是之前要把主機(jī)名和對(duì)應(yīng)的ip寫入到/etc/hosts的文件中。該參數(shù)必須配置。注意不需要輸入hostname這個(gè)字段,要不是ip,要不是主機(jī)名。
配置完以上參數(shù)后就可以發(fā)送報(bào)文了,但是具體報(bào)文的各個(gè)字段都是default配置,并沒有達(dá)到自己要構(gòu)造報(bào)文的目的。下面以ipv4、udp、tcp、icmp為例根據(jù)man文件的內(nèi)容來說明各個(gè)字段的構(gòu)造方法,ipv6、rip、bgp和ntp希望后面有時(shí)間再補(bǔ)充。
二、IPV4報(bào)文的構(gòu)造
先看man文件中顯示支持可以構(gòu)造的IPV4報(bào)文字段有哪些,然后在參數(shù)后直接說明該字段的含義。構(gòu)造報(bào)文首先要求對(duì)報(bào)文的各個(gè)字段非常熟悉,所以先看一下IP首部的圖表:
IP首部:
0 15 16 31
4位版 本 首部長 度 8位
服務(wù)類型(TOS) 16位
總長度(字節(jié))
16位
標(biāo)識(shí) 3位標(biāo)志 13位
片偏移
8位
生存時(shí)間TTL 8位
協(xié)議 16位
首部檢驗(yàn)和
32位
源IP地址
32位
目的IP地址
32位
選項(xiàng)(若有)
數(shù)據(jù)
sendip_表1
上面是一個(gè)簡單的圖示,具體各個(gè)字段可以參見高文宇的《IP協(xié)議》文檔。
Arguments for module ./ipv4.so:
-is x Source IP address (see README)
構(gòu)造源IP地址,任意構(gòu)造。判斷不是很嚴(yán)格,可以輸入錯(cuò)誤,它會(huì)自動(dòng)補(bǔ)充或用255.255.255.255來代替,例如輸入1.1.則用255.255.255.255來代替;如果輸入1.1則會(huì)自動(dòng)補(bǔ)齊中間的兩位,顯示為1.0.0.1;如果輸入1.1.1則會(huì)自動(dòng)填充為1.1.0.1。目的IP地址也是一樣。源IP默認(rèn)為127.0.0.1。
-id x Desitnation IP address
構(gòu)造目的IP地址,這里其實(shí)可以不用寫,因?yàn)閔ostname為一個(gè)必帶的參數(shù)字段,最后的目的地址是匹配hostname參數(shù)后的內(nèi)容。注意,這里的ip和hostname的內(nèi)容要求一樣,不然sendip發(fā)出了報(bào)文(它發(fā)出的報(bào)文目的地址是-id參數(shù)后的地址),但是id和hostname所帶參數(shù)內(nèi)容所指的主機(jī)的網(wǎng)卡并收不到報(bào)文。默認(rèn)以-id后的參數(shù)為準(zhǔn)。
-ih x IP header length (see README)
構(gòu)造header(首部)長度,這里所指的是32-bit的word的個(gè)數(shù),就是以4個(gè)字節(jié)為單位元,你定義的結(jié)果要乘以4,要求最小為5(5x4=20bytes),最大為15(15x4=60bytes)。如果構(gòu)造首部不是20bytes的報(bào)文,網(wǎng)卡收到的時(shí)候ethereal只解析到mac地址,它不認(rèn)為是一個(gè)完整的IP報(bào)文。默認(rèn)是20字節(jié)。
-iv x IP version (you almost definately don’t want to change this)
構(gòu)造IP版本,這個(gè)可以任意,0到15任意選擇,超過15發(fā)出的報(bào)文IP version為0。默認(rèn)為4。
-iy x IP type of service
構(gòu)造服務(wù)類型,這里先說明一下Type of service(PreDTRCx)的各個(gè)標(biāo)志位的意義:
Precedence(000-111)
D(1 = minimize delay)
T(1 = maximize throughout)
R(1 = maximize reliability)
C(1 = minimize cost)
x(reservd and set to 0)
服務(wù)類型的前3位設(shè)置分組的優(yōu)先級(jí),數(shù)值越大,則分組越重要。接下來的3位分別表示延遲、吞吐率和可靠性,如果為0則表示常規(guī)服務(wù),如果為1則表示短延遲、高吞吐率和高可靠性。最后兩位沒有使用。sendip并不能細(xì)致到定義每一個(gè)bit位的數(shù)值,默認(rèn)是全0。
-il x Total IP packet length (see README)
構(gòu)造IP報(bào)文的總長度,這里的總長度是包括數(shù)據(jù)字段的,就是說如果沒有數(shù)據(jù)字段,這里的值應(yīng)該和首部長度字段的值是一樣的。最大值為65535(二進(jìn)制16個(gè)1),但是注意配置這個(gè)值的意義不大,用ethereal抓到這個(gè)報(bào)文時(shí)顯示的值還是一個(gè)正確的值,這個(gè)報(bào)文本來有多大就是多大。默認(rèn)是根據(jù)報(bào)文內(nèi)容來確定,是一個(gè)正確的值。
-ii x IP packet ID (see README)
構(gòu)造IP報(bào)文的標(biāo)識(shí)號(hào),這個(gè)時(shí)隨機(jī)的,沒有太多意義,不知道是不是會(huì)在校驗(yàn)的時(shí)候用到。默認(rèn)是隨機(jī)構(gòu)造。在IP協(xié)議中的作用是標(biāo)識(shí)報(bào)文,例如一個(gè)分片后的IP報(bào)文,它的ID肯定是一樣的。取值的范圍是1-65535,不在這個(gè)范圍的話,程序會(huì)隨機(jī)構(gòu)造一個(gè)id號(hào)。
-ifr x IP reservced flag (see README)
保留的標(biāo)志位。默認(rèn)為0,選項(xiàng)為0、1、r。
-ifd x IP don’t fragment flag (see README)
構(gòu)造強(qiáng)制不分片標(biāo)志位,默認(rèn)為0,選項(xiàng)為0、1、r。
-ifm x IP more fragments flag (see README)
構(gòu)造分片標(biāo)志位,這個(gè)標(biāo)志位只有在報(bào)文需要分片時(shí)才置為1,默認(rèn)為0,選項(xiàng)為0、1、r。
-if x IP fragment offset
構(gòu)造需要分片的報(bào)文的位偏移,默認(rèn)發(fā)送的報(bào)文沒有分片的話就是0。
-it x IP time to live
生存時(shí)間值,修改的意義不大,默認(rèn)配置為255。
-ip x IP protocol
協(xié)議字段,判斷哪個(gè)協(xié)議使用了IP封裝來傳輸,例如ICMP為0x01,TCP為0x06,UDP為0x11。
-ic x IP checksum (see README)
構(gòu)造首部校驗(yàn)和字段,只覆蓋首部,不包括數(shù)據(jù)字段。默認(rèn)是正確的校驗(yàn)和,看不出什么規(guī)律來,應(yīng)該是有一種算法。測試時(shí)可以隨意構(gòu)造一個(gè)錯(cuò)誤的checksum,看DUT是不是檢測checksum這個(gè)字段。但是驗(yàn)證的過程中發(fā)現(xiàn)配置后沒有作用,并沒有修改。測試了icmp的包倒是修改了,不知道是不是軟件的bug。
注意:以下內(nèi)容都是選項(xiàng)字段,之前沒有了解過的話,可能會(huì)覺得有些陌生,為了更好的了解這些字段的意思,可以先用ping這個(gè)簡單的命令來進(jìn)行一些實(shí)踐操作,理解其中的一些字段的含義。
實(shí)例:
1、返回一個(gè)時(shí)戳,表示到達(dá)目的地址的時(shí)間,在reply的回應(yīng)包中可以看到。
C:\>ping -s 1 192.168.100.18
Pinging 192.168.100.18 with 32 bytes of data:
Reply from 192.168.100.18: bytes=32 time<1ms TTL=63
Timestamp: 192.168.100.18 : 9612956
2、記錄路由,表示在ping包到達(dá)目的地址時(shí)經(jīng)過的路由設(shè)備,需要設(shè)備的支持。
C:\>ping -r 1 192.168.100.18 -n 1
Pinging 192.168.100.18 with 32 bytes of data:
Reply from 192.168.100.18: bytes=32 time<1ms TTL=63
Route: 192.168.100.18
Ping statistics for 192.168.100.18:
-r表示記錄路由的跳數(shù),注意這個(gè)參數(shù)值只能是1-9,原因是因?yàn)橛涗浡酚蛇@個(gè)選項(xiàng)需要3個(gè)字節(jié)的開銷,后面每跟一個(gè)ip地址需要4個(gè)字節(jié),而選項(xiàng)字段的最大值為40個(gè)字節(jié)。這個(gè)參數(shù)的作用被之后的tracert命令代替。
-n 表示發(fā)多少個(gè)ping包。
3、嚴(yán)格源路由和記錄路由,表示不但要記錄路由,還要求到達(dá)目的地址必須要經(jīng)過指定的路由地址。
C:\>ping -k 192.168.96.2 192.168.98.1 192.168.100.18
表示到達(dá)192.168.100.18時(shí),先必須經(jīng)過192.168.96.2和192.168.98.1這兩個(gè)路由設(shè)備,再到達(dá)目的ip。
現(xiàn)在逐一來看各個(gè)參數(shù)的含義:
-ionum x
根據(jù)《TCP/IP詳解》卷2第9章,并沒有這個(gè)選項(xiàng)字段,這里應(yīng)該是軟件自己為了控制選項(xiàng)字段的長度而設(shè)計(jì)的。這里先說明一些選項(xiàng)字段的基礎(chǔ)知識(shí):
l 選項(xiàng)字段必須是4字節(jié)的整數(shù)倍,原因很簡單,因?yàn)镮P header length是以4字節(jié)為一個(gè)單位元;
l IP選項(xiàng)字段可能包含0個(gè)或多個(gè)單獨(dú)選項(xiàng),選項(xiàng)有兩種類型,單字節(jié)和多字節(jié),如下圖:
?/P>
sendip_圖1
所有選項(xiàng)1都以字節(jié)類型(type)字段開始。在多字段選項(xiàng)中,類型字段后面緊接著一個(gè)長度(len)字段,其它的字節(jié)是數(shù)據(jù)(data)。許多選項(xiàng)數(shù)據(jù)字段的第一個(gè)字節(jié)是1字節(jié)的位移(offset)字段,指向數(shù)據(jù)字段內(nèi)的某個(gè)字節(jié)。長度(len)字節(jié)的計(jì)算覆蓋了類型、長度、和數(shù)據(jù)字段。類型(type)被繼續(xù)分成了3個(gè)子字段:1bit備份(copied)、2bit類(class)字段和5bit數(shù)字(number)字段。
現(xiàn)在來看各個(gè)選賢字段的定義和使用方法。默認(rèn)這個(gè)參數(shù)后的長度值總是正確的,默認(rèn)沒有選項(xiàng)字段。
-ioeol IP option: end of list
1字節(jié),表示選項(xiàng)表的結(jié)尾,就是一個(gè)選項(xiàng)字段的結(jié)束標(biāo)識(shí)符。
-ionop IP option: no-op
1字節(jié),沒有任何意義,表示無操作,碰到這個(gè)字段可以忽略。
-iorr x
長度可變,作用是記錄路由。格式是pointer:addr1:addr2,這里的pointer其實(shí)就是一個(gè)具體的offset值,是一個(gè)十六進(jìn)制的值,我測試最小值是十進(jìn)制的10(這里只能用十進(jìn)制表示,10剛好對(duì)應(yīng)的是0x16)。使用可以參照這個(gè)命令行:
[root@FC5 ~]# sendip -v -p ipv4 -is 192.168.96.111 -id 192.168.96.202 -iorr 10:192.168.96.1 192.168.96.202 -d asf
這里要說明一點(diǎn)為什么要加一個(gè)asf的3個(gè)字節(jié)的數(shù)據(jù)字段,因?yàn)樵跍y試的時(shí)候,我在被發(fā)送報(bào)文的pc端抓包發(fā)現(xiàn)如果ethereal分析顯示total length這個(gè)值不對(duì)的話,它就不會(huì)分析其它字段,這樣會(huì)導(dǎo)致不能清楚看到option字段,不知道是不是正確構(gòu)造了報(bào)文,所以在構(gòu)造報(bào)文時(shí)還需要注意這個(gè)小竅門,ethereal分析后還少幾個(gè)字節(jié)就加幾個(gè)字符。這樣你就可以看到你剛才發(fā)送的option字段里的內(nèi)容了。
-iots x
長度可變,作用是時(shí)戳。格式是pointer:overflow:flag:(ip1:)ts1:(ip2:)ts2,pointer表示位偏移,overflow表示??,flag是標(biāo)識(shí)位(0表示記錄時(shí)間戳、1表示記錄地址和時(shí)間戳、3表示只在預(yù)先指定的系統(tǒng)記錄時(shí)間戳,其它保留)。注意只有flag位置1時(shí)才有ip1、ip2的參數(shù)。
[root@FC5 ~]# sendip -v -p ipv4 -is 192.168.96.222 -iots 11:4:1:192.168.96.1:11:
192.168.9.8:90 192.168.96.202
11是位偏移,4表示??,1表示記錄地址和時(shí)間戳,后面就是一個(gè)ip對(duì)應(yīng)一個(gè)時(shí)間戳。
構(gòu)造這樣的報(bào)文主要可以用于測試DUT是不是檢查option字段,如果檢查,是不是檢查時(shí)間戳等信息。
-iolsr x
長度可變,表示寬松源路由和記錄路由(LSRR)。格式很簡單了,上面ping的實(shí)例如果運(yùn)行后抓包看過以后,就發(fā)現(xiàn)這個(gè)是按照標(biāo)準(zhǔn)的格式來定義的。
[root@FC5 ~]# sendip -v -p ipv4 -is 192.168.96.253 -iolsr 10:192.168.96.1 192.168.96.202 -d 1
-iosid x
4個(gè)字節(jié),構(gòu)造identifier(標(biāo)識(shí)符),取值范圍0-65535,超過該范圍自動(dòng)變?yōu)?。我測試的結(jié)果顯示前2個(gè)字節(jié)總是0x8804,后面2個(gè)字節(jié)就是輸入的參數(shù)值。
-iossr x
長度可變,表示嚴(yán)格源路由和記錄路由(SSRR),格式同-iolsr。
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -